[
  {
    "path": ".gitignore",
    "content": "lib-cov\n*.seed\n*.log\n*.csv\n*.dat\n*.out\n*.pid\n*.gz\n\npids\nlogs\nresults\ntests\n\nconfig.json\n\nnode_modules\nnpm-debug.log\n\n.c9revisions\n\nbuiltAssets"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"servers/www/assets/select2\"]\n\tpath = servers/www/assets/select2\n\turl = git://github.com/ivaynberg/select2.git\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (C) 2015 Filearts\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r\nof the Software, and to permit persons to whom the Software is furnished to do\r\nso, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "README.md",
    "content": "# Plunker\n\n[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/filearts/plunker?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\nThe next generation of lightweight collaborative online editing.\n\n#### WARNING: This repository does not contain the code for what you see running on http://plnkr.co\n\n > The current code for Plunker is in the repositories listed below\n\nOriginally, Plunker was coded in a single repository with different sub-servers existing in the `/servers`\npath. The entire application was run on a single server.\n\nHowever, with increasing popularity, reality decided to come hang out and make everyone's lives difficult.\nThe solution was simple; since the components of Plunker were designed as 'sub-servers', it should be easy\nto split them out and run them separately. However, having different logical entities with different\nfunctions in the same repository doesn't make sense.\n\nI decided to create separate repositories for each of the Plunker servers that are currently deployed on\nNodejitsu. They are as follows:\n\n#### Plunker component repositories\n\n* [plunker_api](//github.com/filearts/plunker_api) The server that connects to a mongodb database and serves requests over a restful api.\n* [plunker_www](//github.com/filearts/plunker_www) The server that is responsible for hosting and running the front-end that users see and touch everyday.\n* [plunker-run-plugin](//github.com/ggoodman/plunker-run-plugin) The server that allows for previewing of plunks and temporary previews and also does the dynamic transpilation.\n* [plunker_collab](//github.com/filearts/plunker_collab) The server that serves the code necessary for collaborative coding as well as doing the actual operational transformation over a browserchannel connection.\n* [plunker_embed](//github.com/filearts/plunker_embed) The server that hosts the embedded views of plunks.\n\n### Plunker config files\n\nEach server, once cloned locally, requires one or two `config.json` files to run.\n\n**Servers that use the environment-specific config files `config.development.json` and `config.production.json`:**\n\n* plunker_api\n* plunker_www\n* plunker_run\n* plunker_collab\n\nOnly `plunker_embed` uses a single `config.json` file.\n\n**Sample configuration file:**\n\n > Not all fields are required by each server, but if all are present no harm *should* come to any small animals.\n \n```javascript\n{\n  \"host\": \"hostname.com\",\n  \"url\": {\n    \"www\": \"http://hostname.com\",\n    \"collab\": \"http://collab.hostname.com\",\n    \"api\": \"http://api.hostname.com\",\n    \"embed\": \"http://embed.hostname.com\",\n    \"run\": \"http://run.hostname.com\",\n    \"carbonadsH\": \"OOPS, this is pretty specific to my current deploy\",\n    \"carbonadsV\": \"OOPS, this is pretty specific to my current deploy\"\n  },\n  \"port\": 8080,\n  \"oauth\": {\n    \"github\": {\n      \"id\": \"series_of_random_chars\",\n      \"secret\": \"longer_series_of_random_chars\"\n    }\n  }\n}\n```\n\n\n\n# Everything below this point is out of date or incorrect!\n\n > ...And there be dragons\n\n# Usage\n\n```\ngit clone git://github.com/filearts/plunker.git\ngit submodule update --init\n\nnpm install\n\nnode server.js\n```\n\n## Editor API\n\n### `POST /edit/`\n\nYou can send a `POST` request to `/edit/` to bootstrap the editor with the basic structure of a plunk.  The JSON format for this is described below.\n\n```javascript\n{\n  \"description\": \"Description of Plunk\",\n  \"tags\": [\"array\", \"of\", \"tags\"],\n  \"files\": [\n    {\n      \"filename\": \"index.html\",\n      \"content\": \"<html><script src=\\\"script.js\\\"></script></html>\"\n    },\n    {\n      \"filename\": \"script.js\",\n      \"content\": \"alert('hello world');\"\n    }\n  ]\n}\n```\n\n## License\n\nCopyright [Filearts](https://github.com/filearts)\n"
  },
  {
    "path": "config.sample.json",
    "content": "{\r\n  \"host\": \"localhost\", // (Required) The hostname at which Plunk will be run\r\n  \"nosubdomains\": true, // Run Plunker off of a single domain (instead of {api,run,embed,raw}.host)\r\n  \"oauth\": {\r\n    \"github\": { // To enable logging in via github\r\n      \"id\": \"111111111111111\",\r\n      \"secret\": \"11111111111111111111111111111111\"\r\n    }\r\n  },\r\n  \"mongodb\": {\r\n    \"hostname\": \"localhost\",\r\n    \"port\": 27017,\r\n    \"pathname\": \"plunker\",\r\n    \"auth\": \"plunker:plunker\"\r\n  }\r\n}"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"plunker\",\n  \"subdomain\": \"plunker\",\n  \"scripts\": {\n    \"start\": \"server.js\"\n  },\n  \"engines\": {\n    \"node\": \"0.6.x\"\n  },\n  \"version\": \"0.3.13-4\",\n  \"private\": true,\n  \"dependencies\": {\n    \"coffee-script\": \"1.3.x\",\n    \"express\": \"2.5.x\",\n    \"gzippo\": \"0.1.x\",\n    \"jade\": \"0.25.x\",\n    \"less\": \"1.3.x\",\n    \"mime\": \"1.2.x\",\n    \"underscore\": \"1.3.x\",\n    \"backbone\": \"0.9.x\",\n    \"connect-assets\": \"2.2.x\",\n    \"share\": \"0.5.x\",\n    \"express-subdomains\": \"0.0.x\",\n    \"authom\": \"0.4.x\",\n    \"nconf\": \"0.5.x\",\n    \"json-schema\": \"https://github.com/kriszyp/json-schema/tarball/master\",\n    \"request\": \"2.9.x\",\n    \"connect\": \"1.x\",\n    \"async\": \"0.1.x\",\n    \"mongoose\": \"3.x\",\n    \"lru-cache\": \"1.1.x\"\n  },\n  \"bundledDependencies\": [\n    \"json-schema\"\n  ]\n}"
  },
  {
    "path": "server.js",
    "content": "// Everything starts better with coffee\nvar coffee = require(\"coffee-script\");\nvar express = require(\"express\");\n\n\nvar nconf = require(\"nconf\").use(\"memory\")\n  .argv()\n  .env()\n  .file({file: \"config.json\"})\n  .defaults({\n    \"PORT\": 8080\n  });\n\nif (!nconf.get(\"host\")) {\n  console.error(\"The host option is required for Plunker to start\");\n} else {\n  \n  var host = nconf.get(\"host\");\n\n  // Configure global paths\n  if (nconf.get(\"nosubdomains\")) {\n    nconf.set(\"url:www\", \"http://\" + host);\n    nconf.set(\"url:raw\", \"http://\" + host + \"/raw\");\n    nconf.set(\"url:run\", \"http://\" + host + \"/run\");\n    nconf.set(\"url:api\", \"http://\" + host + \"/api\");\n  } else {\n    nconf.set(\"url:www\", \"http://\" + host);\n    nconf.set(\"url:raw\", \"http://raw.\" + host);\n    nconf.set(\"url:run\", \"http://run.\" + host);\n    nconf.set(\"url:api\", \"http://api.\" + host);\n  }\n  \n  // Create and start the parent server\n  express.createServer()\n    //.use(express.logger())\n    .use(require(\"express-subdomains\").use(\"raw\").use(\"api\").use(\"run\").use(\"embed\").middleware)\n    .use(\"/api\", require(\"./servers/api\"))\n    .use(\"/raw\", require(\"./servers/raw\"))\n    .use(\"/run\", require(\"./servers/run\"))\n    .use(\"/embed\", require(\"./servers/embed\"))\n    .use(require(\"./servers/www\"))\n    .listen(nconf.get(\"PORT\"));\n  \n  console.log(\"Started plunker in\", nconf.get(\"NODE_ENV\") || \"development\", \"at\", nconf.get(\"host\"), \"on port\", nconf.get(\"PORT\"), \"using subdomains:\", !nconf.get(\"nosubdomains\"));\n}\n"
  },
  {
    "path": "servers/api/.gitignore",
    "content": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r\n.c9revisions\r\n\r\nbuiltAssets"
  },
  {
    "path": "servers/api/.npmignore",
    "content": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r\n.c9revisions\r\n\r\nbuiltAssets"
  },
  {
    "path": "servers/api/errors.coffee",
    "content": "class APIError extends Error\n  toJSON: -> {@code, @message}\n\nmodule.exports =\n  ParseError: class extends APIError\n    constructor: ->\n      @code = 400\n      @message = \"Problems parsing JSON\"\n  ValidationError: class extends APIError\n    constructor: (@errors) ->\n      @code = 422\n      @message = \"Validation failed\"\n    toJSON: -> {@errors, @code, @message}\n  NotFound: class extends APIError\n    constructor: ->\n      @code = 404\n      @message = \"Not found\"\n  PermissionDenied: class extends APIError\n    constructor: ->\n      @code = 404\n      @message = \"Permission denied\"\n  InternalServerError: class extends APIError\n    constructor: ->\n      @code = 500\n      @message = \"Internal server error\""
  },
  {
    "path": "servers/api/index.coffee",
    "content": "nconf = require(\"nconf\")\r\nrequest = require(\"request\")\r\nmime = require(\"mime\")\r\nexpress = require(\"express\")\r\nurl = require(\"url\")\r\nquerystring = require(\"querystring\")\r\n_ = require(\"underscore\")._\r\nvalidator = require(\"json-schema\")\r\nmime = require(\"mime\")\r\ngate = require(\"json-gate\")\r\nsemver = require(\"semver\")\r\n\r\napiErrors = require(\"./errors\")\r\napiUrl = nconf.get('url:api')\r\n\r\nmodule.exports = app = express.createServer()\r\n\r\n\r\ngenid = (len = 16, prefix = \"\", keyspace = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") ->\r\n  prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0\r\n  prefix\r\n\r\n\r\ndatabase = require(\"./lib/database\")\r\n\r\nSession = database.model(\"Session\")\r\nUser = database.model(\"User\")\r\nPlunk = database.model(\"Plunk\")\r\nPackage = database.model(\"Package\")\r\n\r\n\r\n\r\nPRUNE_FREQUENCY = 1000 * 60 * 60 * 6 # Prune the sessions every 6 hours\r\nSCORE_INCREMENT = 1000 * 60 * 60 * 6 # Each vote bumps the plunk forward 6 hours\r\n\r\npruneSessions = ->\r\n  console.log \"Pruning sessions\"\r\n  Session.prune()\r\n\r\nsetInterval pruneSessions, PRUNE_FREQUENCY\r\npruneSessions()\r\n\r\napp.configure ->\r\n  app.use require(\"./middleware/cors\").middleware()\r\n  app.use require(\"./middleware/cache\").middleware()\r\n  app.use require(\"./middleware/json\").middleware()\r\n  app.use require(\"./middleware/session\").middleware(sessions: database.model(\"Session\"))\r\n    \r\n  app.use app.router\r\n  \r\n  app.use (err, req, res, next) ->\r\n    json = if err.toJSON? then err.toJSON() else\r\n      message: err.message or \"Unknown error\"\r\n      code: err.code or 500\r\n    \r\n    res.json(json, json.code)\r\n    \r\n    throw err\r\n    \r\n  app.set \"jsonp callback\", true\r\n\r\n###\r\n# RESTful sessions\r\n###\r\n\r\n\r\ncreateSession = (token, user, cb) ->\r\n  session = new Session\r\n    last_access: new Date\r\n    keychain: {}\r\n    \r\n  session.user = user if user\r\n  \r\n  session.save (err) -> cb(err, session)\r\n\r\n# Convenience endpoint to get the current session or create a new one\r\napp.get \"/session\", (req, res, next) ->\r\n  res.header \"Cache-Control\", \"no-cache\"\r\n  \r\n  if req.session then res.json(req.session)\r\n  else createSession null, null, (err, session) ->\r\n    if err then next(err)\r\n    else res.json(session, 201)\r\n\r\n\r\napp.post \"/sessions\", (req, res, next) ->\r\n  createSession null, null, (err, session) ->\r\n    if err then next(err)\r\n    else res.json(session, 201)\r\n\r\napp.get \"/sessions/:id\", (req, res, next) ->\r\n  Session.findById(req.params.id).populate(\"user\").exec (err, session) ->\r\n    if err then next(err)\r\n    else unless session then next(new apiErrors.NotFound)\r\n    else if Date.now() - session.last_access.valueOf() > nconf.get(\"session:max_age\") then next(new apiErrors.NotFound)\r\n    else\r\n      unless session.user then res.json(session.toJSON())\r\n      else User.findById session.user, (err, user) ->\r\n        if err then next(err)\r\n        else res.json(_.extend(session, user: user.toJSON()))\r\n\r\n\r\n\r\napp.del \"/sessions/:id/user\", (req, res, next) ->\r\n  Session.findById req.params.id, (err, session) ->\r\n    if err then next(err)\r\n    else unless session then next(new apiErrors.NotFound)\r\n    else\r\n      session.user = null\r\n      session.save (err) ->\r\n        if err then next(err)\r\n        else res.json(session)\r\n\r\napp.post \"/sessions/:id/user\", (req, res, next) ->\r\n  Session.findById req.params.id, (err, session) ->\r\n    if err then next(new apiErrors.NotFound)\r\n    else\r\n      unless token = req.param(\"token\") then next(new apiErrors.MissingArgument(\"token\"))\r\n      else\r\n        sessid = req.param(\"id\")\r\n        \r\n        request.get \"https://api.github.com/user?access_token=#{token}\", (err, response, body) ->\r\n          return next(new apiErrors.Error(err)) if err\r\n          return next(new apiErrors.PermissionDenied) if response.status >= 400\r\n      \r\n          try\r\n            body = JSON.parse(body)\r\n          catch e\r\n            return next(new apiErrors.ParseError)\r\n          \r\n          service_id = \"github:#{body.id}\"\r\n          \r\n          createUser = (cb) ->\r\n            user_json =\r\n              login: body.login\r\n              gravatar_id: body.gravatar_id\r\n              service_id: service_id\r\n              \r\n            User.create(user_json, cb)\r\n          \r\n          withUser = (err, user) ->\r\n            if err then next(err)\r\n            else\r\n              session.user = user\r\n              session.auth =\r\n                service_name: \"github\"\r\n                service_token: token\r\n              session.save (err) ->\r\n                if err then next(err)\r\n                else res.json(_.extend(session.toJSON(), user: user.toJSON()), 201)\r\n              \r\n          User.findOne { service_id: service_id }, (err, user) ->\r\n            unless err or not user then withUser(null, user)\r\n            else createUser(withUser)\r\n\r\n\r\n\r\n\r\n###\r\n# Plunks\r\n###\r\n\r\nownsPlunk = (session, json) ->\r\n  owner = false\r\n  \r\n  if session\r\n    owner ||= !!(json.user and session.user and json.user.login is session.user.login)\r\n    owner ||= !!(session.keychain and session.keychain.id(json.id)?.token is json.token)\r\n\r\n  owner\r\n  \r\npreparePlunk = (session, plunk, populate = {}) ->\r\n  json = _.extend plunk.toJSON(), populate\r\n  \r\n  delete json.token unless ownsPlunk(session, json)\r\n  delete json.voters\r\n  \r\n  if json.files then json.files = do ->\r\n    files = {}\r\n    for file in json.files\r\n      file.raw_url = \"#{json.raw_url}#{file.filename}\"\r\n      files[file.filename] = file\r\n    files\r\n  \r\n  json.thumbed = session?.user? and plunk.voters.indexOf(\"\"+session.user._id) >= 0\r\n  \r\n  json\r\n\r\npreparePlunks = (session, plunks) -> _.map plunks, (plunk) -> preparePlunk(session, plunk)\r\n\r\n\r\nfetchPlunks = (options, req, res, next) ->\r\n  page = parseInt(req.param(\"p\", \"1\"), 10)\r\n  limit = parseInt(req.param(\"pp\", \"8\"))\r\n  \r\n  options.baseUrl ||= \"#{apiUrl}/plunks\"\r\n  \r\n  search = options.query or {}\r\n  \r\n  if req.user\r\n    search.$or = [\r\n      'private': $ne: true\r\n    ,\r\n      user: req.user._id\r\n    ]\r\n  else\r\n    search.private = $ne: true\r\n  \r\n  query = Plunk.find(search)\r\n  query.sort(options.sort or {updated_at: -1})\r\n  query.select(\"-files\")\r\n  \r\n  query.populate(\"user\").paginate page, limit, (err, plunks, count, pages, current) ->\r\n    if err then next(err)\r\n    else\r\n      link = []\r\n      \r\n      if current < pages\r\n        link.push \"<#{options.baseUrl}?p=#{page+1}&pp=#{limit}>; rel=\\\"next\\\"\"\r\n        link.push \"<#{options.baseUrl}?p=#{pages}&pp=#{limit}>; rel=\\\"last\\\"\"\r\n      if current > 1\r\n        link.push \"<#{options.baseUrl}?p=#{page-1}&pp=#{limit}>; rel=\\\"prev\\\"\"\r\n        link.push \"<#{options.baseUrl}?p=1&pp=#{limit}>; rel=\\\"first\\\"\"\r\n        \r\n      res.header(\"Link\", link.join(\", \")) if link.length\r\n      res.json(preparePlunks(req.session, plunks))\r\n\r\n# List plunks\r\napp.get \"/plunks\", (req, res, next) ->\r\n  fetchPlunks({}, req, res, next)\r\n  \r\n# List plunks\r\napp.get \"/plunks/trending\", (req, res, next) ->\r\n  options =\r\n    baseUrl: \"#{apiUrl}/plunks/trending\"\r\n    sort: \"-score -updated_at\"\r\n    \r\n  fetchPlunks(options, req, res, next)\r\n  \r\n# List plunks\r\napp.get \"/plunks/popular\", (req, res, next) ->\r\n  options =\r\n    baseUrl: \"#{apiUrl}/plunks/popular\"\r\n    sort: \"-thumbs -updated_at\"\r\n    \r\n  fetchPlunks(options, req, res, next)\r\n  \r\n# Create plunk\r\napp.post \"/plunks\", (req, res, next) ->\r\n  json = req.body\r\n  schema = require(\"./schema/plunks/create\")\r\n  {valid, errors} = validator.validate(json, schema)\r\n  \r\n  # Despite its awesomeness, revalidator does not support disallow or additionalProperties; we need to check plunk.files size\r\n  if json.files and _.isEmpty(json.files)\r\n    valid = false\r\n    errors.push\r\n      attribute: \"minProperties\"\r\n      property: \"files\"\r\n      message: \"A minimum of one file is required\"\r\n  \r\n  unless valid then next(new apiErrors.ValidationError(errors))\r\n  else\r\n    \r\n    json.files = _.map json.files, (file, filename) ->\r\n      filename: filename\r\n      content: file.content\r\n      mime: mime.lookup(filename, \"text/plain\")\r\n      \r\n    json.tags = _.uniq(json.tags) if json.tags\r\n\r\n    plunk = new Plunk(json)\r\n    plunk.user = req.user._id if req.user\r\n    \r\n    # TODO: This is inefficient as the number space fills up; consider: http://www.faqs.org/patents/app/20090063601\r\n    # Keep generating new ids until not taken\r\n    savePlunk = ->\r\n      plunk._id = if json.private then genid(20) else genid(6)\r\n    \r\n      plunk.save (err) ->\r\n        if err\r\n          if err.code is 11000 then savePlunk()\r\n          else next(err)\r\n        else\r\n          unless req.user and req.session and req.session.keychain\r\n            req.session.keychain.push _id: plunk._id, token: plunk.token\r\n            req.session.save()\r\n          \r\n          populate = {}\r\n          populate.user = req.user.toJSON() if req.user\r\n          \r\n          # User is not populated so we shove it in **UGLY**\r\n          res.json(preparePlunk(req.session, plunk, populate), 201)\r\n          \r\n    savePlunk()\r\n\r\n# Read plunk\r\napp.get \"/plunks/:id\", (req, res, next) ->\r\n  Plunk.findById(req.params.id).populate(\"user\").exec (err, plunk) ->\r\n    if err or not plunk then next(new apiErrors.NotFound)\r\n    else res.json(preparePlunk(req.session, plunk))\r\n    \r\n# Update plunk\r\napp.post \"/plunks/:id\", (req, res, next) ->\r\n  Plunk.findById(req.params.id).populate(\"user\").exec (err, plunk) ->\r\n    if err or not plunk or not ownsPlunk(req.session, plunk) then next(new apiErrors.NotFound)\r\n    else\r\n      json = req.body\r\n      schema = require(\"./schema/plunks/update\")\r\n      {valid, errors} = validator.validate(json, schema)\r\n      \r\n      # Despite its awesomeness, validator does not support disallow or additionalProperties; we need to check plunk.files size\r\n      if json.files and _.isEmpty(json.files)\r\n        valid = false\r\n        errors.push\r\n          attribute: \"minProperties\"\r\n          property: \"files\"\r\n          message: \"A minimum of one file is required\"\r\n      \r\n      unless valid then next(new apiErrors.ValidationError(errors))\r\n      else\r\n        oldFiles = {}\r\n        \r\n        for file, index in plunk.files\r\n          oldFiles[file.filename] = file\r\n        \r\n        for filename, file of json.files\r\n          # Attempt to delete\r\n          if file is null\r\n            oldFiles[filename].remove() if oldFiles[filename]\r\n          # Modification to an existing file\r\n          else if old = oldFiles[filename]\r\n            if file.filename\r\n              old.filename = file.filename\r\n              old.mime = mime.lookup(file.filename, \"text/plain\")\r\n            if file.content?\r\n              old.content = file.content\r\n            \r\n            if file.filename or file.content then old.save()\r\n          # New file; handle only if content provided\r\n          else if file.content\r\n            plunk.files.push\r\n              filename: filename\r\n              content: file.content\r\n              \r\n        if json.tags\r\n          plunk.tags ||= []\r\n          \r\n          for tagname, add of json.tags\r\n            if add\r\n              plunk.tags.push(tagname)\r\n            else\r\n              plunk.tags.splice(idx, 1) if (idx = plunk.tags.indexOf(tagname)) >= 0\r\n        \r\n        plunk.tags = _.uniq(plunk.tags)\r\n        plunk.updated_at = new Date\r\n        plunk.description = json.description if json.description\r\n        plunk.user = req.user._id if req.user\r\n        plunk.save (err) ->\r\n          if err then next(new apiErrors.InternalServerError(err))\r\n          else\r\n            populate = {}\r\n            populate.user = req.user.toJSON() if req.user\r\n                \r\n            res.json(preparePlunk(req.session, plunk, populate))\r\n            \r\n# Obtain a list of a plunk's forks\r\napp.get \"/plunks/:id/forks\", (req, res, next) ->\r\n  Plunk.findOne({_id: req.params.id}).exec (err, plunk) ->\r\n    if err or not plunk then next(new apiErrors.NotFound)\r\n    else\r\n      options =\r\n        query: {fork_of: req.params.id}\r\n        baseUrl: \"#{apiUrl}/plunk/#{req.params.id}/forks\"\r\n        sort: \"-updated_at\"\r\n        \r\n      fetchPlunks(options, req, res, next)\r\n\r\n# Give a thumbs-up to a plunk\r\napp.post \"/plunks/:id/thumb\", (req, res, next) ->\r\n  unless req.user then return next(new apiErrors.NotFound)\r\n  \r\n  Plunk.findOne(_id: req.params.id).where(\"voters\").ne(req.user).exec (err, plunk) ->\r\n    if err or not plunk then next(new apiErrors.NotFound)\r\n    else\r\n      plunk.score ||= plunk.created_at.valueOf()\r\n      plunk.thumbs ||= 0\r\n      \r\n      plunk.voters.addToSet(req.user._id)\r\n      plunk.score += SCORE_INCREMENT\r\n      plunk.thumbs++\r\n      \r\n      plunk.save (err) ->\r\n        if err then next(new apiErrors.InternalServerError(err))\r\n        else res.json({ thumbs: plunk.get(\"thumbs\"), score: plunk.score}, 201)\r\n\r\n# Remove a thumbs-up to a plunk\r\napp.del \"/plunks/:id/thumb\", (req, res, next) ->\r\n  unless req.user then return next(new apiErrors.NotFound)\r\n  \r\n  Plunk.findOne(_id: req.params.id).where(\"voters\").equals(req.user).exec (err, plunk) ->\r\n    if err or not plunk then next(new apiErrors.NotFound)\r\n    else\r\n      plunk.voters.remove(req.user)\r\n      plunk.score -= SCORE_INCREMENT\r\n      plunk.thumbs--\r\n      plunk.save (err) ->\r\n        if err then next(new apiErrors.InternalServerError(err))\r\n        else res.json({ thumbs: plunk.get(\"thumbs\"), score: plunk.score}, 200)\r\n        \r\n# Fork an existing plunk\r\napp.post \"/plunks/:id/forks\", (req, res, next) ->\r\n  Plunk.findById(req.params.id).populate(\"user\").exec (err, parent) ->\r\n    if err or not parent then next(new apiErrors.NotFound)\r\n    else\r\n      json = req.body\r\n      schema = require(\"./schema/plunks/create\")\r\n      {valid, errors} = validator.validate(json, schema)\r\n      \r\n      # Despite its awesomeness, revalidator does not support disallow or additionalProperties; we need to check plunk.files size\r\n      if json.files and _.isEmpty(json.files)\r\n        valid = false\r\n        errors.push\r\n          attribute: \"minProperties\"\r\n          property: \"files\"\r\n          message: \"A minimum of one file is required\"\r\n      \r\n      unless valid then next(new apiErrors.ValidationError(errors))\r\n      else\r\n        \r\n        json.files = _.map json.files, (file, filename) ->\r\n          filename: filename\r\n          content: file.content\r\n          mime: mime.lookup(filename, \"text/plain\")\r\n      \r\n        json.tags = _.uniq(json.tags) if json.tags\r\n    \r\n        plunk = new Plunk(json)\r\n        plunk.user = req.user._id if req.user\r\n        plunk.fork_of = parent._id\r\n                \r\n        # TODO: This is inefficient as the number space fills up; consider: http://www.faqs.org/patents/app/20090063601\r\n        # Keep generating new ids until not taken\r\n        savePlunk = ->\r\n          plunk._id = if json.private then genid(20) else genid(6)\r\n        \r\n          plunk.save (err) ->\r\n            if err\r\n              if err.code is 11000 then savePlunk()\r\n              else next(err)\r\n            else\r\n              # Update syntax to avoid triggering auto-update of updated_at on parent\r\n              parent.forks.push(plunk._id)\r\n              parent.save()\r\n              \r\n              if not req.user and req.session and req.session.keychain\r\n                req.session.keychain.push _id: plunk._id, token: plunk.token\r\n                req.session.save()\r\n              \r\n              populate = {}\r\n              populate.user = req.user.toJSON() if req.user\r\n                \r\n              res.json(preparePlunk(req.session, plunk, populate), 201)\r\n              \r\n        savePlunk()\r\n    \r\n# Delete plunk\r\napp.del \"/plunks/:id\", (req, res, next) ->\r\n  Plunk.findById(req.params.id).populate(\"user\").exec (err, plunk) ->\r\n    if err or not plunk or not ownsPlunk(req.session, plunk) then next(new apiErrors.NotFound)\r\n    else plunk.remove ->\r\n      res.send(204)\r\n      \r\nfetchUser = (req, res, next) ->\r\n  User.findOne({login: req.params.username}).exec (err, user) ->\r\n    if err or not user then next(new apiErrors.NotFound)\r\n    else\r\n      req.found_user = user\r\n      next()\r\n\r\n# Fetch a user\r\napp.get \"/users/:username\", fetchUser, (req, res, next) ->\r\n  res.json(req.found_user)\r\n\r\n# List a user's plunks\r\napp.get \"/users/:username/plunks\", fetchUser, (req, res, next) ->\r\n  options =\r\n    query: {user: req.found_user._id}\r\n    baseUrl: \"#{apiUrl}/users/#{req.params.username}/plunks\"\r\n\r\n  fetchPlunks(options, req, res, next)\r\n\r\n# List plunks a user gave a thumbs-up\r\napp.get \"/users/:username/thumbed\", fetchUser, (req, res, next) ->\r\n  options =\r\n    query: {voters: req.found_user._id}\r\n    baseUrl: \"#{apiUrl}/users/#{req.params.username}/thumbed\"\r\n\r\n  fetchPlunks(options, req, res, next)\r\n  \r\napp.get \"/tags\", (req, res, next) ->\r\n  Plunk.aggregate [\r\n    $unwind: \"$tags\"\r\n  ,\r\n    $group: _id: \"$tags\", count: { $sum: 1 }\r\n  ], (err, json) ->\r\n    if err then res.send(404, err)\r\n    else res.json(json)\r\n    \r\n# List plunks having a specific tag\r\napp.get \"/tags/:tagname/plunks\", (req, res, next) ->\r\n  options =\r\n    query: {tags: req.params.tagname}\r\n    baseUrl: \"#{apiUrl}/tags/#{req.params.tagname}/plunks\"\r\n    \r\n  fetchPlunks(options, req, res, next)\r\n  \r\n\r\n\r\ncreateSchema = gate.createSchema(require(\"./schema/packages/create.json\"))\r\nupdateSchema = gate.createSchema(require(\"./schema/packages/update.json\"))\r\n\r\n\r\nwithUser = (req, res, next) ->\r\n  unless req.user then res.send(400)\r\n  else next()\r\n\r\nwithPackage = (req, res, next) ->\r\n  Package.findOne({name: req.params.name}).select(\"-_id -versions._id\").exec (err, pkg) ->\r\n    if err then res.send(404)\r\n    else\r\n      req.package = pkg\r\n      next()\r\n      \r\n\r\npreparePackage = (session, pkg, populate = {}) ->\r\n  json = _.extend pkg.toJSON(), populate\r\n  \r\n  delete json.id\r\n  \r\n  json.editable = true if session?.user and 0 <= json.maintainers.indexOf(session.user.login)\r\n  \r\n  json.versions.sort (v1, v2) -> semver.rcompare(v1.semver, v2.semver)\r\n  \r\n  json\r\n\r\npreparePackages = (session, pkgs) -> _.map pkgs, (pkg) -> preparePackage(session, pkg)\r\n\r\napp.get \"/packages\", (req, res, next) ->\r\n  Package.find({}).select(\"-_id -versions._id\").exec (err, docs) ->\r\n    if err then res.send(err, 404)\r\n    else res.json(preparePackages(req.session, docs))\r\n    \r\n    \r\n\r\napp.post \"/packages\", withUser, (req, res, next) ->\r\n  createSchema.validate req.body, (err, json) ->\r\n    if err then res.json err, 400\r\n    else\r\n      json.maintainers = [req.user.login]\r\n      \r\n      versions = []\r\n      versions.push versionDef for version, versionDef of req.body.versions\r\n      \r\n      json.versions = versions\r\n      \r\n      Package.create json, (err, pkg) ->\r\n        if err\r\n          if err.code is 11000 then res.json \"A package with that name already exists\", 409\r\n          else res.json err.message, 500\r\n        else res.json preparePackage(req.session, pkg), 201\r\n\r\napp.get \"/packages/:name\", withPackage, (req, res, next) ->\r\n  res.json(preparePackage(req.session, req.package))\r\n\r\napp.post \"/packages/:name\", withUser, (req, res, next) ->\r\n  updateSchema.validate req.body, (err, json) ->\r\n    if err\r\n      console.log \"Invalid request\", arguments...\r\n      res.json err, 400\r\n    else\r\n      for keyword, val of json.keywords\r\n        if val is null then (json.$pullAll ||= keywords: []).keywords.push keyword\r\n        else (json.$pushAll ||= keywords: []).keywords.push keyword\r\n      \r\n      delete json.keywords\r\n      \r\n      \r\n      Package.findOneAndUpdate\r\n        name: req.params.name\r\n        maintainers: req.user.login\r\n      , json, (err, pkg) ->\r\n        if err then res.json(err, 404)\r\n        else res.json(preparePackage(req.session, pkg), 200)\r\n\r\napp.del \"/packages/:name\", withUser, (req, res, next) ->\r\n  Package.findOneAndRemove\r\n    name: req.params.name\r\n    maintainers: req.user.login\r\n  , (err, pkg) ->\r\n    if err then res.json(err, 404)\r\n    else if pkg then res.send(204)\r\n    else res.send(404)\r\n\r\n\r\napp.all \"*\", (req, res, next) ->\r\n  next new apiErrors.NotFound"
  },
  {
    "path": "servers/api/lib/database.coffee",
    "content": "mongoose = require(\"mongoose\")\nnconf = require(\"nconf\")\nmime = require(\"mime\")\nurl = require(\"url\")\nmime = require(\"mime\")\n\nmongoose.connect \"mongodb:\" + url.format(nconf.get(\"mongodb\"))\n\nconnectTimeout = setTimeout(errorConnecting, 1000 * 30)\n\napiUrl = nconf.get('url:api')\nwwwUrl = nconf.get('url:www')\nrunUrl = nconf.get('url:run')\n\nerrorConnecting = ->\n  console.error \"Error connecting to mongodb\"\n  process.exit(1)\n  \nmongoose.connection.on \"open\", -> clearTimeout(connectTimeout)\n\n{Schema, Document, Query} = mongoose\n{ObjectId} = Schema\n\ngenid = (len = 16, prefix = \"\", keyspace = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") ->\n  prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0\n  prefix\n\n\n# Change object _id to normal id\nDocument::toJSON = ->\n  json = @toObject(json: true, virtuals: true)\n  json.id = json._id if json._id\n  delete json._id\n  delete json.__v\n  \n  json\n  \nQuery::paginate = (page, limit, cb) ->\n  page = Math.max(1, parseInt(page, 10))\n  limit = Math.max(4, Math.min(12, parseInt(limit, 10))) # [4, 10]\n  query = @\n  model = @model\n  \n  query.skip(page * limit - limit).limit(limit).exec (err, docs) ->\n    if err then return cb(err, null, null)\n    model.count query._conditions, (err, count) ->\n      if err then return cb(err, null, null)\n      cb(null, docs, count, Math.ceil(count / limit), page)\n  \nlastModified = (schema, options = {}) ->\n  schema.add updated_at: Date\n  schema.pre \"save\", (next) ->\n    @updated_at = new Date\n    next()\n  \n  if options.index then schema.path(\"updated_at\").index(options.index)\n  \nTokenSchema = new Schema\n  _id: String\n  token: String\n\n\nSessionSchema = new Schema\n  user:\n    type: Schema.ObjectId\n    ref: \"User\"\n  last_access: { type: Date, index: true, 'default': Date.now }\n  public_id: { type: String, 'default': genid }\n  auth: {}\n  keychain: [TokenSchema]\n\nSessionSchema.virtual(\"url\").get -> apiUrl + \"/sessions/#{@_id}\"\nSessionSchema.virtual(\"user_url\").get -> apiUrl + \"/sessions/#{@_id}/user\"\nSessionSchema.virtual(\"age\").get -> Date.now() - @last_access\n\nSessionSchema.plugin(lastModified)\n\nSessionSchema.statics.prune = (max_age = 1000 * 60 * 60 * 24 * 7 * 2, cb = ->) ->\n  @find({}).where(\"last_access\").lt(new Date(Date.now() - max_age)).remove()\n\nmongoose.model \"Session\", SessionSchema\n\n\n\nmongoose.model \"User\", UserSchema = new Schema\n  login: { type: String, index: true }\n  gravatar_id: String\n  service_id: { type: String, index: { unique: true } }\n  profile: {}\n\n\nPlunkFileSchema = new Schema\n  filename: String\n  content: String\n  \nPlunkFileSchema.virtual(\"mime\").get -> mime.lookup(@filename, \"text/plain\")\n  \nPlunkVoteSchema = new Schema\n  user: { type: Schema.ObjectId, ref: \"User\" }\n  created_at: { type: Date, 'default': Date.now }\n\nPlunkSchema = new Schema\n  _id: { type: String, index: true }\n  description: String\n  score: { type: Number, 'default': Date.now }\n  thumbs: { type: Number, 'default': 0 }\n  created_at: { type: Date, 'default': Date.now }\n  updated_at: { type: Date, 'default': Date.now }\n  token: { type: String, 'default': genid.bind(null, 16) }\n  'private': { type: Boolean, 'default': false }\n  source: {}\n  files: [PlunkFileSchema]\n  user: { type: Schema.ObjectId, ref: \"User\", index: true }\n  comments: { type: Number, 'default': 0 }\n  fork_of: { type: String, ref: \"Plunk\", index: true }\n  forks: [{ type: String, ref: \"Plunk\", index: true }]\n  tags: [{ type: String, index: true}]\n  voters: [{ type: Schema.ObjectId, ref: \"Users\", index: true }]\n  \nPlunkSchema.index(score: -1, updated_at: -1)\nPlunkSchema.index(thumbs: -1, updated_at: -1)\n\nPlunkSchema.virtual(\"url\").get -> apiUrl + \"/plunks/#{@_id}\"\nPlunkSchema.virtual(\"raw_url\").get -> runUrl + \"/plunks/#{@_id}/\"\nPlunkSchema.virtual(\"comments_url\").get -> wwwUrl + \"/#{@_id}/comments\"\n\nmongoose.model \"Plunk\", PlunkSchema\n\n\n\nPackageVersionSchema = new Schema\n  semver: String\n  scripts: [String]\n  styles: [String]\n\nPackageSchema = new Schema\n  name: { type: String, match: /^[-_.a-z0-9]+$/i, index: true, unique: true }\n  description: { type: String }\n  homepage: String\n  keywords: [{type: String, index: true}]\n  versions: [PackageVersionSchema]\n  maintainers: [{ type: String, index: true }]\n\nmongoose.model \"Package\", PackageSchema\n\n\n\nmodule.exports = mongoose"
  },
  {
    "path": "servers/api/middleware/cache.coffee",
    "content": "module.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    res.header(\"Cache-Control\", \"no-cache\")\r\n    res.header(\"Expires\", \"0\")\r\n    \r\n    next()"
  },
  {
    "path": "servers/api/middleware/cors.coffee",
    "content": "nconf = require(\"nconf\")\n\nmodule.exports.middleware = (config = {}) ->\n  \n  valid = [nconf.get('url:www'), nconf.get('url:embed'), \"http://plnkr.co\"]\n  \n  (req, res, next) ->\n    # Just send the headers all the time. That way we won't miss the right request ;-)\n    # Other CORS middleware just wouldn't work for me\n    # TODO: Minimize these headers to only those needed at the right time\n\n    res.header(\"Access-Control-Allow-Origin\", if req.headers.origin in valid then req.headers.origin else \"*\")\n    res.header(\"Access-Control-Allow-Methods\", \"OPTIONS,GET,PUT,POST,DELETE\")\n    res.header(\"Access-Control-Allow-Headers\", \"Authorization, User-Agent, Referer, X-Requested-With, Proxy-Authorization, Proxy-Connection, Accept-Language, Accept-Encoding, Accept-Charset, Connection, Content-Length, Host, Origin, Pragma, Accept-Charset, Cache-Control, Accept, Content-Type\")\n    res.header(\"Access-Control-Expose-Headers\", \"Link\")\n    res.header(\"Access-Control-Max-Age\", \"60\")\n\n    if \"OPTIONS\" == req.method then res.send(200)\n    else next()"
  },
  {
    "path": "servers/api/middleware/json.coffee",
    "content": "apiErrors = require(\"../errors\")\r\n\r\n\r\nmodule.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    if \"GET\" == req.method or \"HEAD\" == req.method then return next()\r\n    \r\n    req.body ||= {}\r\n    \r\n    buf = '';\r\n    \r\n    req.setEncoding('utf8');\r\n    req.on \"data\", (chunk) -> buf += chunk\r\n    req.on \"end\", ->\r\n      return next() unless buf\r\n      try\r\n        req.body = JSON.parse(buf)\r\n        next()\r\n      catch err\r\n        next(new apiErrors.ParseError())"
  },
  {
    "path": "servers/api/middleware/session.coffee",
    "content": "nconf = require(\"nconf\")\r\n\r\nmodule.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    if req.query.sessid then sessid = req.query.sessid\r\n    else if auth = req.header(\"Authorization\") then [header, sessid] = auth.match(/^token (\\S+)$/i)\r\n\r\n    if sessid and sessid.length then config.sessions.findById(sessid).populate(\"user\").exec (err, session) ->\r\n      return next(err) if err\r\n      return next() unless session\r\n      return next() if Date.now() - session.last_access.valueOf() > nconf.get(\"session:max_age\")\r\n      session.last_access = new Date\r\n      session.save -> # Don't wait for the response\r\n      \r\n      req.session = session\r\n      req.user = session.user if session.user\r\n\r\n      next()\r\n    else next()"
  },
  {
    "path": "servers/api/middleware/user.coffee",
    "content": "module.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    unless req.session and req.session.user then next()\r\n    else config.users.findById req.session.user, (err, user) ->\r\n      return next(err) if err\r\n      \r\n      unless user\r\n        delete req.user\r\n        delete req.session.user\r\n      else req.user = user\r\n      \r\n      next()"
  },
  {
    "path": "servers/api/package.json",
    "content": "{\n  \"name\": \"plunker-api\",\n  \"subdomain\": \"plunker-api\",\n  \"domains\": [\n    \"api.plnkr.co\"\n  ],\n  \"scripts\": {\n    \"start\": \"server.js\"\n  },\n  \"engines\": {\n    \"node\": \"0.8.x\"\n  },\n  \"version\": \"0.3.14-27\",\n  \"private\": true,\n  \"dependencies\": {\n    \"coffee-script\": \"1.3.x\",\n    \"express\": \"2.5.11\",\n    \"mime\": \"1.2.x\",\n    \"underscore\": \"1.3.x\",\n    \"backbone\": \"0.9.x\",\n    \"nconf\": \"0.5.x\",\n    \"json-schema\": \"https://github.com/kriszyp/json-schema/tarball/master\",\n    \"request\": \"2.9.x\",\n    \"connect\": \"1.x\",\n    \"async\": \"0.1.x\",\n    \"mongoose\": \"3.4.x\",\n    \"lru-cache\": \"1.1.x\",\n    \"json-gate\": \"0.8.x\",\n    \"semver\": \"1.1.x\"\n  }\n}"
  },
  {
    "path": "servers/api/schema/packages/create.json",
    "content": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"name\": {\r\n      \"type\": \"string\",\r\n      \"required\": true\r\n    },\r\n    \"description\": {\r\n      \"type\": \"string\",\r\n      \"default\": \"\"\r\n    },\r\n    \"homepage\": {\r\n      \"type\": \"string\",\r\n      \"default\": \"\"\r\n    },\r\n    \"keywords\": {\r\n      \"type\": \"array\",\r\n      \"additionalItems\": false,\r\n      \"uniqueItems\": true,\r\n      \"items\": {\r\n        \"type\": \"string\"\r\n      }\r\n    },\r\n    \"versions\": {\r\n      \"required\": true,\r\n      \"type\": \"object\",\r\n      \"additionalProperties\": false,\r\n      \"patternProperties\": {\r\n        \"^(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)(?:-([0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*))?(?:\\\\+([0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*))?$\": {\r\n          \"type\": \"object\",\r\n          \"required\": true,\r\n          \"additionalProperties\": false,\r\n          \"properties\": {\r\n            \"semver\": {\r\n              \"type\": \"string\",\r\n              \"required\": true,\r\n              \"pattern\": \"^(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)(?:-([0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*))?(?:\\\\+([0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*))?$\"\r\n            },\r\n            \"scripts\": {\r\n              \"type\": \"array\",\r\n              \"items\": {\r\n                \"type\": \"string\"\r\n              }\r\n            },\r\n            \"styles\": {\r\n              \"type\": \"array\",\r\n              \"items\": {\r\n                \"type\": \"string\"\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}"
  },
  {
    "path": "servers/api/schema/packages/update.json",
    "content": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"name\": {\r\n      \"type\": \"string\"\r\n    },\r\n    \"description\": {\r\n      \"type\": \"string\",\r\n      \"default\": \"\"\r\n    },\r\n    \"homepage\": {\r\n      \"type\": \"string\",\r\n      \"default\": \"\"\r\n    },\r\n    \"keywords\": {\r\n      \"type\": \"object\",\r\n      \"additionalProperties\": false,\r\n      \"patternProperties\": {\r\n        \"^(.+)?$\": {\r\n          \"type\": \"boolean\",\r\n          \"required\": true\r\n        }\r\n      }\r\n    }\r\n  }\r\n}"
  },
  {
    "path": "servers/api/schema/plunks/create.json",
    "content": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"description\": {\r\n      \"type\": \"string\",\r\n      \"default\": \"\"\r\n    },\r\n    \"tags\": {\r\n      \"type\": \"array\",\r\n      \"additionalItems\": false,\r\n      \"uniqueItems\": true,\r\n      \"items\": {\r\n        \"type\": \"string\"\r\n      }\r\n    },\r\n    \"private\": {\r\n      \"type\": \"boolean\",\r\n      \"default\": false\r\n    },\r\n    \"source\": {\r\n      \"type\": [\r\n        {\r\n          \"type\": \"null\"\r\n        }, {\r\n          \"type\": \"object\",\r\n          \"properties\": {\r\n            \"type\": {\r\n              \"type\": \"string\",\r\n              \"required\": true,\r\n              \"enum\": [ \"plunker_no_de\", \"gist\" ]\r\n            },\r\n            \"url\": {\r\n              \"type\": \"string\",\r\n              \"required\": true\r\n            },\r\n            \"title\": {\r\n              \"type\": \"string\",\r\n              \"required\": true\r\n            },\r\n            \"description\": {\r\n              \"type\": \"string\"\r\n            }\r\n          }\r\n        }\r\n      ]\r\n    },\r\n    \"files\": {\r\n      \"required\": true,\r\n      \"type\": \"object\",\r\n      \"additionalProperties\": false,\r\n      \"patternProperties\": {\r\n        \"^[a-zA-z0-9_-]+(\\\\.[a-zA-Z0-9]+)?$\": {\r\n          \"type\": \"object\",\r\n          \"properties\": {\r\n            \"content\": {\r\n              \"type\": \"string\",\r\n              \"required\": true\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}"
  },
  {
    "path": "servers/api/schema/plunks/update.json",
    "content": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"minProperties\": 1,\r\n  \"properties\": {\r\n    \"description\": {\r\n      \"type\": \"string\",\r\n      \"default\": \"\"\r\n    },\r\n    \"tags\": {\r\n      \"type\": \"object\",\r\n      \"additionalProperties\": false,\r\n      \"patternProperties\": {\r\n        \"^[a-zA-Z0-9_][-a-zA-Z0-9_ :]*$\": {\r\n          \"type\": \"boolean\"\r\n        }\r\n      }\r\n    },\r\n    \"files\": {\r\n      \"type\": \"object\",\r\n      \"additionalProperties\": false,\r\n      \"patternProperties\": {\r\n        \"^[-a-zA-Z0-9_]+(\\\\.[a-zA-Z0-9]+)?$\": {\r\n          \"type\": [\r\n            {\r\n              \"type\": \"null\"\r\n            }, {\r\n              \"type\": \"object\",\r\n              \"properties\": {\r\n                \"filename\": {\r\n                  \"type\": \"string\"\r\n                },\r\n                \"content\": {\r\n                  \"type\": \"string\"\r\n                }\r\n              },\r\n              \"minProperties\": 1\r\n            }\r\n          ]\r\n        }\r\n      }\r\n    }\r\n  }\r\n}"
  },
  {
    "path": "servers/api/server.js",
    "content": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\nvar nconf = require(\"nconf\").use(\"memory\")\r\n  .argv()\r\n  .env()\r\n  .file({file: \"config.json\"})\r\n  .defaults({\r\n    \"PORT\": 8080\r\n  });\r\n\r\nif (!nconf.get(\"host\")) {\r\n  console.error(\"The host option is required for Plunker to start\");\r\n} else {\r\n  \r\n  //process.env.NODE_ENV = \"production\";\r\n\r\n  var host = nconf.get(\"host\");\r\n\r\n  // Configure global paths\r\n  if (nconf.get(\"nosubdomains\")) {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://\" + host + \"/raw\");\r\n    nconf.set(\"url:run\", \"http://\" + host + \"/run\");\r\n    nconf.set(\"url:api\", \"http://\" + host + \"/api\");\r\n  } else {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://raw.\" + host);\r\n    nconf.set(\"url:run\", \"http://run.\" + host);\r\n    nconf.set(\"url:api\", \"http://api.\" + host);\r\n  }\r\n  \r\n  // Create and start the parent server\r\n  require(\"./index\").listen(nconf.get(\"PORT\"));\r\n  \r\n  console.log(\"Started plunker-www in\", nconf.get(\"NODE_ENV\") || \"development\", \"at\", nconf.get(\"host\"), \"on port\", nconf.get(\"PORT\"), \"using subdomains:\", !nconf.get(\"nosubdomains\"));\r\n}\r\n"
  },
  {
    "path": "servers/embed/.gitignore",
    "content": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r\n.c9revisions\r\n\r\nbuiltAssets"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-affix.js",
    "content": "/* ==========================================================\n * bootstrap-affix.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#affix\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* AFFIX CLASS DEFINITION\n  * ====================== */\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n      'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n      'top'    : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n\n /* AFFIX PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n\n /* AFFIX DATA-API\n  * ============== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-alert.js",
    "content": "/* ==========================================================\n * bootstrap-alert.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#alerts\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* ALERT CLASS DEFINITION\n  * ====================== */\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n    , Alert = function (el) {\n        $(el).on('click', dismiss, this.close)\n      }\n\n  Alert.prototype.close = function (e) {\n    var $this = $(this)\n      , selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n\n    e && e.preventDefault()\n\n    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())\n\n    $parent.trigger(e = $.Event('close'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent\n        .trigger('closed')\n        .remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent.on($.support.transition.end, removeElement) :\n      removeElement()\n  }\n\n\n /* ALERT PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('alert')\n      if (!data) $this.data('alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n /* ALERT DATA-API\n  * ============== */\n\n  $(function () {\n    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-all.js",
    "content": "//= require bootstrap-transition\r\n//= require bootstrap-button\r\n//= require bootstrap-dropdown"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-button.js",
    "content": "/* ============================================================\n * bootstrap-button.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#buttons\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* BUTTON PUBLIC CLASS DEFINITION\n  * ============================== */\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.button.defaults, options)\n  }\n\n  Button.prototype.setState = function (state) {\n    var d = 'disabled'\n      , $el = this.$element\n      , data = $el.data()\n      , val = $el.is('input') ? 'val' : 'html'\n\n    state = state + 'Text'\n    data.resetText || $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d)\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.parent('[data-toggle=\"buttons-radio\"]')\n\n    $parent && $parent\n      .find('.active')\n      .removeClass('active')\n\n    this.$element.toggleClass('active')\n  }\n\n\n /* BUTTON PLUGIN DEFINITION\n  * ======================== */\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('button')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('button', (data = new Button(this, options)))\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.defaults = {\n    loadingText: 'loading...'\n  }\n\n  $.fn.button.Constructor = Button\n\n\n /* BUTTON DATA-API\n  * =============== */\n\n  $(function () {\n    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      $btn.button('toggle')\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-carousel.js",
    "content": "/* ==========================================================\n * bootstrap-carousel.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#carousel\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* CAROUSEL CLASS DEFINITION\n  * ========================= */\n\n  var Carousel = function (element, options) {\n    this.$element = $(element)\n    this.options = options\n    this.options.slide && this.slide(this.options.slide)\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.prototype = {\n\n    cycle: function (e) {\n      if (!e) this.paused = false\n      this.options.interval\n        && !this.paused\n        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n      return this\n    }\n\n  , to: function (pos) {\n      var $active = this.$element.find('.item.active')\n        , children = $active.parent().children()\n        , activePos = children.index($active)\n        , that = this\n\n      if (pos > (children.length - 1) || pos < 0) return\n\n      if (this.sliding) {\n        return this.$element.one('slid', function () {\n          that.to(pos)\n        })\n      }\n\n      if (activePos == pos) {\n        return this.pause().cycle()\n      }\n\n      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))\n    }\n\n  , pause: function (e) {\n      if (!e) this.paused = true\n      if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n        this.$element.trigger($.support.transition.end)\n        this.cycle()\n      }\n      clearInterval(this.interval)\n      this.interval = null\n      return this\n    }\n\n  , next: function () {\n      if (this.sliding) return\n      return this.slide('next')\n    }\n\n  , prev: function () {\n      if (this.sliding) return\n      return this.slide('prev')\n    }\n\n  , slide: function (type, next) {\n      var $active = this.$element.find('.item.active')\n        , $next = next || $active[type]()\n        , isCycling = this.interval\n        , direction = type == 'next' ? 'left' : 'right'\n        , fallback  = type == 'next' ? 'first' : 'last'\n        , that = this\n        , e = $.Event('slide', {\n            relatedTarget: $next[0]\n          })\n\n      this.sliding = true\n\n      isCycling && this.pause()\n\n      $next = $next.length ? $next : this.$element.find('.item')[fallback]()\n\n      if ($next.hasClass('active')) return\n\n      if ($.support.transition && this.$element.hasClass('slide')) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $next.addClass(type)\n        $next[0].offsetWidth // force reflow\n        $active.addClass(direction)\n        $next.addClass(direction)\n        this.$element.one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n      } else {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $active.removeClass('active')\n        $next.addClass('active')\n        this.sliding = false\n        this.$element.trigger('slid')\n      }\n\n      isCycling && this.cycle()\n\n      return this\n    }\n\n  }\n\n\n /* CAROUSEL PLUGIN DEFINITION\n  * ========================== */\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('carousel')\n        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)\n        , action = typeof option == 'string' ? option : options.slide\n      if (!data) $this.data('carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.cycle()\n    })\n  }\n\n  $.fn.carousel.defaults = {\n    interval: 5000\n  , pause: 'hover'\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n /* CAROUSEL DATA-API\n  * ================= */\n\n  $(function () {\n    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {\n      var $this = $(this), href\n        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())\n      $target.carousel(options)\n      e.preventDefault()\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-collapse.js",
    "content": "/* =============================================================\n * bootstrap-collapse.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#collapse\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* COLLAPSE PUBLIC CLASS DEFINITION\n  * ================================ */\n\n  var Collapse = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.collapse.defaults, options)\n\n    if (this.options.parent) {\n      this.$parent = $(this.options.parent)\n    }\n\n    this.options.toggle && this.toggle()\n  }\n\n  Collapse.prototype = {\n\n    constructor: Collapse\n\n  , dimension: function () {\n      var hasWidth = this.$element.hasClass('width')\n      return hasWidth ? 'width' : 'height'\n    }\n\n  , show: function () {\n      var dimension\n        , scroll\n        , actives\n        , hasData\n\n      if (this.transitioning) return\n\n      dimension = this.dimension()\n      scroll = $.camelCase(['scroll', dimension].join('-'))\n      actives = this.$parent && this.$parent.find('> .accordion-group > .in')\n\n      if (actives && actives.length) {\n        hasData = actives.data('collapse')\n        if (hasData && hasData.transitioning) return\n        actives.collapse('hide')\n        hasData || actives.data('collapse', null)\n      }\n\n      this.$element[dimension](0)\n      this.transition('addClass', $.Event('show'), 'shown')\n      $.support.transition && this.$element[dimension](this.$element[0][scroll])\n    }\n\n  , hide: function () {\n      var dimension\n      if (this.transitioning) return\n      dimension = this.dimension()\n      this.reset(this.$element[dimension]())\n      this.transition('removeClass', $.Event('hide'), 'hidden')\n      this.$element[dimension](0)\n    }\n\n  , reset: function (size) {\n      var dimension = this.dimension()\n\n      this.$element\n        .removeClass('collapse')\n        [dimension](size || 'auto')\n        [0].offsetWidth\n\n      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')\n\n      return this\n    }\n\n  , transition: function (method, startEvent, completeEvent) {\n      var that = this\n        , complete = function () {\n            if (startEvent.type == 'show') that.reset()\n            that.transitioning = 0\n            that.$element.trigger(completeEvent)\n          }\n\n      this.$element.trigger(startEvent)\n\n      if (startEvent.isDefaultPrevented()) return\n\n      this.transitioning = 1\n\n      this.$element[method]('in')\n\n      $.support.transition && this.$element.hasClass('collapse') ?\n        this.$element.one($.support.transition.end, complete) :\n        complete()\n    }\n\n  , toggle: function () {\n      this[this.$element.hasClass('in') ? 'hide' : 'show']()\n    }\n\n  }\n\n\n /* COLLAPSIBLE PLUGIN DEFINITION\n  * ============================== */\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('collapse')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.defaults = {\n    toggle: true\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n /* COLLAPSIBLE DATA-API\n  * ==================== */\n\n  $(function () {\n    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {\n      var $this = $(this), href\n        , target = $this.attr('data-target')\n          || e.preventDefault()\n          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n        , option = $(target).data('collapse') ? 'toggle' : $this.data()\n      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n      $(target).collapse(option)\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-dropdown.js",
    "content": "/* ============================================================\n * bootstrap-dropdown.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#dropdowns\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        $parent.toggleClass('open')\n        $this.focus()\n      }\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()\n\n      $items = $('[role=menu] li:not(.divider) a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    getParent($(toggle))\n      .removeClass('open')\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n    $parent.length || ($parent = $this.parent())\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(function () {\n    $('html')\n      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)\n    $('body')\n      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown', function (e) { e.stopPropagation() })\n      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-modal.js",
    "content": "/* =========================================================\n * bootstrap-modal.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#modals\n * =========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        $('body').addClass('modal-open')\n\n        this.isShown = true\n\n        this.escape()\n\n        this.backdrop(function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element\n            .show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element\n            .addClass('in')\n            .attr('aria-hidden', false)\n            .focus()\n\n          that.enforceFocus()\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :\n            that.$element.trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        $('body').removeClass('modal-open')\n\n        this.escape()\n\n        $(document).off('focusin.modal')\n\n        this.$element\n          .removeClass('in')\n          .attr('aria-hidden', true)\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.hideWithTransition() :\n          this.hideModal()\n      }\n\n    , enforceFocus: function () {\n        var that = this\n        $(document).on('focusin.modal', function (e) {\n          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n            that.$element.focus()\n          }\n        })\n      }\n\n    , escape: function () {\n        var that = this\n        if (this.isShown && this.options.keyboard) {\n          this.$element.on('keyup.dismiss.modal', function ( e ) {\n            e.which == 27 && that.hide()\n          })\n        } else if (!this.isShown) {\n          this.$element.off('keyup.dismiss.modal')\n        }\n      }\n\n    , hideWithTransition: function () {\n        var that = this\n          , timeout = setTimeout(function () {\n              that.$element.off($.support.transition.end)\n              that.hideModal()\n            }, 500)\n\n        this.$element.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          that.hideModal()\n        })\n      }\n\n    , hideModal: function (that) {\n        this.$element\n          .hide()\n          .trigger('hidden')\n\n        this.backdrop()\n      }\n\n    , removeBackdrop: function () {\n        this.$backdrop.remove()\n        this.$backdrop = null\n      }\n\n    , backdrop: function (callback) {\n        var that = this\n          , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n        if (this.isShown && this.options.backdrop) {\n          var doAnimate = $.support.transition && animate\n\n          this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n            .appendTo(document.body)\n\n          if (this.options.backdrop != 'static') {\n            this.$backdrop.click($.proxy(this.hide, this))\n          }\n\n          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n          this.$backdrop.addClass('in')\n\n          doAnimate ?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (!this.isShown && this.$backdrop) {\n          this.$backdrop.removeClass('in')\n\n          $.support.transition && this.$element.hasClass('fade')?\n            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :\n            this.removeBackdrop()\n\n        } else if (callback) {\n          callback()\n        }\n      }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(function () {\n    $('body').on('click.modal.data-api', '[data-toggle=\"modal\"]', function ( e ) {\n      var $this = $(this)\n        , href = $this.attr('href')\n        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n      e.preventDefault()\n\n      $target\n        .modal(option)\n        .one('hide', function () {\n          $this.focus()\n        })\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-popover.js",
    "content": "/* ===========================================================\n * bootstrap-popover.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#popovers\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* POPOVER PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n\n  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js\n     ========================================== */\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {\n\n    constructor: Popover\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n        , content = this.getContent()\n\n      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)\n\n      $tip.removeClass('fade top bottom left right in')\n    }\n\n  , hasContent: function () {\n      return this.getTitle() || this.getContent()\n    }\n\n  , getContent: function () {\n      var content\n        , $e = this.$element\n        , o = this.options\n\n      content = $e.attr('data-content')\n        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)\n\n      return content\n    }\n\n  , tip: function () {\n      if (!this.$tip) {\n        this.$tip = $(this.options.template)\n      }\n      return this.$tip\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  })\n\n\n /* POPOVER PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('popover')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><div class=\"popover-inner\"><h3 class=\"popover-title\"></h3><div class=\"popover-content\"><p></p></div></div></div>'\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-scrollspy.js",
    "content": "/* =============================================================\n * bootstrap-scrollspy.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#scrollspy\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* SCROLLSPY CLASS DEFINITION\n  * ========================== */\n\n  function ScrollSpy(element, options) {\n    var process = $.proxy(this.process, this)\n      , $element = $(element).is('body') ? $(window) : $(element)\n      , href\n    this.options = $.extend({}, $.fn.scrollspy.defaults, options)\n    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)\n    this.selector = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.$body = $('body')\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.prototype = {\n\n      constructor: ScrollSpy\n\n    , refresh: function () {\n        var self = this\n          , $targets\n\n        this.offsets = $([])\n        this.targets = $([])\n\n        $targets = this.$body\n          .find(this.selector)\n          .map(function () {\n            var $el = $(this)\n              , href = $el.data('target') || $el.attr('href')\n              , $href = /^#\\w/.test(href) && $(href)\n            return ( $href\n              && $href.length\n              && [[ $href.position().top, href ]] ) || null\n          })\n          .sort(function (a, b) { return a[0] - b[0] })\n          .each(function () {\n            self.offsets.push(this[0])\n            self.targets.push(this[1])\n          })\n      }\n\n    , process: function () {\n        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset\n          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n          , maxScroll = scrollHeight - this.$scrollElement.height()\n          , offsets = this.offsets\n          , targets = this.targets\n          , activeTarget = this.activeTarget\n          , i\n\n        if (scrollTop >= maxScroll) {\n          return activeTarget != (i = targets.last()[0])\n            && this.activate ( i )\n        }\n\n        for (i = offsets.length; i--;) {\n          activeTarget != targets[i]\n            && scrollTop >= offsets[i]\n            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n            && this.activate( targets[i] )\n        }\n      }\n\n    , activate: function (target) {\n        var active\n          , selector\n\n        this.activeTarget = target\n\n        $(this.selector)\n          .parent('.active')\n          .removeClass('active')\n\n        selector = this.selector\n          + '[data-target=\"' + target + '\"],'\n          + this.selector + '[href=\"' + target + '\"]'\n\n        active = $(selector)\n          .parent('li')\n          .addClass('active')\n\n        if (active.parent('.dropdown-menu').length)  {\n          active = active.closest('li.dropdown').addClass('active')\n        }\n\n        active.trigger('activate')\n      }\n\n  }\n\n\n /* SCROLLSPY PLUGIN DEFINITION\n  * =========================== */\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('scrollspy')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n  $.fn.scrollspy.defaults = {\n    offset: 10\n  }\n\n\n /* SCROLLSPY DATA-API\n  * ================== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-tab.js",
    "content": "/* ========================================================\n * bootstrap-tab.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#tabs\n * ========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TAB CLASS DEFINITION\n  * ==================== */\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n  , show: function () {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ( $this.parent('li').hasClass('active') ) return\n\n      previous = $ul.find('.active a').last()[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function () {\n        $this.trigger({\n          type: 'shown'\n        , relatedTarget: previous\n        })\n      })\n    }\n\n  , activate: function ( element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n            && $.support.transition\n            && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if ( element.parent('.dropdown-menu') ) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n\n /* TAB PLUGIN DEFINITION\n  * ===================== */\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n /* TAB DATA-API\n  * ============ */\n\n  $(function () {\n    $('body').on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n      e.preventDefault()\n      $(this).tab('show')\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-tooltip.js",
    "content": "/* ===========================================================\n * bootstrap-tooltip.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TOOLTIP PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Tooltip = function (element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n  , init: function (type, element, options) {\n      var eventIn\n        , eventOut\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      if (this.options.trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (this.options.trigger != 'manual') {\n        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'\n        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'\n        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n  , getOptions: function (options) {\n      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n        , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n  , enter: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n  , leave: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n  , show: function () {\n      var $tip\n        , inside\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n\n      if (this.hasContent() && this.enabled) {\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        inside = /in/.test(placement)\n\n        $tip\n          .remove()\n          .css({ top: 0, left: 0, display: 'block' })\n          .appendTo(inside ? this.$element : document.body)\n\n        pos = this.getPosition(inside)\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (inside ? placement.split(' ')[1] : placement) {\n          case 'bottom':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'top':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'left':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}\n            break\n          case 'right':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}\n            break\n        }\n\n        $tip\n          .css(tp)\n          .addClass(placement)\n          .addClass('in')\n      }\n    }\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n  , hide: function () {\n      var that = this\n        , $tip = this.tip()\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function () {\n          $tip.off($.support.transition.end).remove()\n        }, 500)\n\n        $tip.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          $tip.remove()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.remove()\n\n      return this\n    }\n\n  , fixTitle: function () {\n      var $e = this.$element\n      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')\n      }\n    }\n\n  , hasContent: function () {\n      return this.getTitle()\n    }\n\n  , getPosition: function (inside) {\n      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {\n        width: this.$element[0].offsetWidth\n      , height: this.$element[0].offsetHeight\n      })\n    }\n\n  , getTitle: function () {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n      return title\n    }\n\n  , tip: function () {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n  , validate: function () {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n  , enable: function () {\n      this.enabled = true\n    }\n\n  , disable: function () {\n      this.enabled = false\n    }\n\n  , toggleEnabled: function () {\n      this.enabled = !this.enabled\n    }\n\n  , toggle: function () {\n      this[this.tip().hasClass('in') ? 'hide' : 'show']()\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n\n /* TOOLTIP PLUGIN DEFINITION\n  * ========================= */\n\n  $.fn.tooltip = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover'\n  , title: ''\n  , delay: 0\n  , html: true\n  }\n\n}(window.jQuery);\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-transition.js",
    "content": "/* ===================================================\n * bootstrap-transition.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#transitions\n * ===================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  $(function () {\n\n    \"use strict\"; // jshint ;_;\n\n\n    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n     * ======================================================= */\n\n    $.support.transition = (function () {\n\n      var transitionEnd = (function () {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n               'WebkitTransition' : 'webkitTransitionEnd'\n            ,  'MozTransition'    : 'transitionend'\n            ,  'OTransition'      : 'oTransitionEnd otransitionend'\n            ,  'transition'       : 'transitionend'\n            }\n          , name\n\n        for (name in transEndEventNames){\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/embed/assets/bootstrap/js/bootstrap-typeahead.js",
    "content": "/* =============================================================\n * bootstrap-typeahead.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#typeahead\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function($){\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TYPEAHEAD PUBLIC CLASS DEFINITION\n  * ================================= */\n\n  var Typeahead = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.$menu = $(this.options.menu).appendTo('body')\n    this.source = this.options.source\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n  , select: function () {\n      var val = this.$menu.find('.active').attr('data-value')\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n  , updater: function (item) {\n      return item\n    }\n\n  , show: function () {\n      var pos = $.extend({}, this.$element.offset(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu.css({\n        top: pos.top + pos.height\n      , left: pos.left\n      })\n\n      this.$menu.show()\n      this.shown = true\n      return this\n    }\n\n  , hide: function () {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n  , lookup: function (event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n  , process: function (items) {\n      var that = this\n\n      items = $.grep(items, function (item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n  , matcher: function (item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n  , sorter: function (items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n  , highlighter: function (item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {\n        return '<strong>' + match + '</strong>'\n      })\n    }\n\n  , render: function (items) {\n      var that = this\n\n      items = $(items).map(function (i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n  , next: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n  , prev: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n  , listen: function () {\n      this.$element\n        .on('blur',     $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup',    $.proxy(this.keyup, this))\n\n      if ($.browser.webkit || $.browser.msie) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n    }\n\n  , move: function (e) {\n      if (!this.shown) return\n\n      switch(e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n  , keydown: function (e) {\n      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])\n      this.move(e)\n    }\n\n  , keypress: function (e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n  , keyup: function (e) {\n      switch(e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup()\n      }\n\n      e.stopPropagation()\n      e.preventDefault()\n  }\n\n  , blur: function (e) {\n      var that = this\n      setTimeout(function () { that.hide() }, 150)\n    }\n\n  , click: function (e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n    }\n\n  , mouseenter: function (e) {\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n  }\n\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  $.fn.typeahead = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n  , items: 8\n  , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n  , item: '<li><a href=\"#\"></a></li>'\n  , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n\n /*   TYPEAHEAD DATA-API\n  * ================== */\n\n  $(function () {\n    $('body').on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function (e) {\n      var $this = $(this)\n      if ($this.data('typeahead')) return\n      e.preventDefault()\n      $this.typeahead($this.data())\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/accordion.less",
    "content": "//\n// Accordion\n// --------------------------------------------------\n\n\n// Parent container\n.accordion {\n  margin-bottom: @baseLineHeight;\n}\n\n// Group == heading + body\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  .border-radius(4px);\n}\n.accordion-heading {\n  border-bottom: 0;\n}\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n\n// General toggle styles\n.accordion-toggle {\n  cursor: pointer;\n}\n\n// Inner needs the styles because you can't animate properly with any styles on the element\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: @baseLineHeight;\n  text-shadow: 0 1px 0 rgba(255,255,255,.5);\n  background-color: @warningBackground;\n  border: 1px solid @warningBorder;\n  .border-radius(4px);\n  color: @warningText;\n}\n.alert h4 {\n  margin: 0;\n}\n\n// Adjust close link position\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: @baseLineHeight;\n}\n\n\n// Alternate styles\n// -------------------------\n\n.alert-success {\n  background-color: @successBackground;\n  border-color: @successBorder;\n  color: @successText;\n}\n.alert-danger,\n.alert-error {\n  background-color: @errorBackground;\n  border-color: @errorBorder;\n  color: @errorText;\n}\n.alert-info {\n  background-color: @infoBackground;\n  border-color: @infoBorder;\n  color: @infoText;\n}\n\n\n// Block alerts\n// -------------------------\n\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n.alert-block p + p {\n  margin-top: 5px;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/bootstrap.less",
    "content": "/*!\n * Bootstrap v2.1.0\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n// CSS Reset\n@import \"reset.less\";\n\n// Core variables and mixins\n@import \"variables.less\"; // Modify this for custom colors, font-sizes, etc\n@import \"mixins.less\";\n\n// Grid system and page structure\n@import \"scaffolding.less\";\n@import \"grid.less\";\n@import \"layouts.less\";\n\n// Base CSS\n@import \"type.less\";\n@import \"code.less\";\n@import \"forms.less\";\n@import \"tables.less\";\n\n// Components: common\n@import \"font-awesome.less\";\n@import \"dropdowns.less\";\n@import \"wells.less\";\n@import \"component-animations.less\";\n@import \"close.less\";\n\n// Components: Buttons & Alerts\n@import \"buttons.less\";\n@import \"button-groups.less\";\n@import \"alerts.less\"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less\n\n// Components: Nav\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n\n// Components: Popovers\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n\n// Components: Misc\n@import \"thumbnails.less\";\n@import \"labels-badges.less\";\n@import \"progress-bars.less\";\n@import \"accordion.less\";\n@import \"carousel.less\";\n@import \"hero-unit.less\";\n\n// Utility classes\n@import \"utilities.less\"; // Has to be last to override when necessary\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 @baseLineHeight;\n  list-style: none;\n  background-color: #f5f5f5;\n  .border-radius(4px);\n  li {\n    display: inline-block;\n    .ie7-inline-block();\n    text-shadow: 0 1px 0 @white;\n  }\n  .divider {\n    padding: 0 5px;\n    color: #ccc;\n  }\n  .active {\n    color: @grayLight;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n\n// Make the div behave like a button\n.btn-group {\n  position: relative;\n  font-size: 0; // remove as part 1 of font-size inline-block hack\n  white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)\n  .ie7-restore-left-whitespace();\n}\n\n// Space out series of button groups\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  font-size: 0; // Hack to remove whitespace that results from using inline-block\n  margin-top: @baseLineHeight / 2;\n  margin-bottom: @baseLineHeight / 2;\n  .btn-group {\n    display: inline-block;\n    .ie7-inline-block();\n  }\n  .btn + .btn,\n  .btn-group + .btn,\n  .btn + .btn-group {\n    margin-left: 5px;\n  }\n}\n\n// Float them, remove border radius, then re-add to first and last elements\n.btn-group > .btn {\n  position: relative;\n  .border-radius(0);\n}\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n.btn-group > .btn,\n.btn-group > .dropdown-menu {\n  font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack\n}\n\n// Reset fonts for other sizes\n.btn-group > .btn-mini {\n  font-size: 11px;\n}\n.btn-group > .btn-small {\n  font-size: 12px;\n}\n.btn-group > .btn-large {\n  font-size: 16px;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n     -webkit-border-top-left-radius: 4px;\n         -moz-border-radius-topleft: 4px;\n             border-top-left-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n      -moz-border-radius-bottomleft: 4px;\n          border-bottom-left-radius: 4px;\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n     -webkit-border-top-right-radius: 4px;\n         -moz-border-radius-topright: 4px;\n             border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n      -moz-border-radius-bottomright: 4px;\n          border-bottom-right-radius: 4px;\n}\n// Reset corners for large buttons\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n     -webkit-border-top-left-radius: 6px;\n         -moz-border-radius-topleft: 6px;\n             border-top-left-radius: 6px;\n  -webkit-border-bottom-left-radius: 6px;\n      -moz-border-radius-bottomleft: 6px;\n          border-bottom-left-radius: 6px;\n}\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n     -webkit-border-top-right-radius: 6px;\n         -moz-border-radius-topright: 6px;\n             border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n      -moz-border-radius-bottomright: 6px;\n          border-bottom-right-radius: 6px;\n}\n\n// On hover/focus/active, bring the proper btn to front\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n  .box-shadow(~\"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)\");\n  *padding-top: 5px;\n  *padding-bottom: 5px;\n}\n.btn-group > .btn-mini + .dropdown-toggle {\n  padding-left: 5px;\n  padding-right: 5px;\n  *padding-top: 2px;\n  *padding-bottom: 2px;\n}\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n.btn-group > .btn-large + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n\n.btn-group.open {\n\n  // The clickable button for toggling the menu\n  // Remove the gradient and set the same inset shadow as the :active state\n  .dropdown-toggle {\n    background-image: none;\n    .box-shadow(~\"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)\");\n  }\n\n  // Keep the hover's background when dropdown is open\n  .btn.dropdown-toggle {\n    background-color: @btnBackgroundHighlight;\n  }\n  .btn-primary.dropdown-toggle {\n    background-color: @btnPrimaryBackgroundHighlight;\n  }\n  .btn-warning.dropdown-toggle {\n    background-color: @btnWarningBackgroundHighlight;\n  }\n  .btn-danger.dropdown-toggle {\n    background-color: @btnDangerBackgroundHighlight;\n  }\n  .btn-success.dropdown-toggle {\n    background-color: @btnSuccessBackgroundHighlight;\n  }\n  .btn-info.dropdown-toggle {\n    background-color: @btnInfoBackgroundHighlight;\n  }\n  .btn-inverse.dropdown-toggle {\n    background-color: @btnInverseBackgroundHighlight;\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-mini .caret,\n.btn-small .caret,\n.btn-large .caret {\n  margin-top: 6px;\n}\n.btn-large .caret {\n  border-left-width:  5px;\n  border-right-width: 5px;\n  border-top-width:   5px;\n}\n// Upside down carets for .dropup\n.dropup .btn-large .caret {\n  border-bottom: 5px solid @black;\n  border-top: 0;\n}\n\n\n\n// Account for other colors\n.btn-primary,\n.btn-warning,\n.btn-danger,\n.btn-info,\n.btn-success,\n.btn-inverse {\n  .caret {\n    border-top-color: @white;\n    border-bottom-color: @white;\n  }\n}\n\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  display: inline-block; // makes buttons only take up the width they need\n  .ie7-inline-block();\n}\n.btn-group-vertical .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  .border-radius(0);\n}\n.btn-group-vertical .btn + .btn {\n  margin-left: 0;\n  margin-top: -1px;\n}\n.btn-group-vertical .btn:first-child {\n  .border-radius(4px 4px 0 0);\n}\n.btn-group-vertical .btn:last-child {\n  .border-radius(0 0 4px 4px);\n}\n.btn-group-vertical .btn-large:first-child {\n  .border-radius(6px 6px 0 0);\n}\n.btn-group-vertical .btn-large:last-child {\n  .border-radius(0 0 6px 6px);\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n// Core\n.btn {\n  display: inline-block;\n  .ie7-inline-block();\n  padding: 4px 14px;\n  margin-bottom: 0; // For input.btn\n  font-size: @baseFontSize;\n  line-height: @baseLineHeight;\n  *line-height: @baseLineHeight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));\n  border: 1px solid @btnBorder;\n  *border: 0; // Remove the border to prevent IE7's black border on input:focus\n  border-bottom-color: darken(@btnBorder, 10%);\n  .border-radius(4px);\n  .ie7-restore-left-whitespace(); // Give IE7 some love\n  .box-shadow(~\"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)\");\n\n  // Hover state\n  &:hover {\n    color: @grayDark;\n    text-decoration: none;\n    background-color: darken(@white, 10%);\n    *background-color: darken(@white, 15%); /* Buttons in IE7 don't get borders, so darken on hover */\n    background-position: 0 -15px;\n\n    // transition is only when going to hover, otherwise the background\n    // behind the gradient (there for IE<=9 fallback) gets mismatched\n    .transition(background-position .1s linear);\n  }\n\n  // Focus state for keyboard and accessibility\n  &:focus {\n    .tab-focus();\n  }\n\n  // Active state\n  &.active,\n  &:active {\n    background-color: darken(@white, 10%);\n    background-color: darken(@white, 15%) e(\"\\9\");\n    background-image: none;\n    outline: 0;\n    .box-shadow(~\"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)\");\n  }\n\n  // Disabled state\n  &.disabled,\n  &[disabled] {\n    cursor: default;\n    background-color: darken(@white, 10%);\n    background-image: none;\n    .opacity(65);\n    .box-shadow(none);\n  }\n\n}\n\n\n\n// Button Sizes\n// --------------------------------------------------\n\n// Large\n.btn-large {\n  padding: 9px 14px;\n  font-size: @baseFontSize + 2px;\n  line-height: normal;\n  .border-radius(5px);\n}\n.btn-large [class^=\"icon-\"] {\n  margin-top: 2px;\n}\n\n// Small\n.btn-small {\n  padding: 3px 9px;\n  font-size: @baseFontSize - 2px;\n  line-height: @baseLineHeight - 2px;\n}\n.btn-small [class^=\"icon-\"] {\n  margin-top: 0;\n}\n\n// Mini\n.btn-mini {\n  padding: 2px 6px;\n  font-size: @baseFontSize - 3px;\n  line-height: @baseLineHeight - 4px;\n}\n\n// Block button\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n  .box-sizing(border-box);\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n// Provide *some* extra contrast for those who can get it\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255,255,255,.75);\n}\n\n// Set the backgrounds\n// -------------------------\n.btn {\n  // reset here as of 2.0.3 due to Recess property order\n  border-color: #c5c5c5;\n  border-color: rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25);\n}\n.btn-primary {\n  .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);\n}\n// Warning appears are orange\n.btn-warning {\n  .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);\n}\n// Danger and error appear as red\n.btn-danger {\n  .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);\n}\n// Success appears as green\n.btn-success {\n  .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);\n}\n// Info appears as a neutral blue\n.btn-info {\n  .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);\n}\n// Inverse appears as dark gray\n.btn-inverse {\n  .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);\n}\n\n\n// Cross-browser Jank\n// --------------------------------------------------\n\nbutton.btn,\ninput[type=\"submit\"].btn {\n\n  // Firefox 3.6 only I believe\n  &::-moz-focus-inner {\n    padding: 0;\n    border: 0;\n  }\n\n  // IE7 has some default padding on button controls\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n\n  &.btn-large {\n    *padding-top: 7px;\n    *padding-bottom: 7px;\n  }\n  &.btn-small {\n    *padding-top: 3px;\n    *padding-bottom: 3px;\n  }\n  &.btn-mini {\n    *padding-top: 1px;\n    *padding-bottom: 1px;\n  }\n}\n\n\n// Link buttons\n// --------------------------------------------------\n\n// Make a button look and behave like a link\n.btn-link,\n.btn-link:active {\n  background-color: transparent;\n  background-image: none;\n  .box-shadow(none);\n}\n.btn-link {\n  border-color: transparent;\n  cursor: pointer;\n  color: @linkColor;\n  .border-radius(0);\n}\n.btn-link:hover {\n  color: @linkColorHover;\n  text-decoration: underline;\n  background-color: transparent;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n.carousel {\n  position: relative;\n  margin-bottom: @baseLineHeight;\n  line-height: 1;\n}\n\n.carousel-inner {\n  overflow: hidden;\n  width: 100%;\n  position: relative;\n}\n\n.carousel {\n\n  .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n  }\n\n  // Account for jankitude on images\n  .item > img {\n    display: block;\n    line-height: 1;\n  }\n\n  .active,\n  .next,\n  .prev { display: block; }\n\n  .active {\n    left: 0;\n  }\n\n  .next,\n  .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  .next {\n    left: 100%;\n  }\n  .prev {\n    left: -100%;\n  }\n  .next.left,\n  .prev.right {\n    left: 0;\n  }\n\n  .active.left {\n    left: -100%;\n  }\n  .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: @white;\n  text-align: center;\n  background: @grayDarker;\n  border: 3px solid @white;\n  .border-radius(23px);\n  .opacity(50);\n\n  // we can't have this transition here\n  // because webkit cancels the carousel\n  // animation if you trip this while\n  // in the middle of another animation\n  // ;_;\n  // .transition(opacity .2s linear);\n\n  // Reposition the right one\n  &.right {\n    left: auto;\n    right: 15px;\n  }\n\n  // Hover state\n  &:hover {\n    color: @white;\n    text-decoration: none;\n    .opacity(90);\n  }\n}\n\n\n// Caption for text below images\n// -----------------------------\n\n.carousel-caption {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 15px;\n  background: @grayDark;\n  background: rgba(0,0,0,.75);\n}\n.carousel-caption h4,\n.carousel-caption p {\n  color: @white;\n  line-height: @baseLineHeight;\n}\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n.carousel-caption p {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: @baseLineHeight;\n  color: @black;\n  text-shadow: 0 1px 0 rgba(255,255,255,1);\n  .opacity(20);\n  &:hover {\n    color: @black;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(40);\n  }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/code.less",
    "content": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\npre {\n  padding: 0 3px 2px;\n  #font > #family > .monospace;\n  font-size: @baseFontSize - 2;\n  color: @grayDark;\n  .border-radius(3px);\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (@baseLineHeight - 1) / 2;\n  margin: 0 0 @baseLineHeight / 2;\n  font-size: @baseFontSize - 1; // 14px to 13px\n  line-height: @baseLineHeight;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc; // fallback for IE7-8\n  border: 1px solid rgba(0,0,0,.15);\n  .border-radius(4px);\n\n  // Make prettyprint styles more spaced out for readability\n  &.prettyprint {\n    margin-bottom: @baseLineHeight;\n  }\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    color: inherit;\n    background-color: transparent;\n    border: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  overflow: visible \\9;\n  .transition(height .35s ease);\n  &.in {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle {\n  // The caret makes the toggle a bit too tall in IE7\n  *margin-bottom: -3px;\n}\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n\n// Dropdown arrow/caret\n// --------------------\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top:   4px solid @black;\n  border-right: 4px solid transparent;\n  border-left:  4px solid transparent;\n  content: \"\";\n}\n\n// Place the caret\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n\n// The dropdown menu (ul)\n// ----------------------\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindexDropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  background-color: @dropdownBackground;\n  border: 1px solid #ccc; // Fallback for IE7-8\n  border: 1px solid @dropdownBorder;\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  .border-radius(6px);\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdownDividerTop, @dropdownDividerBottom);\n  }\n\n  // Links within the dropdown menu\n  a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @baseLineHeight;\n    color: @dropdownLinkColor;\n    white-space: nowrap;\n  }\n}\n\n// Hover state\n// -----------\n.dropdown-menu li > a:hover,\n.dropdown-menu li > a:focus,\n.dropdown-submenu:hover > a {\n  text-decoration: none;\n  color: @dropdownLinkColorHover;\n  background-color: @dropdownLinkBackgroundHover;\n  #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));\n}\n\n// Active state\n// ------------\n.dropdown-menu .active > a,\n.dropdown-menu .active > a:hover {\n  color: @dropdownLinkColorHover;\n  text-decoration: none;\n  outline: 0;\n  background-color: @dropdownLinkBackgroundActive;\n  #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));\n}\n\n// Disabled state\n// --------------\n// Gray out text and ensure the hover state remains gray\n.dropdown-menu .disabled > a,\n.dropdown-menu .disabled > a:hover {\n  color: @grayLight;\n}\n// Nuke hover effects\n.dropdown-menu .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n\n// Open state for the dropdown\n// ---------------------------\n.open {\n  // IE7's z-index only goes to the nearest positioned ancestor, which would\n  // make the menu appear below buttons that appeared later on the page\n  *z-index: @zindexDropdown;\n\n  & > .dropdown-menu {\n    display: block;\n  }\n}\n\n// Right aligned dropdowns\n// ---------------------------\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// ------------------------------------------------------\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: 4px solid @black;\n    content: \"\\2191\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n// Sub menus\n// ---------------------------\n.dropdown-submenu {\n  position: relative;\n}\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n     -moz-border-radius: 0 6px 6px 6px;\n          border-radius: 0 6px 6px 6px;\n}\n.dropdown-submenu:hover .dropdown-menu {\n  display: block;\n}\n\n.dropdown-submenu > a:after {\n  display: block;\n  content: \" \";\n  float: right;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  border-left-color: darken(@dropdownBackground, 20%);\n  margin-top: 5px;\n  margin-right: -10px;\n}\n.dropdown-submenu:hover > a:after {\n  border-left-color: @dropdownLinkColorHover;\n}\n\n\n// Tweak nav headers\n// -----------------\n// Increase padding from 15px to 20px on sides\n.dropdown .dropdown-menu .nav-header {\n  padding-left: 20px;\n  padding-right: 20px;\n}\n\n// Typeahead\n// ---------\n.typeahead {\n  margin-top: 2px; // give it some space to breathe\n  .border-radius(4px);\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/font-awesome.less",
    "content": "/*  Font Awesome\n    the iconic font designed for use with Twitter Bootstrap\n    -------------------------------------------------------\n    The full suite of pictographic icons, examples, and documentation\n    can be found at: http://fortawesome.github.com/Font-Awesome/\n\n    License\n    -------------------------------------------------------\n    The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:\n    http://creativecommons.org/licenses/by/3.0/ A mention of\n    'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable\n    source code is considered acceptable attribution (most common on the web).\n    If human readable source code is not available to the end user, a mention in\n    an 'About' or 'Credits' screen is considered acceptable (most common in desktop\n    or mobile software).\n\n    Contact\n    -------------------------------------------------------\n    Email: dave@davegandy.com\n    Twitter: http://twitter.com/fortaweso_me\n    Work: Lead Product Designer @ http://kyruus.com\n\n    */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../../font/fontawesome-webfont.eot');\n  src: url('../../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),\n    url('../../font/fontawesome-webfont.woff') format('woff'),\n    url('../../font/fontawesome-webfont.ttf') format('truetype'),\n    url('../../font/fontawesome-webfont.svg#FontAwesome') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n\n/*  Font Awesome styles\n    ------------------------------------------------------- */\n[class^=\"icon-\"]:before,\n[class*=\" icon-\"]:before {\n  font-family: FontAwesome;\n  font-weight: normal;\n  font-style: normal;\n  display: inline-block;\n  text-decoration: inherit;\n}\n\na [class^=\"icon-\"],\na [class*=\" icon-\"] {\n  display: inline-block;\n  text-decoration: inherit;\n}\n\n/* makes the font 33% larger relative to the icon container */\n.icon-large:before {\n  vertical-align: middle;\n  font-size: 4/3em;\n}\n\n.btn, .nav-tabs {\n  [class^=\"icon-\"],\n  [class*=\" icon-\"] {\n  /* keeps button heights with and without icons the same */\n    line-height: .9em;\n  }\n}\n\nli {\n  [class^=\"icon-\"],\n  [class*=\" icon-\"] {\n    display: inline-block;\n    width: 1.25em;\n    text-align: center;\n  }\n  .icon-large:before,\n  .icon-large:before {\n    /* 1.5 increased font size for icon-large * 1.25 width */\n    width: 1.5*1.25em;\n  }\n}\n\nul.icons {\n  list-style-type: none;\n  margin-left: 2em;\n  text-indent: -.8em;\n\n  li {\n    [class^=\"icon-\"],\n    [class*=\" icon-\"] {\n      width: .8em;\n    }\n    .icon-large:before,\n    .icon-large:before {\n      /* 1.5 increased font size for icon-large * 1.25 width */\n      vertical-align: initial;\n//      width: 1.5*1.25em;\n    }\n  }\n}\n\n/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n    readers do not read off random characters that represent icons */\n.icon-glass:before                { content: \"\\f000\"; }\n.icon-music:before                { content: \"\\f001\"; }\n.icon-search:before               { content: \"\\f002\"; }\n.icon-envelope:before             { content: \"\\f003\"; }\n.icon-heart:before                { content: \"\\f004\"; }\n.icon-star:before                 { content: \"\\f005\"; }\n.icon-star-empty:before           { content: \"\\f006\"; }\n.icon-user:before                 { content: \"\\f007\"; }\n.icon-film:before                 { content: \"\\f008\"; }\n.icon-th-large:before             { content: \"\\f009\"; }\n.icon-th:before                   { content: \"\\f00a\"; }\n.icon-th-list:before              { content: \"\\f00b\"; }\n.icon-ok:before                   { content: \"\\f00c\"; }\n.icon-remove:before               { content: \"\\f00d\"; }\n.icon-zoom-in:before              { content: \"\\f00e\"; }\n\n.icon-zoom-out:before             { content: \"\\f010\"; }\n.icon-off:before                  { content: \"\\f011\"; }\n.icon-signal:before               { content: \"\\f012\"; }\n.icon-cog:before                  { content: \"\\f013\"; }\n.icon-trash:before                { content: \"\\f014\"; }\n.icon-home:before                 { content: \"\\f015\"; }\n.icon-file:before                 { content: \"\\f016\"; }\n.icon-time:before                 { content: \"\\f017\"; }\n.icon-road:before                 { content: \"\\f018\"; }\n.icon-download-alt:before         { content: \"\\f019\"; }\n.icon-download:before             { content: \"\\f01a\"; }\n.icon-upload:before               { content: \"\\f01b\"; }\n.icon-inbox:before                { content: \"\\f01c\"; }\n.icon-play-circle:before          { content: \"\\f01d\"; }\n.icon-repeat:before               { content: \"\\f01e\"; }\n\n/* \\f020 is not a valid unicode character. all shifted one down */\n.icon-refresh:before              { content: \"\\f021\"; }\n.icon-list-alt:before             { content: \"\\f022\"; }\n.icon-lock:before                 { content: \"\\f023\"; }\n.icon-flag:before                 { content: \"\\f024\"; }\n.icon-headphones:before           { content: \"\\f025\"; }\n.icon-volume-off:before           { content: \"\\f026\"; }\n.icon-volume-down:before          { content: \"\\f027\"; }\n.icon-volume-up:before            { content: \"\\f028\"; }\n.icon-qrcode:before               { content: \"\\f029\"; }\n.icon-barcode:before              { content: \"\\f02a\"; }\n.icon-tag:before                  { content: \"\\f02b\"; }\n.icon-tags:before                 { content: \"\\f02c\"; }\n.icon-book:before                 { content: \"\\f02d\"; }\n.icon-bookmark:before             { content: \"\\f02e\"; }\n.icon-print:before                { content: \"\\f02f\"; }\n\n.icon-camera:before               { content: \"\\f030\"; }\n.icon-font:before                 { content: \"\\f031\"; }\n.icon-bold:before                 { content: \"\\f032\"; }\n.icon-italic:before               { content: \"\\f033\"; }\n.icon-text-height:before          { content: \"\\f034\"; }\n.icon-text-width:before           { content: \"\\f035\"; }\n.icon-align-left:before           { content: \"\\f036\"; }\n.icon-align-center:before         { content: \"\\f037\"; }\n.icon-align-right:before          { content: \"\\f038\"; }\n.icon-align-justify:before        { content: \"\\f039\"; }\n.icon-list:before                 { content: \"\\f03a\"; }\n.icon-indent-left:before          { content: \"\\f03b\"; }\n.icon-indent-right:before         { content: \"\\f03c\"; }\n.icon-facetime-video:before       { content: \"\\f03d\"; }\n.icon-picture:before              { content: \"\\f03e\"; }\n\n.icon-pencil:before               { content: \"\\f040\"; }\n.icon-map-marker:before           { content: \"\\f041\"; }\n.icon-adjust:before               { content: \"\\f042\"; }\n.icon-tint:before                 { content: \"\\f043\"; }\n.icon-edit:before                 { content: \"\\f044\"; }\n.icon-share:before                { content: \"\\f045\"; }\n.icon-check:before                { content: \"\\f046\"; }\n.icon-move:before                 { content: \"\\f047\"; }\n.icon-step-backward:before        { content: \"\\f048\"; }\n.icon-fast-backward:before        { content: \"\\f049\"; }\n.icon-backward:before             { content: \"\\f04a\"; }\n.icon-play:before                 { content: \"\\f04b\"; }\n.icon-pause:before                { content: \"\\f04c\"; }\n.icon-stop:before                 { content: \"\\f04d\"; }\n.icon-forward:before              { content: \"\\f04e\"; }\n\n.icon-fast-forward:before         { content: \"\\f050\"; }\n.icon-step-forward:before         { content: \"\\f051\"; }\n.icon-eject:before                { content: \"\\f052\"; }\n.icon-chevron-left:before         { content: \"\\f053\"; }\n.icon-chevron-right:before        { content: \"\\f054\"; }\n.icon-plus-sign:before            { content: \"\\f055\"; }\n.icon-minus-sign:before           { content: \"\\f056\"; }\n.icon-remove-sign:before          { content: \"\\f057\"; }\n.icon-ok-sign:before              { content: \"\\f058\"; }\n.icon-question-sign:before        { content: \"\\f059\"; }\n.icon-info-sign:before            { content: \"\\f05a\"; }\n.icon-screenshot:before           { content: \"\\f05b\"; }\n.icon-remove-circle:before        { content: \"\\f05c\"; }\n.icon-ok-circle:before            { content: \"\\f05d\"; }\n.icon-ban-circle:before           { content: \"\\f05e\"; }\n\n.icon-arrow-left:before           { content: \"\\f060\"; }\n.icon-arrow-right:before          { content: \"\\f061\"; }\n.icon-arrow-up:before             { content: \"\\f062\"; }\n.icon-arrow-down:before           { content: \"\\f063\"; }\n.icon-share-alt:before            { content: \"\\f064\"; }\n.icon-resize-full:before          { content: \"\\f065\"; }\n.icon-resize-small:before         { content: \"\\f066\"; }\n.icon-plus:before                 { content: \"\\f067\"; }\n.icon-minus:before                { content: \"\\f068\"; }\n.icon-asterisk:before             { content: \"\\f069\"; }\n.icon-exclamation-sign:before     { content: \"\\f06a\"; }\n.icon-gift:before                 { content: \"\\f06b\"; }\n.icon-leaf:before                 { content: \"\\f06c\"; }\n.icon-fire:before                 { content: \"\\f06d\"; }\n.icon-eye-open:before             { content: \"\\f06e\"; }\n\n.icon-eye-close:before            { content: \"\\f070\"; }\n.icon-warning-sign:before         { content: \"\\f071\"; }\n.icon-plane:before                { content: \"\\f072\"; }\n.icon-calendar:before             { content: \"\\f073\"; }\n.icon-random:before               { content: \"\\f074\"; }\n.icon-comment:before              { content: \"\\f075\"; }\n.icon-magnet:before               { content: \"\\f076\"; }\n.icon-chevron-up:before           { content: \"\\f077\"; }\n.icon-chevron-down:before         { content: \"\\f078\"; }\n.icon-retweet:before              { content: \"\\f079\"; }\n.icon-shopping-cart:before        { content: \"\\f07a\"; }\n.icon-folder-close:before         { content: \"\\f07b\"; }\n.icon-folder-open:before          { content: \"\\f07c\"; }\n.icon-resize-vertical:before      { content: \"\\f07d\"; }\n.icon-resize-horizontal:before    { content: \"\\f07e\"; }\n\n.icon-bar-chart:before            { content: \"\\f080\"; }\n.icon-twitter-sign:before         { content: \"\\f081\"; }\n.icon-facebook-sign:before        { content: \"\\f082\"; }\n.icon-camera-retro:before         { content: \"\\f083\"; }\n.icon-key:before                  { content: \"\\f084\"; }\n.icon-cogs:before                 { content: \"\\f085\"; }\n.icon-comments:before             { content: \"\\f086\"; }\n.icon-thumbs-up:before            { content: \"\\f087\"; }\n.icon-thumbs-down:before          { content: \"\\f088\"; }\n.icon-star-half:before            { content: \"\\f089\"; }\n.icon-heart-empty:before          { content: \"\\f08a\"; }\n.icon-signout:before              { content: \"\\f08b\"; }\n.icon-linkedin-sign:before        { content: \"\\f08c\"; }\n.icon-pushpin:before              { content: \"\\f08d\"; }\n.icon-external-link:before        { content: \"\\f08e\"; }\n\n.icon-signin:before               { content: \"\\f090\"; }\n.icon-trophy:before               { content: \"\\f091\"; }\n.icon-github-sign:before          { content: \"\\f092\"; }\n.icon-upload-alt:before           { content: \"\\f093\"; }\n.icon-lemon:before                { content: \"\\f094\"; }\n.icon-phone:before                { content: \"\\f095\"; }\n.icon-check-empty:before          { content: \"\\f096\"; }\n.icon-bookmark-empty:before       { content: \"\\f097\"; }\n.icon-phone-sign:before           { content: \"\\f098\"; }\n.icon-twitter:before              { content: \"\\f099\"; }\n.icon-facebook:before             { content: \"\\f09a\"; }\n.icon-github:before               { content: \"\\f09b\"; }\n.icon-unlock:before               { content: \"\\f09c\"; }\n.icon-credit-card:before          { content: \"\\f09d\"; }\n.icon-rss:before                  { content: \"\\f09e\"; }\n\n.icon-hdd:before                  { content: \"\\f0a0\"; }\n.icon-bullhorn:before             { content: \"\\f0a1\"; }\n.icon-bell:before                 { content: \"\\f0a2\"; }\n.icon-certificate:before          { content: \"\\f0a3\"; }\n.icon-hand-right:before           { content: \"\\f0a4\"; }\n.icon-hand-left:before            { content: \"\\f0a5\"; }\n.icon-hand-up:before              { content: \"\\f0a6\"; }\n.icon-hand-down:before            { content: \"\\f0a7\"; }\n.icon-circle-arrow-left:before    { content: \"\\f0a8\"; }\n.icon-circle-arrow-right:before   { content: \"\\f0a9\"; }\n.icon-circle-arrow-up:before      { content: \"\\f0aa\"; }\n.icon-circle-arrow-down:before    { content: \"\\f0ab\"; }\n.icon-globe:before                { content: \"\\f0ac\"; }\n.icon-wrench:before               { content: \"\\f0ad\"; }\n.icon-tasks:before                { content: \"\\f0ae\"; }\n\n.icon-filter:before               { content: \"\\f0b0\"; }\n.icon-briefcase:before            { content: \"\\f0b1\"; }\n.icon-fullscreen:before           { content: \"\\f0b2\"; }\n\n.icon-group:before                { content: \"\\f0c0\"; }\n.icon-link:before                 { content: \"\\f0c1\"; }\n.icon-cloud:before                { content: \"\\f0c2\"; }\n.icon-beaker:before               { content: \"\\f0c3\"; }\n.icon-cut:before                  { content: \"\\f0c4\"; }\n.icon-copy:before                 { content: \"\\f0c5\"; }\n.icon-paper-clip:before           { content: \"\\f0c6\"; }\n.icon-save:before                 { content: \"\\f0c7\"; }\n.icon-sign-blank:before           { content: \"\\f0c8\"; }\n.icon-reorder:before              { content: \"\\f0c9\"; }\n.icon-list-ul:before              { content: \"\\f0ca\"; }\n.icon-list-ol:before              { content: \"\\f0cb\"; }\n.icon-strikethrough:before        { content: \"\\f0cc\"; }\n.icon-underline:before            { content: \"\\f0cd\"; }\n.icon-table:before                { content: \"\\f0ce\"; }\n.icon-table:before                { content: \"\\f0ce\"; }\n\n.icon-magic:before                { content: \"\\f0d0\"; }\n.icon-truck:before                { content: \"\\f0d1\"; }\n.icon-pinterest:before            { content: \"\\f0d2\"; }\n.icon-pinterest-sign:before       { content: \"\\f0d3\"; }\n.icon-google-plus-sign:before     { content: \"\\f0d4\"; }\n.icon-google-plus:before          { content: \"\\f0d5\"; }\n.icon-money:before                { content: \"\\f0d6\"; }\n.icon-caret-down:before           { content: \"\\f0d7\"; }\n.icon-caret-up:before             { content: \"\\f0d8\"; }\n.icon-caret-left:before           { content: \"\\f0d9\"; }\n.icon-caret-right:before          { content: \"\\f0da\"; }\n.icon-columns:before              { content: \"\\f0db\"; }\n.icon-sort:before                 { content: \"\\f0dc\"; }\n.icon-sort-down:before            { content: \"\\f0dd\"; }\n.icon-sort-up:before              { content: \"\\f0de\"; }\n\n.icon-envelope-alt:before         { content: \"\\f0e0\"; }\n.icon-linkedin:before             { content: \"\\f0e1\"; }\n.icon-undo:before                 { content: \"\\f0e2\"; }\n.icon-legal:before                { content: \"\\f0e3\"; }\n.icon-dashboard:before            { content: \"\\f0e4\"; }\n.icon-comment-alt:before          { content: \"\\f0e5\"; }\n.icon-comments-alt:before         { content: \"\\f0e6\"; }\n.icon-bolt:before                 { content: \"\\f0e7\"; }\n.icon-sitemap:before              { content: \"\\f0e8\"; }\n.icon-umbrella:before             { content: \"\\f0e9\"; }\n.icon-paste:before                { content: \"\\f0ea\"; }\n\n.icon-user-md:before              { content: \"\\f200\"; }\n\n.icon-apple-logo:before           { content: \"\\f500\"; }\n.icon-windows-8:before            { content: \"\\f501\"; }\n.icon-js-fiddle:before            { content: \"\\f502\"; }\n.icon-skype:before                { content: \"\\f503\"; }\n.icon-youtube-sign:before         { content: \"\\f504\"; }\n.icon-youtube:before              { content: \"\\f505\"; }\n.icon-vimeo-sign:before           { content: \"\\f506\"; }\n.icon-vimeo:before                { content: \"\\f507\"; }\n.icon-lastfm-sign:before          { content: \"\\f508\"; }\n.icon-lastfm:before               { content: \"\\f509\"; }\n.icon-rss-sign:before             { content: \"\\f50a\"; }\n.icon-reddit:before               { content: \"\\f50b\"; }\n.icon-delicious-sign:before       { content: \"\\f50c\"; }\n.icon-wordpress-sign:before       { content: \"\\f50d\"; }\n.icon-wordpress:before            { content: \"\\f50e\"; }\n.icon-git-fork:before             { content: \"\\f50f\"; }\n\n.icon-blogger-sign:before         { content: \"\\f510\"; }\n.icon-blogger:before              { content: \"\\f511\"; }\n.icon-tumblr-sign:before          { content: \"\\f512\"; }\n.icon-tumblr:before               { content: \"\\f513\"; }\n.icon-flickr-sign:before          { content: \"\\f514\"; }\n.icon-flickr:before               { content: \"\\f515\"; }\n.icon-picasa-sign:before          { content: \"\\f516\"; }\n.icon-picasa:before               { content: \"\\f517\"; }\n.icon-amazon-sign:before          { content: \"\\f518\"; }\n.icon-amazon:before               { content: \"\\f519\"; }\n.icon-yelp-sign:before            { content: \"\\f51a\"; }\n.icon-yelp:before                 { content: \"\\f51b\"; }\n.icon-soundcloud:before           { content: \"\\f51c\"; }\n.icon-spotify:before              { content: \"\\f51d\"; }\n\n.icon-yahoo-sign:before           { content: \"\\f520\"; }\n.icon-yahoo:before                { content: \"\\f521\"; }\n.icon-evernote-sign:before        { content: \"\\f522\"; }\n.icon-evernote:before             { content: \"\\f523\"; }\n.icon-google-sign:before          { content: \"\\f524\"; }\n.icon-google:before               { content: \"\\f525\"; }\n.icon-hacker-news:before          { content: \"\\f526\"; }\n.icon-map:before          \t\t\t\t{ content: \"\\f529\"; }\n.icon-bus-sign:before             { content: \"\\f52a\"; }\n.icon-bike-sign:before            { content: \"\\f52b\"; }\n.icon-car-sign:before             { content: \"\\f52c\"; }\n.icon-taxi-sign:before            { content: \"\\f52d\"; }\n.icon-truck-sign:before           { content: \"\\f52e\"; }\n.icon-handicap-sign:before        { content: \"\\f52f\"; }\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// GENERAL STYLES\n// --------------\n\n// Make all forms have space below them\nform {\n  margin: 0 0 @baseLineHeight;\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\n// Groups of fields with labels on top (legends)\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @baseLineHeight;\n  font-size: @baseFontSize * 1.5;\n  line-height: @baseLineHeight * 2;\n  color: @grayDark;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n\n  // Small\n  small {\n    font-size: @baseLineHeight * .75;\n    color: @grayLight;\n  }\n}\n\n// Set font for forms\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)\n}\n\n// Identify controls by their labels\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\n\n// Form controls\n// -------------------------\n\n// Shared size and type resets\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: @baseLineHeight;\n  padding: 4px 6px;\n  margin-bottom: 9px;\n  font-size: @baseFontSize;\n  line-height: @baseLineHeight;\n  color: @gray;\n  .border-radius(@inputBorderRadius);\n}\n\n// Reset appearance properties for textual inputs and textarea\n// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)\ninput,\ntextarea {\n  width: 210px;\n}\n// Reset height since textareas have rows\ntextarea {\n  height: auto;\n}\n// Everything else\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: @inputBackground;\n  border: 1px solid @inputBorder;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border linear .2s, box-shadow linear .2s\");\n\n  // Focus state\n  &:focus {\n    border-color: rgba(82,168,236,.8);\n    outline: 0;\n    outline: thin dotted \\9; /* IE6-9 */\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)\");\n  }\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  *margin-top: 0; /* IE7 */\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n  cursor: pointer;\n}\n\n// Reset width of input images, buttons, radios, checkboxes\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto; // Override of generic input selector\n}\n\n// Set the height of select and file controls to match text inputs\nselect,\ninput[type=\"file\"] {\n  height: 30px; /* In IE7, the height of the select element cannot be changed by height, only font-size */\n  *margin-top: 4px; /* For IE7, add top margin to align select with labels */\n  line-height: 30px;\n}\n\n// Make select elements obey height by applying a border\nselect {\n  width: 220px; // default input width + 10px of padding that doesn't get applied\n  border: 1px solid #bbb;\n  background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for select, file, radio, and checkbox\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n\n// Uneditable inputs\n// -------------------------\n\n// Make uneditable inputs look inactive\n.uneditable-input,\n.uneditable-textarea {\n  color: @grayLight;\n  background-color: darken(@inputBackground, 1%);\n  border-color: @inputBorder;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));\n  cursor: not-allowed;\n}\n\n// For text that needs to appear as an input but should not be an input\n.uneditable-input {\n  overflow: hidden; // prevent text from wrapping, but still cut it off like an input does\n  white-space: nowrap;\n}\n\n// Make uneditable textareas behave like a textarea\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\n\n\n// Placeholder\n// -------------------------\n\n// Placeholder text gets special styles; can't be bundled together though for some reason\ninput,\ntextarea {\n  .placeholder();\n}\n\n\n// CHECKBOXES & RADIOS\n// -------------------\n\n// Indent the labels to position radios/checkboxes as hanging\n.radio,\n.checkbox {\n  min-height: 18px; // clear the floating input if there is no label text\n  padding-left: 18px;\n}\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -18px;\n}\n\n// Move the options list down to align with labels\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px; // has to be padding because margin collaspes\n}\n\n// Radios and checkboxes on same line\n// TODO v3: Convert .inline to .control-inline\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n\n\n// INPUT SIZES\n// -----------\n\n// General classes for quick sizes\n.input-mini       { width: 60px; }\n.input-small      { width: 90px; }\n.input-medium     { width: 150px; }\n.input-large      { width: 210px; }\n.input-xlarge     { width: 270px; }\n.input-xxlarge    { width: 530px; }\n\n// Grid style input sizes\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n// Redeclare since the fluid row class is more specific\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n// Ensure input-prepend/append never wraps\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\n\n\n\n// GRID SIZING FOR INPUTS\n// ----------------------\n\n// Grid sizes\n#grid > .input(@gridColumnWidth, @gridGutterWidth);\n\n// Control row for multiple inputs per line\n.controls-row {\n  .clearfix(); // Clear the float from controls\n}\n.controls-row [class*=\"span\"] {\n  float: left; // Float to collapse white-space for proper grid alignment\n}\n\n\n\n\n// DISABLED STATE\n// --------------\n\n// Disabled and read-only inputs\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: @inputDisabledBackground;\n}\n// Explicitly reset the colors here\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n\n\n\n\n// FORM FIELD FEEDBACK STATES\n// --------------------------\n\n// Warning\n.control-group.warning {\n  .formFieldState(@warningText, @warningText, @warningBackground);\n}\n// Error\n.control-group.error {\n  .formFieldState(@errorText, @errorText, @errorBackground);\n}\n// Success\n.control-group.success {\n  .formFieldState(@successText, @successText, @successBackground);\n}\n\n// HTML5 invalid states\n// Shares styles with the .control-group.error above\ninput:focus:required:invalid,\ntextarea:focus:required:invalid,\nselect:focus:required:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n  &:focus {\n    border-color: darken(#ee5f5b, 10%);\n    .box-shadow(0 0 6px lighten(#ee5f5b, 20%));\n  }\n}\n\n\n\n// FORM ACTIONS\n// ------------\n\n.form-actions {\n  padding: (@baseLineHeight - 1) 20px @baseLineHeight;\n  margin-top: @baseLineHeight;\n  margin-bottom: @baseLineHeight;\n  background-color: @formActionsBackground;\n  border-top: 1px solid #e5e5e5;\n  .clearfix(); // Adding clearfix to allow for .pull-right button containers\n}\n\n\n\n// HELP TEXT\n// ---------\n\n.help-block,\n.help-inline {\n  color: lighten(@textColor, 15%); // lighten the text some for contrast\n}\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-bottom: @baseLineHeight / 2;\n}\n\n.help-inline {\n  display: inline-block;\n  .ie7-inline-block();\n  vertical-align: middle;\n  padding-left: 5px;\n}\n\n\n\n// INPUT GROUPS\n// ------------\n\n// Allow us to put symbols and text within the input field for a cleaner look\n.input-append,\n.input-prepend {\n  margin-bottom: 5px;\n  font-size: 0;\n  white-space: nowrap; // Prevent span and input from separating\n\n  input,\n  select,\n  .uneditable-input {\n    position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness\n    margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms\n    *margin-left: 0;\n    font-size: @baseFontSize;\n    vertical-align: top;\n    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);\n    // Make input on top when focused so blue border and shadow always show\n    &:focus {\n      z-index: 2;\n    }\n  }\n  .add-on {\n    display: inline-block;\n    width: auto;\n    height: @baseLineHeight;\n    min-width: 16px;\n    padding: 4px 5px;\n    font-size: @baseFontSize;\n    font-weight: normal;\n    line-height: @baseLineHeight;\n    text-align: center;\n    text-shadow: 0 1px 0 @white;\n    background-color: @grayLighter;\n    border: 1px solid #ccc;\n  }\n  .add-on,\n  .btn {\n    margin-left: -1px;\n    vertical-align: top;\n    .border-radius(0);\n  }\n  .active {\n    background-color: lighten(@green, 30);\n    border-color: @green;\n  }\n}\n.input-prepend {\n  .add-on,\n  .btn {\n    margin-right: -1px;\n  }\n  .add-on:first-child,\n  .btn:first-child {\n    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);\n  }\n}\n.input-append {\n  input,\n  select,\n  .uneditable-input {\n    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);\n  }\n  .add-on:last-child,\n  .btn:last-child {\n    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);\n  }\n}\n// Remove all border-radius for inputs with both prepend and append\n.input-prepend.input-append {\n  input,\n  select,\n  .uneditable-input {\n    .border-radius(0);\n  }\n  .add-on:first-child,\n  .btn:first-child {\n    margin-right: -1px;\n    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);\n  }\n  .add-on:last-child,\n  .btn:last-child {\n    margin-left: -1px;\n    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);\n  }\n}\n\n\n\n// SEARCH FORM\n// -----------\n\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9; /* IE7-8 doesn't have border-radius, so don't indent the padding */\n  margin-bottom: 0; // Remove the default margin on all inputs\n  .border-radius(15px);\n}\n\n/* Allow for input prepend/append in search forms */\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  .border-radius(0); // Override due to specificity\n}\n.form-search .input-append .search-query {\n  .border-radius(14px 0 0 14px)\n}\n.form-search .input-append .btn {\n  .border-radius(0 14px 14px 0)\n}\n.form-search .input-prepend .search-query {\n  .border-radius(0 14px 14px 0)\n}\n.form-search .input-prepend .btn {\n  .border-radius(14px 0 0 14px)\n}\n\n\n\n\n// HORIZONTAL & VERTICAL FORMS\n// ---------------------------\n\n// Common properties\n// -----------------\n\n.form-search,\n.form-inline,\n.form-horizontal {\n  input,\n  textarea,\n  select,\n  .help-inline,\n  .uneditable-input,\n  .input-prepend,\n  .input-append {\n    display: inline-block;\n    .ie7-inline-block();\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  // Re-hide hidden elements due to specifity\n  .hide {\n    display: none;\n  }\n}\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n// Remove margin for input-prepend/-append\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n// Inline checkbox/radio labels (remove padding on left)\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n// Remove float and margin, set to inline-block\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n\n\n// Margin to space out fieldsets\n.control-group {\n  margin-bottom: @baseLineHeight / 2;\n}\n\n// Legend collapses margin, so next element is responsible for spacing\nlegend + .control-group {\n  margin-top: @baseLineHeight;\n  -webkit-margin-top-collapse: separate;\n}\n\n// Horizontal-specific styles\n// --------------------------\n\n.form-horizontal {\n  // Increase spacing between groups\n  .control-group {\n    margin-bottom: @baseLineHeight;\n    .clearfix();\n  }\n  // Float the labels left\n  .control-label {\n    float: left;\n    width: 140px;\n    padding-top: 5px;\n    text-align: right;\n  }\n  // Move over all input controls and content\n  .controls {\n    // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend\n    // don't inherit the margin of the parent, in this case .controls\n    *display: inline-block;\n    *padding-left: 20px;\n    margin-left: 160px;\n    *margin-left: 0;\n    &:first-child {\n      *padding-left: 160px;\n    }\n  }\n  // Remove bottom margin on block level help text since that's accounted for on .control-group\n  .help-block {\n    margin-top: @baseLineHeight / 2;\n    margin-bottom: 0;\n  }\n  // Move over buttons in .form-actions to align with .controls\n  .form-actions {\n    padding-left: 160px;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Fixed (940px)\n#grid > .core(@gridColumnWidth, @gridGutterWidth);\n\n// Fluid (940px)\n#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);\n\n// Reset utility classes due to specificity\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/hero-unit.less",
    "content": "//\n// Hero unit\n// --------------------------------------------------\n\n\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  background-color: @heroUnitBackground;\n  .border-radius(6px);\n  h1 {\n    margin-bottom: 0;\n    font-size: 60px;\n    line-height: 1;\n    color: @heroUnitHeadingColor;\n    letter-spacing: -1px;\n  }\n  p {\n    font-size: 18px;\n    font-weight: 200;\n    line-height: @baseLineHeight * 1.5;\n    color: @heroUnitLeadColor;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/labels-badges.less",
    "content": "//\n// Labels and badges\n// --------------------------------------------------\n\n\n// Base classes\n.label,\n.badge {\n  font-size: @baseFontSize * .846;\n  font-weight: bold;\n  line-height: 14px; // ensure proper line-height if floated\n  color: @white;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  background-color: @grayLight;\n}\n// Set unique padding and border-radii\n.label {\n  padding: 1px 4px 2px;\n  .border-radius(3px);\n}\n.badge {\n  padding: 1px 9px 2px;\n  .border-radius(9px);\n}\n\n// Hover state, but only for links\na {\n  &.label:hover,\n  &.badge:hover {\n    color: @white;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)\n.label,\n.badge {\n  // Important (red)\n  &-important         { background-color: @errorText; }\n  &-important[href]   { background-color: darken(@errorText, 10%); }\n  // Warnings (orange)\n  &-warning           { background-color: @orange; }\n  &-warning[href]     { background-color: darken(@orange, 10%); }\n  // Success (green)\n  &-success           { background-color: @successText; }\n  &-success[href]     { background-color: darken(@successText, 10%); }\n  // Info (turquoise)\n  &-info              { background-color: @infoText; }\n  &-info[href]        { background-color: darken(@infoText, 10%); }\n  // Inverse (black)\n  &-inverse           { background-color: @grayDark; }\n  &-inverse[href]     { background-color: darken(@grayDark, 10%); }\n}\n\n// Quick fix for labels/badges in buttons\n.btn {\n  .label,\n  .badge {\n    position: relative;\n    top: -1px;\n  }\n}\n.btn-mini {\n  .label,\n  .badge {\n    top: 0;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/layouts.less",
    "content": "//\n// Layouts\n// --------------------------------------------------\n\n\n// Container (centered, fixed-width layouts)\n.container {\n  .container-fixed();\n}\n\n// Fluid layouts (left aligned, with sidebar, min- & max-width content)\n.container-fluid {\n  padding-right: @gridGutterWidth;\n  padding-left: @gridGutterWidth;\n  .clearfix();\n}"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/mixins.less",
    "content": "//\n// Mixins\n// --------------------------------------------------\n\n\n// UTILITY MIXINS\n// --------------------------------------------------\n\n// Clearfix\n// --------\n// For clearing floats like a boss h5bp.com/q\n.clearfix {\n  *zoom: 1;\n  &:before,\n  &:after {\n    display: table;\n    content: \"\";\n    // Fixes Opera/contenteditable bug:\n    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952\n    line-height: 0;\n  }\n  &:after {\n    clear: both;\n  }\n}\n\n// Webkit-style focus\n// ------------------\n.tab-focus() {\n  // Default\n  outline: thin dotted #333;\n  // Webkit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n// Center-align a block level element\n// ----------------------------------\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n// IE7 inline-block\n// ----------------\n.ie7-inline-block() {\n  *display: inline; /* IE7 inline-block hack */\n  *zoom: 1;\n}\n\n// IE7 likes to collapse whitespace on either side of the inline-block elements.\n// Ems because we're attempting to match the width of a space character. Left\n// version is for form buttons, which typically come after other elements, and\n// right version is for icons, which come before. Applying both is ok, but it will\n// mean that space between those elements will be .6em (~2 space characters) in IE7,\n// instead of the 1 space in other browsers.\n.ie7-restore-left-whitespace() {\n  *margin-left: .3em;\n\n  &:first-child {\n    *margin-left: 0;\n  }\n}\n\n.ie7-restore-right-whitespace() {\n  *margin-right: .3em;\n}\n\n// Sizing shortcuts\n// -------------------------\n.size(@height, @width) {\n  width: @width;\n  height: @height;\n}\n.square(@size) {\n  .size(@size, @size);\n}\n\n// Placeholder text\n// -------------------------\n.placeholder(@color: @placeholderText) {\n  &:-moz-placeholder {\n    color: @color;\n  }\n  &:-ms-input-placeholder {\n    color: @color;\n  }\n  &::-webkit-input-placeholder {\n    color: @color;\n  }\n}\n\n// Text overflow\n// -------------------------\n// Requires inline-block or block for proper styling\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n// CSS image replacement\n// -------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n\n// FONTS\n// --------------------------------------------------\n\n#font {\n  #family {\n    .serif() {\n      font-family: @serifFontFamily;\n    }\n    .sans-serif() {\n      font-family: @sansFontFamily;\n    }\n    .monospace() {\n      font-family: @monoFontFamily;\n    }\n  }\n  .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    font-size: @size;\n    font-weight: @weight;\n    line-height: @lineHeight;\n  }\n  .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    #font > #family > .serif;\n    #font > .shorthand(@size, @weight, @lineHeight);\n  }\n  .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    #font > #family > .sans-serif;\n    #font > .shorthand(@size, @weight, @lineHeight);\n  }\n  .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    #font > #family > .monospace;\n    #font > .shorthand(@size, @weight, @lineHeight);\n  }\n}\n\n\n// FORMS\n// --------------------------------------------------\n\n// Block level inputs\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;        // Make inputs at least the height of their button counterpart\n  .box-sizing(border-box); // Makes inputs behave like true block-level elements\n}\n\n\n\n// Mixin for form field states\n.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {\n  // Set the text color\n  > label,\n  .help-block,\n  .help-inline {\n    color: @textColor;\n  }\n  // Style inputs accordingly\n  .checkbox,\n  .radio,\n  input,\n  select,\n  textarea {\n    color: @textColor;\n    border-color: @borderColor;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@borderColor, 10%);\n      // Write out in full since the lighten() function isn't easily escaped\n      -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);\n         -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);\n              box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);\n    }\n  }\n  // Give a small background color for input-prepend/-append\n  .input-prepend .add-on,\n  .input-append .add-on {\n    color: @textColor;\n    background-color: @backgroundColor;\n    border-color: @textColor;\n  }\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Border Radius\n.border-radius(@radius) {\n  -webkit-border-radius: @radius;\n     -moz-border-radius: @radius;\n          border-radius: @radius;\n}\n\n// Single Corner Border Radius\n.border-top-left-radius(@radius) {\n  -webkit-border-top-left-radius: @radius;\n      -moz-border-radius-topleft: @radius;\n          border-top-left-radius: @radius;\n}\n.border-top-right-radius(@radius) {\n  -webkit-border-top-right-radius: @radius;\n      -moz-border-radius-topright: @radius;\n          border-top-right-radius: @radius;\n}\n.border-bottom-right-radius(@radius) {\n  -webkit-border-bottom-right-radius: @radius;\n      -moz-border-radius-bottomright: @radius;\n          border-bottom-right-radius: @radius;\n}\n.border-bottom-left-radius(@radius) {\n  -webkit-border-bottom-left-radius: @radius;\n      -moz-border-radius-bottomleft: @radius;\n          border-bottom-left-radius: @radius;\n}\n\n// Single Side Border Radius\n.border-top-radius(@radius) {\n  .border-top-right-radius(@radius);\n  .border-top-left-radius(@radius);\n}\n.border-right-radius(@radius) {\n  .border-top-right-radius(@radius);\n  .border-bottom-right-radius(@radius);\n}\n.border-bottom-radius(@radius) {\n  .border-bottom-right-radius(@radius);\n  .border-bottom-left-radius(@radius);\n}\n.border-left-radius(@radius) {\n  .border-top-left-radius(@radius);\n  .border-bottom-left-radius(@radius);\n}\n\n// Drop shadows\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow;\n     -moz-box-shadow: @shadow;\n          box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n  -webkit-transition: @transition;\n     -moz-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n     -moz-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n     -moz-transform: scale(@ratio);\n      -ms-transform: scale(@ratio);\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.translate(@x, @y) {\n  -webkit-transform: translate(@x, @y);\n     -moz-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y);\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.skew(@x, @y) {\n  -webkit-transform: skew(@x, @y);\n     -moz-transform: skew(@x, @y);\n      -ms-transform: skew(@x, @y);\n       -o-transform: skew(@x, @y);\n          transform: skew(@x, @y);\n}\n.translate3d(@x, @y, @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n     -moz-transform: translate3d(@x, @y, @z);\n       -o-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden\n// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples\n.backface-visibility(@visibility){\n\t-webkit-backface-visibility: @visibility;\n\t   -moz-backface-visibility: @visibility;\n\t        backface-visibility: @visibility;\n}\n\n// Background clipping\n// Heads up: FF 3.6 and under need \"padding\" instead of \"padding-box\"\n.background-clip(@clip) {\n  -webkit-background-clip: @clip;\n     -moz-background-clip: @clip;\n          background-clip: @clip;\n}\n\n// Background sizing\n.background-size(@size){\n  -webkit-background-size: @size;\n     -moz-background-size: @size;\n       -o-background-size: @size;\n          background-size: @size;\n}\n\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select;\n       -o-user-select: @select;\n          user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@columnCount, @columnGap: @gridGutterWidth) {\n  -webkit-column-count: @columnCount;\n     -moz-column-count: @columnCount;\n          column-count: @columnCount;\n  -webkit-column-gap: @columnGap;\n     -moz-column-gap: @columnGap;\n          column-gap: @columnGap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode;\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n  opacity: @opacity / 100;\n  filter: ~\"alpha(opacity=@{opacity})\";\n}\n\n\n\n// BACKGROUNDS\n// --------------------------------------------------\n\n// Add an alphatransparency value to any background or border color (via Elyse Holladay)\n#translucent {\n  .background(@color: @white, @alpha: 1) {\n    background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);\n  }\n  .border(@color: @white, @alpha: 1) {\n    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);\n    .background-clip(padding-box);\n  }\n}\n\n// Gradient Bar Colors for buttons and alerts\n.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {\n  color: @textColor;\n  text-shadow: @textShadow;\n  #gradient > .vertical(@primaryColor, @secondaryColor);\n  border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);\n  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);\n}\n\n// Gradients\n#gradient {\n  .horizontal(@startColor: #555, @endColor: #333) {\n    background-color: @endColor;\n    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+\n    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+\n    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+\n    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10\n    background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@startColor),argb(@endColor))); // IE9 and down\n  }\n  .vertical(@startColor: #555, @endColor: #333) {\n    background-color: mix(@startColor, @endColor, 60%);\n    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+\n    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+\n    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10\n    background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@startColor),argb(@endColor))); // IE9 and down\n  }\n  .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {\n    background-color: @endColor;\n    background-repeat: repeat-x;\n    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+\n    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10\n    background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10\n  }\n  .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {\n    background-color: mix(@midColor, @endColor, 80%);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));\n    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);\n    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop*100%, @endColor);\n    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);\n    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@innerColor: #555, @outerColor: #333)  {\n    background-color: @outerColor;\n    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));\n    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);\n    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);\n    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);\n    background-repeat: no-repeat;\n  }\n  .striped(@color, @angle: 45deg) {\n    background-color: @color;\n    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));\n    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n  }\n}\n// Reset filters for IE\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@top: #e5e5e5, @bottom: @white) {\n  // IE7 needs a set width since we gave a height. Restricting just\n  // to IE7 to keep the 1px left/right space in other browsers.\n  // It is unclear where IE is getting the extra space that we need\n  // to negative-margin away, but so it goes.\n  *width: 100%;\n  height: 1px;\n  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: @top;\n  border-bottom: 1px solid @bottom;\n}\n\n// Button backgrounds\n// ------------------\n.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {\n  // gradientBar will set the background to a pleasing blend of these, to support IE<=9\n  .gradientBar(@startColor, @endColor, @textColor, @textShadow);\n  *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n  .reset-filter();\n\n  // in these cases the gradient won't cover the background, so we override\n  &:hover, &:active, &.active, &.disabled, &[disabled] {\n    color: @textColor;\n    background-color: @endColor;\n    *background-color: darken(@endColor, 5%);\n  }\n\n  // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves\n  &:active,\n  &.active {\n    background-color: darken(@endColor, 10%) e(\"\\9\");\n  }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.\n.navbarVerticalAlign(@elementHeight) {\n  margin-top: (@navbarHeight - @elementHeight) / 2;\n}\n\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n  margin-right: auto;\n  margin-left: auto;\n  .clearfix();\n}\n\n// Table columns\n.tableColumns(@columnSpan: 1) {\n  float: none; // undo default grid column styles\n  width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells\n  margin-left: 0; // undo default grid column styles\n}\n\n// Make a Grid\n// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior\n.makeRow() {\n  margin-left: @gridGutterWidth * -1;\n  .clearfix();\n}\n.makeColumn(@columns: 1, @offset: 0) {\n  float: left;\n  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);\n  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));\n}\n\n// The Grid\n#grid {\n\n  .core (@gridColumnWidth, @gridGutterWidth) {\n\n    .spanX (@index) when (@index > 0) {\n      (~\".span@{index}\") { .span(@index); }\n      .spanX(@index - 1);\n    }\n    .spanX (0) {}\n\n    .offsetX (@index) when (@index > 0) {\n      (~\".offset@{index}\") { .offset(@index); }\n      .offsetX(@index - 1);\n    }\n    .offsetX (0) {}\n\n    .offset (@columns) {\n      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));\n    }\n\n    .span (@columns) {\n      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));\n    }\n\n    .row {\n      margin-left: @gridGutterWidth * -1;\n      .clearfix();\n    }\n\n    [class*=\"span\"] {\n      float: left;\n      margin-left: @gridGutterWidth;\n    }\n\n    // Set the container width, and override it for fixed navbars in media queries\n    .container,\n    .navbar-static-top .container,\n    .navbar-fixed-top .container,\n    .navbar-fixed-bottom .container { .span(@gridColumns); }\n\n    // generate .spanX and .offsetX\n    .spanX (@gridColumns);\n    .offsetX (@gridColumns);\n\n  }\n\n  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {\n\n    .spanX (@index) when (@index > 0) {\n      (~\".span@{index}\") { .span(@index); }\n      .spanX(@index - 1);\n    }\n    .spanX (0) {}\n\n    .offsetX (@index) when (@index > 0) {\n      (~'.offset@{index}') { .offset(@index); }\n      (~'.offset@{index}:first-child') { .offsetFirstChild(@index); }\n      .offsetX(@index - 1);\n    }\n    .offsetX (0) {}\n\n    .offset (@columns) {\n      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);\n  \t  *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);\n    }\n\n    .offsetFirstChild (@columns) {\n      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);\n      *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);\n    }\n\n    .span (@columns) {\n      width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));\n      *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);\n    }\n\n    .row-fluid {\n      width: 100%;\n      .clearfix();\n      [class*=\"span\"] {\n        .input-block-level();\n        float: left;\n        margin-left: @fluidGridGutterWidth;\n        *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);\n      }\n      [class*=\"span\"]:first-child {\n        margin-left: 0;\n      }\n\n      // generate .spanX and .offsetX\n      .spanX (@gridColumns);\n      .offsetX (@gridColumns);\n    }\n\n  }\n\n  .input(@gridColumnWidth, @gridGutterWidth) {\n\n    .spanX (@index) when (@index > 0) {\n      (~\"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}\") { .span(@index); }\n      .spanX(@index - 1);\n    }\n    .spanX (0) {}\n\n    .span(@columns) {\n      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;\n    }\n\n    input,\n    textarea,\n    .uneditable-input {\n      margin-left: 0; // override margin-left from core grid system\n    }\n\n    // Space grid-sized controls properly if multiple per line\n    .controls-row [class*=\"span\"] + [class*=\"span\"] {\n      margin-left: @gridGutterWidth;\n    }\n\n    // generate .spanX\n    .spanX (@gridColumns);\n\n  }\n\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n\n// Recalculate z-index where appropriate\n.modal-open {\n  .dropdown-menu {  z-index: @zindexDropdown + @zindexModal; }\n  .dropdown.open { *z-index: @zindexDropdown + @zindexModal; }\n  .popover       {  z-index: @zindexPopover  + @zindexModal; }\n  .tooltip       {  z-index: @zindexTooltip  + @zindexModal; }\n}\n\n// Background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindexModalBackdrop;\n  background-color: @black;\n  // Fade for backdrop\n  &.fade { opacity: 0; }\n}\n\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  .opacity(80);\n}\n\n// Base modal\n.modal {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  z-index: @zindexModal;\n  overflow: auto;\n  width: 560px;\n  margin: -250px 0 0 -280px;\n  background-color: @white;\n  border: 1px solid #999;\n  border: 1px solid rgba(0,0,0,.3);\n  *border: 1px solid #999; /* IE6-7 */\n  .border-radius(6px);\n  .box-shadow(0 3px 7px rgba(0,0,0,0.3));\n  .background-clip(padding-box);\n  &.fade {\n    .transition(e('opacity .3s linear, top .3s ease-out'));\n    top: -25%;\n  }\n  &.fade.in { top: 50%; }\n}\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n  // Close icon\n  .close { margin-top: 2px; }\n  // Heading\n  h3 {\n    margin: 0;\n    line-height: 30px;\n  }\n}\n\n// Body (where all modal content resides)\n.modal-body {\n  overflow-y: auto;\n  max-height: 400px;\n  padding: 15px;\n}\n// Remove bottom margin if need be\n.modal-form {\n  margin-bottom: 0;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right; // right align buttons\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  .border-radius(0 0 6px 6px);\n  .box-shadow(inset 0 1px 0 @white);\n  .clearfix(); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/navbar.less",
    "content": "//\n// Navbars (Redux)\n// --------------------------------------------------\n\n\n// COMMON STYLES\n// -------------\n\n// Base class and wrapper\n.navbar {\n  overflow: visible;\n  margin-bottom: @baseLineHeight;\n  color: @navbarText;\n\n  // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar\n  *position: relative;\n  *z-index: 2;\n}\n\n// Inner for background effects\n// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present\n.navbar-inner {\n  min-height: @navbarHeight;\n  padding-left:  20px;\n  padding-right: 20px;\n  #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);\n  border: 1px solid @navbarBorder;\n  .border-radius(4px);\n  .box-shadow(0 1px 4px rgba(0,0,0,.065));\n}\n\n// Set width to auto for default container\n// We then reset it for fixed navbars in the #gridSystem mixin\n.navbar .container {\n  width: auto;\n}\n\n// Override the default collapsed state\n.nav-collapse.collapse {\n  height: auto;\n}\n\n\n// Brand: website or project name\n// -------------------------\n.navbar .brand {\n  float: left;\n  display: block;\n  // Vertically center the text given @navbarHeight\n  padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);\n  margin-left: -20px; // negative indent to left-align the text down the page\n  font-size: 20px;\n  font-weight: 200;\n  color: @navbarBrandColor;\n  text-shadow: 0 1px 0 @navbarBackgroundHighlight;\n  &:hover {\n    text-decoration: none;\n  }\n}\n\n// Plain text in topbar\n// -------------------------\n.navbar-text {\n  margin-bottom: 0;\n  line-height: @navbarHeight;\n}\n\n// Janky solution for now to account for links outside the .nav\n// -------------------------\n.navbar-link {\n  color: @navbarLinkColor;\n  &:hover {\n    color: @navbarLinkColorHover;\n  }\n}\n\n// Dividers in navbar\n// -------------------------\n.navbar .divider-vertical {\n  height: @navbarHeight;\n  margin: 0 9px;\n  border-left: 1px solid @navbarBackground;\n  border-right: 1px solid @navbarBackgroundHighlight;\n}\n\n// Buttons in navbar\n// -------------------------\n.navbar .btn,\n.navbar .btn-group {\n  .navbarVerticalAlign(28px); // Vertically center in navbar\n}\n.navbar .btn-group .btn {\n  margin: 0; // then undo the margin here so we don't accidentally double it\n}\n\n// Navbar forms\n.navbar-form {\n  margin-bottom: 0; // remove default bottom margin\n  .clearfix();\n  input,\n  select,\n  .radio,\n  .checkbox {\n    .navbarVerticalAlign(30px); // Vertically center in navbar\n  }\n  input,\n  select,\n  .btn {\n    display: inline-block;\n    margin-bottom: 0;\n  }\n  input[type=\"image\"],\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    margin-top: 3px;\n  }\n  .input-append,\n  .input-prepend {\n    margin-top: 6px;\n    white-space: nowrap; // preven two  items from separating within a .navbar-form that has .pull-left\n    input {\n      margin-top: 0; // remove the margin on top since it's on the parent\n    }\n  }\n}\n\n// Navbar search\n.navbar-search {\n  position: relative;\n  float: left;\n  .navbarVerticalAlign(30px); // Vertically center in navbar\n  margin-bottom: 0;\n  .search-query {\n    margin-bottom: 0;\n    padding: 4px 14px;\n    #font > .sans-serif(13px, normal, 1);\n    .border-radius(15px); // redeclare because of specificity of the type attribute\n  }\n}\n\n\n\n// Static navbar\n// -------------------------\n\n.navbar-static-top {\n  position: static;\n  width: 100%;\n  margin-bottom: 0; // remove 18px margin for default navbar\n  .navbar-inner {\n    .border-radius(0);\n  }\n}\n\n\n\n// Fixed navbar\n// -------------------------\n\n// Shared (top/bottom) styles\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindexFixedNavbar;\n  margin-bottom: 0; // remove 18px margin for default navbar\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom,\n.navbar-static-top {\n  .navbar-inner {\n    border: 0;\n  }\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-left:  0;\n  padding-right: 0;\n  .border-radius(0);\n}\n\n// Reset container width\n// Required here as we reset the width earlier on and the grid mixins don't override early enough\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  #grid > .core > .span(@gridColumns);\n}\n\n// Fixed to top\n.navbar-fixed-top {\n  top: 0;\n}\n.navbar-fixed-top,\n.navbar-static-top {\n  .navbar-inner {\n    .box-shadow(~\"inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1)\");\n  }\n}\n\n// Fixed to bottom\n.navbar-fixed-bottom {\n  bottom: 0;\n  .navbar-inner {\n    .box-shadow(~\"inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1)\");\n  }\n}\n\n\n\n// NAVIGATION\n// ----------\n\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n.navbar .nav.pull-right {\n  float: right; // redeclare due to specificity\n}\n.navbar .nav > li {\n  float: left;\n}\n\n// Links\n.navbar .nav > li > a {\n  float: none;\n  // Vertically center the text given @navbarHeight\n  padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);\n  color: @navbarLinkColor;\n  text-decoration: none;\n  text-shadow: 0 1px 0 @navbarBackgroundHighlight;\n}\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n// Hover\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  background-color: @navbarLinkBackgroundHover; // \"transparent\" is default to differentiate :hover from .active\n  color: @navbarLinkColorHover;\n  text-decoration: none;\n}\n\n// Active nav items\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: @navbarLinkColorActive;\n  text-decoration: none;\n  background-color: @navbarLinkBackgroundActive;\n  -webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);\n     -moz-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);\n          box-shadow: inset 0 3px 8px rgba(0,0,0,.125);\n}\n\n// Navbar button for toggling navbar items in responsive layouts\n// These definitions need to come after '.navbar .btn'\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-left: 5px;\n  margin-right: 5px;\n  .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));\n  .box-shadow(~\"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)\");\n}\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  .border-radius(1px);\n  .box-shadow(0 1px 0 rgba(0,0,0,.25));\n}\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n\n\n\n// Dropdown menus\n// --------------\n\n// Menu position and menu carets\n.navbar .nav > li > .dropdown-menu {\n  &:before {\n    content: '';\n    display: inline-block;\n    border-left:   7px solid transparent;\n    border-right:  7px solid transparent;\n    border-bottom: 7px solid #ccc;\n    border-bottom-color: @dropdownBorder;\n    position: absolute;\n    top: -7px;\n    left: 9px;\n  }\n  &:after {\n    content: '';\n    display: inline-block;\n    border-left:   6px solid transparent;\n    border-right:  6px solid transparent;\n    border-bottom: 6px solid @dropdownBackground;\n    position: absolute;\n    top: -6px;\n    left: 10px;\n  }\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .nav > li > .dropdown-menu {\n  &:before {\n    border-top: 7px solid #ccc;\n    border-top-color: @dropdownBorder;\n    border-bottom: 0;\n    bottom: -7px;\n    top: auto;\n  }\n  &:after {\n    border-top: 6px solid @dropdownBackground;\n    border-bottom: 0;\n    bottom: -6px;\n    top: auto;\n  }\n}\n\n// Remove background color from open dropdown\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: @navbarLinkBackgroundActive;\n  color: @navbarLinkColorActive;\n}\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: @navbarLinkColor;\n  border-bottom-color: @navbarLinkColor;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: @navbarLinkColorActive;\n  border-bottom-color: @navbarLinkColorActive;\n}\n\n// Right aligned menus need alt position\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n  &:before {\n    left: auto;\n    right: 12px;\n  }\n  &:after {\n    left: auto;\n    right: 13px;\n  }\n  .dropdown-menu {\n    left: auto;\n    right: 100%;\n    margin-left: 0;\n    margin-right: -1px;\n    .border-radius(6px 0 6px 6px);\n  }\n}\n\n\n// Inverted navbar\n// -------------------------\n\n.navbar-inverse {\n  color: @navbarInverseText;\n\n  .navbar-inner {\n    #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);\n    border-color: @navbarInverseBorder;\n  }\n\n  .brand,\n  .nav > li > a {\n    color: @navbarInverseLinkColor;\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n    &:hover {\n      color: @navbarInverseLinkColorHover;\n    }\n  }\n\n  .nav > li > a:focus,\n  .nav > li > a:hover {\n    background-color: @navbarInverseLinkBackgroundHover;\n    color: @navbarInverseLinkColorHover;\n  }\n\n  .nav .active > a,\n  .nav .active > a:hover,\n  .nav .active > a:focus {\n    color: @navbarInverseLinkColorActive;\n    background-color: @navbarInverseLinkBackgroundActive;\n  }\n\n  // Inline text links\n  .navbar-link {\n    color: @navbarInverseLinkColor;\n    &:hover {\n      color: @navbarInverseLinkColorHover;\n    }\n  }\n\n  // Dividers in navbar\n  .divider-vertical {\n    border-left-color: @navbarInverseBackground;\n    border-right-color: @navbarInverseBackgroundHighlight;\n  }\n\n  // Dropdowns\n  .nav li.dropdown.open > .dropdown-toggle,\n  .nav li.dropdown.active > .dropdown-toggle,\n  .nav li.dropdown.open.active > .dropdown-toggle {\n    background-color: @navbarInverseLinkBackgroundActive;\n    color: @navbarInverseLinkColorActive;\n  }\n  .nav li.dropdown > .dropdown-toggle .caret {\n    border-top-color: @navbarInverseLinkColor;\n    border-bottom-color: @navbarInverseLinkColor;\n  }\n  .nav li.dropdown.open > .dropdown-toggle .caret,\n  .nav li.dropdown.active > .dropdown-toggle .caret,\n  .nav li.dropdown.open.active > .dropdown-toggle .caret {\n    border-top-color: @navbarInverseLinkColorActive;\n    border-bottom-color: @navbarInverseLinkColorActive;\n  }\n\n  // Navbar search\n  .navbar-search {\n    .search-query {\n      color: @white;\n      background-color: @navbarInverseSearchBackground;\n      border-color: @navbarInverseSearchBorder;\n      .box-shadow(~\"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)\");\n      .transition(none);\n      .placeholder(@navbarInverseSearchPlaceholderColor);\n\n      // Focus states (we use .focused since IE7-8 and down doesn't support :focus)\n      &:focus,\n      &.focused {\n        padding: 5px 15px;\n        color: @grayDark;\n        text-shadow: 0 1px 0 @white;\n        background-color: @navbarInverseSearchBackgroundFocus;\n        border: 0;\n        .box-shadow(0 0 3px rgba(0,0,0,.15));\n        outline: 0;\n      }\n    }\n  }\n\n  // Navbar collapse button\n  .btn-navbar {\n    .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));\n  }\n\n}\n\n\n\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// BASE CLASS\n// ----------\n\n.nav {\n  margin-left: 0;\n  margin-bottom: @baseLineHeight;\n  list-style: none;\n}\n\n// Make links block level\n.nav > li > a {\n  display: block;\n}\n.nav > li > a:hover {\n  text-decoration: none;\n  background-color: @grayLighter;\n}\n\n// Redeclare pull classes because of specifity\n.nav > .pull-right {\n  float: right;\n}\n\n// Nav headers (for dropdowns and lists)\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: @baseLineHeight;\n  color: @grayLight;\n  text-shadow: 0 1px 0 rgba(255,255,255,.5);\n  text-transform: uppercase;\n}\n// Space them out when they follow another list item (link)\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n\n\n\n// NAV LIST\n// --------\n\n.nav-list {\n  padding-left: 15px;\n  padding-right: 15px;\n  margin-bottom: 0;\n}\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-left:  -15px;\n  margin-right: -15px;\n  text-shadow: 0 1px 0 rgba(255,255,255,.5);\n}\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n.nav-list > .active > a,\n.nav-list > .active > a:hover {\n  color: @white;\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  background-color: @linkColor;\n}\n.nav-list [class^=\"icon-\"] {\n  margin-right: 2px;\n}\n// Dividers (basically an hr) within the dropdown\n.nav-list .divider {\n  .nav-divider();\n}\n\n\n\n// TABS AND PILLS\n// -------------\n\n// Common styles\n.nav-tabs,\n.nav-pills {\n  .clearfix();\n}\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px; // keeps the overall height an even number\n}\n\n// TABS\n// ----\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n// Make the list-items overlay the bottom border\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n// Actual tabs (as links)\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: @baseLineHeight;\n  border: 1px solid transparent;\n  .border-radius(4px 4px 0 0);\n  &:hover {\n    border-color: @grayLighter @grayLighter #ddd;\n  }\n}\n// Active state, and it's :hover to override normal :hover\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover {\n  color: @gray;\n  background-color: @white;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n\n\n// PILLS\n// -----\n\n// Links rendered as pills\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  .border-radius(5px);\n}\n\n// Active state\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover {\n  color: @white;\n  background-color: @linkColor;\n}\n\n\n\n// STACKED NAV\n// -----------\n\n// Stacked tabs and pills\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li > a {\n  margin-right: 0; // no need for the gap between nav items\n}\n\n// Tabs\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  .border-radius(0);\n}\n.nav-tabs.nav-stacked > li:first-child > a {\n  .border-top-radius(4px);\n}\n.nav-tabs.nav-stacked > li:last-child > a {\n  .border-bottom-radius(4px);\n}\n.nav-tabs.nav-stacked > li > a:hover {\n  border-color: #ddd;\n  z-index: 2;\n}\n\n// Pills\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px; // decrease margin to match sizing of stacked tabs\n}\n\n\n\n// DROPDOWNS\n// ---------\n\n.nav-tabs .dropdown-menu {\n  .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu\n}\n.nav-pills .dropdown-menu {\n  .border-radius(6px); // make rounded corners match the pills\n}\n\n// Default dropdown links\n// -------------------------\n// Make carets use linkColor to start\n.nav .dropdown-toggle .caret {\n  border-top-color: @linkColor;\n  border-bottom-color: @linkColor;\n  margin-top: 6px;\n}\n.nav .dropdown-toggle:hover .caret {\n  border-top-color: @linkColorHover;\n  border-bottom-color: @linkColorHover;\n}\n/* move down carets for tabs */\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n// Active dropdown links\n// -------------------------\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: @gray;\n  border-bottom-color: @gray;\n}\n\n// Active:hover dropdown links\n// -------------------------\n.nav > .dropdown.active > a:hover {\n  cursor: pointer;\n}\n\n// Open dropdowns\n// -------------------------\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover {\n  color: @white;\n  background-color: @grayLight;\n  border-color: @grayLight;\n}\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret {\n  border-top-color: @white;\n  border-bottom-color: @white;\n  .opacity(100);\n}\n\n// Dropdowns in stacked tabs\n.tabs-stacked .open > a:hover {\n  border-color: @grayLight;\n}\n\n\n\n// TABBABLE\n// --------\n\n\n// COMMON STYLES\n// -------------\n\n// Clear any floats\n.tabbable {\n  .clearfix();\n}\n.tab-content {\n  overflow: auto; // prevent content from running below tabs\n}\n\n// Remove border on bottom, left, right\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n\n// Show/hide tabbable areas\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n\n// BOTTOM\n// ------\n\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n.tabs-below > .nav-tabs > li > a {\n  .border-radius(0 0 4px 4px);\n  &:hover {\n    border-bottom-color: transparent;\n    border-top-color: #ddd;\n  }\n}\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover {\n  border-color: transparent #ddd #ddd #ddd;\n}\n\n// LEFT & RIGHT\n// ------------\n\n// Common styles\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n\n// Tabs on the left\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  .border-radius(4px 0 0 4px);\n}\n.tabs-left > .nav-tabs > li > a:hover {\n  border-color: @grayLighter #ddd @grayLighter @grayLighter;\n}\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: @white;\n}\n\n// Tabs on the right\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  .border-radius(0 4px 4px 0);\n}\n.tabs-right > .nav-tabs > li > a:hover {\n  border-color: @grayLighter @grayLighter @grayLighter #ddd;\n}\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: @white;\n}\n\n\n\n// DISABLED STATES\n// ---------------\n\n// Gray out text\n.nav > .disabled > a {\n  color: @grayLight;\n}\n// Nuke hover effects\n.nav > .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  margin: @baseLineHeight 0;\n  list-style: none;\n  text-align: center;\n  .clearfix();\n}\n.pager li {\n  display: inline;\n}\n.pager a {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  .border-radius(15px);\n}\n.pager a:hover {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.pager .next a {\n  float: right;\n}\n.pager .previous a {\n  float: left;\n}\n.pager .disabled a,\n.pager .disabled a:hover {\n  color: @grayLight;\n  background-color: #fff;\n  cursor: default;\n}"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n\n\n.pagination {\n  height: @baseLineHeight * 2;\n  margin: @baseLineHeight 0;\n }\n.pagination ul {\n  display: inline-block;\n  .ie7-inline-block();\n  margin-left: 0;\n  margin-bottom: 0;\n  .border-radius(3px);\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n.pagination li {\n    display: inline;\n  }\n.pagination a,\n.pagination span {\n  float: left;\n  padding: 0 14px;\n  line-height: (@baseLineHeight * 2) - 2;\n  text-decoration: none;\n  background-color: @paginationBackground;\n  border: 1px solid @paginationBorder;\n  border-left-width: 0;\n}\n.pagination a:hover,\n.pagination .active a,\n.pagination .active span {\n  background-color: #f5f5f5;\n}\n.pagination .active a,\n.pagination .active span {\n  color: @grayLight;\n  cursor: default;\n}\n.pagination .disabled span,\n.pagination .disabled a,\n.pagination .disabled a:hover {\n  color: @grayLight;\n  background-color: transparent;\n  cursor: default;\n}\n.pagination li:first-child a,\n.pagination li:first-child span {\n  border-left-width: 1px;\n  .border-radius(3px 0 0 3px);\n}\n.pagination li:last-child a,\n.pagination li:last-child span {\n  .border-radius(0 3px 3px 0);\n}\n\n// Centered\n.pagination-centered {\n  text-align: center;\n}\n.pagination-right {\n  text-align: right;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindexPopover;\n  display: none;\n  width: 236px;\n  padding: 1px;\n  background-color: @popoverBackground;\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0,0,0,.2);\n  .border-radius(6px);\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-bottom: 10px; }\n  &.right   { margin-left: 10px; }\n  &.bottom  { margin-top: 10px; }\n  &.left    { margin-right: 10px; }\n\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: @popoverTitleBackground;\n  border-bottom: 1px solid darken(@popoverTitleBackground, 5%);\n  .border-radius(5px 5px 0 0);\n}\n\n.popover-content {\n  padding: 9px 14px;\n  p, ul, ol {\n    margin-bottom: 0;\n  }\n}\n\n// Arrows\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: inline-block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover .arrow:after {\n  content: \"\";\n  z-index: -1;\n}\n\n.popover {\n  &.top .arrow {\n    bottom: -@popoverArrowWidth;\n    left: 50%;\n    margin-left: -@popoverArrowWidth;\n    border-width: @popoverArrowWidth @popoverArrowWidth 0;\n    border-top-color: @popoverArrowColor;\n    &:after {\n      border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth 0;\n      border-top-color: @popoverArrowOuterColor;\n      bottom: -1px;\n      left: -@popoverArrowOuterWidth;\n    }\n  }\n  &.right .arrow {\n    top: 50%;\n    left: -@popoverArrowWidth;\n    margin-top: -@popoverArrowWidth;\n    border-width: @popoverArrowWidth @popoverArrowWidth @popoverArrowWidth 0;\n    border-right-color: @popoverArrowColor;\n    &:after {\n      border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth @popoverArrowOuterWidth 0;\n      border-right-color: @popoverArrowOuterColor;\n      bottom: -@popoverArrowOuterWidth;\n      left: -1px;\n    }\n  }\n  &.bottom .arrow {\n    top: -@popoverArrowWidth;\n    left: 50%;\n    margin-left: -@popoverArrowWidth;\n    border-width: 0 @popoverArrowWidth @popoverArrowWidth;\n    border-bottom-color: @popoverArrowColor;\n    &:after {\n      border-width: 0 @popoverArrowOuterWidth @popoverArrowOuterWidth;\n      border-bottom-color: @popoverArrowOuterColor;\n      top: -1px;\n      left: -@popoverArrowOuterWidth;\n    }\n  }\n  &.left .arrow {\n    top: 50%;\n    right: -@popoverArrowWidth;\n    margin-top: -@popoverArrowWidth;\n    border-width: @popoverArrowWidth 0 @popoverArrowWidth @popoverArrowWidth;\n    border-left-color: @popoverArrowColor;\n    &:after {\n      border-width: @popoverArrowOuterWidth 0 @popoverArrowOuterWidth @popoverArrowOuterWidth;\n      border-left-color: @popoverArrowOuterColor;\n      bottom: -@popoverArrowOuterWidth;\n      right: -1px;\n    }\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// ANIMATIONS\n// ----------\n\n// Webkit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Firefox\n@-moz-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// IE9\n@-ms-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Opera\n@-o-keyframes progress-bar-stripes {\n  from  { background-position: 0 0; }\n  to    { background-position: 40px 0; }\n}\n\n// Spec\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// THE BARS\n// --------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @baseLineHeight;\n  margin-bottom: @baseLineHeight;\n  #gradient > .vertical(#f5f5f5, #f9f9f9);\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n  .border-radius(4px);\n}\n\n// Bar of progress\n.progress .bar {\n  width: 0%;\n  height: 100%;\n  color: @white;\n  float: left;\n  font-size: 12px;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  #gradient > .vertical(#149bdf, #0480be);\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .box-sizing(border-box);\n  .transition(width .6s ease);\n}\n.progress .bar + .bar {\n  .box-shadow(~\"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)\");\n}\n\n// Striped bars\n.progress-striped .bar {\n  #gradient > .striped(#149bdf);\n  .background-size(40px 40px);\n}\n\n// Call animation for the active one\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n\n\n// COLORS\n// ------\n\n// Danger (red)\n.progress-danger .bar, .progress .bar-danger {\n  #gradient > .vertical(#ee5f5b, #c43c35);\n}\n.progress-danger.progress-striped .bar, .progress-striped .bar-danger {\n  #gradient > .striped(#ee5f5b);\n}\n\n// Success (green)\n.progress-success .bar, .progress .bar-success {\n  #gradient > .vertical(#62c462, #57a957);\n}\n.progress-success.progress-striped .bar, .progress-striped .bar-success {\n  #gradient > .striped(#62c462);\n}\n\n// Info (teal)\n.progress-info .bar, .progress .bar-info {\n  #gradient > .vertical(#5bc0de, #339bb9);\n}\n.progress-info.progress-striped .bar, .progress-striped .bar-info {\n  #gradient > .striped(#5bc0de);\n}\n\n// Warning (orange)\n.progress-warning .bar, .progress .bar-warning {\n  #gradient > .vertical(lighten(@orange, 15%), @orange);\n}\n.progress-warning.progress-striped .bar, .progress-striped .bar-warning {\n  #gradient > .striped(lighten(@orange, 15%));\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/reset.less",
    "content": "//\n// Modals\n// Adapted from http://github.com/necolas/normalize.css\n// --------------------------------------------------\n\n\n// Display in IE6-9 and FF3\n// -------------------------\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\n\n// Display block in IE6-9 and FF3\n// -------------------------\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\n\n// Prevents modern browsers from displaying 'audio' without controls\n// -------------------------\n\naudio:not([controls]) {\n    display: none;\n}\n\n// Base settings\n// -------------------------\n\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n// Focus states\na:focus {\n  .tab-focus();\n}\n// Hover & Active\na:hover,\na:active {\n  outline: 0;\n}\n\n// Prevents sub and sup affecting line-height in all browsers\n// -------------------------\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\n\n// Img border in a's and image quality\n// -------------------------\n\nimg {\n  max-width: 100%; // Make images inherently responsive\n  height: auto; // Make images inherently responsive\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n\n// Prevent max-width from affecting Google Maps\n#map_canvas img {\n  max-width: none;\n}\n\n// Forms\n// -------------------------\n\n// Font size in all browsers, margin changes, misc consistency\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible; // Inner spacing ie IE6/7\n  line-height: normal; // FF3/4 have !important on line-height in UA stylesheet\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner { // Inner padding and border oddities in FF3/4\n  padding: 0;\n  border: 0;\n}\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer; // Cursors on all buttons applied consistently\n  -webkit-appearance: button; // Style clickable inputs in iOS\n}\ninput[type=\"search\"] { // Appearance in Safari/Chrome\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5\n}\ntextarea {\n  overflow: auto; // Remove vertical scrollbar in IE6-9\n  vertical-align: top; // Readability and alignment cross-browser\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-1200px-min.less",
    "content": "//\n// Responsive: Large desktop and up\n// --------------------------------------------------\n\n\n@media (min-width: 1200px) {\n\n  // Fixed grid\n  #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);\n\n  // Fluid grid\n  #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);\n\n  // Input grid\n  #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);\n\n  // Thumbnails\n  .thumbnails {\n    margin-left: -@gridGutterWidth1200;\n  }\n  .thumbnails > li {\n    margin-left: @gridGutterWidth1200;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-767px-max.less",
    "content": "//\n// Responsive: Landscape phone to desktop/tablet\n// --------------------------------------------------\n\n\n@media (max-width: 767px) {\n\n  // Padding to set content in a bit\n  body {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  // Negative indent the now static \"fixed\" navbar\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    margin-left: -20px;\n    margin-right: -20px;\n  }\n  // Remove padding on container given explicit padding set on body\n  .container-fluid {\n    padding: 0;\n  }\n\n  // TYPOGRAPHY\n  // ----------\n  // Reset horizontal dl\n  .dl-horizontal {\n    dt {\n      float: none;\n      clear: none;\n      width: auto;\n      text-align: left;\n    }\n    dd {\n      margin-left: 0;\n    }\n  }\n\n  // GRID & CONTAINERS\n  // -----------------\n  // Remove width from containers\n  .container {\n    width: auto;\n  }\n  // Fluid rows\n  .row-fluid {\n    width: 100%;\n  }\n  // Undo negative margin on rows and thumbnails\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present\n  }\n  // Make all grid-sized elements block level again\n  [class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    float: none;\n    display: block;\n    width: auto;\n    margin-left: 0;\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    .box-sizing(border-box);\n  }\n\n  // FORM FIELDS\n  // -----------\n  // Make span* classes full width\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    .input-block-level();\n  }\n  // But don't let it screw up prepend/append inputs\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block; // redeclare so they don't wrap to new lines\n    width: auto;\n  }\n\n  // Modals\n  .modal {\n    position: fixed;\n    top:   20px;\n    left:  20px;\n    right: 20px;\n    width: auto;\n    margin: 0;\n    &.fade.in { top: auto; }\n  }\n\n}\n\n\n\n// UP TO LANDSCAPE PHONE\n// ---------------------\n\n@media (max-width: 480px) {\n\n  // Smooth out the collapsing/expanding nav\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0); // activate the GPU\n  }\n\n  // Block level the page header small tag for readability\n  .page-header h1 small {\n    display: block;\n    line-height: @baseLineHeight;\n  }\n\n  // Update checkboxes for iOS\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n\n  // Remove the horizontal form styles\n  .form-horizontal .control-group > label {\n    float: none;\n    width: auto;\n    padding-top: 0;\n    text-align: left;\n  }\n  // Move over all input controls and content\n  .form-horizontal .controls {\n    margin-left: 0;\n  }\n  // Move the options list down to align with labels\n  .form-horizontal .control-list {\n    padding-top: 0; // has to be padding because margin collaspes\n  }\n  // Move over buttons in .form-actions to align with .controls\n  .form-horizontal .form-actions {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n\n  // Modals\n  .modal {\n    top:   10px;\n    left:  10px;\n    right: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n\n  // Carousel\n  .carousel-caption {\n    position: static;\n  }\n\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-768px-979px.less",
    "content": "//\n// Responsive: Tablet to desktop\n// --------------------------------------------------\n\n\n@media (min-width: 768px) and (max-width: 979px) {\n\n  // Fixed grid\n  #grid > .core(@gridColumnWidth768, @gridGutterWidth768);\n\n  // Fluid grid\n  #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);\n\n  // Input grid\n  #grid > .input(@gridColumnWidth768, @gridGutterWidth768);\n\n  // No need to reset .thumbnails here since it's the same @gridGutterWidth\n\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-navbar.less",
    "content": "//\n// Responsive: Navbar\n// --------------------------------------------------\n\n\n// TABLETS AND BELOW\n// -----------------\n@media (max-width: @navbarCollapseWidth) {\n\n  // UNFIX THE TOPBAR\n  // ----------------\n  // Remove any padding from the body\n  body {\n    padding-top: 0;\n  }\n  // Unfix the navbars\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: @baseLineHeight;\n  }\n  .navbar-fixed-bottom {\n    margin-top: @baseLineHeight;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  // Account for brand name\n  .navbar .brand {\n    padding-left: 10px;\n    padding-right: 10px;\n    margin: 0 0 0 -5px;\n  }\n\n  // COLLAPSIBLE NAVBAR\n  // ------------------\n  // Nav collapse clears brand\n  .nav-collapse {\n    clear: both;\n  }\n  // Block-level the nav\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 (@baseLineHeight / 2);\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: @navbarText;\n    text-shadow: none;\n  }\n  // Nav and dropdown links in navbar\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: @navbarLinkColor;\n    .border-radius(3px);\n  }\n  // Buttons\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    .border-radius(4px);\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .dropdown-menu a:hover {\n    background-color: @navbarBackground;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover {\n    background-color: @navbarInverseBackground;\n  }\n  // Buttons in the navbar\n  .nav-collapse.in .btn-group {\n    margin-top: 5px;\n    padding: 0;\n  }\n  // Dropdowns in the navbar\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    float: none;\n    display: block;\n    max-width: none;\n    margin: 0 15px;\n    padding: 0;\n    background-color: transparent;\n    border: none;\n    .border-radius(0);\n    .box-shadow(none);\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  // Forms in navbar\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: (@baseLineHeight / 2) 15px;\n    margin: (@baseLineHeight / 2) 0;\n    border-top: 1px solid @navbarBackground;\n    border-bottom: 1px solid @navbarBackground;\n    .box-shadow(~\"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)\");\n  }\n  // Pull right (secondary) nav content\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  // Hide everything in the navbar save .brand and toggle button */\n  .nav-collapse,\n  .nav-collapse.collapse {\n    overflow: hidden;\n    height: 0;\n  }\n  // Navbar button\n  .navbar .btn-navbar {\n    display: block;\n  }\n\n  // STATIC NAVBAR\n  // -------------\n  .navbar-static .navbar-inner {\n    padding-left:  10px;\n    padding-right: 10px;\n  }\n\n\n}\n\n\n// DEFAULT DESKTOP\n// ---------------\n\n@media (min-width: 980px) {\n\n  // Required to make the collapsing navbar work on regular desktops\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// Hide from screenreaders and browsers\n// Credit: HTML5 Boilerplate\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n\n// Visibility utilities\n\n// For desktops\n.visible-phone     { display: none !important; }\n.visible-tablet    { display: none !important; }\n.hidden-phone      { }\n.hidden-tablet     { }\n.hidden-desktop    { display: none !important; }\n.visible-desktop   { display: inherit !important; }\n\n// Tablets & small desktops only\n@media (min-width: 768px) and (max-width: 979px) {\n  // Hide everything else\n  .hidden-desktop    { display: inherit !important; }\n  .visible-desktop   { display: none !important ; }\n  // Show\n  .visible-tablet    { display: inherit !important; }\n  // Hide\n  .hidden-tablet     { display: none !important; }\n}\n\n// Phones only\n@media (max-width: 767px) {\n  // Hide everything else\n  .hidden-desktop    { display: inherit !important; }\n  .visible-desktop   { display: none !important; }\n  // Show\n  .visible-phone     { display: inherit !important; } // Use inherit to restore previous behavior\n  // Hide\n  .hidden-phone      { display: none !important; }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/responsive.less",
    "content": "/*!\n * Bootstrap Responsive v2.1.0\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n\n// Responsive.less\n// For phone and tablet devices\n// -------------------------------------------------------------\n\n\n// REPEAT VARIABLES & MIXINS\n// -------------------------\n// Required since we compile the responsive stuff separately\n\n@import \"variables.less\"; // Modify this for custom colors, font-sizes, etc\n@import \"mixins.less\";\n\n\n// RESPONSIVE CLASSES\n// ------------------\n\n@import \"responsive-utilities.less\";\n\n\n// MEDIA QUERIES\n// ------------------\n\n// Large desktops\n@import \"responsive-1200px-min.less\";\n\n// Tablets to regular desktops\n@import \"responsive-768px-979px.less\";\n\n// Phones to portrait tablets and narrow desktops\n@import \"responsive-767px-max.less\";\n\n\n// RESPONSIVE NAVBAR\n// ------------------\n\n// From 979px and below, show a button to toggle navbar contents\n@import \"responsive-navbar.less\";\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Body reset\n// -------------------------\n\nbody {\n  margin: 0;\n  font-family: @baseFontFamily;\n  font-size: @baseFontSize;\n  line-height: @baseLineHeight;\n  color: @textColor;\n  background-color: @bodyBackground;\n}\n\n\n// Links\n// -------------------------\n\na {\n  color: @linkColor;\n  text-decoration: none;\n}\na:hover {\n  color: @linkColorHover;\n  text-decoration: underline;\n}\n\n\n// Images\n// -------------------------\n\n.img-rounded {\n  .border-radius(6px);\n}\n\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0,0,0,.2);\n  -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);\n     -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);\n          box-shadow: 0 1px 3px rgba(0,0,0,.1);\n}\n\n.img-circle {\n  .border-radius(500px);\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/sprites.less",
    "content": "//\n// Sprites\n// --------------------------------------------------\n\n\n// ICONS\n// -----\n\n// All icons receive the styles of the <i> tag with a base class\n// of .i and are then given a unique class to add width, height,\n// and background-position. Your resulting HTML will look like\n// <i class=\"icon-inbox\"></i>.\n\n// For the white version of the icons, just add the .icon-white class:\n// <i class=\"icon-inbox icon-white\"></i>\n\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  display: inline-block;\n  width: 14px;\n  height: 14px;\n  .ie7-restore-right-whitespace();\n  line-height: 14px;\n  vertical-align: text-top;\n  background-image: url(\"@{iconSpritePath}\");\n  background-position: 14px 14px;\n  background-repeat: no-repeat;\n  margin-top: 1px;\n}\n\n/* White icons with optional class, or on hover/active states of certain elements */\n.icon-white,\n.nav > .active > a > [class^=\"icon-\"],\n.nav > .active > a > [class*=\" icon-\"],\n.dropdown-menu > li > a:hover > [class^=\"icon-\"],\n.dropdown-menu > li > a:hover > [class*=\" icon-\"],\n.dropdown-menu > .active > a > [class^=\"icon-\"],\n.dropdown-menu > .active > a > [class*=\" icon-\"] {\n  background-image: url(\"@{iconWhiteSpritePath}\");\n}\n\n.icon-glass              { background-position: 0      0; }\n.icon-music              { background-position: -24px  0; }\n.icon-search             { background-position: -48px  0; }\n.icon-envelope           { background-position: -72px  0; }\n.icon-heart              { background-position: -96px  0; }\n.icon-star               { background-position: -120px 0; }\n.icon-star-empty         { background-position: -144px 0; }\n.icon-user               { background-position: -168px 0; }\n.icon-film               { background-position: -192px 0; }\n.icon-th-large           { background-position: -216px 0; }\n.icon-th                 { background-position: -240px 0; }\n.icon-th-list            { background-position: -264px 0; }\n.icon-ok                 { background-position: -288px 0; }\n.icon-remove             { background-position: -312px 0; }\n.icon-zoom-in            { background-position: -336px 0; }\n.icon-zoom-out           { background-position: -360px 0; }\n.icon-off                { background-position: -384px 0; }\n.icon-signal             { background-position: -408px 0; }\n.icon-cog                { background-position: -432px 0; }\n.icon-trash              { background-position: -456px 0; }\n\n.icon-home               { background-position: 0      -24px; }\n.icon-file               { background-position: -24px  -24px; }\n.icon-time               { background-position: -48px  -24px; }\n.icon-road               { background-position: -72px  -24px; }\n.icon-download-alt       { background-position: -96px  -24px; }\n.icon-download           { background-position: -120px -24px; }\n.icon-upload             { background-position: -144px -24px; }\n.icon-inbox              { background-position: -168px -24px; }\n.icon-play-circle        { background-position: -192px -24px; }\n.icon-repeat             { background-position: -216px -24px; }\n.icon-refresh            { background-position: -240px -24px; }\n.icon-list-alt           { background-position: -264px -24px; }\n.icon-lock               { background-position: -287px -24px; } // 1px off\n.icon-flag               { background-position: -312px -24px; }\n.icon-headphones         { background-position: -336px -24px; }\n.icon-volume-off         { background-position: -360px -24px; }\n.icon-volume-down        { background-position: -384px -24px; }\n.icon-volume-up          { background-position: -408px -24px; }\n.icon-qrcode             { background-position: -432px -24px; }\n.icon-barcode            { background-position: -456px -24px; }\n\n.icon-tag                { background-position: 0      -48px; }\n.icon-tags               { background-position: -25px  -48px; } // 1px off\n.icon-book               { background-position: -48px  -48px; }\n.icon-bookmark           { background-position: -72px  -48px; }\n.icon-print              { background-position: -96px  -48px; }\n.icon-camera             { background-position: -120px -48px; }\n.icon-font               { background-position: -144px -48px; }\n.icon-bold               { background-position: -167px -48px; } // 1px off\n.icon-italic             { background-position: -192px -48px; }\n.icon-text-height        { background-position: -216px -48px; }\n.icon-text-width         { background-position: -240px -48px; }\n.icon-align-left         { background-position: -264px -48px; }\n.icon-align-center       { background-position: -288px -48px; }\n.icon-align-right        { background-position: -312px -48px; }\n.icon-align-justify      { background-position: -336px -48px; }\n.icon-list               { background-position: -360px -48px; }\n.icon-indent-left        { background-position: -384px -48px; }\n.icon-indent-right       { background-position: -408px -48px; }\n.icon-facetime-video     { background-position: -432px -48px; }\n.icon-picture            { background-position: -456px -48px; }\n\n.icon-pencil             { background-position: 0      -72px; }\n.icon-map-marker         { background-position: -24px  -72px; }\n.icon-adjust             { background-position: -48px  -72px; }\n.icon-tint               { background-position: -72px  -72px; }\n.icon-edit               { background-position: -96px  -72px; }\n.icon-share              { background-position: -120px -72px; }\n.icon-check              { background-position: -144px -72px; }\n.icon-move               { background-position: -168px -72px; }\n.icon-step-backward      { background-position: -192px -72px; }\n.icon-fast-backward      { background-position: -216px -72px; }\n.icon-backward           { background-position: -240px -72px; }\n.icon-play               { background-position: -264px -72px; }\n.icon-pause              { background-position: -288px -72px; }\n.icon-stop               { background-position: -312px -72px; }\n.icon-forward            { background-position: -336px -72px; }\n.icon-fast-forward       { background-position: -360px -72px; }\n.icon-step-forward       { background-position: -384px -72px; }\n.icon-eject              { background-position: -408px -72px; }\n.icon-chevron-left       { background-position: -432px -72px; }\n.icon-chevron-right      { background-position: -456px -72px; }\n\n.icon-plus-sign          { background-position: 0      -96px; }\n.icon-minus-sign         { background-position: -24px  -96px; }\n.icon-remove-sign        { background-position: -48px  -96px; }\n.icon-ok-sign            { background-position: -72px  -96px; }\n.icon-question-sign      { background-position: -96px  -96px; }\n.icon-info-sign          { background-position: -120px -96px; }\n.icon-screenshot         { background-position: -144px -96px; }\n.icon-remove-circle      { background-position: -168px -96px; }\n.icon-ok-circle          { background-position: -192px -96px; }\n.icon-ban-circle         { background-position: -216px -96px; }\n.icon-arrow-left         { background-position: -240px -96px; }\n.icon-arrow-right        { background-position: -264px -96px; }\n.icon-arrow-up           { background-position: -289px -96px; } // 1px off\n.icon-arrow-down         { background-position: -312px -96px; }\n.icon-share-alt          { background-position: -336px -96px; }\n.icon-resize-full        { background-position: -360px -96px; }\n.icon-resize-small       { background-position: -384px -96px; }\n.icon-plus               { background-position: -408px -96px; }\n.icon-minus              { background-position: -433px -96px; }\n.icon-asterisk           { background-position: -456px -96px; }\n\n.icon-exclamation-sign   { background-position: 0      -120px; }\n.icon-gift               { background-position: -24px  -120px; }\n.icon-leaf               { background-position: -48px  -120px; }\n.icon-fire               { background-position: -72px  -120px; }\n.icon-eye-open           { background-position: -96px  -120px; }\n.icon-eye-close          { background-position: -120px -120px; }\n.icon-warning-sign       { background-position: -144px -120px; }\n.icon-plane              { background-position: -168px -120px; }\n.icon-calendar           { background-position: -192px -120px; }\n.icon-random             { background-position: -216px -120px; width: 16px; }\n.icon-comment            { background-position: -240px -120px; }\n.icon-magnet             { background-position: -264px -120px; }\n.icon-chevron-up         { background-position: -288px -120px; }\n.icon-chevron-down       { background-position: -313px -119px; } // 1px, 1px off\n.icon-retweet            { background-position: -336px -120px; }\n.icon-shopping-cart      { background-position: -360px -120px; }\n.icon-folder-close       { background-position: -384px -120px; }\n.icon-folder-open        { background-position: -408px -120px; width: 16px; }\n.icon-resize-vertical    { background-position: -432px -119px; } // 1px, 1px off\n.icon-resize-horizontal  { background-position: -456px -118px; } // 1px, 2px off\n\n.icon-hdd                     { background-position: 0      -144px; }\n.icon-bullhorn                { background-position: -24px  -144px; }\n.icon-bell                    { background-position: -48px  -144px; }\n.icon-certificate             { background-position: -72px  -144px; }\n.icon-thumbs-up               { background-position: -96px  -144px; }\n.icon-thumbs-down             { background-position: -120px -144px; }\n.icon-hand-right              { background-position: -144px -144px; }\n.icon-hand-left               { background-position: -168px -144px; }\n.icon-hand-up                 { background-position: -192px -144px; }\n.icon-hand-down               { background-position: -216px -144px; }\n.icon-circle-arrow-right      { background-position: -240px -144px; }\n.icon-circle-arrow-left       { background-position: -264px -144px; }\n.icon-circle-arrow-up         { background-position: -288px -144px; }\n.icon-circle-arrow-down       { background-position: -312px -144px; }\n.icon-globe                   { background-position: -336px -144px; }\n.icon-wrench                  { background-position: -360px -144px; }\n.icon-tasks                   { background-position: -384px -144px; }\n.icon-filter                  { background-position: -408px -144px; }\n.icon-briefcase               { background-position: -432px -144px; }\n.icon-fullscreen              { background-position: -456px -144px; }\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\n// BASE TABLES\n// -----------------\n\ntable {\n  max-width: 100%;\n  background-color: @tableBackground;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n// BASELINE STYLES\n// ---------------\n\n.table {\n  width: 100%;\n  margin-bottom: @baseLineHeight;\n  // Cells\n  th,\n  td {\n    padding: 8px;\n    line-height: @baseLineHeight;\n    text-align: left;\n    vertical-align: top;\n    border-top: 1px solid @tableBorder;\n  }\n  th {\n    font-weight: bold;\n  }\n  // Bottom align for column headings\n  thead th {\n    vertical-align: bottom;\n  }\n  // Remove top border from thead by default\n  caption + thead tr:first-child th,\n  caption + thead tr:first-child td,\n  colgroup + thead tr:first-child th,\n  colgroup + thead tr:first-child td,\n  thead:first-child tr:first-child th,\n  thead:first-child tr:first-child td {\n    border-top: 0;\n  }\n  // Account for multiple tbody instances\n  tbody + tbody {\n    border-top: 2px solid @tableBorder;\n  }\n}\n\n\n\n// CONDENSED TABLE W/ HALF PADDING\n// -------------------------------\n\n.table-condensed {\n  th,\n  td {\n    padding: 4px 5px;\n  }\n}\n\n\n// BORDERED VERSION\n// ----------------\n\n.table-bordered {\n  border: 1px solid @tableBorder;\n  border-collapse: separate; // Done so we can round those corners!\n  *border-collapse: collapse; // IE7 can't round corners anyway\n  border-left: 0;\n  .border-radius(4px);\n  th,\n  td {\n    border-left: 1px solid @tableBorder;\n  }\n  // Prevent a double border\n  caption + thead tr:first-child th,\n  caption + tbody tr:first-child th,\n  caption + tbody tr:first-child td,\n  colgroup + thead tr:first-child th,\n  colgroup + tbody tr:first-child th,\n  colgroup + tbody tr:first-child td,\n  thead:first-child tr:first-child th,\n  tbody:first-child tr:first-child th,\n  tbody:first-child tr:first-child td {\n    border-top: 0;\n  }\n  // For first th or td in the first row in the first thead or tbody\n  thead:first-child tr:first-child th:first-child,\n  tbody:first-child tr:first-child td:first-child {\n    -webkit-border-top-left-radius: 4px;\n            border-top-left-radius: 4px;\n        -moz-border-radius-topleft: 4px;\n  }\n  thead:first-child tr:first-child th:last-child,\n  tbody:first-child tr:first-child td:last-child {\n    -webkit-border-top-right-radius: 4px;\n            border-top-right-radius: 4px;\n        -moz-border-radius-topright: 4px;\n  }\n  // For first th or td in the first row in the first thead or tbody\n  thead:last-child tr:last-child th:first-child,\n  tbody:last-child tr:last-child td:first-child,\n  tfoot:last-child tr:last-child td:first-child {\n    .border-radius(0 0 0 4px);\n    -webkit-border-bottom-left-radius: 4px;\n            border-bottom-left-radius: 4px;\n        -moz-border-radius-bottomleft: 4px;\n  }\n  thead:last-child tr:last-child th:last-child,\n  tbody:last-child tr:last-child td:last-child,\n  tfoot:last-child tr:last-child td:last-child {\n    -webkit-border-bottom-right-radius: 4px;\n            border-bottom-right-radius: 4px;\n        -moz-border-radius-bottomright: 4px;\n  }\n\n  // Special fixes to round the left border on the first td/th\n  caption + thead tr:first-child th:first-child,\n  caption + tbody tr:first-child td:first-child,\n  colgroup + thead tr:first-child th:first-child,\n  colgroup + tbody tr:first-child td:first-child {\n    -webkit-border-top-left-radius: 4px;\n            border-top-left-radius: 4px;\n        -moz-border-radius-topleft: 4px;\n  }\n  caption + thead tr:first-child th:last-child,\n  caption + tbody tr:first-child td:last-child,\n  colgroup + thead tr:first-child th:last-child,\n  colgroup + tbody tr:first-child td:last-child {\n    -webkit-border-top-right-radius: 4px;\n            border-top-right-radius: 4px;\n          -moz-border-right-topleft: 4px;\n  }\n\n}\n\n\n\n\n// ZEBRA-STRIPING\n// --------------\n\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n.table-striped {\n  tbody {\n    tr:nth-child(odd) td,\n    tr:nth-child(odd) th {\n      background-color: @tableBackgroundAccent;\n    }\n  }\n}\n\n\n// HOVER EFFECT\n// ------------\n// Placed here since it has to come after the potential zebra striping\n.table-hover {\n  tbody {\n    tr:hover td,\n    tr:hover th {\n      background-color: @tableBackgroundHover;\n    }\n  }\n}\n\n\n// TABLE CELL SIZING\n// -----------------\n\n// Reset default grid behavior\ntable [class*=span],\n.row-fluid table [class*=span] {\n  display: table-cell;\n  float: none; // undo default grid column styles\n  margin-left: 0; // undo default grid column styles\n}\n\n// Change the column widths to account for td/th padding\ntable {\n  .span1     { .tableColumns(1); }\n  .span2     { .tableColumns(2); }\n  .span3     { .tableColumns(3); }\n  .span4     { .tableColumns(4); }\n  .span5     { .tableColumns(5); }\n  .span6     { .tableColumns(6); }\n  .span7     { .tableColumns(7); }\n  .span8     { .tableColumns(8); }\n  .span9     { .tableColumns(9); }\n  .span10    { .tableColumns(10); }\n  .span11    { .tableColumns(11); }\n  .span12    { .tableColumns(12); }\n  .span13    { .tableColumns(13); }\n  .span14    { .tableColumns(14); }\n  .span15    { .tableColumns(15); }\n  .span16    { .tableColumns(16); }\n  .span17    { .tableColumns(17); }\n  .span18    { .tableColumns(18); }\n  .span19    { .tableColumns(19); }\n  .span20    { .tableColumns(20); }\n  .span21    { .tableColumns(21); }\n  .span22    { .tableColumns(22); }\n  .span23    { .tableColumns(23); }\n  .span24    { .tableColumns(24); }\n}\n\n\n// TABLE BACKGROUNDS\n// -----------------\n// Exact selectors below required to override .table-striped\n\n.table {\n  tbody tr.success td {\n    background-color: @successBackground;\n  }\n  tbody tr.error td {\n    background-color: @errorBackground;\n  }\n  tbody tr.info td {\n    background-color: @infoBackground;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files\n\n// Make wrapper ul behave like the grid\n.thumbnails {\n  margin-left: -@gridGutterWidth;\n  list-style: none;\n  .clearfix();\n}\n// Fluid rows have no left margin\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n\n// Float li to make thumbnails appear in a row\n.thumbnails > li {\n  float: left; // Explicity set the float since we don't require .span* classes\n  margin-bottom: @baseLineHeight;\n  margin-left: @gridGutterWidth;\n}\n\n// The actual thumbnail (can be `a` or `div`)\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: @baseLineHeight;\n  border: 1px solid #ddd;\n  .border-radius(4px);\n  .box-shadow(0 1px 3px rgba(0,0,0,.055));\n  .transition(all .2s ease-in-out);\n}\n// Add a hover state for linked versions only\na.thumbnail:hover {\n  border-color: @linkColor;\n  .box-shadow(0 1px 4px rgba(0,105,214,.25));\n}\n\n// Images and captions\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: @gray;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindexTooltip;\n  display: block;\n  visibility: visible;\n  padding: 5px;\n  font-size: 11px;\n  .opacity(0);\n  &.in     { .opacity(80); }\n  &.top    { margin-top:  -3px; }\n  &.right  { margin-left:  3px; }\n  &.bottom { margin-top:   3px; }\n  &.left   { margin-left: -3px; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: @tooltipColor;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltipBackground;\n  .border-radius(4px);\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltipArrowWidth;\n    border-width: @tooltipArrowWidth @tooltipArrowWidth 0;\n    border-top-color: @tooltipArrowColor;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltipArrowWidth;\n    border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;\n    border-right-color: @tooltipArrowColor;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltipArrowWidth;\n    border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;\n    border-left-color: @tooltipArrowColor;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltipArrowWidth;\n    border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;\n    border-bottom-color: @tooltipArrowColor;\n  }\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 @baseLineHeight / 2;\n}\n.lead {\n  margin-bottom: @baseLineHeight;\n  font-size: 20px;\n  font-weight: 200;\n  line-height: @baseLineHeight * 1.5;\n}\n\n\n// Emphasis & misc\n// -------------------------\n\nsmall {\n  font-size: 85%; // Ex: 14px base font * 85% = about 12px\n}\nstrong {\n  font-weight: bold;\n}\nem {\n  font-style: italic;\n}\ncite {\n  font-style: normal;\n}\n.muted {\n  color: @grayLight;\n}\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6 {\n  margin: (@baseLineHeight / 2) 0;\n  font-family: @headingsFontFamily;\n  font-weight: @headingsFontWeight;\n  line-height: 1;\n  color: @headingsColor;\n  text-rendering: optimizelegibility; // Fix the character spacing for headings\n  small {\n    font-weight: normal;\n    line-height: 1;\n    color: @grayLight;\n  }\n}\nh1 { font-size: 36px; line-height: 40px; }\nh2 { font-size: 30px; line-height: 40px; }\nh3 { font-size: 24px; line-height: 40px; }\nh4 { font-size: 18px; line-height: 20px; }\nh5 { font-size: 14px; line-height: 20px; }\nh6 { font-size: 12px; line-height: 20px; }\n\nh1 small { font-size: 24px; }\nh2 small { font-size: 18px; }\nh3 small { font-size: 14px; }\nh4 small { font-size: 14px; }\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (@baseLineHeight / 2) - 1;\n  margin: @baseLineHeight 0 (@baseLineHeight * 1.5);\n  border-bottom: 1px solid @grayLighter;\n}\n\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul, ol {\n  padding: 0;\n  margin: 0 0 @baseLineHeight / 2 25px;\n}\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\nli {\n  line-height: @baseLineHeight;\n}\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\n\n// Description Lists\ndl {\n  margin-bottom: @baseLineHeight;\n}\ndt,\ndd {\n  line-height: @baseLineHeight;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: @baseLineHeight / 2;\n}\n// Horizontal layout (like forms)\n.dl-horizontal {\n  dt {\n    float: left;\n    width: 120px;\n    clear: left;\n    text-align: right;\n    .text-overflow();\n  }\n  dd {\n    margin-left: 130px;\n  }\n}\n\n// MISC\n// ----\n\n// Horizontal rules\nhr {\n  margin: @baseLineHeight 0;\n  border: 0;\n  border-top: 1px solid @hrBorder;\n  border-bottom: 1px solid @white;\n}\n\n// Abbreviations and acronyms\nabbr[title] {\n  cursor: help;\n  border-bottom: 1px dotted @grayLight;\n}\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 @baseLineHeight;\n  border-left: 5px solid @grayLighter;\n  p {\n    margin-bottom: 0;\n    #font > .shorthand(16px,300,@baseLineHeight * 1.25);\n  }\n  small {\n    display: block;\n    line-height: @baseLineHeight;\n    color: @grayLight;\n    &:before {\n      content: '\\2014 \\00A0';\n    }\n  }\n\n  // Float right with text-align: right\n  &.pull-right {\n    float: right;\n    padding-right: 15px;\n    padding-left: 0;\n    border-right: 5px solid @grayLighter;\n    border-left: 0;\n    p,\n    small {\n      text-align: right;\n    }\n    small {\n      &:before {\n        content: '';\n      }\n      &:after {\n        content: '\\00A0 \\2014';\n      }\n    }\n  }\n}\n\n// Quotes\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  display: block;\n  margin-bottom: @baseLineHeight;\n  font-style: normal;\n  line-height: @baseLineHeight;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Quick floats\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n\n// Toggling content\n.hide {\n  display: none;\n}\n.show {\n  display: block;\n}\n\n// Visibility\n.invisible {\n  visibility: hidden;\n}\n\n// For Affix plugin\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// --------------------------------------------------\n\n\n// Grays\n// -------------------------\n@black:                 #000;\n@grayDarker:            #222;\n@grayDark:              #333;\n@gray:                  #555;\n@grayLight:             #999;\n@grayLighter:           #eee;\n@white:                 #fff;\n\n\n// Accent colors\n// -------------------------\n@blue:                  #049cdb;\n@blueDark:              #0064cd;\n@green:                 #46a546;\n@red:                   #9d261d;\n@yellow:                #ffc40d;\n@orange:                #f89406;\n@pink:                  #c3325f;\n@purple:                #7a43b6;\n\n\n// Scaffolding\n// -------------------------\n@bodyBackground:        @white;\n@textColor:             @grayDark;\n\n\n// Links\n// -------------------------\n@linkColor:             #08c;\n@linkColorHover:        darken(@linkColor, 15%);\n\n\n// Typography\n// -------------------------\n@sansFontFamily:        \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@serifFontFamily:       Georgia, \"Times New Roman\", Times, serif;\n@monoFontFamily:        Monaco, Menlo, Consolas, \"Courier New\", monospace;\n\n@baseFontSize:          13px;\n@baseFontFamily:        @sansFontFamily;\n@baseLineHeight:        18px;\n@altFontFamily:         @serifFontFamily;\n\n@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily\n@headingsFontWeight:    bold;    // instead of browser default, bold\n@headingsColor:         inherit; // empty to use BS default, @textColor\n\n\n// Tables\n// -------------------------\n@tableBackground:                   transparent; // overall background-color\n@tableBackgroundAccent:             #f9f9f9; // for striping\n@tableBackgroundHover:              #f5f5f5; // for hover\n@tableBorder:                       #ddd; // table and cell border\n\n\n// Buttons\n// -------------------------\n@btnBackground:                     @white;\n@btnBackgroundHighlight:            darken(@white, 10%);\n@btnBorder:                         #bbb;\n\n@btnPrimaryBackground:              @linkColor;\n@btnPrimaryBackgroundHighlight:     spin(@btnPrimaryBackground, 20%);\n\n@btnInfoBackground:                 #5bc0de;\n@btnInfoBackgroundHighlight:        #2f96b4;\n\n@btnSuccessBackground:              #62c462;\n@btnSuccessBackgroundHighlight:     #51a351;\n\n@btnWarningBackground:              lighten(@orange, 15%);\n@btnWarningBackgroundHighlight:     @orange;\n\n@btnDangerBackground:               #ee5f5b;\n@btnDangerBackgroundHighlight:      #bd362f;\n\n@btnInverseBackground:              #444;\n@btnInverseBackgroundHighlight:     @grayDarker;\n\n\n// Forms\n// -------------------------\n@inputBackground:               @white;\n@inputBorder:                   #ccc;\n@inputBorderRadius:             3px;\n@inputDisabledBackground:       @grayLighter;\n@formActionsBackground:         #f5f5f5;\n\n// Dropdowns\n// -------------------------\n@dropdownBackground:            @white;\n@dropdownBorder:                rgba(0,0,0,.2);\n@dropdownDividerTop:            #e5e5e5;\n@dropdownDividerBottom:         @white;\n\n@dropdownLinkColor:             @grayDark;\n\n@dropdownLinkColorHover:        @white;\n@dropdownLinkBackgroundHover:   @dropdownLinkBackgroundActive;\n\n@dropdownLinkColorActive:       @dropdownLinkColor;\n@dropdownLinkBackgroundActive:  @linkColor;\n\n\n\n// COMPONENT VARIABLES\n// --------------------------------------------------\n\n// Z-index master list\n// -------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n@zindexDropdown:          1000;\n@zindexPopover:           1010;\n@zindexTooltip:           1030;\n@zindexFixedNavbar:       1030;\n@zindexModalBackdrop:     1040;\n@zindexModal:             1050;\n\n\n// Sprite icons path\n// -------------------------\n@iconSpritePath:          \"../img/glyphicons-halflings.png\";\n@iconWhiteSpritePath:     \"../img/glyphicons-halflings-white.png\";\n\n\n// Input placeholder text color\n// -------------------------\n@placeholderText:         @grayLight;\n\n\n// Hr border color\n// -------------------------\n@hrBorder:                @grayLighter;\n\n\n// Wells\n// -------------------------\n@wellBackground:                  #f5f5f5;\n\n\n// Navbar\n// -------------------------\n@navbarCollapseWidth:             979px;\n\n@navbarHeight:                    40px;\n@navbarBackground:                darken(@navbarBackgroundHighlight, 5%);\n@navbarBackgroundHighlight:       #ffffff;\n@navbarBorder:                    darken(@navbarBackground, 12%);\n\n@navbarText:                      @gray;\n@navbarLinkColor:                 @gray;\n@navbarLinkColorHover:            @grayDark;\n@navbarLinkColorActive:           @gray;\n@navbarLinkBackgroundHover:       transparent;\n@navbarLinkBackgroundActive:      darken(@navbarBackground, 5%);\n\n@navbarBrandColor:                @navbarLinkColor;\n\n// Inverted navbar\n@navbarInverseBackground:                #111111;\n@navbarInverseBackgroundHighlight:       #222222;\n@navbarInverseBorder:                    #252525;\n\n@navbarInverseText:                      @grayLight;\n@navbarInverseLinkColor:                 @grayLight;\n@navbarInverseLinkColorHover:            @white;\n@navbarInverseLinkColorActive:           @navbarInverseLinkColorHover;\n@navbarInverseLinkBackgroundHover:       transparent;\n@navbarInverseLinkBackgroundActive:      @navbarInverseBackground;\n\n@navbarInverseSearchBackground:          lighten(@navbarInverseBackground, 25%);\n@navbarInverseSearchBackgroundFocus:     @white;\n@navbarInverseSearchBorder:              @navbarInverseBackground;\n@navbarInverseSearchPlaceholderColor:    #ccc;\n\n@navbarInverseBrandColor:                @navbarInverseLinkColor;\n\n\n// Pagination\n// -------------------------\n@paginationBackground:                #fff;\n@paginationBorder:                    #ddd;\n@paginationActiveBackground:          #f5f5f5;\n\n\n// Hero unit\n// -------------------------\n@heroUnitBackground:              @grayLighter;\n@heroUnitHeadingColor:            inherit;\n@heroUnitLeadColor:               inherit;\n\n\n// Form states and alerts\n// -------------------------\n@warningText:             #c09853;\n@warningBackground:       #fcf8e3;\n@warningBorder:           darken(spin(@warningBackground, -10), 3%);\n\n@errorText:               #b94a48;\n@errorBackground:         #f2dede;\n@errorBorder:             darken(spin(@errorBackground, -10), 3%);\n\n@successText:             #468847;\n@successBackground:       #dff0d8;\n@successBorder:           darken(spin(@successBackground, -10), 5%);\n\n@infoText:                #3a87ad;\n@infoBackground:          #d9edf7;\n@infoBorder:              darken(spin(@infoBackground, -10), 7%);\n\n\n// Tooltips and popovers\n// -------------------------\n@tooltipColor:            #fff;\n@tooltipBackground:       #000;\n@tooltipArrowWidth:       5px;\n@tooltipArrowColor:       @tooltipBackground;\n\n@popoverBackground:       #fff;\n@popoverArrowWidth:       10px;\n@popoverArrowColor:       #fff;\n@popoverTitleBackground:  darken(@popoverBackground, 3%);\n\n// Special enhancement for popovers\n@popoverArrowOuterWidth:  @popoverArrowWidth + 1;\n@popoverArrowOuterColor:  rgba(0,0,0,.25);\n\n\n\n// GRID\n// --------------------------------------------------\n\n\n// Default 940px grid\n// -------------------------\n@gridColumns:             12;\n@gridColumnWidth:         60px;\n@gridGutterWidth:         20px;\n@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));\n\n// 1200px min\n@gridColumnWidth1200:     70px;\n@gridGutterWidth1200:     30px;\n@gridRowWidth1200:        (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));\n\n// 768px-979px\n@gridColumnWidth768:      42px;\n@gridGutterWidth768:      20px;\n@gridRowWidth768:         (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));\n\n\n// Fluid grid\n// -------------------------\n@fluidGridColumnWidth:    percentage(@gridColumnWidth/@gridRowWidth);\n@fluidGridGutterWidth:    percentage(@gridGutterWidth/@gridRowWidth);\n\n// 1200px min\n@fluidGridColumnWidth1200:     percentage(@gridColumnWidth1200/@gridRowWidth1200);\n@fluidGridGutterWidth1200:     percentage(@gridGutterWidth1200/@gridRowWidth1200);\n\n// 768px-979px\n@fluidGridColumnWidth768:      percentage(@gridColumnWidth768/@gridRowWidth768);\n@fluidGridGutterWidth768:      percentage(@gridGutterWidth768/@gridRowWidth768);\n"
  },
  {
    "path": "servers/embed/assets/bootstrap/less/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @wellBackground;\n  border: 1px solid darken(@wellBackground, 7%);\n  .border-radius(4px);\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-large {\n  padding: 24px;\n  .border-radius(6px);\n}\n.well-small {\n  padding: 9px;\n  .border-radius(3px);\n}\n"
  },
  {
    "path": "servers/embed/assets/css/components/navbar.less",
    "content": ".navbar {\r\n  .navbar-inner {\r\n    padding: 0 8px;\r\n    min-height: 30px;\r\n  }\r\n  \r\n  .brand {\r\n    background: rgba(0,0,0,0.0) url('../../img/plunker.png') no-repeat left top;\r\n    background-size: 30px;\r\n    margin-left: -5px;\r\n    line-height: 24px;\r\n    height: 18px;\r\n  }\r\n  .nav {\r\n    > li > a {\r\n      padding: 5px 10px;\r\n    }\r\n  }\r\n  .nav.pull-right {\r\n    margin: 0;\r\n  }\r\n  .divider-vertical {\r\n    height: 30px;\r\n    margin: 0 2px;\r\n  }\r\n}"
  },
  {
    "path": "servers/embed/assets/css/pages/embed.less",
    "content": "@import \"../../bootstrap/less/bootstrap\";\r\n\r\n@import \"../components/navbar\";\r\n\r\n@import \"../vendor/prettify\";\r\n\r\n#embed {\r\n  position: absolute;\r\n  top: 30px; left: 0; right: 0; bottom: 0;\r\n  overflow: auto;\r\n  \r\n  .overlay {\r\n    z-index: 9999;\r\n    background-color: rgba(0,0,0,0.5);\r\n    position: absolute;\r\n    top: 0; left: 0; right: 0; bottom: 0;\r\n    display: none;\r\n    \r\n    .message {\r\n    \theight: 40px;\r\n      \r\n      text-align: center;\r\n      font-family: Rockwell, Georgia, \"Times New Roman\", Times, serif;\r\n      font-size: 30px;\r\n      font-weight: bold;\r\n      color: #222;\r\n      text-shadow: rgba(0,0,0,0.5) -1px 0, rgba(0,0,0,0.3) 0 -1px, rgba(255,255,255,0.5) 0 1px, rgba(0,0,0,0.3) -1px -2px;\r\n    \r\n    \tposition: absolute;\r\n    \ttop:0;\r\n    \tbottom: 0;\r\n    \tleft: 0;\r\n    \tright: 0;\r\n    \t\r\n    \tmargin: auto;\r\n    }\r\n  }\r\n  \r\n  iframe {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: 0;\r\n  }\r\n  \r\n  pre.prettyprint {\r\n    border: 1px solid #CCC;\r\n    -webkit-border-radius: 0;\r\n    -moz-border-radius: 0;\r\n    border-radius: 0;\r\n    margin: 0;\r\n  }\r\n}\r\n\r\n#embed.loading .overlay {\r\n  display: block;\r\n}\r\n\r\n#run {\r\n  position: absolute;\r\n  top: 0;\r\n  bottom: 0;\r\n  overflow: hidden;\r\n  right: 0;\r\n  left: 0;\r\n}\r\n#readme {\r\n  margin: 8px;\r\n}"
  },
  {
    "path": "servers/embed/assets/css/vendor/prettify.less",
    "content": ".com { color: #93a1a1; }\r\n.lit { color: #195f91; }\r\n.pun, .opn, .clo { color: #93a1a1; }\r\n.fun { color: #dc322f; }\r\n.str, .atv { color: #D14; }\r\n.kwd, .linenums .tag { color: #1e347b; }\r\n.typ, .atn, .dec, .var { color: teal; }\r\n.pln { color: #48484c; }\r\n\r\n.prettyprint {\r\n  padding: 8px;\r\n  background-color: #f7f7f9;\r\n  border: 1px solid #e1e1e8;\r\n}\r\n.prettyprint.linenums {\r\n  -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\r\n     -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\r\n          box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\r\n}\r\n\r\n/* Specify class=linenums on a pre to get line numbering */\r\nol.linenums {\r\n  margin: 0 0 0 33px; /* IE indents via margin-left */\r\n} \r\nol.linenums li {\r\n  padding-left: 12px;\r\n  color: #bebec5;\r\n  line-height: 18px;\r\n  text-shadow: 0 1px 0 #fff;\r\n}"
  },
  {
    "path": "servers/embed/assets/js/pages/embed.coffee",
    "content": "#= require ../vendor/showdown\r\n#= require ../vendor/prettify\r\n#= require ../vendor/overthrow\r\n\r\n#= require ../services/importer\r\n#= require ../services/url\r\n\r\n\r\nmodule = angular.module(\"plunker.embed\", [\"ngSanitize\", \"plunker.importer\", \"plunker.url\"])\r\n\r\n\r\nmodule.config [\"$routeProvider\", \"$locationProvider\", ($routeProvider, $locationProvider) ->\r\n  $locationProvider.html5Mode(true)\r\n]\r\n\r\nmodule.filter \"markdown\", [ () ->\r\n  converter = new Showdown.converter()\r\n  (value) -> if value then converter.makeHtml(value) else \"\"\r\n]\r\n\r\nmodule.controller \"embed\", [\"$scope\", \"$location\", \"$http\", \"$timeout\", \"importer\", \"url\", \"Plunk\", ($scope, $location, $http, $timeout, importer, url, Plunk) ->\r\n  $scope.url = url\r\n  $scope.plunk = new Plunk(_plunker.plunk or {})\r\n  $scope.loading = \"Initializing...\"\r\n  $scope.tab = $location.search().t or \"run\"\r\n  \r\n  $scope.selectFile = (file) -> $scope.currentFile = file\r\n  $scope.activateFile = (file) ->\r\n    $scope.selectFile(file)\r\n    $scope.tab = \"code\"\r\n    \r\n    $timeout -> $('.navbar .dropdown.open .dropdown-toggle').dropdown('toggle')\r\n    \r\n  $scope.$watch \"currentFile\", (tab) ->\r\n    $timeout -> prettyPrint()\r\n    \r\n  $scope.launchEditor = (e) ->\r\n    plunk = $scope.plunk\r\n    \r\n    hiddenInput = (name, value) ->\r\n      $(\"\"\"<input type=\"hidden\" />\"\"\").attr(\"name\", name).val(value)\r\n    \r\n    $form = $(\"\"\"<form action=\"#{url.www}/edit/\" method=\"post\" target=\"_blank\"></form>\"\"\")\r\n    \r\n    $form.append hiddenInput \"description\", plunk.description or \"\"\r\n    $form.append hiddenInput \"tags[]\", tag for tag in plunk.tags if plunk.tags\r\n    $form.append hiddenInput \"files[#{filename}]\", file.content for filename, file of plunk.files if plunk.files\r\n    \r\n    $form.submit()\r\n    \r\n    e.preventDefault()\r\n    e.stopPropagation()\r\n  \r\n  $scope.refreshPreview = ->\r\n    $scope.tab = \"run\"\r\n    $scope.loading = \"Refreshing...\"\r\n    $timeout ->\r\n      if iframe = $(\"#run>iframe\")[0]\r\n      \r\n        json = { files: {} }\r\n        \r\n        for filename, file of $scope.plunk.files\r\n          json.files[file.filename] =\r\n            content: file.content\r\n        \r\n        request = $http.post(url.run, json)\r\n        \r\n        request.then (response) ->\r\n          iframe.contentWindow.location.replace(response.data.run_url)\r\n          $scope.loading = \"\"\r\n        , (err) ->\r\n          $scope.loading = err.toString()\r\n          \r\n  $scope.attachPlunk = (plunk) ->\r\n    for filename, file of plunk.files\r\n      first = file\r\n      break\r\n        \r\n    $scope.selectFile plunk.files[$location.search().f or \"index.html\"] or first\r\n    \r\n    document.title = \"Plunker - #{plunk.description}\"\r\n    \r\n    if $scope.tab == \"run\" then $scope.refreshPreview() \r\n    else $scope.loading = \"\"\r\n    \r\n  \r\n  $scope.$watch ( -> $location.path().slice(1) ), (id) ->\r\n    if id and id isnt $scope.plunk.id\r\n      $scope.loading = \"Loading...\"\r\n      \r\n      $scope.plunk.reset()\r\n      $scope.plunk.id = id\r\n      \r\n      $scope.plunk.fetch (plunk) ->\r\n        $scope.attachPlunk(plunk)\r\n      , (err) ->\r\n        $scope.loading = err.toString()\r\n    else\r\n      $scope.attachPlunk($scope.plunk)\r\n      \r\n]"
  },
  {
    "path": "servers/embed/assets/js/services/importer.coffee",
    "content": "#= require ../services/plunks\r\n\r\nplunkerRegex = ///\r\n  ^\r\n    \\s*                   # Leading whitespace\r\n    (?:plunk:)?           # Optional plunk:prefix\r\n    ([-\\._a-zA-Z0-9]+)     # Plunk ID\r\n    \\s*                   # Trailing whitespace\r\n  $\r\n///i\r\n\r\ngithubRegex = ///\r\n  ^\r\n    \\s*                   # Leading whitespace\r\n    (?:                   # Optional protocol/hostname\r\n      (?:https?\\://)?     # Protocol\r\n      gist\\.github\\.com/  # Hostname\r\n    |\r\n      gist\\:\r\n    )\r\n    ([0-9]+|[0-9a-z]{20}) # Gist ID\r\n    (?:#.+)?              # Optional anchor\r\n    \\s*                   # Trailing whitespace\r\n  $\r\n///i\r\n\r\n\r\nmodule = angular.module(\"plunker.importer\", [\"plunker.plunks\"])\r\n\r\nmodule.factory \"importer\", [ \"$q\", \"$http\", \"Plunk\", ($q, $http, Plunk) ->\r\n  import: (source) ->\r\n    deferred = $q.defer()\r\n    \r\n    if matches = source.match(plunkerRegex)\r\n      Plunk.get {id: matches[1]}, (plunk) ->\r\n        deferred.resolve(angular.copy(plunk))\r\n      , (error) ->\r\n        deferred.reject(\"Plunk not found\")\r\n    else if matches = source.match(githubRegex)\r\n      request = $http.jsonp(\"https://api.github.com/gists/#{matches[1]}?callback=JSON_CALLBACK\")\r\n      \r\n      request.then (response) ->\r\n        if response.data.meta.status >= 400 then deferred.reject(\"Gist not found\")\r\n        else\r\n          gist = response.data.data\r\n  \r\n          json =\r\n            source:\r\n              type: \"gist\"\r\n              url: gist.html_url\r\n              title: \"gist:#{gist.id}\"\r\n            files: {}\r\n          \r\n          json.description = json.source.description = gist.description if gist.description\r\n\r\n          #if manifest = gist.files[\"plunker.json\"]\r\n          #  try\r\n          #    angular.copy(angular.fromJson(manifest.content), json)                \r\n\r\n          for filename, file of gist.files\r\n            unless filename == \"plunker.json\"\r\n              json.files[filename] =\r\n                filename: filename\r\n                content: file.content \r\n          \r\n          deferred.resolve(json)\r\n    else deferred.reject(\"Not a recognized source\")\r\n          \r\n    deferred.promise\r\n]"
  },
  {
    "path": "servers/embed/assets/js/services/plunks.coffee",
    "content": "#= require ../vendor/jquery.cookie\n\n#= require ../services/url\n\nmodule = angular.module(\"plunker.plunks\", [\"plunker.url\"])\n\nmodule.factory \"Plunk\", [\"$http\", \"$rootScope\", \"url\", ($http, $rootScope, url) ->\n  class window.Plunk\n    @defaults:\n      description: \"Untitled\"\n      tags: []\n      files:\n        \"index.html\": {filename: \"index.html\", content: \"\"}\n    @base_url: \"#{url.api}/plunks\"\n    @query: (source, success = angular.noop, error = angular.noop) ->\n      plunks = []\n      params = sessid: $.cookie(\"plnk_session\")\n      \n      unless angular.isObject(source)\n        source = \n          url: source\n          \n      source.url ||= \"#{url.api}/plunks\"\n      source.page and params.p = source.page\n      source.size and params.pp = source.sizeji\n      \n      request = $http\n        method: \"GET\"\n        params: params\n        url: source.url\n      \n      request.then (response) ->\n        if link = response.headers(\"link\")\n          plunks.pager = {}\n          \n          link.replace /<([^>]+)>;\\s*rel=\"(next|prev|first|last)\"/gi, (match, href, rel) ->\n            plunks.pager[rel] = href\n        \n        for plunk in response.data\n          plunks.push new Plunk angular.extend plunk,\n            html_url: \"/#{plunk.id}\"\n            edit_url: \"/edit/#{plunk.id}\"\n        \n        success(plunks)\n      , (error) ->\n        console.log \"Error\", error\n        \n      plunks\n      \n    @get: (json, success = angular.noop, error = angular.noop) ->\n      plunk = new Plunk(json)\n      plunk.fetch(success, error)\n      \n    @create: (json, success = angular.noop, error = angular.noop) ->\n      plunk = new Plunk(json)\n      plunk.save(success, error)\n\n\n    constructor: (attributes = {}) ->\n      @reset(attributes)\n      \n      @description ||= \"Untitled\"\n      @files ||= {}\n\n      \n    reset: (attributes = {}) -> angular.copy(attributes, @)\n    \n    getForkOf: ->\n      if @fork_of\n        if angular.isString(@fork_of)\n          @fork_of = new Plunk(id: @fork_of)\n        else unless @fork_of instanceof Plunk\n          @fork_of = new Plunk(@fork_of)\n        \n        @fork_of.fetch() unless @fork_of.url\n        @fork_of\n    \n    getForks: ->\n      if @forks\n        for fork, idx in @forks\n          if angular.isString(fork)\n            @forks[idx] = new Plunk(id: fork)\n            @forks[idx].fetch()\n          unless fork instanceof Plunk\n            @forks[idx] = new Plunk(fork)\n            @forks[idx].fetch() unless fork.url\n\n        @forks\n          \n    getEditUrl: -> \"/edit/#{@id}\" if @id\n    getHtmlUrl: -> \"/#{@id}\" if @id\n    getCommentsUrl: -> @getHtmlUrl() + \"/comments\"\n    \n    isOwner: -> !@id or !!@token\n    \n    addThumbsUp: (success = angular.noop, error = angular.noop) ->\n      plunk = @\n      \n      request = $http\n        method: \"POST\"\n        params: sessid: $.cookie(\"plnk_session\")\n        url: \"#{url.api}/plunks/#{plunk.id}/thumb\"\n      \n      request.then (response) ->\n        plunk.thumbs = response.data.thumbs\n        plunk.score = response.data.score\n        \n        plunk.thumbed = true\n        \n        success(plunk, response.headers)\n      , error\n    \n      @      \n    \n    removeThumbsUp: (success = angular.noop, error = angular.noop) ->\n      plunk = @\n      \n      request = $http\n        method: \"DELETE\"\n        params: sessid: $.cookie(\"plnk_session\")\n        url: \"#{url.api}/plunks/#{plunk.id}/thumb\"\n      \n      request.then (response) ->\n        plunk.thumbs = response.data.thumbs\n        plunk.score = response.data.score\n        \n        plunk.thumbed = false\n        \n        success(plunk, response.headers)\n      , error\n    \n      @ \n    \n    fetch: (success = angular.noop, error = angular.noop) ->\n      plunk = @\n      \n      return @ unless plunk.id\n      \n      request = $http\n        method: \"GET\"\n        params: sessid: $.cookie(\"plnk_session\")\n        url: \"#{url.api}/plunks/#{plunk.id}\"\n      \n      request.then (response) ->\n        angular.copy(response.data, plunk)\n        \n        success(plunk, response.headers)\n      , error\n    \n      @\n      \n    destroy: (success = angular.noop, error = angular.noop) ->\n      return error(\"Impossible to delete a plunk that is not saved\") unless @id\n      return error(\"Impossible to delete a plunk that you do not own\") unless @token\n      \n      self = @\n      \n      path = \"#{url.api}/plunks\"\n      path += \"/#{self.id}\" if self.id\n\n      request = $http\n        method: \"DELETE\"\n        params: sessid: $.cookie(\"plnk_session\")\n        url: path\n          \n      request.then (response) ->\n        angular.copy({}, self)\n        success()\n      , error\n      \n      self\n  \n    fork: (a0, a1, a2) ->\n      self = @\n      \n      switch arguments.length\n        when 3\n          attributes = a0\n          success = a1\n          error = a2\n        when 2\n          success = a0\n          error = a1\n        when 1\n          attributes = a0\n        \n      success ||= angular.noop\n      error ||= angular.noop\n      \n      if self.id\n        path = \"#{url.api}/plunks/#{self.id}/forks\"\n        \n        data = attributes or \n          description: self.description\n          files: self.files\n            \n        request = $http\n          method: \"POST\"\n          params: sessid: $.cookie(\"plnk_session\")\n          url: path\n          data: data\n            \n        request.then (response) ->\n          #TODO: Hack around AngularJS 1.0.1 bug\n          tags = self.tags\n          \n          angular.copy(response.data, self)\n          \n          if angular.equals(tags, self.tags)\n            self.tags = tags # Reset tags to the old reference to avoid ngList bug\n          \n          success(self, response.headers)\n        , error\n      else\n        error(\"Fork error: Plunk does not exist\")\n      \n      self\n    \n    save: (a0, a1, a2) ->\n      self = @\n      \n      switch arguments.length\n        when 3\n          attributes = a0\n          success = a1\n          error = a2\n        when 2\n          success = a0\n          error = a1\n        when 1\n          attributes = a0\n        \n      success ||= angular.noop\n      error ||= angular.noop\n      \n      path = \"#{url.api}/plunks\"\n      path += \"/#{self.id}\" if self.id\n      \n      data = attributes or \n        description: self.description\n        files: self.files\n          \n      request = $http\n        method: \"POST\"\n        params: sessid: $.cookie(\"plnk_session\")\n        url: path\n        data: data\n          \n      request.then (response) ->\n        #TODO: Hack around AngularJS 1.0.1 bug\n        tags = self.tags\n        \n        angular.copy(response.data, self)\n        \n        if angular.equals(tags, self.tags)\n          self.tags = tags # Reset tags to the old reference to avoid ngList bug\n        \n        success(self, response.headers)\n      , error\n      \n      self\n      \n]"
  },
  {
    "path": "servers/embed/assets/js/services/url.coffee",
    "content": "\nmodule = angular.module(\"plunker.url\", [])\n\nmodule.service \"url\", [ ->\n  if _plunker and _plunker.url then _plunker.url\n  else\n    www: \"\"\n    api: \"\"\n    raw: \"\"\n]"
  },
  {
    "path": "servers/embed/assets/js/vendor/angular-sanitize.js",
    "content": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, angular, undefined) {\r\n'use strict';\r\n\r\n/**\r\n * @ngdoc overview\r\n * @name ngSanitize\r\n * @description\r\n */\r\n\r\n/*\r\n * HTML Parser By Misko Hevery (misko@hevery.com)\r\n * based on:  HTML Parser By John Resig (ejohn.org)\r\n * Original code by Erik Arvidsson, Mozilla Public License\r\n * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js\r\n *\r\n * // Use like so:\r\n * htmlParser(htmlString, {\r\n *     start: function(tag, attrs, unary) {},\r\n *     end: function(tag) {},\r\n *     chars: function(text) {},\r\n *     comment: function(text) {}\r\n * });\r\n *\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc service\r\n * @name ngSanitize.$sanitize\r\n * @function\r\n *\r\n * @description\r\n *   The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are\r\n *   then serialized back to properly escaped html string. This means that no unsafe input can make\r\n *   it into the returned string, however, since our parser is more strict than a typical browser\r\n *   parser, it's possible that some obscure input, which would be recognized as valid HTML by a\r\n *   browser, won't make it through the sanitizer.\r\n *\r\n * @param {string} html Html input.\r\n * @returns {string} Sanitized html.\r\n *\r\n * @example\r\n   <doc:example module=\"ngSanitize\">\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.snippet =\r\n             '<p style=\"color:blue\">an html\\n' +\r\n             '<em onmouseover=\"this.textContent=\\'PWN3D!\\'\">click here</em>\\n' +\r\n             'snippet</p>';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n          Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\r\n           <table>\r\n             <tr>\r\n               <td>Filter</td>\r\n               <td>Source</td>\r\n               <td>Rendered</td>\r\n             </tr>\r\n             <tr id=\"html-filter\">\r\n               <td>html filter</td>\r\n               <td>\r\n                 <pre>&lt;div ng-bind-html=\"snippet\"&gt;<br/>&lt;/div&gt;</pre>\r\n               </td>\r\n               <td>\r\n                 <div ng-bind-html=\"snippet\"></div>\r\n               </td>\r\n             </tr>\r\n             <tr id=\"escaped-html\">\r\n               <td>no filter</td>\r\n               <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\r\n               <td><div ng-bind=\"snippet\"></div></td>\r\n             </tr>\r\n             <tr id=\"html-unsafe-filter\">\r\n               <td>unsafe html filter</td>\r\n               <td><pre>&lt;div ng-bind-html-unsafe=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\r\n               <td><div ng-bind-html-unsafe=\"snippet\"></div></td>\r\n             </tr>\r\n           </table>\r\n         </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should sanitize the html snippet ', function() {\r\n         expect(using('#html-filter').element('div').html()).\r\n           toBe('<p>an html\\n<em>click here</em>\\nsnippet</p>');\r\n       });\r\n\r\n       it('should escape snippet without any filter', function() {\r\n         expect(using('#escaped-html').element('div').html()).\r\n           toBe(\"&lt;p style=\\\"color:blue\\\"&gt;an html\\n\" +\r\n                \"&lt;em onmouseover=\\\"this.textContent='PWN3D!'\\\"&gt;click here&lt;/em&gt;\\n\" +\r\n                \"snippet&lt;/p&gt;\");\r\n       });\r\n\r\n       it('should inline raw snippet if filtered as unsafe', function() {\r\n         expect(using('#html-unsafe-filter').element(\"div\").html()).\r\n           toBe(\"<p style=\\\"color:blue\\\">an html\\n\" +\r\n                \"<em onmouseover=\\\"this.textContent='PWN3D!'\\\">click here</em>\\n\" +\r\n                \"snippet</p>\");\r\n       });\r\n\r\n       it('should update', function() {\r\n         input('snippet').enter('new <b>text</b>');\r\n         expect(using('#html-filter').binding('snippet')).toBe('new <b>text</b>');\r\n         expect(using('#escaped-html').element('div').html()).toBe(\"new &lt;b&gt;text&lt;/b&gt;\");\r\n         expect(using('#html-unsafe-filter').binding(\"snippet\")).toBe('new <b>text</b>');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar $sanitize = function(html) {\r\n  var buf = [];\r\n    htmlParser(html, htmlSanitizeWriter(buf));\r\n    return buf.join('');\r\n};\r\n\r\n\r\n// Regular Expressions for parsing tags and attributes\r\nvar START_TAG_REGEXP = /^<\\s*([\\w:-]+)((?:\\s+[\\w:-]+(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)\\s*>/,\r\n  END_TAG_REGEXP = /^<\\s*\\/\\s*([\\w:-]+)[^>]*>/,\r\n  ATTR_REGEXP = /([\\w:-]+)(?:\\s*=\\s*(?:(?:\"((?:[^\"])*)\")|(?:'((?:[^'])*)')|([^>\\s]+)))?/g,\r\n  BEGIN_TAG_REGEXP = /^</,\r\n  BEGING_END_TAGE_REGEXP = /^<\\s*\\//,\r\n  COMMENT_REGEXP = /<!--(.*?)-->/g,\r\n  CDATA_REGEXP = /<!\\[CDATA\\[(.*?)]]>/g,\r\n  URI_REGEXP = /^((ftp|https?):\\/\\/|mailto:|#)/,\r\n  NON_ALPHANUMERIC_REGEXP = /([^\\#-~| |!])/g; // Match everything outside of normal chars and \" (quote character)\r\n\r\n\r\n// Good source of info about elements and attributes\r\n// http://dev.w3.org/html5/spec/Overview.html#semantics\r\n// http://simon.html5.org/html-elements\r\n\r\n// Safe Void Elements - HTML5\r\n// http://dev.w3.org/html5/spec/Overview.html#void-elements\r\nvar voidElements = makeMap(\"area,br,col,hr,img,wbr\");\r\n\r\n// Elements that you can, intentionally, leave open (and which close themselves)\r\n// http://dev.w3.org/html5/spec/Overview.html#optional-tags\r\nvar optionalEndTagBlockElements = makeMap(\"colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr\"),\r\n    optionalEndTagInlineElements = makeMap(\"rp,rt\"),\r\n    optionalEndTagElements = angular.extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements);\r\n\r\n// Safe Block Elements - HTML5\r\nvar blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap(\"address,article,aside,\" +\r\n        \"blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,\" +\r\n        \"header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul\"));\r\n\r\n// Inline Elements - HTML5\r\nvar inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap(\"a,abbr,acronym,b,bdi,bdo,\" +\r\n        \"big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,\" +\r\n        \"span,strike,strong,sub,sup,time,tt,u,var\"));\r\n\r\n\r\n// Special Elements (can contain anything)\r\nvar specialElements = makeMap(\"script,style\");\r\n\r\nvar validElements = angular.extend({}, voidElements, blockElements, inlineElements, optionalEndTagElements);\r\n\r\n//Attributes that have href and hence need to be sanitized\r\nvar uriAttrs = makeMap(\"background,cite,href,longdesc,src,usemap\");\r\nvar validAttrs = angular.extend({}, uriAttrs, makeMap(\r\n    'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+\r\n    'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+\r\n    'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+\r\n    'scope,scrolling,shape,span,start,summary,target,title,type,'+\r\n    'valign,value,vspace,width'));\r\n\r\nfunction makeMap(str) {\r\n  var obj = {}, items = str.split(','), i;\r\n  for (i = 0; i < items.length; i++) obj[items[i]] = true;\r\n  return obj;\r\n}\r\n\r\n\r\n/**\r\n * @example\r\n * htmlParser(htmlString, {\r\n *     start: function(tag, attrs, unary) {},\r\n *     end: function(tag) {},\r\n *     chars: function(text) {},\r\n *     comment: function(text) {}\r\n * });\r\n *\r\n * @param {string} html string\r\n * @param {object} handler\r\n */\r\nfunction htmlParser( html, handler ) {\r\n  var index, chars, match, stack = [], last = html;\r\n  stack.last = function() { return stack[ stack.length - 1 ]; };\r\n\r\n  while ( html ) {\r\n    chars = true;\r\n\r\n    // Make sure we're not in a script or style element\r\n    if ( !stack.last() || !specialElements[ stack.last() ] ) {\r\n\r\n      // Comment\r\n      if ( html.indexOf(\"<!--\") === 0 ) {\r\n        index = html.indexOf(\"-->\");\r\n\r\n        if ( index >= 0 ) {\r\n          if (handler.comment) handler.comment( html.substring( 4, index ) );\r\n          html = html.substring( index + 3 );\r\n          chars = false;\r\n        }\r\n\r\n      // end tag\r\n      } else if ( BEGING_END_TAGE_REGEXP.test(html) ) {\r\n        match = html.match( END_TAG_REGEXP );\r\n\r\n        if ( match ) {\r\n          html = html.substring( match[0].length );\r\n          match[0].replace( END_TAG_REGEXP, parseEndTag );\r\n          chars = false;\r\n        }\r\n\r\n      // start tag\r\n      } else if ( BEGIN_TAG_REGEXP.test(html) ) {\r\n        match = html.match( START_TAG_REGEXP );\r\n\r\n        if ( match ) {\r\n          html = html.substring( match[0].length );\r\n          match[0].replace( START_TAG_REGEXP, parseStartTag );\r\n          chars = false;\r\n        }\r\n      }\r\n\r\n      if ( chars ) {\r\n        index = html.indexOf(\"<\");\r\n\r\n        var text = index < 0 ? html : html.substring( 0, index );\r\n        html = index < 0 ? \"\" : html.substring( index );\r\n\r\n        if (handler.chars) handler.chars( decodeEntities(text) );\r\n      }\r\n\r\n    } else {\r\n      html = html.replace(new RegExp(\"(.*)<\\\\s*\\\\/\\\\s*\" + stack.last() + \"[^>]*>\", 'i'), function(all, text){\r\n        text = text.\r\n          replace(COMMENT_REGEXP, \"$1\").\r\n          replace(CDATA_REGEXP, \"$1\");\r\n\r\n        if (handler.chars) handler.chars( decodeEntities(text) );\r\n\r\n        return \"\";\r\n      });\r\n\r\n      parseEndTag( \"\", stack.last() );\r\n    }\r\n\r\n    if ( html == last ) {\r\n      throw \"Parse Error: \" + html;\r\n    }\r\n    last = html;\r\n  }\r\n\r\n  // Clean up any remaining tags\r\n  parseEndTag();\r\n\r\n  function parseStartTag( tag, tagName, rest, unary ) {\r\n    tagName = angular.lowercase(tagName);\r\n    if ( blockElements[ tagName ] ) {\r\n      while ( stack.last() && inlineElements[ stack.last() ] ) {\r\n        parseEndTag( \"\", stack.last() );\r\n      }\r\n    }\r\n\r\n    if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) {\r\n      parseEndTag( \"\", tagName );\r\n    }\r\n\r\n    unary = voidElements[ tagName ] || !!unary;\r\n\r\n    if ( !unary )\r\n      stack.push( tagName );\r\n\r\n    var attrs = {};\r\n\r\n    rest.replace(ATTR_REGEXP, function(match, name, doubleQuotedValue, singleQoutedValue, unqoutedValue) {\r\n      var value = doubleQuotedValue\r\n        || singleQoutedValue\r\n        || unqoutedValue\r\n        || '';\r\n\r\n      attrs[name] = decodeEntities(value);\r\n    });\r\n    if (handler.start) handler.start( tagName, attrs, unary );\r\n  }\r\n\r\n  function parseEndTag( tag, tagName ) {\r\n    var pos = 0, i;\r\n    tagName = angular.lowercase(tagName);\r\n    if ( tagName )\r\n      // Find the closest opened tag of the same type\r\n      for ( pos = stack.length - 1; pos >= 0; pos-- )\r\n        if ( stack[ pos ] == tagName )\r\n          break;\r\n\r\n    if ( pos >= 0 ) {\r\n      // Close all the open elements, up the stack\r\n      for ( i = stack.length - 1; i >= pos; i-- )\r\n        if (handler.end) handler.end( stack[ i ] );\r\n\r\n      // Remove the open elements from the stack\r\n      stack.length = pos;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * decodes all entities into regular string\r\n * @param value\r\n * @returns {string} A string with decoded entities.\r\n */\r\nvar hiddenPre=document.createElement(\"pre\");\r\nfunction decodeEntities(value) {\r\n  hiddenPre.innerHTML=value.replace(/</g,\"&lt;\");\r\n  return hiddenPre.innerText || hiddenPre.textContent || '';\r\n}\r\n\r\n/**\r\n * Escapes all potentially dangerous characters, so that the\r\n * resulting string can be safely inserted into attribute or\r\n * element text.\r\n * @param value\r\n * @returns escaped text\r\n */\r\nfunction encodeEntities(value) {\r\n  return value.\r\n    replace(/&/g, '&amp;').\r\n    replace(NON_ALPHANUMERIC_REGEXP, function(value){\r\n      return '&#' + value.charCodeAt(0) + ';';\r\n    }).\r\n    replace(/</g, '&lt;').\r\n    replace(/>/g, '&gt;');\r\n}\r\n\r\n/**\r\n * create an HTML/XML writer which writes to buffer\r\n * @param {Array} buf use buf.jain('') to get out sanitized html string\r\n * @returns {object} in the form of {\r\n *     start: function(tag, attrs, unary) {},\r\n *     end: function(tag) {},\r\n *     chars: function(text) {},\r\n *     comment: function(text) {}\r\n * }\r\n */\r\nfunction htmlSanitizeWriter(buf){\r\n  var ignore = false;\r\n  var out = angular.bind(buf, buf.push);\r\n  return {\r\n    start: function(tag, attrs, unary){\r\n      tag = angular.lowercase(tag);\r\n      if (!ignore && specialElements[tag]) {\r\n        ignore = tag;\r\n      }\r\n      if (!ignore && validElements[tag] == true) {\r\n        out('<');\r\n        out(tag);\r\n        angular.forEach(attrs, function(value, key){\r\n          var lkey=angular.lowercase(key);\r\n          if (validAttrs[lkey]==true && (uriAttrs[lkey]!==true || value.match(URI_REGEXP))) {\r\n            out(' ');\r\n            out(key);\r\n            out('=\"');\r\n            out(encodeEntities(value));\r\n            out('\"');\r\n          }\r\n        });\r\n        out(unary ? '/>' : '>');\r\n      }\r\n    },\r\n    end: function(tag){\r\n        tag = angular.lowercase(tag);\r\n        if (!ignore && validElements[tag] == true) {\r\n          out('</');\r\n          out(tag);\r\n          out('>');\r\n        }\r\n        if (tag == ignore) {\r\n          ignore = false;\r\n        }\r\n      },\r\n    chars: function(chars){\r\n        if (!ignore) {\r\n          out(encodeEntities(chars));\r\n        }\r\n      }\r\n  };\r\n}\r\n\r\n\r\n// define ngSanitize module and register $sanitize service\r\nangular.module('ngSanitize', []).value('$sanitize', $sanitize);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ngSanitize.directive:ngBindHtml\r\n *\r\n * @description\r\n * Creates a binding that will sanitize the result of evaluating the `expression` with the\r\n * {@link ngSanitize.$sanitize $sanitize} service and innerHTML the result into the current element.\r\n *\r\n * See {@link ngSanitize.$sanitize $sanitize} docs for examples.\r\n *\r\n * @element ANY\r\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\r\n */\r\nangular.module('ngSanitize').directive('ngBindHtml', ['$sanitize', function($sanitize) {\r\n  return function(scope, element, attr) {\r\n    element.addClass('ng-binding').data('$binding', attr.ngBindHtml);\r\n    scope.$watch(attr.ngBindHtml, function(value) {\r\n      value = $sanitize(value);\r\n      element.html(value || '');\r\n    });\r\n  };\r\n}]);\r\n/**\r\n * @ngdoc filter\r\n * @name ngSanitize.filter:linky\r\n * @function\r\n *\r\n * @description\r\n *   Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and\r\n *   plain email address links.\r\n *\r\n * @param {string} text Input text.\r\n * @returns {string} Html-linkified text.\r\n *\r\n * @example\r\n   <doc:example module=\"ngSanitize\">\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.snippet =\r\n             'Pretty text with some links:\\n'+\r\n             'http://angularjs.org/,\\n'+\r\n             'mailto:us@somewhere.org,\\n'+\r\n             'another@somewhere.org,\\n'+\r\n             'and one more: ftp://127.0.0.1/.';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n       Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\r\n       <table>\r\n         <tr>\r\n           <td>Filter</td>\r\n           <td>Source</td>\r\n           <td>Rendered</td>\r\n         </tr>\r\n         <tr id=\"linky-filter\">\r\n           <td>linky filter</td>\r\n           <td>\r\n             <pre>&lt;div ng-bind-html=\"snippet | linky\"&gt;<br>&lt;/div&gt;</pre>\r\n           </td>\r\n           <td>\r\n             <div ng-bind-html=\"snippet | linky\"></div>\r\n           </td>\r\n         </tr>\r\n         <tr id=\"escaped-html\">\r\n           <td>no filter</td>\r\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br>&lt;/div&gt;</pre></td>\r\n           <td><div ng-bind=\"snippet\"></div></td>\r\n         </tr>\r\n       </table>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should linkify the snippet with urls', function() {\r\n         expect(using('#linky-filter').binding('snippet | linky')).\r\n           toBe('Pretty text with some links:&#10;' +\r\n                '<a href=\"http://angularjs.org/\">http://angularjs.org/</a>,&#10;' +\r\n                '<a href=\"mailto:us@somewhere.org\">us@somewhere.org</a>,&#10;' +\r\n                '<a href=\"mailto:another@somewhere.org\">another@somewhere.org</a>,&#10;' +\r\n                'and one more: <a href=\"ftp://127.0.0.1/\">ftp://127.0.0.1/</a>.');\r\n       });\r\n\r\n       it ('should not linkify snippet without the linky filter', function() {\r\n         expect(using('#escaped-html').binding('snippet')).\r\n           toBe(\"Pretty text with some links:\\n\" +\r\n                \"http://angularjs.org/,\\n\" +\r\n                \"mailto:us@somewhere.org,\\n\" +\r\n                \"another@somewhere.org,\\n\" +\r\n                \"and one more: ftp://127.0.0.1/.\");\r\n       });\r\n\r\n       it('should update', function() {\r\n         input('snippet').enter('new http://link.');\r\n         expect(using('#linky-filter').binding('snippet | linky')).\r\n           toBe('new <a href=\"http://link\">http://link</a>.');\r\n         expect(using('#escaped-html').binding('snippet')).toBe('new http://link.');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nangular.module('ngSanitize').filter('linky', function() {\r\n  var LINKY_URL_REGEXP = /((ftp|https?):\\/\\/|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s\\.\\;\\,\\(\\)\\{\\}\\<\\>]/,\r\n      MAILTO_REGEXP = /^mailto:/;\r\n\r\n  return function(text) {\r\n    if (!text) return text;\r\n    var match;\r\n    var raw = text;\r\n    var html = [];\r\n    // TODO(vojta): use $sanitize instead\r\n    var writer = htmlSanitizeWriter(html);\r\n    var url;\r\n    var i;\r\n    while ((match = raw.match(LINKY_URL_REGEXP))) {\r\n      // We can not end in these as they are sometimes found at the end of the sentence\r\n      url = match[0];\r\n      // if we did not match ftp/http/mailto then assume mailto\r\n      if (match[2] == match[3]) url = 'mailto:' + url;\r\n      i = match.index;\r\n      writer.chars(raw.substr(0, i));\r\n      writer.start('a', {href:url});\r\n      writer.chars(match[0].replace(MAILTO_REGEXP, ''));\r\n      writer.end('a');\r\n      raw = raw.substring(i + match[0].length);\r\n    }\r\n    writer.chars(raw);\r\n    return html.join('');\r\n  };\r\n});\r\n\r\n})(window, window.angular);"
  },
  {
    "path": "servers/embed/assets/js/vendor/angular-ui.js",
    "content": "/**\r\n * AngularUI for AngularJS\r\n * v0.1.0\r\n * \r\n * @link http://angular-ui.github.com/\r\n */\r\n\r\nangular.module('ui.config', []).value('ui.config', {});\r\nangular.module('ui.filters', ['ui.config']);\r\nangular.module('ui.directives', ['ui.config']);\r\nangular.module('ui', [\r\n  'ui.filters', \r\n  'ui.directives',\r\n  'ui.config'\r\n]);\r\n\r\nangular.module('ui.directives').directive('uiKeypress', ['$parse', function ($parse) {\r\n  return {\r\n    link: function (scope, elm, attrs) {\r\n      var keysByCode = {\r\n        8: 'backspace',\r\n        9: 'tab',\r\n        13: 'enter',\r\n        27: 'esc',\r\n        32: 'space',\r\n        33: 'pageup',\r\n        34: 'pagedown',\r\n        35: 'end',\r\n        36: 'home',\r\n        37: 'left',\r\n        38: 'up',\r\n        39: 'right',\r\n        40: 'down',\r\n        45: 'insert',\r\n        46: 'delete'\r\n      };\r\n\r\n      var params, paramsParsed, expression, keys, combinations = [];\r\n      try {\r\n        params = scope.$eval(attrs.uiKeypress);\r\n        paramsParsed = true;\r\n      } catch (error) {\r\n        params = attrs.uiKeypress.split(/\\s+and\\s+/i);\r\n        paramsParsed = false;\r\n      }\r\n\r\n      // Prepare combinations for simple checking\r\n      angular.forEach(params, function (v, k) {\r\n        var combination = {};\r\n        if (paramsParsed) {\r\n          // An object passed\r\n          combination.expression = $parse(v);\r\n          combination.keys = k;\r\n        } else {\r\n          // A string passed\r\n          v = v.split(/\\s+on\\s+/i);\r\n          combination.expression = $parse(v[0]);\r\n          combination.keys = v[1];\r\n        }\r\n\r\n        keys = {};\r\n        angular.forEach(combination.keys.split('-'), function (value) {\r\n          keys[value] = true;\r\n        });\r\n        combination.keys = keys;\r\n        combinations.push(combination);\r\n      });\r\n\r\n      // Check only mathcing of pressed keys one of the conditions\r\n      elm.bind('keydown', function (event) {\r\n        // No need to do that inside the cycle\r\n        var altPressed = event.metaKey || event.altKey;\r\n        var ctrlPressed = event.ctrlKey;\r\n        var shiftPressed = event.shiftKey;\r\n\r\n        // Iterate over prepared combinations\r\n        angular.forEach(combinations, function (combination) {\r\n\r\n          var mainKeyPressed = (combination.keys[keysByCode[event.keyCode]] || combination.keys[event.keyCode.toString()]) || false;\r\n\r\n          var altRequired = combination.keys.alt || false;\r\n          var ctrlRequired = combination.keys.ctrl || false;\r\n          var shiftRequired = combination.keys.shift || false;\r\n\r\n          if (mainKeyPressed &&\r\n            ( altRequired == altPressed   ) &&\r\n            ( ctrlRequired == ctrlPressed  ) &&\r\n            ( shiftRequired == shiftPressed )\r\n            ) {\r\n            // Run the function\r\n            scope.$apply(function () {\r\n              combination.expression(scope, { '$event': event });\r\n            });\r\n          }\r\n        });\r\n      });\r\n    }\r\n  };\r\n}]);"
  },
  {
    "path": "servers/embed/assets/js/vendor/angular.js",
    "content": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, document, undefined) {\r\n'use strict';\r\n\r\n////////////////////////////////////\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.lowercase\r\n * @function\r\n *\r\n * @description Converts the specified string to lowercase.\r\n * @param {string} string String to be converted to lowercase.\r\n * @returns {string} Lowercased string.\r\n */\r\nvar lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.uppercase\r\n * @function\r\n *\r\n * @description Converts the specified string to uppercase.\r\n * @param {string} string String to be converted to uppercase.\r\n * @returns {string} Uppercased string.\r\n */\r\nvar uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};\r\n\r\n\r\nvar manualLowercase = function(s) {\r\n  return isString(s)\r\n      ? s.replace(/[A-Z]/g, function(ch) {return fromCharCode(ch.charCodeAt(0) | 32);})\r\n      : s;\r\n};\r\nvar manualUppercase = function(s) {\r\n  return isString(s)\r\n      ? s.replace(/[a-z]/g, function(ch) {return fromCharCode(ch.charCodeAt(0) & ~32);})\r\n      : s;\r\n};\r\n\r\n\r\n// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\r\n// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\r\n// with correct but slower alternatives.\r\nif ('i' !== 'I'.toLowerCase()) {\r\n  lowercase = manualLowercase;\r\n  uppercase = manualUppercase;\r\n}\r\n\r\nfunction fromCharCode(code) {return String.fromCharCode(code);}\r\n\r\n\r\nvar Error             = window.Error,\r\n    /** holds major version number for IE or NaN for real browsers */\r\n    msie              = int((/msie (\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]),\r\n    jqLite,           // delay binding since jQuery could be loaded after us.\r\n    jQuery,           // delay binding\r\n    slice             = [].slice,\r\n    push              = [].push,\r\n    toString          = Object.prototype.toString,\r\n\r\n    /** @name angular */\r\n    angular           = window.angular || (window.angular = {}),\r\n    angularModule,\r\n    nodeName_,\r\n    uid               = ['0', '0', '0'];\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.forEach\r\n * @function\r\n *\r\n * @description\r\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\r\n * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`\r\n * is the value of an object property or an array element and `key` is the object property key or\r\n * array element index. Specifying a `context` for the function is optional.\r\n *\r\n * Note: this function was previously known as `angular.foreach`.\r\n *\r\n   <pre>\r\n     var values = {name: 'misko', gender: 'male'};\r\n     var log = [];\r\n     angular.forEach(values, function(value, key){\r\n       this.push(key + ': ' + value);\r\n     }, log);\r\n     expect(log).toEqual(['name: misko', 'gender:male']);\r\n   </pre>\r\n *\r\n * @param {Object|Array} obj Object to iterate over.\r\n * @param {Function} iterator Iterator function.\r\n * @param {Object=} context Object to become context (`this`) for the iterator function.\r\n * @returns {Object|Array} Reference to `obj`.\r\n */\r\nfunction forEach(obj, iterator, context) {\r\n  var key;\r\n  if (obj) {\r\n    if (isFunction(obj)){\r\n      for (key in obj) {\r\n        if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) {\r\n          iterator.call(context, obj[key], key);\r\n        }\r\n      }\r\n    } else if (obj.forEach && obj.forEach !== forEach) {\r\n      obj.forEach(iterator, context);\r\n    } else if (isObject(obj) && isNumber(obj.length)) {\r\n      for (key = 0; key < obj.length; key++)\r\n        iterator.call(context, obj[key], key);\r\n    } else {\r\n      for (key in obj) {\r\n        if (obj.hasOwnProperty(key)) {\r\n          iterator.call(context, obj[key], key);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return obj;\r\n}\r\n\r\nfunction sortedKeys(obj) {\r\n  var keys = [];\r\n  for (var key in obj) {\r\n    if (obj.hasOwnProperty(key)) {\r\n      keys.push(key);\r\n    }\r\n  }\r\n  return keys.sort();\r\n}\r\n\r\nfunction forEachSorted(obj, iterator, context) {\r\n  var keys = sortedKeys(obj);\r\n  for ( var i = 0; i < keys.length; i++) {\r\n    iterator.call(context, obj[keys[i]], keys[i]);\r\n  }\r\n  return keys;\r\n}\r\n\r\n\r\n/**\r\n * when using forEach the params are value, key, but it is often useful to have key, value.\r\n * @param {function(string, *)} iteratorFn\r\n * @returns {function(*, string)}\r\n */\r\nfunction reverseParams(iteratorFn) {\r\n  return function(value, key) { iteratorFn(key, value) };\r\n}\r\n\r\n/**\r\n * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\r\n * characters such as '012ABC'. The reason why we are not using simply a number counter is that\r\n * the number string gets longer over time, and it can also overflow, where as the the nextId\r\n * will grow much slower, it is a string, and it will never overflow.\r\n *\r\n * @returns an unique alpha-numeric string\r\n */\r\nfunction nextUid() {\r\n  var index = uid.length;\r\n  var digit;\r\n\r\n  while(index) {\r\n    index--;\r\n    digit = uid[index].charCodeAt(0);\r\n    if (digit == 57 /*'9'*/) {\r\n      uid[index] = 'A';\r\n      return uid.join('');\r\n    }\r\n    if (digit == 90  /*'Z'*/) {\r\n      uid[index] = '0';\r\n    } else {\r\n      uid[index] = String.fromCharCode(digit + 1);\r\n      return uid.join('');\r\n    }\r\n  }\r\n  uid.unshift('0');\r\n  return uid.join('');\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.extend\r\n * @function\r\n *\r\n * @description\r\n * Extends the destination object `dst` by copying all of the properties from the `src` object(s)\r\n * to `dst`. You can specify multiple `src` objects.\r\n *\r\n * @param {Object} dst Destination object.\r\n * @param {...Object} src Source object(s).\r\n */\r\nfunction extend(dst) {\r\n  forEach(arguments, function(obj){\r\n    if (obj !== dst) {\r\n      forEach(obj, function(value, key){\r\n        dst[key] = value;\r\n      });\r\n    }\r\n  });\r\n  return dst;\r\n}\r\n\r\nfunction int(str) {\r\n  return parseInt(str, 10);\r\n}\r\n\r\n\r\nfunction inherit(parent, extra) {\r\n  return extend(new (extend(function() {}, {prototype:parent}))(), extra);\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.noop\r\n * @function\r\n *\r\n * @description\r\n * A function that performs no operations. This function can be useful when writing code in the\r\n * functional style.\r\n   <pre>\r\n     function foo(callback) {\r\n       var result = calculateResult();\r\n       (callback || angular.noop)(result);\r\n     }\r\n   </pre>\r\n */\r\nfunction noop() {}\r\nnoop.$inject = [];\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.identity\r\n * @function\r\n *\r\n * @description\r\n * A function that returns its first argument. This function is useful when writing code in the\r\n * functional style.\r\n *\r\n   <pre>\r\n     function transformer(transformationFn, value) {\r\n       return (transformationFn || identity)(value);\r\n     };\r\n   </pre>\r\n */\r\nfunction identity($) {return $;}\r\nidentity.$inject = [];\r\n\r\n\r\nfunction valueFn(value) {return function() {return value;};}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isUndefined\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is undefined.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is undefined.\r\n */\r\nfunction isUndefined(value){return typeof value == 'undefined';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isDefined\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is defined.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is defined.\r\n */\r\nfunction isDefined(value){return typeof value != 'undefined';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isObject\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\r\n * considered to be objects.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is an `Object` but not `null`.\r\n */\r\nfunction isObject(value){return value != null && typeof value == 'object';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isString\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a `String`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `String`.\r\n */\r\nfunction isString(value){return typeof value == 'string';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isNumber\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a `Number`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `Number`.\r\n */\r\nfunction isNumber(value){return typeof value == 'number';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isDate\r\n * @function\r\n *\r\n * @description\r\n * Determines if a value is a date.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `Date`.\r\n */\r\nfunction isDate(value){\r\n  return toString.apply(value) == '[object Date]';\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isArray\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is an `Array`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is an `Array`.\r\n */\r\nfunction isArray(value) {\r\n  return toString.apply(value) == '[object Array]';\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isFunction\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a `Function`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `Function`.\r\n */\r\nfunction isFunction(value){return typeof value == 'function';}\r\n\r\n\r\n/**\r\n * Checks if `obj` is a window object.\r\n *\r\n * @private\r\n * @param {*} obj Object to check\r\n * @returns {boolean} True if `obj` is a window obj.\r\n */\r\nfunction isWindow(obj) {\r\n  return obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n}\r\n\r\n\r\nfunction isScope(obj) {\r\n  return obj && obj.$evalAsync && obj.$watch;\r\n}\r\n\r\n\r\nfunction isFile(obj) {\r\n  return toString.apply(obj) === '[object File]';\r\n}\r\n\r\n\r\nfunction isBoolean(value) {\r\n  return typeof value == 'boolean';\r\n}\r\n\r\n\r\nfunction trim(value) {\r\n  return isString(value) ? value.replace(/^\\s*/, '').replace(/\\s*$/, '') : value;\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isElement\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a DOM element (or wrapped jQuery element).\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\r\n */\r\nfunction isElement(node) {\r\n  return node &&\r\n    (node.nodeName  // we are a direct element\r\n    || (node.bind && node.find));  // we have a bind and find method part of jQuery API\r\n}\r\n\r\n/**\r\n * @param str 'key1,key2,...'\r\n * @returns {object} in the form of {key1:true, key2:true, ...}\r\n */\r\nfunction makeMap(str){\r\n  var obj = {}, items = str.split(\",\"), i;\r\n  for ( i = 0; i < items.length; i++ )\r\n    obj[ items[i] ] = true;\r\n  return obj;\r\n}\r\n\r\n\r\nif (msie < 9) {\r\n  nodeName_ = function(element) {\r\n    element = element.nodeName ? element : element[0];\r\n    return (element.scopeName && element.scopeName != 'HTML')\r\n      ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;\r\n  };\r\n} else {\r\n  nodeName_ = function(element) {\r\n    return element.nodeName ? element.nodeName : element[0].nodeName;\r\n  };\r\n}\r\n\r\n\r\nfunction map(obj, iterator, context) {\r\n  var results = [];\r\n  forEach(obj, function(value, index, list) {\r\n    results.push(iterator.call(context, value, index, list));\r\n  });\r\n  return results;\r\n}\r\n\r\n\r\n/**\r\n * @description\r\n * Determines the number of elements in an array, the number of properties an object has, or\r\n * the length of a string.\r\n *\r\n * Note: This function is used to augment the Object type in Angular expressions. See\r\n * {@link angular.Object} for more information about Angular arrays.\r\n *\r\n * @param {Object|Array|string} obj Object, array, or string to inspect.\r\n * @param {boolean} [ownPropsOnly=false] Count only \"own\" properties in an object\r\n * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.\r\n */\r\nfunction size(obj, ownPropsOnly) {\r\n  var size = 0, key;\r\n\r\n  if (isArray(obj) || isString(obj)) {\r\n    return obj.length;\r\n  } else if (isObject(obj)){\r\n    for (key in obj)\r\n      if (!ownPropsOnly || obj.hasOwnProperty(key))\r\n        size++;\r\n  }\r\n\r\n  return size;\r\n}\r\n\r\n\r\nfunction includes(array, obj) {\r\n  return indexOf(array, obj) != -1;\r\n}\r\n\r\nfunction indexOf(array, obj) {\r\n  if (array.indexOf) return array.indexOf(obj);\r\n\r\n  for ( var i = 0; i < array.length; i++) {\r\n    if (obj === array[i]) return i;\r\n  }\r\n  return -1;\r\n}\r\n\r\nfunction arrayRemove(array, value) {\r\n  var index = indexOf(array, value);\r\n  if (index >=0)\r\n    array.splice(index, 1);\r\n  return value;\r\n}\r\n\r\nfunction isLeafNode (node) {\r\n  if (node) {\r\n    switch (node.nodeName) {\r\n    case \"OPTION\":\r\n    case \"PRE\":\r\n    case \"TITLE\":\r\n      return true;\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.copy\r\n * @function\r\n *\r\n * @description\r\n * Creates a deep copy of `source`, which should be an object or an array.\r\n *\r\n * * If no destination is supplied, a copy of the object or array is created.\r\n * * If a destination is provided, all of its elements (for array) or properties (for objects)\r\n *   are deleted and then all elements/properties from the source are copied to it.\r\n * * If  `source` is not an object or array, `source` is returned.\r\n *\r\n * Note: this function is used to augment the Object type in Angular expressions. See\r\n * {@link ng.$filter} for more information about Angular arrays.\r\n *\r\n * @param {*} source The source that will be used to make a copy.\r\n *                   Can be any type, including primitives, `null`, and `undefined`.\r\n * @param {(Object|Array)=} destination Destination into which the source is copied. If\r\n *     provided, must be of the same type as `source`.\r\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\r\n */\r\nfunction copy(source, destination){\r\n  if (isWindow(source) || isScope(source)) throw Error(\"Can't copy Window or Scope\");\r\n  if (!destination) {\r\n    destination = source;\r\n    if (source) {\r\n      if (isArray(source)) {\r\n        destination = copy(source, []);\r\n      } else if (isDate(source)) {\r\n        destination = new Date(source.getTime());\r\n      } else if (isObject(source)) {\r\n        destination = copy(source, {});\r\n      }\r\n    }\r\n  } else {\r\n    if (source === destination) throw Error(\"Can't copy equivalent objects or arrays\");\r\n    if (isArray(source)) {\r\n      while(destination.length) {\r\n        destination.pop();\r\n      }\r\n      for ( var i = 0; i < source.length; i++) {\r\n        destination.push(copy(source[i]));\r\n      }\r\n    } else {\r\n      forEach(destination, function(value, key){\r\n        delete destination[key];\r\n      });\r\n      for ( var key in source) {\r\n        destination[key] = copy(source[key]);\r\n      }\r\n    }\r\n  }\r\n  return destination;\r\n}\r\n\r\n/**\r\n * Create a shallow copy of an object\r\n */\r\nfunction shallowCopy(src, dst) {\r\n  dst = dst || {};\r\n\r\n  for(var key in src) {\r\n    if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') {\r\n      dst[key] = src[key];\r\n    }\r\n  }\r\n\r\n  return dst;\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.equals\r\n * @function\r\n *\r\n * @description\r\n * Determines if two objects or two values are equivalent. Supports value types, arrays and\r\n * objects.\r\n *\r\n * Two objects or values are considered equivalent if at least one of the following is true:\r\n *\r\n * * Both objects or values pass `===` comparison.\r\n * * Both objects or values are of the same type and all of their properties pass `===` comparison.\r\n * * Both values are NaN. (In JavasScript, NaN == NaN => false. But we consider two NaN as equal)\r\n *\r\n * During a property comparision, properties of `function` type and properties with names\r\n * that begin with `$` are ignored.\r\n *\r\n * Scope and DOMWindow objects are being compared only be identify (`===`).\r\n *\r\n * @param {*} o1 Object or value to compare.\r\n * @param {*} o2 Object or value to compare.\r\n * @returns {boolean} True if arguments are equal.\r\n */\r\nfunction equals(o1, o2) {\r\n  if (o1 === o2) return true;\r\n  if (o1 === null || o2 === null) return false;\r\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\r\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\r\n  if (t1 == t2) {\r\n    if (t1 == 'object') {\r\n      if (isArray(o1)) {\r\n        if ((length = o1.length) == o2.length) {\r\n          for(key=0; key<length; key++) {\r\n            if (!equals(o1[key], o2[key])) return false;\r\n          }\r\n          return true;\r\n        }\r\n      } else if (isDate(o1)) {\r\n        return isDate(o2) && o1.getTime() == o2.getTime();\r\n      } else {\r\n        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false;\r\n        keySet = {};\r\n        for(key in o1) {\r\n          if (key.charAt(0) !== '$' && !isFunction(o1[key]) && !equals(o1[key], o2[key])) {\r\n            return false;\r\n          }\r\n          keySet[key] = true;\r\n        }\r\n        for(key in o2) {\r\n          if (!keySet[key] && key.charAt(0) !== '$' && !isFunction(o2[key])) return false;\r\n        }\r\n        return true;\r\n      }\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n\r\nfunction concat(array1, array2, index) {\r\n  return array1.concat(slice.call(array2, index));\r\n}\r\n\r\nfunction sliceArgs(args, startIndex) {\r\n  return slice.call(args, startIndex || 0);\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.bind\r\n * @function\r\n *\r\n * @description\r\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\r\n * `fn`). You can supply optional `args` that are are prebound to the function. This feature is also\r\n * known as [function currying](http://en.wikipedia.org/wiki/Currying).\r\n *\r\n * @param {Object} self Context which `fn` should be evaluated in.\r\n * @param {function()} fn Function to be bound.\r\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\r\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\r\n */\r\nfunction bind(self, fn) {\r\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\r\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\r\n    return curryArgs.length\r\n      ? function() {\r\n          return arguments.length\r\n            ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))\r\n            : fn.apply(self, curryArgs);\r\n        }\r\n      : function() {\r\n          return arguments.length\r\n            ? fn.apply(self, arguments)\r\n            : fn.call(self);\r\n        };\r\n  } else {\r\n    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)\r\n    return fn;\r\n  }\r\n}\r\n\r\n\r\nfunction toJsonReplacer(key, value) {\r\n  var val = value;\r\n\r\n  if (/^\\$+/.test(key)) {\r\n    val = undefined;\r\n  } else if (isWindow(value)) {\r\n    val = '$WINDOW';\r\n  } else if (value &&  document === value) {\r\n    val = '$DOCUMENT';\r\n  } else if (isScope(value)) {\r\n    val = '$SCOPE';\r\n  }\r\n\r\n  return val;\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.toJson\r\n * @function\r\n *\r\n * @description\r\n * Serializes input into a JSON-formatted string.\r\n *\r\n * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.\r\n * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.\r\n * @returns {string} Jsonified string representing `obj`.\r\n */\r\nfunction toJson(obj, pretty) {\r\n  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.fromJson\r\n * @function\r\n *\r\n * @description\r\n * Deserializes a JSON string.\r\n *\r\n * @param {string} json JSON string to deserialize.\r\n * @returns {Object|Array|Date|string|number} Deserialized thingy.\r\n */\r\nfunction fromJson(json) {\r\n  return isString(json)\r\n      ? JSON.parse(json)\r\n      : json;\r\n}\r\n\r\n\r\nfunction toBoolean(value) {\r\n  if (value && value.length !== 0) {\r\n    var v = lowercase(\"\" + value);\r\n    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');\r\n  } else {\r\n    value = false;\r\n  }\r\n  return value;\r\n}\r\n\r\n/**\r\n * @returns {string} Returns the string representation of the element.\r\n */\r\nfunction startingTag(element) {\r\n  element = jqLite(element).clone();\r\n  try {\r\n    // turns out IE does not let you set .html() on elements which\r\n    // are not allowed to have children. So we just ignore it.\r\n    element.html('');\r\n  } catch(e) {}\r\n  return jqLite('<div>').append(element).html().\r\n      match(/^(<[^>]+>)/)[1].\r\n      replace(/^<([\\w\\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });\r\n}\r\n\r\n\r\n/////////////////////////////////////////////////\r\n\r\n/**\r\n * Parses an escaped url query string into key-value pairs.\r\n * @returns Object.<(string|boolean)>\r\n */\r\nfunction parseKeyValue(/**string*/keyValue) {\r\n  var obj = {}, key_value, key;\r\n  forEach((keyValue || \"\").split('&'), function(keyValue){\r\n    if (keyValue) {\r\n      key_value = keyValue.split('=');\r\n      key = decodeURIComponent(key_value[0]);\r\n      obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true;\r\n    }\r\n  });\r\n  return obj;\r\n}\r\n\r\nfunction toKeyValue(obj) {\r\n  var parts = [];\r\n  forEach(obj, function(value, key) {\r\n    parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true)));\r\n  });\r\n  return parts.length ? parts.join('&') : '';\r\n}\r\n\r\n\r\n/**\r\n * We need our custom mehtod because encodeURIComponent is too agressive and doesn't follow\r\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\r\n * segments:\r\n *    segment       = *pchar\r\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\r\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n */\r\nfunction encodeUriSegment(val) {\r\n  return encodeUriQuery(val, true).\r\n             replace(/%26/gi, '&').\r\n             replace(/%3D/gi, '=').\r\n             replace(/%2B/gi, '+');\r\n}\r\n\r\n\r\n/**\r\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\r\n * method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be\r\n * encoded per http://tools.ietf.org/html/rfc3986:\r\n *    query       = *( pchar / \"/\" / \"?\" )\r\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\r\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n */\r\nfunction encodeUriQuery(val, pctEncodeSpaces) {\r\n  return encodeURIComponent(val).\r\n             replace(/%40/gi, '@').\r\n             replace(/%3A/gi, ':').\r\n             replace(/%24/g, '$').\r\n             replace(/%2C/gi, ',').\r\n             replace((pctEncodeSpaces ? null : /%20/g), '+');\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngApp\r\n *\r\n * @element ANY\r\n * @param {angular.Module} ngApp on optional application\r\n *   {@link angular.module module} name to load.\r\n *\r\n * @description\r\n *\r\n * Use this directive to auto-bootstrap on application. Only\r\n * one directive can be used per HTML document. The directive\r\n * designates the root of the application and is typically placed\r\n * ot the root of the page.\r\n *\r\n * In the example below if the `ngApp` directive would not be placed\r\n * on the `html` element then the document would not be compiled\r\n * and the `{{ 1+2 }}` would not be resolved to `3`.\r\n *\r\n * `ngApp` is the easiest way to bootstrap an application.\r\n *\r\n <doc:example>\r\n   <doc:source>\r\n    I can add: 1 + 2 =  {{ 1+2 }}\r\n   </doc:source>\r\n </doc:example>\r\n *\r\n */\r\nfunction angularInit(element, bootstrap) {\r\n  var elements = [element],\r\n      appElement,\r\n      module,\r\n      names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],\r\n      NG_APP_CLASS_REGEXP = /\\sng[:\\-]app(:\\s*([\\w\\d_]+);?)?\\s/;\r\n\r\n  function append(element) {\r\n    element && elements.push(element);\r\n  }\r\n\r\n  forEach(names, function(name) {\r\n    names[name] = true;\r\n    append(document.getElementById(name));\r\n    name = name.replace(':', '\\\\:');\r\n    if (element.querySelectorAll) {\r\n      forEach(element.querySelectorAll('.' + name), append);\r\n      forEach(element.querySelectorAll('.' + name + '\\\\:'), append);\r\n      forEach(element.querySelectorAll('[' + name + ']'), append);\r\n    }\r\n  });\r\n\r\n  forEach(elements, function(element) {\r\n    if (!appElement) {\r\n      var className = ' ' + element.className + ' ';\r\n      var match = NG_APP_CLASS_REGEXP.exec(className);\r\n      if (match) {\r\n        appElement = element;\r\n        module = (match[2] || '').replace(/\\s+/g, ',');\r\n      } else {\r\n        forEach(element.attributes, function(attr) {\r\n          if (!appElement && names[attr.name]) {\r\n            appElement = element;\r\n            module = attr.value;\r\n          }\r\n        });\r\n      }\r\n    }\r\n  });\r\n  if (appElement) {\r\n    bootstrap(appElement, module ? [module] : []);\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.bootstrap\r\n * @description\r\n * Use this function to manually start up angular application.\r\n *\r\n * See: {@link guide/bootstrap Bootstrap}\r\n *\r\n * @param {Element} element DOM element which is the root of angular application.\r\n * @param {Array<String|Function>=} modules an array of module declarations. See: {@link angular.module modules}\r\n * @returns {AUTO.$injector} Returns the newly created injector for this app.\r\n */\r\nfunction bootstrap(element, modules) {\r\n  element = jqLite(element);\r\n  modules = modules || [];\r\n  modules.unshift(['$provide', function($provide) {\r\n    $provide.value('$rootElement', element);\r\n  }]);\r\n  modules.unshift('ng');\r\n  var injector = createInjector(modules);\r\n  injector.invoke(\r\n    ['$rootScope', '$rootElement', '$compile', '$injector', function(scope, element, compile, injector){\r\n      scope.$apply(function() {\r\n        element.data('$injector', injector);\r\n        compile(element)(scope);\r\n      });\r\n    }]\r\n  );\r\n  return injector;\r\n}\r\n\r\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\r\nfunction snake_case(name, separator){\r\n  separator = separator || '_';\r\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\r\n    return (pos ? separator : '') + letter.toLowerCase();\r\n  });\r\n}\r\n\r\nfunction bindJQuery() {\r\n  // bind to jQuery if present;\r\n  jQuery = window.jQuery;\r\n  // reset to jQuery or default to us.\r\n  if (jQuery) {\r\n    jqLite = jQuery;\r\n    extend(jQuery.fn, {\r\n      scope: JQLitePrototype.scope,\r\n      controller: JQLitePrototype.controller,\r\n      injector: JQLitePrototype.injector,\r\n      inheritedData: JQLitePrototype.inheritedData\r\n    });\r\n    JQLitePatchJQueryRemove('remove', true);\r\n    JQLitePatchJQueryRemove('empty');\r\n    JQLitePatchJQueryRemove('html');\r\n  } else {\r\n    jqLite = JQLite;\r\n  }\r\n  angular.element = jqLite;\r\n}\r\n\r\n/**\r\n * throw error of the argument is falsy.\r\n */\r\nfunction assertArg(arg, name, reason) {\r\n  if (!arg) {\r\n    throw new Error(\"Argument '\" + (name || '?') + \"' is \" + (reason || \"required\"));\r\n  }\r\n  return arg;\r\n}\r\n\r\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\r\n  if (acceptArrayAnnotation && isArray(arg)) {\r\n      arg = arg[arg.length - 1];\r\n  }\r\n\r\n  assertArg(isFunction(arg), name, 'not a function, got ' +\r\n      (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg));\r\n  return arg;\r\n}\r\n\r\n/**\r\n * @ngdoc interface\r\n * @name angular.Module\r\n * @description\r\n *\r\n * Interface for configuring angular {@link angular.module modules}.\r\n */\r\n\r\nfunction setupModuleLoader(window) {\r\n\r\n  function ensure(obj, name, factory) {\r\n    return obj[name] || (obj[name] = factory());\r\n  }\r\n\r\n  return ensure(ensure(window, 'angular', Object), 'module', function() {\r\n    /** @type {Object.<string, angular.Module>} */\r\n    var modules = {};\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name angular.module\r\n     * @description\r\n     *\r\n     * The `angular.module` is a global place for creating and registering Angular modules. All\r\n     * modules (angular core or 3rd party) that should be available to an application must be\r\n     * registered using this mechanism.\r\n     *\r\n     *\r\n     * # Module\r\n     *\r\n     * A module is a collocation of services, directives, filters, and configure information. Module\r\n     * is used to configure the {@link AUTO.$injector $injector}.\r\n     *\r\n     * <pre>\r\n     * // Create a new module\r\n     * var myModule = angular.module('myModule', []);\r\n     *\r\n     * // register a new service\r\n     * myModule.value('appName', 'MyCoolApp');\r\n     *\r\n     * // configure existing services inside initialization blocks.\r\n     * myModule.config(function($locationProvider) {\r\n     *   // Configure existing providers\r\n     *   $locationProvider.hashPrefix('!');\r\n     * });\r\n     * </pre>\r\n     *\r\n     * Then you can create an injector and load your modules like this:\r\n     *\r\n     * <pre>\r\n     * var injector = angular.injector(['ng', 'MyModule'])\r\n     * </pre>\r\n     *\r\n     * However it's more likely that you'll just use\r\n     * {@link ng.directive:ngApp ngApp} or\r\n     * {@link angular.bootstrap} to simplify this process for you.\r\n     *\r\n     * @param {!string} name The name of the module to create or retrieve.\r\n     * @param {Array.<string>=} requires If specified then new module is being created. If unspecified then the\r\n     *        the module is being retrieved for further configuration.\r\n     * @param {Function} configFn Option configuration function for the module. Same as\r\n     *        {@link angular.Module#config Module#config()}.\r\n     * @returns {module} new module with the {@link angular.Module} api.\r\n     */\r\n    return function module(name, requires, configFn) {\r\n      if (requires && modules.hasOwnProperty(name)) {\r\n        modules[name] = null;\r\n      }\r\n      return ensure(modules, name, function() {\r\n        if (!requires) {\r\n          throw Error('No module: ' + name);\r\n        }\r\n\r\n        /** @type {!Array.<Array.<*>>} */\r\n        var invokeQueue = [];\r\n\r\n        /** @type {!Array.<Function>} */\r\n        var runBlocks = [];\r\n\r\n        var config = invokeLater('$injector', 'invoke');\r\n\r\n        /** @type {angular.Module} */\r\n        var moduleInstance = {\r\n          // Private state\r\n          _invokeQueue: invokeQueue,\r\n          _runBlocks: runBlocks,\r\n\r\n          /**\r\n           * @ngdoc property\r\n           * @name angular.Module#requires\r\n           * @propertyOf angular.Module\r\n           * @returns {Array.<string>} List of module names which must be loaded before this module.\r\n           * @description\r\n           * Holds the list of modules which the injector will load before the current module is loaded.\r\n           */\r\n          requires: requires,\r\n\r\n          /**\r\n           * @ngdoc property\r\n           * @name angular.Module#name\r\n           * @propertyOf angular.Module\r\n           * @returns {string} Name of the module.\r\n           * @description\r\n           */\r\n          name: name,\r\n\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#provider\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {Function} providerType Construction function for creating new instance of the service.\r\n           * @description\r\n           * See {@link AUTO.$provide#provider $provide.provider()}.\r\n           */\r\n          provider: invokeLater('$provide', 'provider'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#factory\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {Function} providerFunction Function for creating new instance of the service.\r\n           * @description\r\n           * See {@link AUTO.$provide#factory $provide.factory()}.\r\n           */\r\n          factory: invokeLater('$provide', 'factory'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#service\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {Function} constructor A constructor function that will be instantiated.\r\n           * @description\r\n           * See {@link AUTO.$provide#service $provide.service()}.\r\n           */\r\n          service: invokeLater('$provide', 'service'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#value\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {*} object Service instance object.\r\n           * @description\r\n           * See {@link AUTO.$provide#value $provide.value()}.\r\n           */\r\n          value: invokeLater('$provide', 'value'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#constant\r\n           * @methodOf angular.Module\r\n           * @param {string} name constant name\r\n           * @param {*} object Constant value.\r\n           * @description\r\n           * Because the constant are fixed, they get applied before other provide methods.\r\n           * See {@link AUTO.$provide#constant $provide.constant()}.\r\n           */\r\n          constant: invokeLater('$provide', 'constant', 'unshift'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#filter\r\n           * @methodOf angular.Module\r\n           * @param {string} name Filter name.\r\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\r\n           * @description\r\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\r\n           */\r\n          filter: invokeLater('$filterProvider', 'register'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#controller\r\n           * @methodOf angular.Module\r\n           * @param {string} name Controller name.\r\n           * @param {Function} constructor Controller constructor function.\r\n           * @description\r\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\r\n           */\r\n          controller: invokeLater('$controllerProvider', 'register'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#directive\r\n           * @methodOf angular.Module\r\n           * @param {string} name directive name\r\n           * @param {Function} directiveFactory Factory function for creating new instance of\r\n           * directives.\r\n           * @description\r\n           * See {@link ng.$compileProvider.directive $compileProvider.directive()}.\r\n           */\r\n          directive: invokeLater('$compileProvider', 'directive'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#config\r\n           * @methodOf angular.Module\r\n           * @param {Function} configFn Execute this function on module load. Useful for service\r\n           *    configuration.\r\n           * @description\r\n           * Use this method to register work which needs to be performed on module loading.\r\n           */\r\n          config: config,\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#run\r\n           * @methodOf angular.Module\r\n           * @param {Function} initializationFn Execute this function after injector creation.\r\n           *    Useful for application initialization.\r\n           * @description\r\n           * Use this method to register work which needs to be performed when the injector with\r\n           * with the current module is finished loading.\r\n           */\r\n          run: function(block) {\r\n            runBlocks.push(block);\r\n            return this;\r\n          }\r\n        };\r\n\r\n        if (configFn) {\r\n          config(configFn);\r\n        }\r\n\r\n        return  moduleInstance;\r\n\r\n        /**\r\n         * @param {string} provider\r\n         * @param {string} method\r\n         * @param {String=} insertMethod\r\n         * @returns {angular.Module}\r\n         */\r\n        function invokeLater(provider, method, insertMethod) {\r\n          return function() {\r\n            invokeQueue[insertMethod || 'push']([provider, method, arguments]);\r\n            return moduleInstance;\r\n          }\r\n        }\r\n      });\r\n    };\r\n  });\r\n\r\n}\r\n\r\n/**\r\n * @ngdoc property\r\n * @name angular.version\r\n * @description\r\n * An object that contains information about the current AngularJS version. This object has the\r\n * following properties:\r\n *\r\n * - `full` â€“ `{string}` â€“ Full version string, such as \"0.9.18\".\r\n * - `major` â€“ `{number}` â€“ Major version number, such as \"0\".\r\n * - `minor` â€“ `{number}` â€“ Minor version number, such as \"9\".\r\n * - `dot` â€“ `{number}` â€“ Dot version number, such as \"18\".\r\n * - `codeName` â€“ `{string}` â€“ Code name of the release, such as \"jiggling-armfat\".\r\n */\r\nvar version = {\r\n  full: '1.0.1',    // all of these placeholder strings will be replaced by rake's\r\n  major: 1,    // compile task\r\n  minor: 0,\r\n  dot: 1,\r\n  codeName: 'thorium-shielding'\r\n};\r\n\r\n\r\nfunction publishExternalAPI(angular){\r\n  extend(angular, {\r\n    'bootstrap': bootstrap,\r\n    'copy': copy,\r\n    'extend': extend,\r\n    'equals': equals,\r\n    'element': jqLite,\r\n    'forEach': forEach,\r\n    'injector': createInjector,\r\n    'noop':noop,\r\n    'bind':bind,\r\n    'toJson': toJson,\r\n    'fromJson': fromJson,\r\n    'identity':identity,\r\n    'isUndefined': isUndefined,\r\n    'isDefined': isDefined,\r\n    'isString': isString,\r\n    'isFunction': isFunction,\r\n    'isObject': isObject,\r\n    'isNumber': isNumber,\r\n    'isElement': isElement,\r\n    'isArray': isArray,\r\n    'version': version,\r\n    'isDate': isDate,\r\n    'lowercase': lowercase,\r\n    'uppercase': uppercase,\r\n    'callbacks': {counter: 0}\r\n  });\r\n\r\n  angularModule = setupModuleLoader(window);\r\n  try {\r\n    angularModule('ngLocale');\r\n  } catch (e) {\r\n    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);\r\n  }\r\n\r\n  angularModule('ng', ['ngLocale'], ['$provide',\r\n    function ngModule($provide) {\r\n      $provide.provider('$compile', $CompileProvider).\r\n        directive({\r\n            a: htmlAnchorDirective,\r\n            input: inputDirective,\r\n            textarea: inputDirective,\r\n            form: formDirective,\r\n            script: scriptDirective,\r\n            select: selectDirective,\r\n            style: styleDirective,\r\n            option: optionDirective,\r\n            ngBind: ngBindDirective,\r\n            ngBindHtmlUnsafe: ngBindHtmlUnsafeDirective,\r\n            ngBindTemplate: ngBindTemplateDirective,\r\n            ngClass: ngClassDirective,\r\n            ngClassEven: ngClassEvenDirective,\r\n            ngClassOdd: ngClassOddDirective,\r\n            ngCsp: ngCspDirective,\r\n            ngCloak: ngCloakDirective,\r\n            ngController: ngControllerDirective,\r\n            ngForm: ngFormDirective,\r\n            ngHide: ngHideDirective,\r\n            ngInclude: ngIncludeDirective,\r\n            ngInit: ngInitDirective,\r\n            ngNonBindable: ngNonBindableDirective,\r\n            ngPluralize: ngPluralizeDirective,\r\n            ngRepeat: ngRepeatDirective,\r\n            ngShow: ngShowDirective,\r\n            ngSubmit: ngSubmitDirective,\r\n            ngStyle: ngStyleDirective,\r\n            ngSwitch: ngSwitchDirective,\r\n            ngSwitchWhen: ngSwitchWhenDirective,\r\n            ngSwitchDefault: ngSwitchDefaultDirective,\r\n            ngOptions: ngOptionsDirective,\r\n            ngView: ngViewDirective,\r\n            ngTransclude: ngTranscludeDirective,\r\n            ngModel: ngModelDirective,\r\n            ngList: ngListDirective,\r\n            ngChange: ngChangeDirective,\r\n            required: requiredDirective,\r\n            ngRequired: requiredDirective,\r\n            ngValue: ngValueDirective\r\n        }).\r\n        directive(ngAttributeAliasDirectives).\r\n        directive(ngEventDirectives);\r\n      $provide.provider({\r\n        $anchorScroll: $AnchorScrollProvider,\r\n        $browser: $BrowserProvider,\r\n        $cacheFactory: $CacheFactoryProvider,\r\n        $controller: $ControllerProvider,\r\n        $document: $DocumentProvider,\r\n        $exceptionHandler: $ExceptionHandlerProvider,\r\n        $filter: $FilterProvider,\r\n        $interpolate: $InterpolateProvider,\r\n        $http: $HttpProvider,\r\n        $httpBackend: $HttpBackendProvider,\r\n        $location: $LocationProvider,\r\n        $log: $LogProvider,\r\n        $parse: $ParseProvider,\r\n        $route: $RouteProvider,\r\n        $routeParams: $RouteParamsProvider,\r\n        $rootScope: $RootScopeProvider,\r\n        $q: $QProvider,\r\n        $sniffer: $SnifferProvider,\r\n        $templateCache: $TemplateCacheProvider,\r\n        $timeout: $TimeoutProvider,\r\n        $window: $WindowProvider\r\n      });\r\n    }\r\n  ]);\r\n}\r\n\r\n//////////////////////////////////\r\n//JQLite\r\n//////////////////////////////////\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.element\r\n * @function\r\n *\r\n * @description\r\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\r\n * `angular.element` can be either an alias for [jQuery](http://api.jquery.com/jQuery/) function, if\r\n * jQuery is available, or a function that wraps the element or string in Angular's jQuery lite\r\n * implementation (commonly referred to as jqLite).\r\n *\r\n * Real jQuery always takes precedence over jqLite, provided it was loaded before `DOMContentLoaded`\r\n * event fired.\r\n *\r\n * jqLite is a tiny, API-compatible subset of jQuery that allows\r\n * Angular to manipulate the DOM. jqLite implements only the most commonly needed functionality\r\n * within a very small footprint, so only a subset of the jQuery API - methods, arguments and\r\n * invocation styles - are supported.\r\n *\r\n * Note: All element references in Angular are always wrapped with jQuery or jqLite; they are never\r\n * raw DOM references.\r\n *\r\n * ## Angular's jQuery lite provides the following methods:\r\n *\r\n * - [addClass()](http://api.jquery.com/addClass/)\r\n * - [after()](http://api.jquery.com/after/)\r\n * - [append()](http://api.jquery.com/append/)\r\n * - [attr()](http://api.jquery.com/attr/)\r\n * - [bind()](http://api.jquery.com/bind/)\r\n * - [children()](http://api.jquery.com/children/)\r\n * - [clone()](http://api.jquery.com/clone/)\r\n * - [contents()](http://api.jquery.com/contents/)\r\n * - [css()](http://api.jquery.com/css/)\r\n * - [data()](http://api.jquery.com/data/)\r\n * - [eq()](http://api.jquery.com/eq/)\r\n * - [find()](http://api.jquery.com/find/) - Limited to lookups by tag name.\r\n * - [hasClass()](http://api.jquery.com/hasClass/)\r\n * - [html()](http://api.jquery.com/html/)\r\n * - [next()](http://api.jquery.com/next/)\r\n * - [parent()](http://api.jquery.com/parent/)\r\n * - [prepend()](http://api.jquery.com/prepend/)\r\n * - [prop()](http://api.jquery.com/prop/)\r\n * - [ready()](http://api.jquery.com/ready/)\r\n * - [remove()](http://api.jquery.com/remove/)\r\n * - [removeAttr()](http://api.jquery.com/removeAttr/)\r\n * - [removeClass()](http://api.jquery.com/removeClass/)\r\n * - [removeData()](http://api.jquery.com/removeData/)\r\n * - [replaceWith()](http://api.jquery.com/replaceWith/)\r\n * - [text()](http://api.jquery.com/text/)\r\n * - [toggleClass()](http://api.jquery.com/toggleClass/)\r\n * - [unbind()](http://api.jquery.com/unbind/)\r\n * - [val()](http://api.jquery.com/val/)\r\n * - [wrap()](http://api.jquery.com/wrap/)\r\n *\r\n * ## In addtion to the above, Angular privides an additional method to both jQuery and jQuery lite:\r\n *\r\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\r\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\r\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\r\n *   `'ngModel'`).\r\n * - `injector()` - retrieves the injector of the current element or its parent.\r\n * - `scope()` - retrieves the {@link api/ng.$rootScope.Scope scope} of the current\r\n *   element or its parent.\r\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\r\n *   parent element is reached.\r\n *\r\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\r\n * @returns {Object} jQuery object.\r\n */\r\n\r\nvar jqCache = JQLite.cache = {},\r\n    jqName = JQLite.expando = 'ng-' + new Date().getTime(),\r\n    jqId = 1,\r\n    addEventListenerFn = (window.document.addEventListener\r\n      ? function(element, type, fn) {element.addEventListener(type, fn, false);}\r\n      : function(element, type, fn) {element.attachEvent('on' + type, fn);}),\r\n    removeEventListenerFn = (window.document.removeEventListener\r\n      ? function(element, type, fn) {element.removeEventListener(type, fn, false); }\r\n      : function(element, type, fn) {element.detachEvent('on' + type, fn); });\r\n\r\nfunction jqNextId() { return ++jqId; }\r\n\r\n\r\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\r\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\r\n\r\n/**\r\n * Converts snake_case to camelCase.\r\n * Also there is special case for Moz prefix starting with upper case letter.\r\n * @param name Name to normalize\r\n */\r\nfunction camelCase(name) {\r\n  return name.\r\n    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\r\n      return offset ? letter.toUpperCase() : letter;\r\n    }).\r\n    replace(MOZ_HACK_REGEXP, 'Moz$1');\r\n}\r\n\r\n/////////////////////////////////////////////\r\n// jQuery mutation patch\r\n//\r\n//  In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a\r\n// $destroy event on all DOM nodes being removed.\r\n//\r\n/////////////////////////////////////////////\r\n\r\nfunction JQLitePatchJQueryRemove(name, dispatchThis) {\r\n  var originalJqFn = jQuery.fn[name];\r\n  originalJqFn = originalJqFn.$original || originalJqFn;\r\n  removePatch.$original = originalJqFn;\r\n  jQuery.fn[name] = removePatch;\r\n\r\n  function removePatch() {\r\n    var list = [this],\r\n        fireEvent = dispatchThis,\r\n        set, setIndex, setLength,\r\n        element, childIndex, childLength, children,\r\n        fns, events;\r\n\r\n    while(list.length) {\r\n      set = list.shift();\r\n      for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {\r\n        element = jqLite(set[setIndex]);\r\n        if (fireEvent) {\r\n          events = element.data('events');\r\n          if ( (fns = events && events.$destroy) ) {\r\n            forEach(fns, function(fn){\r\n              fn.handler();\r\n            });\r\n          }\r\n        } else {\r\n          fireEvent = !fireEvent;\r\n        }\r\n        for(childIndex = 0, childLength = (children = element.children()).length;\r\n            childIndex < childLength;\r\n            childIndex++) {\r\n          list.push(jQuery(children[childIndex]));\r\n        }\r\n      }\r\n    }\r\n    return originalJqFn.apply(this, arguments);\r\n  }\r\n}\r\n\r\n/////////////////////////////////////////////\r\nfunction JQLite(element) {\r\n  if (element instanceof JQLite) {\r\n    return element;\r\n  }\r\n  if (!(this instanceof JQLite)) {\r\n    if (isString(element) && element.charAt(0) != '<') {\r\n      throw Error('selectors not implemented');\r\n    }\r\n    return new JQLite(element);\r\n  }\r\n\r\n  if (isString(element)) {\r\n    var div = document.createElement('div');\r\n    // Read about the NoScope elements here:\r\n    // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx\r\n    div.innerHTML = '<div>&nbsp;</div>' + element; // IE insanity to make NoScope elements work!\r\n    div.removeChild(div.firstChild); // remove the superfluous div\r\n    JQLiteAddNodes(this, div.childNodes);\r\n    this.remove(); // detach the elements from the temporary DOM div.\r\n  } else {\r\n    JQLiteAddNodes(this, element);\r\n  }\r\n}\r\n\r\nfunction JQLiteClone(element) {\r\n  return element.cloneNode(true);\r\n}\r\n\r\nfunction JQLiteDealoc(element){\r\n  JQLiteRemoveData(element);\r\n  for ( var i = 0, children = element.childNodes || []; i < children.length; i++) {\r\n    JQLiteDealoc(children[i]);\r\n  }\r\n}\r\n\r\nfunction JQLiteUnbind(element, type, fn) {\r\n  var events = JQLiteExpandoStore(element, 'events'),\r\n      handle = JQLiteExpandoStore(element, 'handle');\r\n\r\n  if (!handle) return; //no listeners registered\r\n\r\n  if (isUndefined(type)) {\r\n    forEach(events, function(eventHandler, type) {\r\n      removeEventListenerFn(element, type, eventHandler);\r\n      delete events[type];\r\n    });\r\n  } else {\r\n    if (isUndefined(fn)) {\r\n      removeEventListenerFn(element, type, events[type]);\r\n      delete events[type];\r\n    } else {\r\n      arrayRemove(events[type], fn);\r\n    }\r\n  }\r\n}\r\n\r\nfunction JQLiteRemoveData(element) {\r\n  var expandoId = element[jqName],\r\n      expandoStore = jqCache[expandoId];\r\n\r\n  if (expandoStore) {\r\n    if (expandoStore.handle) {\r\n      expandoStore.events.$destroy && expandoStore.handle({}, '$destroy');\r\n      JQLiteUnbind(element);\r\n    }\r\n    delete jqCache[expandoId];\r\n    element[jqName] = undefined; // ie does not allow deletion of attributes on elements.\r\n  }\r\n}\r\n\r\nfunction JQLiteExpandoStore(element, key, value) {\r\n  var expandoId = element[jqName],\r\n      expandoStore = jqCache[expandoId || -1];\r\n\r\n  if (isDefined(value)) {\r\n    if (!expandoStore) {\r\n      element[jqName] = expandoId = jqNextId();\r\n      expandoStore = jqCache[expandoId] = {};\r\n    }\r\n    expandoStore[key] = value;\r\n  } else {\r\n    return expandoStore && expandoStore[key];\r\n  }\r\n}\r\n\r\nfunction JQLiteData(element, key, value) {\r\n  var data = JQLiteExpandoStore(element, 'data'),\r\n      isSetter = isDefined(value),\r\n      keyDefined = !isSetter && isDefined(key),\r\n      isSimpleGetter = keyDefined && !isObject(key);\r\n\r\n  if (!data && !isSimpleGetter) {\r\n    JQLiteExpandoStore(element, 'data', data = {});\r\n  }\r\n\r\n  if (isSetter) {\r\n    data[key] = value;\r\n  } else {\r\n    if (keyDefined) {\r\n      if (isSimpleGetter) {\r\n        // don't create data in this case.\r\n        return data && data[key];\r\n      } else {\r\n        extend(data, key);\r\n      }\r\n    } else {\r\n      return data;\r\n    }\r\n  }\r\n}\r\n\r\nfunction JQLiteHasClass(element, selector) {\r\n  return ((\" \" + element.className + \" \").replace(/[\\n\\t]/g, \" \").\r\n      indexOf( \" \" + selector + \" \" ) > -1);\r\n}\r\n\r\nfunction JQLiteRemoveClass(element, selector) {\r\n  if (selector) {\r\n    forEach(selector.split(' '), function(cssClass) {\r\n      element.className = trim(\r\n          (\" \" + element.className + \" \")\r\n          .replace(/[\\n\\t]/g, \" \")\r\n          .replace(\" \" + trim(cssClass) + \" \", \" \")\r\n      );\r\n    });\r\n  }\r\n}\r\n\r\nfunction JQLiteAddClass(element, selector) {\r\n  if (selector) {\r\n    forEach(selector.split(' '), function(cssClass) {\r\n      if (!JQLiteHasClass(element, cssClass)) {\r\n        element.className = trim(element.className + ' ' + trim(cssClass));\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nfunction JQLiteAddNodes(root, elements) {\r\n  if (elements) {\r\n    elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))\r\n      ? elements\r\n      : [ elements ];\r\n    for(var i=0; i < elements.length; i++) {\r\n      root.push(elements[i]);\r\n    }\r\n  }\r\n}\r\n\r\nfunction JQLiteController(element, name) {\r\n  return JQLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');\r\n}\r\n\r\nfunction JQLiteInheritedData(element, name, value) {\r\n  element = jqLite(element);\r\n\r\n  // if element is the document object work with the html element instead\r\n  // this makes $(document).scope() possible\r\n  if(element[0].nodeType == 9) {\r\n    element = element.find('html');\r\n  }\r\n\r\n  while (element.length) {\r\n    if (value = element.data(name)) return value;\r\n    element = element.parent();\r\n  }\r\n}\r\n\r\n//////////////////////////////////////////\r\n// Functions which are declared directly.\r\n//////////////////////////////////////////\r\nvar JQLitePrototype = JQLite.prototype = {\r\n  ready: function(fn) {\r\n    var fired = false;\r\n\r\n    function trigger() {\r\n      if (fired) return;\r\n      fired = true;\r\n      fn();\r\n    }\r\n\r\n    this.bind('DOMContentLoaded', trigger); // works for modern browsers and IE9\r\n    // we can not use jqLite since we are not done loading and jQuery could be loaded later.\r\n    JQLite(window).bind('load', trigger); // fallback to window.onload for others\r\n  },\r\n  toString: function() {\r\n    var value = [];\r\n    forEach(this, function(e){ value.push('' + e);});\r\n    return '[' + value.join(', ') + ']';\r\n  },\r\n\r\n  eq: function(index) {\r\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\r\n  },\r\n\r\n  length: 0,\r\n  push: push,\r\n  sort: [].sort,\r\n  splice: [].splice\r\n};\r\n\r\n//////////////////////////////////////////\r\n// Functions iterating getter/setters.\r\n// these functions return self on setter and\r\n// value on get.\r\n//////////////////////////////////////////\r\nvar BOOLEAN_ATTR = {};\r\nforEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value) {\r\n  BOOLEAN_ATTR[lowercase(value)] = value;\r\n});\r\nvar BOOLEAN_ELEMENTS = {};\r\nforEach('input,select,option,textarea,button,form'.split(','), function(value) {\r\n  BOOLEAN_ELEMENTS[uppercase(value)] = true;\r\n});\r\n\r\nfunction getBooleanAttrName(element, name) {\r\n  // check dom last since we will most likely fail on name\r\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\r\n\r\n  // booleanAttr is here twice to minimize DOM access\r\n  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;\r\n}\r\n\r\nforEach({\r\n  data: JQLiteData,\r\n  inheritedData: JQLiteInheritedData,\r\n\r\n  scope: function(element) {\r\n    return JQLiteInheritedData(element, '$scope');\r\n  },\r\n\r\n  controller: JQLiteController ,\r\n\r\n  injector: function(element) {\r\n    return JQLiteInheritedData(element, '$injector');\r\n  },\r\n\r\n  removeAttr: function(element,name) {\r\n    element.removeAttribute(name);\r\n  },\r\n\r\n  hasClass: JQLiteHasClass,\r\n\r\n  css: function(element, name, value) {\r\n    name = camelCase(name);\r\n\r\n    if (isDefined(value)) {\r\n      element.style[name] = value;\r\n    } else {\r\n      var val;\r\n\r\n      if (msie <= 8) {\r\n        // this is some IE specific weirdness that jQuery 1.6.4 does not sure why\r\n        val = element.currentStyle && element.currentStyle[name];\r\n        if (val === '') val = 'auto';\r\n      }\r\n\r\n      val = val || element.style[name];\r\n\r\n      if (msie <= 8) {\r\n        // jquery weirdness :-/\r\n        val = (val === '') ? undefined : val;\r\n      }\r\n\r\n      return  val;\r\n    }\r\n  },\r\n\r\n  attr: function(element, name, value){\r\n    var lowercasedName = lowercase(name);\r\n    if (BOOLEAN_ATTR[lowercasedName]) {\r\n      if (isDefined(value)) {\r\n        if (!!value) {\r\n          element[name] = true;\r\n          element.setAttribute(name, lowercasedName);\r\n        } else {\r\n          element[name] = false;\r\n          element.removeAttribute(lowercasedName);\r\n        }\r\n      } else {\r\n        return (element[name] ||\r\n                 (element.attributes.getNamedItem(name)|| noop).specified)\r\n               ? lowercasedName\r\n               : undefined;\r\n      }\r\n    } else if (isDefined(value)) {\r\n      element.setAttribute(name, value);\r\n    } else if (element.getAttribute) {\r\n      // the extra argument \"2\" is to get the right thing for a.href in IE, see jQuery code\r\n      // some elements (e.g. Document) don't have get attribute, so return undefined\r\n      var ret = element.getAttribute(name, 2);\r\n      // normalize non-existing attributes to undefined (as jQuery)\r\n      return ret === null ? undefined : ret;\r\n    }\r\n  },\r\n\r\n  prop: function(element, name, value) {\r\n    if (isDefined(value)) {\r\n      element[name] = value;\r\n    } else {\r\n      return element[name];\r\n    }\r\n  },\r\n\r\n  text: extend((msie < 9)\r\n      ? function(element, value) {\r\n        if (element.nodeType == 1 /** Element */) {\r\n          if (isUndefined(value))\r\n            return element.innerText;\r\n          element.innerText = value;\r\n        } else {\r\n          if (isUndefined(value))\r\n            return element.nodeValue;\r\n          element.nodeValue = value;\r\n        }\r\n      }\r\n      : function(element, value) {\r\n        if (isUndefined(value)) {\r\n          return element.textContent;\r\n        }\r\n        element.textContent = value;\r\n      }, {$dv:''}),\r\n\r\n  val: function(element, value) {\r\n    if (isUndefined(value)) {\r\n      return element.value;\r\n    }\r\n    element.value = value;\r\n  },\r\n\r\n  html: function(element, value) {\r\n    if (isUndefined(value)) {\r\n      return element.innerHTML;\r\n    }\r\n    for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\r\n      JQLiteDealoc(childNodes[i]);\r\n    }\r\n    element.innerHTML = value;\r\n  }\r\n}, function(fn, name){\r\n  /**\r\n   * Properties: writes return selection, reads return first value\r\n   */\r\n  JQLite.prototype[name] = function(arg1, arg2) {\r\n    var i, key;\r\n\r\n    // JQLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\r\n    // in a way that survives minification.\r\n    if (((fn.length == 2 && (fn !== JQLiteHasClass && fn !== JQLiteController)) ? arg1 : arg2) === undefined) {\r\n      if (isObject(arg1)) {\r\n\r\n        // we are a write, but the object properties are the key/values\r\n        for(i=0; i < this.length; i++) {\r\n          if (fn === JQLiteData) {\r\n            // data() takes the whole object in jQuery\r\n            fn(this[i], arg1);\r\n          } else {\r\n            for (key in arg1) {\r\n              fn(this[i], key, arg1[key]);\r\n            }\r\n          }\r\n        }\r\n        // return self for chaining\r\n        return this;\r\n      } else {\r\n        // we are a read, so read the first child.\r\n        if (this.length)\r\n          return fn(this[0], arg1, arg2);\r\n      }\r\n    } else {\r\n      // we are a write, so apply to all children\r\n      for(i=0; i < this.length; i++) {\r\n        fn(this[i], arg1, arg2);\r\n      }\r\n      // return self for chaining\r\n      return this;\r\n    }\r\n    return fn.$dv;\r\n  };\r\n});\r\n\r\nfunction createEventHandler(element, events) {\r\n  var eventHandler = function (event, type) {\r\n    if (!event.preventDefault) {\r\n      event.preventDefault = function() {\r\n        event.returnValue = false; //ie\r\n      };\r\n    }\r\n\r\n    if (!event.stopPropagation) {\r\n      event.stopPropagation = function() {\r\n        event.cancelBubble = true; //ie\r\n      };\r\n    }\r\n\r\n    if (!event.target) {\r\n      event.target = event.srcElement || document;\r\n    }\r\n\r\n    if (isUndefined(event.defaultPrevented)) {\r\n      var prevent = event.preventDefault;\r\n      event.preventDefault = function() {\r\n        event.defaultPrevented = true;\r\n        prevent.call(event);\r\n      };\r\n      event.defaultPrevented = false;\r\n    }\r\n\r\n    event.isDefaultPrevented = function() {\r\n      return event.defaultPrevented;\r\n    };\r\n\r\n    forEach(events[type || event.type], function(fn) {\r\n      fn.call(element, event);\r\n    });\r\n\r\n    // Remove monkey-patched methods (IE),\r\n    // as they would cause memory leaks in IE8.\r\n    if (msie <= 8) {\r\n      // IE7/8 does not allow to delete property on native object\r\n      event.preventDefault = null;\r\n      event.stopPropagation = null;\r\n      event.isDefaultPrevented = null;\r\n    } else {\r\n      // It shouldn't affect normal browsers (native methods are defined on prototype).\r\n      delete event.preventDefault;\r\n      delete event.stopPropagation;\r\n      delete event.isDefaultPrevented;\r\n    }\r\n  };\r\n  eventHandler.elem = element;\r\n  return eventHandler;\r\n}\r\n\r\n//////////////////////////////////////////\r\n// Functions iterating traversal.\r\n// These functions chain results into a single\r\n// selector.\r\n//////////////////////////////////////////\r\nforEach({\r\n  removeData: JQLiteRemoveData,\r\n\r\n  dealoc: JQLiteDealoc,\r\n\r\n  bind: function bindFn(element, type, fn){\r\n    var events = JQLiteExpandoStore(element, 'events'),\r\n        handle = JQLiteExpandoStore(element, 'handle');\r\n\r\n    if (!events) JQLiteExpandoStore(element, 'events', events = {});\r\n    if (!handle) JQLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));\r\n\r\n    forEach(type.split(' '), function(type){\r\n      var eventFns = events[type];\r\n\r\n      if (!eventFns) {\r\n        if (type == 'mouseenter' || type == 'mouseleave') {\r\n          var counter = 0;\r\n\r\n          events.mouseenter = [];\r\n          events.mouseleave = [];\r\n\r\n          bindFn(element, 'mouseover', function(event) {\r\n            counter++;\r\n            if (counter == 1) {\r\n              handle(event, 'mouseenter');\r\n            }\r\n          });\r\n          bindFn(element, 'mouseout', function(event) {\r\n            counter --;\r\n            if (counter == 0) {\r\n              handle(event, 'mouseleave');\r\n            }\r\n          });\r\n        } else {\r\n          addEventListenerFn(element, type, handle);\r\n          events[type] = [];\r\n        }\r\n        eventFns = events[type]\r\n      }\r\n      eventFns.push(fn);\r\n    });\r\n  },\r\n\r\n  unbind: JQLiteUnbind,\r\n\r\n  replaceWith: function(element, replaceNode) {\r\n    var index, parent = element.parentNode;\r\n    JQLiteDealoc(element);\r\n    forEach(new JQLite(replaceNode), function(node){\r\n      if (index) {\r\n        parent.insertBefore(node, index.nextSibling);\r\n      } else {\r\n        parent.replaceChild(node, element);\r\n      }\r\n      index = node;\r\n    });\r\n  },\r\n\r\n  children: function(element) {\r\n    var children = [];\r\n    forEach(element.childNodes, function(element){\r\n      if (element.nodeName != '#text')\r\n        children.push(element);\r\n    });\r\n    return children;\r\n  },\r\n\r\n  contents: function(element) {\r\n    return element.childNodes;\r\n  },\r\n\r\n  append: function(element, node) {\r\n    forEach(new JQLite(node), function(child){\r\n      if (element.nodeType === 1)\r\n        element.appendChild(child);\r\n    });\r\n  },\r\n\r\n  prepend: function(element, node) {\r\n    if (element.nodeType === 1) {\r\n      var index = element.firstChild;\r\n      forEach(new JQLite(node), function(child){\r\n        if (index) {\r\n          element.insertBefore(child, index);\r\n        } else {\r\n          element.appendChild(child);\r\n          index = child;\r\n        }\r\n      });\r\n    }\r\n  },\r\n\r\n  wrap: function(element, wrapNode) {\r\n    wrapNode = jqLite(wrapNode)[0];\r\n    var parent = element.parentNode;\r\n    if (parent) {\r\n      parent.replaceChild(wrapNode, element);\r\n    }\r\n    wrapNode.appendChild(element);\r\n  },\r\n\r\n  remove: function(element) {\r\n    JQLiteDealoc(element);\r\n    var parent = element.parentNode;\r\n    if (parent) parent.removeChild(element);\r\n  },\r\n\r\n  after: function(element, newElement) {\r\n    var index = element, parent = element.parentNode;\r\n    forEach(new JQLite(newElement), function(node){\r\n      parent.insertBefore(node, index.nextSibling);\r\n      index = node;\r\n    });\r\n  },\r\n\r\n  addClass: JQLiteAddClass,\r\n  removeClass: JQLiteRemoveClass,\r\n\r\n  toggleClass: function(element, selector, condition) {\r\n    if (isUndefined(condition)) {\r\n      condition = !JQLiteHasClass(element, selector);\r\n    }\r\n    (condition ? JQLiteAddClass : JQLiteRemoveClass)(element, selector);\r\n  },\r\n\r\n  parent: function(element) {\r\n    var parent = element.parentNode;\r\n    return parent && parent.nodeType !== 11 ? parent : null;\r\n  },\r\n\r\n  next: function(element) {\r\n    return element.nextSibling;\r\n  },\r\n\r\n  find: function(element, selector) {\r\n    return element.getElementsByTagName(selector);\r\n  },\r\n\r\n  clone: JQLiteClone\r\n}, function(fn, name){\r\n  /**\r\n   * chaining functions\r\n   */\r\n  JQLite.prototype[name] = function(arg1, arg2) {\r\n    var value;\r\n    for(var i=0; i < this.length; i++) {\r\n      if (value == undefined) {\r\n        value = fn(this[i], arg1, arg2);\r\n        if (value !== undefined) {\r\n          // any function which returns a value needs to be wrapped\r\n          value = jqLite(value);\r\n        }\r\n      } else {\r\n        JQLiteAddNodes(value, fn(this[i], arg1, arg2));\r\n      }\r\n    }\r\n    return value == undefined ? this : value;\r\n  };\r\n});\r\n\r\n/**\r\n * Computes a hash of an 'obj'.\r\n * Hash of a:\r\n *  string is string\r\n *  number is number as string\r\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\r\n *         that is also assigned to the $$hashKey property of the object.\r\n *\r\n * @param obj\r\n * @returns {string} hash string such that the same input will have the same hash string.\r\n *         The resulting string key is in 'type:hashKey' format.\r\n */\r\nfunction hashKey(obj) {\r\n  var objType = typeof obj,\r\n      key;\r\n\r\n  if (objType == 'object' && obj !== null) {\r\n    if (typeof (key = obj.$$hashKey) == 'function') {\r\n      // must invoke on object to keep the right this\r\n      key = obj.$$hashKey();\r\n    } else if (key === undefined) {\r\n      key = obj.$$hashKey = nextUid();\r\n    }\r\n  } else {\r\n    key = obj;\r\n  }\r\n\r\n  return objType + ':' + key;\r\n}\r\n\r\n/**\r\n * HashMap which can use objects as keys\r\n */\r\nfunction HashMap(array){\r\n  forEach(array, this.put, this);\r\n}\r\nHashMap.prototype = {\r\n  /**\r\n   * Store key value pair\r\n   * @param key key to store can be any type\r\n   * @param value value to store can be any type\r\n   */\r\n  put: function(key, value) {\r\n    this[hashKey(key)] = value;\r\n  },\r\n\r\n  /**\r\n   * @param key\r\n   * @returns the value for the key\r\n   */\r\n  get: function(key) {\r\n    return this[hashKey(key)];\r\n  },\r\n\r\n  /**\r\n   * Remove the key/value pair\r\n   * @param key\r\n   */\r\n  remove: function(key) {\r\n    var value = this[key = hashKey(key)];\r\n    delete this[key];\r\n    return value;\r\n  }\r\n};\r\n\r\n/**\r\n * A map where multiple values can be added to the same key such that they form a queue.\r\n * @returns {HashQueueMap}\r\n */\r\nfunction HashQueueMap() {}\r\nHashQueueMap.prototype = {\r\n  /**\r\n   * Same as array push, but using an array as the value for the hash\r\n   */\r\n  push: function(key, value) {\r\n    var array = this[key = hashKey(key)];\r\n    if (!array) {\r\n      this[key] = [value];\r\n    } else {\r\n      array.push(value);\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Same as array shift, but using an array as the value for the hash\r\n   */\r\n  shift: function(key) {\r\n    var array = this[key = hashKey(key)];\r\n    if (array) {\r\n      if (array.length == 1) {\r\n        delete this[key];\r\n        return array[0];\r\n      } else {\r\n        return array.shift();\r\n      }\r\n    }\r\n  }\r\n};\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.injector\r\n * @function\r\n *\r\n * @description\r\n * Creates an injector function that can be used for retrieving services as well as for\r\n * dependency injection (see {@link guide/di dependency injection}).\r\n *\r\n\r\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\r\n *        {@link angular.module}. The `ng` module must be explicitly added.\r\n * @returns {function()} Injector function. See {@link AUTO.$injector $injector}.\r\n *\r\n * @example\r\n * Typical usage\r\n * <pre>\r\n *   // create an injector\r\n *   var $injector = angular.injector(['ng']);\r\n *\r\n *   // use the injector to kick of your application\r\n *   // use the type inference to auto inject arguments, or use implicit injection\r\n *   $injector.invoke(function($rootScope, $compile, $document){\r\n *     $compile($document)($rootScope);\r\n *     $rootScope.$digest();\r\n *   });\r\n * </pre>\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc overview\r\n * @name AUTO\r\n * @description\r\n *\r\n * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}.\r\n */\r\n\r\nvar FN_ARGS = /^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\r\nvar FN_ARG_SPLIT = /,/;\r\nvar FN_ARG = /^\\s*(_?)(.+?)\\1\\s*$/;\r\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\r\nfunction annotate(fn) {\r\n  var $inject,\r\n      fnText,\r\n      argDecl,\r\n      last;\r\n\r\n  if (typeof fn == 'function') {\r\n    if (!($inject = fn.$inject)) {\r\n      $inject = [];\r\n      fnText = fn.toString().replace(STRIP_COMMENTS, '');\r\n      argDecl = fnText.match(FN_ARGS);\r\n      forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){\r\n        arg.replace(FN_ARG, function(all, underscore, name){\r\n          $inject.push(name);\r\n        });\r\n      });\r\n      fn.$inject = $inject;\r\n    }\r\n  } else if (isArray(fn)) {\r\n    last = fn.length - 1;\r\n    assertArgFn(fn[last], 'fn')\r\n    $inject = fn.slice(0, last);\r\n  } else {\r\n    assertArgFn(fn, 'fn', true);\r\n  }\r\n  return $inject;\r\n}\r\n\r\n///////////////////////////////////////\r\n\r\n/**\r\n * @ngdoc object\r\n * @name AUTO.$injector\r\n * @function\r\n *\r\n * @description\r\n *\r\n * `$injector` is used to retrieve object instances as defined by\r\n * {@link AUTO.$provide provider}, instantiate types, invoke methods,\r\n * and load modules.\r\n *\r\n * The following always holds true:\r\n *\r\n * <pre>\r\n *   var $injector = angular.injector();\r\n *   expect($injector.get('$injector')).toBe($injector);\r\n *   expect($injector.invoke(function($injector){\r\n *     return $injector;\r\n *   }).toBe($injector);\r\n * </pre>\r\n *\r\n * # Injection Function Annotation\r\n *\r\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\r\n * following ways are all valid way of annotating function with injection arguments and are equivalent.\r\n *\r\n * <pre>\r\n *   // inferred (only works if code not minified/obfuscated)\r\n *   $inject.invoke(function(serviceA){});\r\n *\r\n *   // annotated\r\n *   function explicit(serviceA) {};\r\n *   explicit.$inject = ['serviceA'];\r\n *   $inject.invoke(explicit);\r\n *\r\n *   // inline\r\n *   $inject.invoke(['serviceA', function(serviceA){}]);\r\n * </pre>\r\n *\r\n * ## Inference\r\n *\r\n * In JavaScript calling `toString()` on a function returns the function definition. The definition can then be\r\n * parsed and the function arguments can be extracted. *NOTE:* This does not work with minification, and obfuscation\r\n * tools since these tools change the argument names.\r\n *\r\n * ## `$inject` Annotation\r\n * By adding a `$inject` property onto a function the injection parameters can be specified.\r\n *\r\n * ## Inline\r\n * As an array of injection names, where the last item in the array is the function to call.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#get\r\n * @methodOf AUTO.$injector\r\n *\r\n * @description\r\n * Return an instance of the service.\r\n *\r\n * @param {string} name The name of the instance to retrieve.\r\n * @return {*} The instance.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#invoke\r\n * @methodOf AUTO.$injector\r\n *\r\n * @description\r\n * Invoke the method and supply the method arguments from the `$injector`.\r\n *\r\n * @param {!function} fn The function to invoke. The function arguments come form the function annotation.\r\n * @param {Object=} self The `this` for the invoked method.\r\n * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before\r\n *   the `$injector` is consulted.\r\n * @returns {*} the value returned by the invoked `fn` function.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#instantiate\r\n * @methodOf AUTO.$injector\r\n * @description\r\n * Create a new instance of JS type. The method takes a constructor function invokes the new operator and supplies\r\n * all of the arguments to the constructor function as specified by the constructor annotation.\r\n *\r\n * @param {function} Type Annotated constructor function.\r\n * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before\r\n *   the `$injector` is consulted.\r\n * @returns {Object} new instance of `Type`.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#annotate\r\n * @methodOf AUTO.$injector\r\n *\r\n * @description\r\n * Returns an array of service names which the function is requesting for injection. This API is used by the injector\r\n * to determine which services need to be injected into the function when the function is invoked. There are three\r\n * ways in which the function can be annotated with the needed dependencies.\r\n *\r\n * # Argument names\r\n *\r\n * The simplest form is to extract the dependencies from the arguments of the function. This is done by converting\r\n * the function into a string using `toString()` method and extracting the argument names.\r\n * <pre>\r\n *   // Given\r\n *   function MyController($scope, $route) {\r\n *     // ...\r\n *   }\r\n *\r\n *   // Then\r\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\r\n * </pre>\r\n *\r\n * This method does not work with code minfication / obfuscation. For this reason the following annotation strategies\r\n * are supported.\r\n *\r\n * # The `$injector` property\r\n *\r\n * If a function has an `$inject` property and its value is an array of strings, then the strings represent names of\r\n * services to be injected into the function.\r\n * <pre>\r\n *   // Given\r\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\r\n *     // ...\r\n *   }\r\n *   // Define function dependencies\r\n *   MyController.$inject = ['$scope', '$route'];\r\n *\r\n *   // Then\r\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\r\n * </pre>\r\n *\r\n * # The array notation\r\n *\r\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property is very\r\n * inconvenient. In these situations using the array notation to specify the dependencies in a way that survives\r\n * minification is a better choice:\r\n *\r\n * <pre>\r\n *   // We wish to write this (not minification / obfuscation safe)\r\n *   injector.invoke(function($compile, $rootScope) {\r\n *     // ...\r\n *   });\r\n *\r\n *   // We are forced to write break inlining\r\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\r\n *     // ...\r\n *   };\r\n *   tmpFn.$inject = ['$compile', '$rootScope'];\r\n *   injector.invoke(tempFn);\r\n *\r\n *   // To better support inline function the inline annotation is supported\r\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\r\n *     // ...\r\n *   }]);\r\n *\r\n *   // Therefore\r\n *   expect(injector.annotate(\r\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\r\n *    ).toEqual(['$compile', '$rootScope']);\r\n * </pre>\r\n *\r\n * @param {function|Array.<string|Function>} fn Function for which dependent service names need to be retrieved as described\r\n *   above.\r\n *\r\n * @returns {Array.<string>} The names of the services which the function requires.\r\n */\r\n\r\n\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name AUTO.$provide\r\n *\r\n * @description\r\n *\r\n * Use `$provide` to register new providers with the `$injector`. The providers are the factories for the instance.\r\n * The providers share the same name as the instance they create with the `Provider` suffixed to them.\r\n *\r\n * A provider is an object with a `$get()` method. The injector calls the `$get` method to create a new instance of\r\n * a service. The Provider can have additional methods which would allow for configuration of the provider.\r\n *\r\n * <pre>\r\n *   function GreetProvider() {\r\n *     var salutation = 'Hello';\r\n *\r\n *     this.salutation = function(text) {\r\n *       salutation = text;\r\n *     };\r\n *\r\n *     this.$get = function() {\r\n *       return function (name) {\r\n *         return salutation + ' ' + name + '!';\r\n *       };\r\n *     };\r\n *   }\r\n *\r\n *   describe('Greeter', function(){\r\n *\r\n *     beforeEach(module(function($provide) {\r\n *       $provide.provider('greet', GreetProvider);\r\n *     });\r\n *\r\n *     it('should greet', inject(function(greet) {\r\n *       expect(greet('angular')).toEqual('Hello angular!');\r\n *     }));\r\n *\r\n *     it('should allow configuration of salutation', function() {\r\n *       module(function(greetProvider) {\r\n *         greetProvider.salutation('Ahoj');\r\n *       });\r\n *       inject(function(greet) {\r\n *         expect(greet('angular')).toEqual('Ahoj angular!');\r\n *       });\r\n *     )};\r\n *\r\n *   });\r\n * </pre>\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#provider\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * Register a provider for a service. The providers can be retrieved and can have additional configuration methods.\r\n *\r\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key.\r\n * @param {(Object|function())} provider If the provider is:\r\n *\r\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\r\n *               {@link AUTO.$injector#invoke $injector.invoke()} when an instance needs to be created.\r\n *   - `Constructor`: a new instance of the provider will be created using\r\n *               {@link AUTO.$injector#instantiate $injector.instantiate()}, then treated as `object`.\r\n *\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#factory\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A short hand for configuring services if only `$get` method is required.\r\n *\r\n * @param {string} name The name of the instance.\r\n * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand for\r\n * `$provide.provider(name, {$get: $getFn})`.\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#service\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A short hand for registering service of given class.\r\n *\r\n * @param {string} name The name of the instance.\r\n * @param {Function} constructor A class (constructor function) that will be instantiated.\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#value\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A short hand for configuring services if the `$get` method is a constant.\r\n *\r\n * @param {string} name The name of the instance.\r\n * @param {*} value The value.\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#constant\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A constant value, but unlike {@link AUTO.$provide#value value} it can be injected\r\n * into configuration function (other modules) and it is not interceptable by\r\n * {@link AUTO.$provide#decorator decorator}.\r\n *\r\n * @param {string} name The name of the constant.\r\n * @param {*} value The constant value.\r\n * @returns {Object} registered instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#decorator\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * Decoration of service, allows the decorator to intercept the service instance creation. The\r\n * returned instance may be the original instance, or a new instance which delegates to the\r\n * original instance.\r\n *\r\n * @param {string} name The name of the service to decorate.\r\n * @param {function()} decorator This function will be invoked when the service needs to be\r\n *    instanciated. The function is called using the {@link AUTO.$injector#invoke\r\n *    injector.invoke} method and is therefore fully injectable. Local injection arguments:\r\n *\r\n *    * `$delegate` - The original service instance, which can be monkey patched, configured,\r\n *      decorated or delegated to.\r\n */\r\n\r\n\r\nfunction createInjector(modulesToLoad) {\r\n  var INSTANTIATING = {},\r\n      providerSuffix = 'Provider',\r\n      path = [],\r\n      loadedModules = new HashMap(),\r\n      providerCache = {\r\n        $provide: {\r\n            provider: supportObject(provider),\r\n            factory: supportObject(factory),\r\n            service: supportObject(service),\r\n            value: supportObject(value),\r\n            constant: supportObject(constant),\r\n            decorator: decorator\r\n          }\r\n      },\r\n      providerInjector = createInternalInjector(providerCache, function() {\r\n        throw Error(\"Unknown provider: \" + path.join(' <- '));\r\n      }),\r\n      instanceCache = {},\r\n      instanceInjector = (instanceCache.$injector =\r\n          createInternalInjector(instanceCache, function(servicename) {\r\n            var provider = providerInjector.get(servicename + providerSuffix);\r\n            return instanceInjector.invoke(provider.$get, provider);\r\n          }));\r\n\r\n\r\n  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });\r\n\r\n  return instanceInjector;\r\n\r\n  ////////////////////////////////////\r\n  // $provider\r\n  ////////////////////////////////////\r\n\r\n  function supportObject(delegate) {\r\n    return function(key, value) {\r\n      if (isObject(key)) {\r\n        forEach(key, reverseParams(delegate));\r\n      } else {\r\n        return delegate(key, value);\r\n      }\r\n    }\r\n  }\r\n\r\n  function provider(name, provider_) {\r\n    if (isFunction(provider_)) {\r\n      provider_ = providerInjector.instantiate(provider_);\r\n    }\r\n    if (!provider_.$get) {\r\n      throw Error('Provider ' + name + ' must define $get factory method.');\r\n    }\r\n    return providerCache[name + providerSuffix] = provider_;\r\n  }\r\n\r\n  function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }\r\n\r\n  function service(name, constructor) {\r\n    return factory(name, ['$injector', function($injector) {\r\n      return $injector.instantiate(constructor);\r\n    }]);\r\n  }\r\n\r\n  function value(name, value) { return factory(name, valueFn(value)); }\r\n\r\n  function constant(name, value) {\r\n    providerCache[name] = value;\r\n    instanceCache[name] = value;\r\n  }\r\n\r\n  function decorator(serviceName, decorFn) {\r\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\r\n        orig$get = origProvider.$get;\r\n\r\n    origProvider.$get = function() {\r\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\r\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\r\n    };\r\n  }\r\n\r\n  ////////////////////////////////////\r\n  // Module Loading\r\n  ////////////////////////////////////\r\n  function loadModules(modulesToLoad){\r\n    var runBlocks = [];\r\n    forEach(modulesToLoad, function(module) {\r\n      if (loadedModules.get(module)) return;\r\n      loadedModules.put(module, true);\r\n      if (isString(module)) {\r\n        var moduleFn = angularModule(module);\r\n        runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\r\n\r\n        try {\r\n          for(var invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {\r\n            var invokeArgs = invokeQueue[i],\r\n                provider = invokeArgs[0] == '$injector'\r\n                    ? providerInjector\r\n                    : providerInjector.get(invokeArgs[0]);\r\n\r\n            provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\r\n          }\r\n        } catch (e) {\r\n          if (e.message) e.message += ' from ' + module;\r\n          throw e;\r\n        }\r\n      } else if (isFunction(module)) {\r\n        try {\r\n          runBlocks.push(providerInjector.invoke(module));\r\n        } catch (e) {\r\n          if (e.message) e.message += ' from ' + module;\r\n          throw e;\r\n        }\r\n      } else if (isArray(module)) {\r\n        try {\r\n          runBlocks.push(providerInjector.invoke(module));\r\n        } catch (e) {\r\n          if (e.message) e.message += ' from ' + String(module[module.length - 1]);\r\n          throw e;\r\n        }\r\n      } else {\r\n        assertArgFn(module, 'module');\r\n      }\r\n    });\r\n    return runBlocks;\r\n  }\r\n\r\n  ////////////////////////////////////\r\n  // internal Injector\r\n  ////////////////////////////////////\r\n\r\n  function createInternalInjector(cache, factory) {\r\n\r\n    function getService(serviceName) {\r\n      if (typeof serviceName !== 'string') {\r\n        throw Error('Service name expected');\r\n      }\r\n      if (cache.hasOwnProperty(serviceName)) {\r\n        if (cache[serviceName] === INSTANTIATING) {\r\n          throw Error('Circular dependency: ' + path.join(' <- '));\r\n        }\r\n        return cache[serviceName];\r\n      } else {\r\n        try {\r\n          path.unshift(serviceName);\r\n          cache[serviceName] = INSTANTIATING;\r\n          return cache[serviceName] = factory(serviceName);\r\n        } finally {\r\n          path.shift();\r\n        }\r\n      }\r\n    }\r\n\r\n    function invoke(fn, self, locals){\r\n      var args = [],\r\n          $inject = annotate(fn),\r\n          length, i,\r\n          key;\r\n\r\n      for(i = 0, length = $inject.length; i < length; i++) {\r\n        key = $inject[i];\r\n        args.push(\r\n          locals && locals.hasOwnProperty(key)\r\n          ? locals[key]\r\n          : getService(key, path)\r\n        );\r\n      }\r\n      if (!fn.$inject) {\r\n        // this means that we must be an array.\r\n        fn = fn[length];\r\n      }\r\n\r\n\r\n      // Performance optimization: http://jsperf.com/apply-vs-call-vs-invoke\r\n      switch (self ? -1 : args.length) {\r\n        case  0: return fn();\r\n        case  1: return fn(args[0]);\r\n        case  2: return fn(args[0], args[1]);\r\n        case  3: return fn(args[0], args[1], args[2]);\r\n        case  4: return fn(args[0], args[1], args[2], args[3]);\r\n        case  5: return fn(args[0], args[1], args[2], args[3], args[4]);\r\n        case  6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]);\r\n        case  7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\r\n        case  8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);\r\n        case  9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);\r\n        case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\r\n        default: return fn.apply(self, args);\r\n      }\r\n    }\r\n\r\n    function instantiate(Type, locals) {\r\n      var Constructor = function() {},\r\n          instance, returnedValue;\r\n\r\n      Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;\r\n      instance = new Constructor();\r\n      returnedValue = invoke(Type, instance, locals);\r\n\r\n      return isObject(returnedValue) ? returnedValue : instance;\r\n    }\r\n\r\n    return {\r\n      invoke: invoke,\r\n      instantiate: instantiate,\r\n      get: getService,\r\n      annotate: annotate\r\n    };\r\n  }\r\n}\r\n/**\r\n * @ngdoc function\r\n * @name ng.$anchorScroll\r\n * @requires $window\r\n * @requires $location\r\n * @requires $rootScope\r\n *\r\n * @description\r\n * When called, it checks current value of `$location.hash()` and scroll to related element,\r\n * according to rules specified in\r\n * {@link http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document Html5 spec}.\r\n *\r\n * It also watches the `$location.hash()` and scroll whenever it changes to match any anchor.\r\n * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.\r\n */\r\nfunction $AnchorScrollProvider() {\r\n\r\n  var autoScrollingEnabled = true;\r\n\r\n  this.disableAutoScrolling = function() {\r\n    autoScrollingEnabled = false;\r\n  };\r\n\r\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\r\n    var document = $window.document;\r\n\r\n    // helper function to get first anchor from a NodeList\r\n    // can't use filter.filter, as it accepts only instances of Array\r\n    // and IE can't convert NodeList to an array using [].slice\r\n    // TODO(vojta): use filter if we change it to accept lists as well\r\n    function getFirstAnchor(list) {\r\n      var result = null;\r\n      forEach(list, function(element) {\r\n        if (!result && lowercase(element.nodeName) === 'a') result = element;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    function scroll() {\r\n      var hash = $location.hash(), elm;\r\n\r\n      // empty hash, scroll to the top of the page\r\n      if (!hash) $window.scrollTo(0, 0);\r\n\r\n      // element with given id\r\n      else if ((elm = document.getElementById(hash))) elm.scrollIntoView();\r\n\r\n      // first anchor with given name :-D\r\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();\r\n\r\n      // no element and hash == 'top', scroll to the top of the page\r\n      else if (hash === 'top') $window.scrollTo(0, 0);\r\n    }\r\n\r\n    // does not scroll when user clicks on anchor link that is currently on\r\n    // (no url change, no $locaiton.hash() change), browser native does scroll\r\n    if (autoScrollingEnabled) {\r\n      $rootScope.$watch(function() {return $location.hash();}, function() {\r\n        $rootScope.$evalAsync(scroll);\r\n      });\r\n    }\r\n\r\n    return scroll;\r\n  }];\r\n}\r\n\r\n/**\r\n * ! This is a private undocumented service !\r\n *\r\n * @name ng.$browser\r\n * @requires $log\r\n * @description\r\n * This object has two goals:\r\n *\r\n * - hide all the global state in the browser caused by the window object\r\n * - abstract away all the browser specific features and inconsistencies\r\n *\r\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\r\n * service, which can be used for convenient testing of the application without the interaction with\r\n * the real browser apis.\r\n */\r\n/**\r\n * @param {object} window The global window object.\r\n * @param {object} document jQuery wrapped document.\r\n * @param {function()} XHR XMLHttpRequest constructor.\r\n * @param {object} $log console.log or an object with the same interface.\r\n * @param {object} $sniffer $sniffer service\r\n */\r\nfunction Browser(window, document, $log, $sniffer) {\r\n  var self = this,\r\n      rawDocument = document[0],\r\n      location = window.location,\r\n      history = window.history,\r\n      setTimeout = window.setTimeout,\r\n      clearTimeout = window.clearTimeout,\r\n      pendingDeferIds = {};\r\n\r\n  self.isMock = false;\r\n\r\n  var outstandingRequestCount = 0;\r\n  var outstandingRequestCallbacks = [];\r\n\r\n  // TODO(vojta): remove this temporary api\r\n  self.$$completeOutstandingRequest = completeOutstandingRequest;\r\n  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };\r\n\r\n  /**\r\n   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\r\n   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\r\n   */\r\n  function completeOutstandingRequest(fn) {\r\n    try {\r\n      fn.apply(null, sliceArgs(arguments, 1));\r\n    } finally {\r\n      outstandingRequestCount--;\r\n      if (outstandingRequestCount === 0) {\r\n        while(outstandingRequestCallbacks.length) {\r\n          try {\r\n            outstandingRequestCallbacks.pop()();\r\n          } catch (e) {\r\n            $log.error(e);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * Note: this method is used only by scenario runner\r\n   * TODO(vojta): prefix this method with $$ ?\r\n   * @param {function()} callback Function that will be called when no outstanding request\r\n   */\r\n  self.notifyWhenNoOutstandingRequests = function(callback) {\r\n    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire\r\n    // at some deterministic time in respect to the test runner's actions. Leaving things up to the\r\n    // regular poller would result in flaky tests.\r\n    forEach(pollFns, function(pollFn){ pollFn(); });\r\n\r\n    if (outstandingRequestCount === 0) {\r\n      callback();\r\n    } else {\r\n      outstandingRequestCallbacks.push(callback);\r\n    }\r\n  };\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // Poll Watcher API\r\n  //////////////////////////////////////////////////////////////\r\n  var pollFns = [],\r\n      pollTimeout;\r\n\r\n  /**\r\n   * @name ng.$browser#addPollFn\r\n   * @methodOf ng.$browser\r\n   *\r\n   * @param {function()} fn Poll function to add\r\n   *\r\n   * @description\r\n   * Adds a function to the list of functions that poller periodically executes,\r\n   * and starts polling if not started yet.\r\n   *\r\n   * @returns {function()} the added function\r\n   */\r\n  self.addPollFn = function(fn) {\r\n    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);\r\n    pollFns.push(fn);\r\n    return fn;\r\n  };\r\n\r\n  /**\r\n   * @param {number} interval How often should browser call poll functions (ms)\r\n   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.\r\n   *\r\n   * @description\r\n   * Configures the poller to run in the specified intervals, using the specified\r\n   * setTimeout fn and kicks it off.\r\n   */\r\n  function startPoller(interval, setTimeout) {\r\n    (function check() {\r\n      forEach(pollFns, function(pollFn){ pollFn(); });\r\n      pollTimeout = setTimeout(check, interval);\r\n    })();\r\n  }\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // URL API\r\n  //////////////////////////////////////////////////////////////\r\n\r\n  var lastBrowserUrl = location.href,\r\n      baseElement = document.find('base');\r\n\r\n  /**\r\n   * @name ng.$browser#url\r\n   * @methodOf ng.$browser\r\n   *\r\n   * @description\r\n   * GETTER:\r\n   * Without any argument, this method just returns current value of location.href.\r\n   *\r\n   * SETTER:\r\n   * With at least one argument, this method sets url to new value.\r\n   * If html5 history api supported, pushState/replaceState is used, otherwise\r\n   * location.href/location.replace is used.\r\n   * Returns its own instance to allow chaining\r\n   *\r\n   * NOTE: this api is intended for use only by the $location service. Please use the\r\n   * {@link ng.$location $location service} to change url.\r\n   *\r\n   * @param {string} url New url (when used as setter)\r\n   * @param {boolean=} replace Should new url replace current history record ?\r\n   */\r\n  self.url = function(url, replace) {\r\n    // setter\r\n    if (url) {\r\n      if (lastBrowserUrl == url) return;\r\n      lastBrowserUrl = url;\r\n      if ($sniffer.history) {\r\n        if (replace) history.replaceState(null, '', url);\r\n        else {\r\n          history.pushState(null, '', url);\r\n          // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462\r\n          baseElement.attr('href', baseElement.attr('href'));\r\n        }\r\n      } else {\r\n        if (replace) location.replace(url);\r\n        else location.href = url;\r\n      }\r\n      return self;\r\n    // getter\r\n    } else {\r\n      // the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\r\n      return location.href.replace(/%27/g,\"'\");\r\n    }\r\n  };\r\n\r\n  var urlChangeListeners = [],\r\n      urlChangeInit = false;\r\n\r\n  function fireUrlChange() {\r\n    if (lastBrowserUrl == self.url()) return;\r\n\r\n    lastBrowserUrl = self.url();\r\n    forEach(urlChangeListeners, function(listener) {\r\n      listener(self.url());\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @name ng.$browser#onUrlChange\r\n   * @methodOf ng.$browser\r\n   * @TODO(vojta): refactor to use node's syntax for events\r\n   *\r\n   * @description\r\n   * Register callback function that will be called, when url changes.\r\n   *\r\n   * It's only called when the url is changed by outside of angular:\r\n   * - user types different url into address bar\r\n   * - user clicks on history (forward/back) button\r\n   * - user clicks on a link\r\n   *\r\n   * It's not called when url is changed by $browser.url() method\r\n   *\r\n   * The listener gets called with new url as parameter.\r\n   *\r\n   * NOTE: this api is intended for use only by the $location service. Please use the\r\n   * {@link ng.$location $location service} to monitor url changes in angular apps.\r\n   *\r\n   * @param {function(string)} listener Listener function to be called when url changes.\r\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\r\n   */\r\n  self.onUrlChange = function(callback) {\r\n    if (!urlChangeInit) {\r\n      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)\r\n      // don't fire popstate when user change the address bar and don't fire hashchange when url\r\n      // changed by push/replaceState\r\n\r\n      // html5 history api - popstate event\r\n      if ($sniffer.history) jqLite(window).bind('popstate', fireUrlChange);\r\n      // hashchange event\r\n      if ($sniffer.hashchange) jqLite(window).bind('hashchange', fireUrlChange);\r\n      // polling\r\n      else self.addPollFn(fireUrlChange);\r\n\r\n      urlChangeInit = true;\r\n    }\r\n\r\n    urlChangeListeners.push(callback);\r\n    return callback;\r\n  };\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // Misc API\r\n  //////////////////////////////////////////////////////////////\r\n\r\n  /**\r\n   * Returns current <base href>\r\n   * (always relative - without domain)\r\n   *\r\n   * @returns {string=}\r\n   */\r\n  self.baseHref = function() {\r\n    var href = baseElement.attr('href');\r\n    return href ? href.replace(/^https?\\:\\/\\/[^\\/]*/, '') : href;\r\n  };\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // Cookies API\r\n  //////////////////////////////////////////////////////////////\r\n  var lastCookies = {};\r\n  var lastCookieString = '';\r\n  var cookiePath = self.baseHref();\r\n\r\n  /**\r\n   * @name ng.$browser#cookies\r\n   * @methodOf ng.$browser\r\n   *\r\n   * @param {string=} name Cookie name\r\n   * @param {string=} value Cokkie value\r\n   *\r\n   * @description\r\n   * The cookies method provides a 'private' low level access to browser cookies.\r\n   * It is not meant to be used directly, use the $cookie service instead.\r\n   *\r\n   * The return values vary depending on the arguments that the method was called with as follows:\r\n   * <ul>\r\n   *   <li>cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify it</li>\r\n   *   <li>cookies(name, value) -> set name to value, if value is undefined delete the cookie</li>\r\n   *   <li>cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way)</li>\r\n   * </ul>\r\n   *\r\n   * @returns {Object} Hash of all cookies (if called without any parameter)\r\n   */\r\n  self.cookies = function(name, value) {\r\n    var cookieLength, cookieArray, cookie, i, index;\r\n\r\n    if (name) {\r\n      if (value === undefined) {\r\n        rawDocument.cookie = escape(name) + \"=;path=\" + cookiePath + \";expires=Thu, 01 Jan 1970 00:00:00 GMT\";\r\n      } else {\r\n        if (isString(value)) {\r\n          cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath).length + 1;\r\n          if (cookieLength > 4096) {\r\n            $log.warn(\"Cookie '\"+ name +\"' possibly not set or overflowed because it was too large (\"+\r\n              cookieLength + \" > 4096 bytes)!\");\r\n          }\r\n          if (lastCookies.length > 20) {\r\n            $log.warn(\"Cookie '\"+ name +\"' possibly not set or overflowed because too many cookies \" +\r\n              \"were already set (\" + lastCookies.length + \" > 20 )\");\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      if (rawDocument.cookie !== lastCookieString) {\r\n        lastCookieString = rawDocument.cookie;\r\n        cookieArray = lastCookieString.split(\"; \");\r\n        lastCookies = {};\r\n\r\n        for (i = 0; i < cookieArray.length; i++) {\r\n          cookie = cookieArray[i];\r\n          index = cookie.indexOf('=');\r\n          if (index > 0) { //ignore nameless cookies\r\n            lastCookies[unescape(cookie.substring(0, index))] = unescape(cookie.substring(index + 1));\r\n          }\r\n        }\r\n      }\r\n      return lastCookies;\r\n    }\r\n  };\r\n\r\n\r\n  /**\r\n   * @name ng.$browser#defer\r\n   * @methodOf ng.$browser\r\n   * @param {function()} fn A function, who's execution should be defered.\r\n   * @param {number=} [delay=0] of milliseconds to defer the function execution.\r\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\r\n   *\r\n   * @description\r\n   * Executes a fn asynchroniously via `setTimeout(fn, delay)`.\r\n   *\r\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\r\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\r\n   * via `$browser.defer.flush()`.\r\n   *\r\n   */\r\n  self.defer = function(fn, delay) {\r\n    var timeoutId;\r\n    outstandingRequestCount++;\r\n    timeoutId = setTimeout(function() {\r\n      delete pendingDeferIds[timeoutId];\r\n      completeOutstandingRequest(fn);\r\n    }, delay || 0);\r\n    pendingDeferIds[timeoutId] = true;\r\n    return timeoutId;\r\n  };\r\n\r\n\r\n  /**\r\n   * @name ng.$browser#defer.cancel\r\n   * @methodOf ng.$browser.defer\r\n   *\r\n   * @description\r\n   * Cancels a defered task identified with `deferId`.\r\n   *\r\n   * @param {*} deferId Token returned by the `$browser.defer` function.\r\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfuly canceled.\r\n   */\r\n  self.defer.cancel = function(deferId) {\r\n    if (pendingDeferIds[deferId]) {\r\n      delete pendingDeferIds[deferId];\r\n      clearTimeout(deferId);\r\n      completeOutstandingRequest(noop);\r\n      return true;\r\n    }\r\n    return false;\r\n  };\r\n\r\n}\r\n\r\nfunction $BrowserProvider(){\r\n  this.$get = ['$window', '$log', '$sniffer', '$document',\r\n      function( $window,   $log,   $sniffer,   $document){\r\n        return new Browser($window, $document, $log, $sniffer);\r\n      }];\r\n}\r\n/**\r\n * @ngdoc object\r\n * @name ng.$cacheFactory\r\n *\r\n * @description\r\n * Factory that constructs cache objects.\r\n *\r\n *\r\n * @param {string} cacheId Name or id of the newly created cache.\r\n * @param {object=} options Options object that specifies the cache behavior. Properties:\r\n *\r\n *   - `{number=}` `capacity` â€” turns the cache into LRU cache.\r\n *\r\n * @returns {object} Newly created cache object with the following set of methods:\r\n *\r\n * - `{object}` `info()` â€” Returns id, size, and options of cache.\r\n * - `{void}` `put({string} key, {*} value)` â€” Puts a new key-value pair into the cache.\r\n * - `{{*}} `get({string} key) â€” Returns cached value for `key` or undefined for cache miss.\r\n * - `{void}` `remove({string} key) â€” Removes a key-value pair from the cache.\r\n * - `{void}` `removeAll() â€” Removes all cached values.\r\n * - `{void}` `destroy() â€” Removes references to this cache from $cacheFactory.\r\n *\r\n */\r\nfunction $CacheFactoryProvider() {\r\n\r\n  this.$get = function() {\r\n    var caches = {};\r\n\r\n    function cacheFactory(cacheId, options) {\r\n      if (cacheId in caches) {\r\n        throw Error('cacheId ' + cacheId + ' taken');\r\n      }\r\n\r\n      var size = 0,\r\n          stats = extend({}, options, {id: cacheId}),\r\n          data = {},\r\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\r\n          lruHash = {},\r\n          freshEnd = null,\r\n          staleEnd = null;\r\n\r\n      return caches[cacheId] = {\r\n\r\n        put: function(key, value) {\r\n          var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\r\n\r\n          refresh(lruEntry);\r\n\r\n          if (isUndefined(value)) return;\r\n          if (!(key in data)) size++;\r\n          data[key] = value;\r\n\r\n          if (size > capacity) {\r\n            this.remove(staleEnd.key);\r\n          }\r\n        },\r\n\r\n\r\n        get: function(key) {\r\n          var lruEntry = lruHash[key];\r\n\r\n          if (!lruEntry) return;\r\n\r\n          refresh(lruEntry);\r\n\r\n          return data[key];\r\n        },\r\n\r\n\r\n        remove: function(key) {\r\n          var lruEntry = lruHash[key];\r\n\r\n          if (lruEntry == freshEnd) freshEnd = lruEntry.p;\r\n          if (lruEntry == staleEnd) staleEnd = lruEntry.n;\r\n          link(lruEntry.n,lruEntry.p);\r\n\r\n          delete lruHash[key];\r\n          delete data[key];\r\n          size--;\r\n        },\r\n\r\n\r\n        removeAll: function() {\r\n          data = {};\r\n          size = 0;\r\n          lruHash = {};\r\n          freshEnd = staleEnd = null;\r\n        },\r\n\r\n\r\n        destroy: function() {\r\n          data = null;\r\n          stats = null;\r\n          lruHash = null;\r\n          delete caches[cacheId];\r\n        },\r\n\r\n\r\n        info: function() {\r\n          return extend({}, stats, {size: size});\r\n        }\r\n      };\r\n\r\n\r\n      /**\r\n       * makes the `entry` the freshEnd of the LRU linked list\r\n       */\r\n      function refresh(entry) {\r\n        if (entry != freshEnd) {\r\n          if (!staleEnd) {\r\n            staleEnd = entry;\r\n          } else if (staleEnd == entry) {\r\n            staleEnd = entry.n;\r\n          }\r\n\r\n          link(entry.n, entry.p);\r\n          link(entry, freshEnd);\r\n          freshEnd = entry;\r\n          freshEnd.n = null;\r\n        }\r\n      }\r\n\r\n\r\n      /**\r\n       * bidirectionally links two entries of the LRU linked list\r\n       */\r\n      function link(nextEntry, prevEntry) {\r\n        if (nextEntry != prevEntry) {\r\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\r\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\r\n        }\r\n      }\r\n    }\r\n\r\n\r\n    cacheFactory.info = function() {\r\n      var info = {};\r\n      forEach(caches, function(cache, cacheId) {\r\n        info[cacheId] = cache.info();\r\n      });\r\n      return info;\r\n    };\r\n\r\n\r\n    cacheFactory.get = function(cacheId) {\r\n      return caches[cacheId];\r\n    };\r\n\r\n\r\n    return cacheFactory;\r\n  };\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$templateCache\r\n *\r\n * @description\r\n * Cache used for storing html templates.\r\n *\r\n * See {@link ng.$cacheFactory $cacheFactory}.\r\n *\r\n */\r\nfunction $TemplateCacheProvider() {\r\n  this.$get = ['$cacheFactory', function($cacheFactory) {\r\n    return $cacheFactory('templates');\r\n  }];\r\n}\r\n\r\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\r\n *\r\n * DOM-related variables:\r\n *\r\n * - \"node\" - DOM Node\r\n * - \"element\" - DOM Element or Node\r\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\r\n *\r\n *\r\n * Compiler related stuff:\r\n *\r\n * - \"linkFn\" - linking fn of a single directive\r\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\r\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\r\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\r\n */\r\n\r\n\r\nvar NON_ASSIGNABLE_MODEL_EXPRESSION = 'Non-assignable model expression: ';\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$compile\r\n * @function\r\n *\r\n * @description\r\n * Compiles a piece of HTML string or DOM into a template and produces a template function, which\r\n * can then be used to link {@link ng.$rootScope.Scope scope} and the template together.\r\n *\r\n * The compilation is a process of walking the DOM tree and trying to match DOM elements to\r\n * {@link ng.$compileProvider.directive directives}. For each match it\r\n * executes corresponding template function and collects the\r\n * instance functions into a single template function which is then returned.\r\n *\r\n * The template function can then be used once to produce the view or as it is the case with\r\n * {@link ng.directive:ngRepeat repeater} many-times, in which\r\n * case each call results in a view that is a DOM clone of the original template.\r\n *\r\n <doc:example module=\"compile\">\r\n   <doc:source>\r\n    <script>\r\n      // declare a new module, and inject the $compileProvider\r\n      angular.module('compile', [], function($compileProvider) {\r\n        // configure new 'compile' directive by passing a directive\r\n        // factory function. The factory function injects the '$compile'\r\n        $compileProvider.directive('compile', function($compile) {\r\n          // directive factory creates a link function\r\n          return function(scope, element, attrs) {\r\n            scope.$watch(\r\n              function(scope) {\r\n                 // watch the 'compile' expression for changes\r\n                return scope.$eval(attrs.compile);\r\n              },\r\n              function(value) {\r\n                // when the 'compile' expression changes\r\n                // assign it into the current DOM\r\n                element.html(value);\r\n\r\n                // compile the new DOM and link it to the current\r\n                // scope.\r\n                // NOTE: we only compile .childNodes so that\r\n                // we don't get into infinite loop compiling ourselves\r\n                $compile(element.contents())(scope);\r\n              }\r\n            );\r\n          };\r\n        })\r\n      });\r\n\r\n      function Ctrl($scope) {\r\n        $scope.name = 'Angular';\r\n        $scope.html = 'Hello {{name}}';\r\n      }\r\n    </script>\r\n    <div ng-controller=\"Ctrl\">\r\n      <input ng-model=\"name\"> <br>\r\n      <textarea ng-model=\"html\"></textarea> <br>\r\n      <div compile=\"html\"></div>\r\n    </div>\r\n   </doc:source>\r\n   <doc:scenario>\r\n     it('should auto compile', function() {\r\n       expect(element('div[compile]').text()).toBe('Hello Angular');\r\n       input('html').enter('{{name}}!');\r\n       expect(element('div[compile]').text()).toBe('Angular!');\r\n     });\r\n   </doc:scenario>\r\n </doc:example>\r\n\r\n *\r\n *\r\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\r\n * @param {function(angular.Scope[, cloneAttachFn]} transclude function available to directives.\r\n * @param {number} maxPriority only apply directives lower then given priority (Only effects the\r\n *                 root element(s), not their children)\r\n * @returns {function(scope[, cloneAttachFn])} a link function which is used to bind template\r\n * (a DOM element/tree) to a scope. Where:\r\n *\r\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\r\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\r\n *               `template` and call the `cloneAttachFn` function allowing the caller to attach the\r\n *               cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\r\n *               called as: <br> `cloneAttachFn(clonedElement, scope)` where:\r\n *\r\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\r\n *      * `scope` - is the current scope with which the linking function is working with.\r\n *\r\n * Calling the linking function returns the element of the template. It is either the original element\r\n * passed in, or the clone of the element if the `cloneAttachFn` is provided.\r\n *\r\n * After linking the view is not updated until after a call to $digest which typically is done by\r\n * Angular automatically.\r\n *\r\n * If you need access to the bound view, there are two ways to do it:\r\n *\r\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\r\n *   before you send them to the compiler and keep this reference around.\r\n *   <pre>\r\n *     var element = $compile('<p>{{total}}</p>')(scope);\r\n *   </pre>\r\n *\r\n * - if on the other hand, you need the element to be cloned, the view reference from the original\r\n *   example would not point to the clone, but rather to the original template that was cloned. In\r\n *   this case, you can access the clone via the cloneAttachFn:\r\n *   <pre>\r\n *     var templateHTML = angular.element('<p>{{total}}</p>'),\r\n *         scope = ....;\r\n *\r\n *     var clonedElement = $compile(templateHTML)(scope, function(clonedElement, scope) {\r\n *       //attach the clone to DOM document at the right place\r\n *     });\r\n *\r\n *     //now we have reference to the cloned DOM via `clone`\r\n *   </pre>\r\n *\r\n *\r\n * For information on how the compiler works, see the\r\n * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc service\r\n * @name ng.$compileProvider\r\n * @function\r\n *\r\n * @description\r\n */\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$compileProvider#directive\r\n * @methodOf ng.$compileProvider\r\n * @function\r\n *\r\n * @description\r\n * Register a new directive with compiler\r\n *\r\n * @param {string} name name of the directive.\r\n * @param {function} directiveFactory An injectable directive factory function.\r\n * @returns {ng.$compileProvider} Self for chaining.\r\n */\r\n$CompileProvider.$inject = ['$provide'];\r\nfunction $CompileProvider($provide) {\r\n  var hasDirectives = {},\r\n      Suffix = 'Directive',\r\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive\\:\\s*([\\d\\w\\-_]+)\\s+(.*)$/,\r\n      CLASS_DIRECTIVE_REGEXP = /(([\\d\\w\\-_]+)(?:\\:([^;]+))?;?)/,\r\n      MULTI_ROOT_TEMPLATE_ERROR = 'Template must have exactly one root element. was: ';\r\n\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.$compileProvider.directive\r\n   * @methodOf ng.$compileProvider\r\n   * @function\r\n   *\r\n   * @description\r\n   * Register directives with the compiler.\r\n   *\r\n   * @param {string} name Name of the directive in camel-case. (ie <code>ngBind</code> which will match as\r\n   *                <code>ng-bind</code>).\r\n   * @param {function} directiveFactory An injectable directive factroy function. See {@link guide/directive} for more\r\n   *                info.\r\n   */\r\n   this.directive = function registerDirective(name, directiveFactory) {\r\n    if (isString(name)) {\r\n      assertArg(directiveFactory, 'directive');\r\n      if (!hasDirectives.hasOwnProperty(name)) {\r\n        hasDirectives[name] = [];\r\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\r\n          function($injector, $exceptionHandler) {\r\n            var directives = [];\r\n            forEach(hasDirectives[name], function(directiveFactory) {\r\n              try {\r\n                var directive = $injector.invoke(directiveFactory);\r\n                if (isFunction(directive)) {\r\n                  directive = { compile: valueFn(directive) };\r\n                } else if (!directive.compile && directive.link) {\r\n                  directive.compile = valueFn(directive.link);\r\n                }\r\n                directive.priority = directive.priority || 0;\r\n                directive.name = directive.name || name;\r\n                directive.require = directive.require || (directive.controller && directive.name);\r\n                directive.restrict = directive.restrict || 'A';\r\n                directives.push(directive);\r\n              } catch (e) {\r\n                $exceptionHandler(e);\r\n              }\r\n            });\r\n            return directives;\r\n          }]);\r\n      }\r\n      hasDirectives[name].push(directiveFactory);\r\n    } else {\r\n      forEach(name, reverseParams(registerDirective));\r\n    }\r\n    return this;\r\n  };\r\n\r\n\r\n  this.$get = [\r\n            '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',\r\n            '$controller', '$rootScope',\r\n    function($injector,   $interpolate,   $exceptionHandler,   $http,   $templateCache,   $parse,\r\n             $controller,   $rootScope) {\r\n\r\n    var Attributes = function(element, attr) {\r\n      this.$$element = element;\r\n      this.$attr = attr || {};\r\n    };\r\n\r\n    Attributes.prototype = {\r\n      $normalize: directiveNormalize,\r\n\r\n\r\n      /**\r\n       * Set a normalized attribute on the element in a way such that all directives\r\n       * can share the attribute. This function properly handles boolean attributes.\r\n       * @param {string} key Normalized key. (ie ngAttribute)\r\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\r\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\r\n       *     Defaults to true.\r\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\r\n       */\r\n      $set: function(key, value, writeAttr, attrName) {\r\n        var booleanKey = getBooleanAttrName(this.$$element[0], key),\r\n            $$observers = this.$$observers;\r\n\r\n        if (booleanKey) {\r\n          this.$$element.prop(key, value);\r\n          attrName = booleanKey;\r\n        }\r\n\r\n        this[key] = value;\r\n\r\n        // translate normalized key to actual key\r\n        if (attrName) {\r\n          this.$attr[key] = attrName;\r\n        } else {\r\n          attrName = this.$attr[key];\r\n          if (!attrName) {\r\n            this.$attr[key] = attrName = snake_case(key, '-');\r\n          }\r\n        }\r\n\r\n        if (writeAttr !== false) {\r\n          if (value === null || value === undefined) {\r\n            this.$$element.removeAttr(attrName);\r\n          } else {\r\n            this.$$element.attr(attrName, value);\r\n          }\r\n        }\r\n\r\n        // fire observers\r\n        $$observers && forEach($$observers[key], function(fn) {\r\n          try {\r\n            fn(value);\r\n          } catch (e) {\r\n            $exceptionHandler(e);\r\n          }\r\n        });\r\n      },\r\n\r\n\r\n      /**\r\n       * Observe an interpolated attribute.\r\n       * The observer will never be called, if given attribute is not interpolated.\r\n       *\r\n       * @param {string} key Normalized key. (ie ngAttribute) .\r\n       * @param {function(*)} fn Function that will be called whenever the attribute value changes.\r\n       * @returns {function(*)} the `fn` Function passed in.\r\n       */\r\n      $observe: function(key, fn) {\r\n        var attrs = this,\r\n            $$observers = (attrs.$$observers || (attrs.$$observers = {})),\r\n            listeners = ($$observers[key] || ($$observers[key] = []));\r\n\r\n        listeners.push(fn);\r\n        $rootScope.$evalAsync(function() {\r\n          if (!listeners.$$inter) {\r\n            // no one registered attribute interpolation function, so lets call it manually\r\n            fn(attrs[key]);\r\n          }\r\n        });\r\n        return fn;\r\n      }\r\n    };\r\n\r\n    return compile;\r\n\r\n    //================================\r\n\r\n    function compile($compileNode, transcludeFn, maxPriority) {\r\n      if (!($compileNode instanceof jqLite)) {\r\n        // jquery always rewraps, where as we need to preserve the original selector so that we can modify it.\r\n        $compileNode = jqLite($compileNode);\r\n      }\r\n      // We can not compile top level text elements since text nodes can be merged and we will\r\n      // not be able to attach scope data to them, so we will wrap them in <span>\r\n      forEach($compileNode, function(node, index){\r\n        if (node.nodeType == 3 /* text node */) {\r\n          $compileNode[index] = jqLite(node).wrap('<span>').parent()[0];\r\n        }\r\n      });\r\n      var compositeLinkFn = compileNodes($compileNode, transcludeFn, $compileNode, maxPriority);\r\n      return function(scope, cloneConnectFn){\r\n        assertArg(scope, 'scope');\r\n        // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\r\n        // and sometimes changes the structure of the DOM.\r\n        var $linkNode = cloneConnectFn\r\n          ? JQLitePrototype.clone.call($compileNode) // IMPORTANT!!!\r\n          : $compileNode;\r\n        $linkNode.data('$scope', scope);\r\n        safeAddClass($linkNode, 'ng-scope');\r\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\r\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);\r\n        return $linkNode;\r\n      };\r\n    }\r\n\r\n    function wrongMode(localName, mode) {\r\n      throw Error(\"Unsupported '\" + mode + \"' for '\" + localName + \"'.\");\r\n    }\r\n\r\n    function safeAddClass($element, className) {\r\n      try {\r\n        $element.addClass(className);\r\n      } catch(e) {\r\n        // ignore, since it means that we are trying to set class on\r\n        // SVG element, where class name is read-only.\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Compile function matches each node in nodeList against the directives. Once all directives\r\n     * for a particular node are collected their compile functions are executed. The compile\r\n     * functions return values - the linking functions - are combined into a composite linking\r\n     * function, which is the a linking function for the node.\r\n     *\r\n     * @param {NodeList} nodeList an array of nodes to compile\r\n     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the\r\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\r\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then the\r\n     *        rootElement must be set the jqLite collection of the compile root. This is\r\n     *        needed so that the jqLite collection items can be replaced with widgets.\r\n     * @param {number=} max directive priority\r\n     * @returns {?function} A composite linking function of all of the matched directives or null.\r\n     */\r\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority) {\r\n     var linkFns = [],\r\n         nodeLinkFn, childLinkFn, directives, attrs, linkFnFound;\r\n\r\n     for(var i = 0; i < nodeList.length; i++) {\r\n       attrs = new Attributes();\r\n\r\n       // we must always refer to nodeList[i] since the nodes can be replaced underneath us.\r\n       directives = collectDirectives(nodeList[i], [], attrs, maxPriority);\r\n\r\n       nodeLinkFn = (directives.length)\r\n           ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement)\r\n           : null;\r\n\r\n       childLinkFn = (nodeLinkFn && nodeLinkFn.terminal)\r\n           ? null\r\n           : compileNodes(nodeList[i].childNodes,\r\n                nodeLinkFn ? nodeLinkFn.transclude : transcludeFn);\r\n\r\n       linkFns.push(nodeLinkFn);\r\n       linkFns.push(childLinkFn);\r\n       linkFnFound = (linkFnFound || nodeLinkFn || childLinkFn);\r\n     }\r\n\r\n     // return a linking function if we have found anything, null otherwise\r\n     return linkFnFound ? compositeLinkFn : null;\r\n\r\n     function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) {\r\n       var nodeLinkFn, childLinkFn, node, childScope, childTranscludeFn;\r\n\r\n       for(var i = 0, n = 0, ii = linkFns.length; i < ii; n++) {\r\n         node = nodeList[n];\r\n         nodeLinkFn = linkFns[i++];\r\n         childLinkFn = linkFns[i++];\r\n\r\n         if (nodeLinkFn) {\r\n           if (nodeLinkFn.scope) {\r\n             childScope = scope.$new(isObject(nodeLinkFn.scope));\r\n             jqLite(node).data('$scope', childScope);\r\n           } else {\r\n             childScope = scope;\r\n           }\r\n           childTranscludeFn = nodeLinkFn.transclude;\r\n           if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) {\r\n             nodeLinkFn(childLinkFn, childScope, node, $rootElement,\r\n                 (function(transcludeFn) {\r\n                   return function(cloneFn) {\r\n                     var transcludeScope = scope.$new();\r\n\r\n                     return transcludeFn(transcludeScope, cloneFn).\r\n                         bind('$destroy', bind(transcludeScope, transcludeScope.$destroy));\r\n                    };\r\n                  })(childTranscludeFn || transcludeFn)\r\n             );\r\n           } else {\r\n             nodeLinkFn(childLinkFn, childScope, node, undefined, boundTranscludeFn);\r\n           }\r\n         } else if (childLinkFn) {\r\n           childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);\r\n         }\r\n       }\r\n     }\r\n   }\r\n\r\n\r\n    /**\r\n     * Looks for directives on the given node ands them to the directive collection which is sorted.\r\n     *\r\n     * @param node node to search\r\n     * @param directives an array to which the directives are added to. This array is sorted before\r\n     *        the function returns.\r\n     * @param attrs the shared attrs object which is used to populate the normalized attributes.\r\n     * @param {number=} max directive priority\r\n     */\r\n    function collectDirectives(node, directives, attrs, maxPriority) {\r\n      var nodeType = node.nodeType,\r\n          attrsMap = attrs.$attr,\r\n          match,\r\n          className;\r\n\r\n      switch(nodeType) {\r\n        case 1: /* Element */\r\n          // use the node name: <directive>\r\n          addDirective(directives,\r\n              directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority);\r\n\r\n          // iterate over the attributes\r\n          for (var attr, name, nName, value, nAttrs = node.attributes,\r\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\r\n            attr = nAttrs[j];\r\n            if (attr.specified) {\r\n              name = attr.name;\r\n              nName = directiveNormalize(name.toLowerCase());\r\n              attrsMap[nName] = name;\r\n              attrs[nName] = value = trim((msie && name == 'href')\r\n                ? decodeURIComponent(node.getAttribute(name, 2))\r\n                : attr.value);\r\n              if (getBooleanAttrName(node, nName)) {\r\n                attrs[nName] = true; // presence means true\r\n              }\r\n              addAttrInterpolateDirective(node, directives, value, nName);\r\n              addDirective(directives, nName, 'A', maxPriority);\r\n            }\r\n          }\r\n\r\n          // use class as directive\r\n          className = node.className;\r\n          if (isString(className)) {\r\n            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {\r\n              nName = directiveNormalize(match[2]);\r\n              if (addDirective(directives, nName, 'C', maxPriority)) {\r\n                attrs[nName] = trim(match[3]);\r\n              }\r\n              className = className.substr(match.index + match[0].length);\r\n            }\r\n          }\r\n          break;\r\n        case 3: /* Text Node */\r\n          addTextInterpolateDirective(directives, node.nodeValue);\r\n          break;\r\n        case 8: /* Comment */\r\n          try {\r\n            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\r\n            if (match) {\r\n              nName = directiveNormalize(match[1]);\r\n              if (addDirective(directives, nName, 'M', maxPriority)) {\r\n                attrs[nName] = trim(match[2]);\r\n              }\r\n            }\r\n          } catch (e) {\r\n            // turns out that under some circumstances IE9 throws errors when one attempts to read comment's node value.\r\n            // Just ignore it and continue. (Can't seem to reproduce in test case.)\r\n          }\r\n          break;\r\n      }\r\n\r\n      directives.sort(byPriority);\r\n      return directives;\r\n    }\r\n\r\n\r\n    /**\r\n     * Once the directives have been collected their compile functions is executed. This method\r\n     * is responsible for inlining directive templates as well as terminating the application\r\n     * of the directives if the terminal directive has been reached..\r\n     *\r\n     * @param {Array} directives Array of collected directives to execute their compile function.\r\n     *        this needs to be pre-sorted by priority order.\r\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\r\n     * @param {Object} templateAttrs The shared attribute function\r\n     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the\r\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\r\n     * @param {DOMElement} $rootElement If we are working on the root of the compile tree then this\r\n     *        argument has the root jqLite array so that we can replace widgets on it.\r\n     * @returns linkFn\r\n     */\r\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, $rootElement) {\r\n      var terminalPriority = -Number.MAX_VALUE,\r\n          preLinkFns = [],\r\n          postLinkFns = [],\r\n          newScopeDirective = null,\r\n          newIsolatedScopeDirective = null,\r\n          templateDirective = null,\r\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\r\n          directive,\r\n          directiveName,\r\n          $template,\r\n          transcludeDirective,\r\n          childTranscludeFn = transcludeFn,\r\n          controllerDirectives,\r\n          linkFn,\r\n          directiveValue;\r\n\r\n      // executes all directives on the current element\r\n      for(var i = 0, ii = directives.length; i < ii; i++) {\r\n        directive = directives[i];\r\n        $template = undefined;\r\n\r\n        if (terminalPriority > directive.priority) {\r\n          break; // prevent further processing of directives\r\n        }\r\n\r\n        if (directiveValue = directive.scope) {\r\n          assertNoDuplicate('isolated scope', newIsolatedScopeDirective, directive, $compileNode);\r\n          if (isObject(directiveValue)) {\r\n            safeAddClass($compileNode, 'ng-isolate-scope');\r\n            newIsolatedScopeDirective = directive;\r\n          }\r\n          safeAddClass($compileNode, 'ng-scope');\r\n          newScopeDirective = newScopeDirective || directive;\r\n        }\r\n\r\n        directiveName = directive.name;\r\n\r\n        if (directiveValue = directive.controller) {\r\n          controllerDirectives = controllerDirectives || {};\r\n          assertNoDuplicate(\"'\" + directiveName + \"' controller\",\r\n              controllerDirectives[directiveName], directive, $compileNode);\r\n          controllerDirectives[directiveName] = directive;\r\n        }\r\n\r\n        if (directiveValue = directive.transclude) {\r\n          assertNoDuplicate('transclusion', transcludeDirective, directive, $compileNode);\r\n          transcludeDirective = directive;\r\n          terminalPriority = directive.priority;\r\n          if (directiveValue == 'element') {\r\n            $template = jqLite(compileNode);\r\n            $compileNode = templateAttrs.$$element =\r\n                jqLite('<!-- ' + directiveName + ': ' + templateAttrs[directiveName]  + ' -->');\r\n            compileNode = $compileNode[0];\r\n            replaceWith($rootElement, jqLite($template[0]), compileNode);\r\n            childTranscludeFn = compile($template, transcludeFn, terminalPriority);\r\n          } else {\r\n            $template = jqLite(JQLiteClone(compileNode)).contents();\r\n            $compileNode.html(''); // clear contents\r\n            childTranscludeFn = compile($template, transcludeFn);\r\n          }\r\n        }\r\n\r\n        if (directiveValue = directive.template) {\r\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\r\n          templateDirective = directive;\r\n\r\n          $template = jqLite('<div>' + trim(directiveValue) + '</div>').contents();\r\n          compileNode = $template[0];\r\n\r\n          if (directive.replace) {\r\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\r\n              throw new Error(MULTI_ROOT_TEMPLATE_ERROR + directiveValue);\r\n            }\r\n\r\n            replaceWith($rootElement, $compileNode, compileNode);\r\n\r\n            var newTemplateAttrs = {$attr: {}};\r\n\r\n            // combine directives from the original node and from the template:\r\n            // - take the array of directives for this element\r\n            // - split it into two parts, those that were already applied and those that weren't\r\n            // - collect directives from the template, add them to the second group and sort them\r\n            // - append the second group with new directives to the first group\r\n            directives = directives.concat(\r\n                collectDirectives(\r\n                    compileNode,\r\n                    directives.splice(i + 1, directives.length - (i + 1)),\r\n                    newTemplateAttrs\r\n                )\r\n            );\r\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\r\n\r\n            ii = directives.length;\r\n          } else {\r\n            $compileNode.html(directiveValue);\r\n          }\r\n        }\r\n\r\n        if (directive.templateUrl) {\r\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\r\n          templateDirective = directive;\r\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i),\r\n              nodeLinkFn, $compileNode, templateAttrs, $rootElement, directive.replace,\r\n              childTranscludeFn);\r\n          ii = directives.length;\r\n        } else if (directive.compile) {\r\n          try {\r\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\r\n            if (isFunction(linkFn)) {\r\n              addLinkFns(null, linkFn);\r\n            } else if (linkFn) {\r\n              addLinkFns(linkFn.pre, linkFn.post);\r\n            }\r\n          } catch (e) {\r\n            $exceptionHandler(e, startingTag($compileNode));\r\n          }\r\n        }\r\n\r\n        if (directive.terminal) {\r\n          nodeLinkFn.terminal = true;\r\n          terminalPriority = Math.max(terminalPriority, directive.priority);\r\n        }\r\n\r\n      }\r\n\r\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope;\r\n      nodeLinkFn.transclude = transcludeDirective && childTranscludeFn;\r\n\r\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\r\n      return nodeLinkFn;\r\n\r\n      ////////////////////\r\n\r\n      function addLinkFns(pre, post) {\r\n        if (pre) {\r\n          pre.require = directive.require;\r\n          preLinkFns.push(pre);\r\n        }\r\n        if (post) {\r\n          post.require = directive.require;\r\n          postLinkFns.push(post);\r\n        }\r\n      }\r\n\r\n\r\n      function getControllers(require, $element) {\r\n        var value, retrievalMethod = 'data', optional = false;\r\n        if (isString(require)) {\r\n          while((value = require.charAt(0)) == '^' || value == '?') {\r\n            require = require.substr(1);\r\n            if (value == '^') {\r\n              retrievalMethod = 'inheritedData';\r\n            }\r\n            optional = optional || value == '?';\r\n          }\r\n          value = $element[retrievalMethod]('$' + require + 'Controller');\r\n          if (!value && !optional) {\r\n            throw Error(\"No controller: \" + require);\r\n          }\r\n          return value;\r\n        } else if (isArray(require)) {\r\n          value = [];\r\n          forEach(require, function(require) {\r\n            value.push(getControllers(require, $element));\r\n          });\r\n        }\r\n        return value;\r\n      }\r\n\r\n\r\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\r\n        var attrs, $element, i, ii, linkFn, controller;\r\n\r\n        if (compileNode === linkNode) {\r\n          attrs = templateAttrs;\r\n        } else {\r\n          attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));\r\n        }\r\n        $element = attrs.$$element;\r\n\r\n        if (newScopeDirective && isObject(newScopeDirective.scope)) {\r\n          var LOCAL_REGEXP = /^\\s*([@=&])\\s*(\\w*)\\s*$/;\r\n\r\n          var parentScope = scope.$parent || scope;\r\n\r\n          forEach(newScopeDirective.scope, function(definiton, scopeName) {\r\n            var match = definiton.match(LOCAL_REGEXP) || [],\r\n                attrName = match[2]|| scopeName,\r\n                mode = match[1], // @, =, or &\r\n                lastValue,\r\n                parentGet, parentSet;\r\n\r\n            switch (mode) {\r\n\r\n              case '@': {\r\n                attrs.$observe(attrName, function(value) {\r\n                  scope[scopeName] = value;\r\n                });\r\n                attrs.$$observers[attrName].$$scope = parentScope;\r\n                break;\r\n              }\r\n\r\n              case '=': {\r\n                parentGet = $parse(attrs[attrName]);\r\n                parentSet = parentGet.assign || function() {\r\n                  // reset the change, or we will throw this exception on every $digest\r\n                  lastValue = scope[scopeName] = parentGet(parentScope);\r\n                  throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] +\r\n                      ' (directive: ' + newScopeDirective.name + ')');\r\n                };\r\n                lastValue = scope[scopeName] = parentGet(parentScope);\r\n                scope.$watch(function() {\r\n                  var parentValue = parentGet(parentScope);\r\n\r\n                  if (parentValue !== scope[scopeName]) {\r\n                    // we are out of sync and need to copy\r\n                    if (parentValue !== lastValue) {\r\n                      // parent changed and it has precedence\r\n                      lastValue = scope[scopeName] = parentValue;\r\n                    } else {\r\n                      // if the parent can be assigned then do so\r\n                      parentSet(parentScope, lastValue = scope[scopeName]);\r\n                    }\r\n                  }\r\n                  return parentValue;\r\n                });\r\n                break;\r\n              }\r\n\r\n              case '&': {\r\n                parentGet = $parse(attrs[attrName]);\r\n                scope[scopeName] = function(locals) {\r\n                  return parentGet(parentScope, locals);\r\n                }\r\n                break;\r\n              }\r\n\r\n              default: {\r\n                throw Error('Invalid isolate scope definition for directive ' +\r\n                    newScopeDirective.name + ': ' + definiton);\r\n              }\r\n            }\r\n          });\r\n        }\r\n\r\n        if (controllerDirectives) {\r\n          forEach(controllerDirectives, function(directive) {\r\n            var locals = {\r\n              $scope: scope,\r\n              $element: $element,\r\n              $attrs: attrs,\r\n              $transclude: boundTranscludeFn\r\n            };\r\n\r\n            controller = directive.controller;\r\n            if (controller == '@') {\r\n              controller = attrs[directive.name];\r\n            }\r\n\r\n            $element.data(\r\n                '$' + directive.name + 'Controller',\r\n                $controller(controller, locals));\r\n          });\r\n        }\r\n\r\n        // PRELINKING\r\n        for(i = 0, ii = preLinkFns.length; i < ii; i++) {\r\n          try {\r\n            linkFn = preLinkFns[i];\r\n            linkFn(scope, $element, attrs,\r\n                linkFn.require && getControllers(linkFn.require, $element));\r\n          } catch (e) {\r\n            $exceptionHandler(e, startingTag($element));\r\n          }\r\n        }\r\n\r\n        // RECURSION\r\n        childLinkFn && childLinkFn(scope, linkNode.childNodes, undefined, boundTranscludeFn);\r\n\r\n        // POSTLINKING\r\n        for(i = 0, ii = postLinkFns.length; i < ii; i++) {\r\n          try {\r\n            linkFn = postLinkFns[i];\r\n            linkFn(scope, $element, attrs,\r\n                linkFn.require && getControllers(linkFn.require, $element));\r\n          } catch (e) {\r\n            $exceptionHandler(e, startingTag($element));\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n\r\n    /**\r\n     * looks up the directive and decorates it with exception handling and proper parameters. We\r\n     * call this the boundDirective.\r\n     *\r\n     * @param {string} name name of the directive to look up.\r\n     * @param {string} location The directive must be found in specific format.\r\n     *   String containing any of theses characters:\r\n     *\r\n     *   * `E`: element name\r\n     *   * `A': attribute\r\n     *   * `C`: class\r\n     *   * `M`: comment\r\n     * @returns true if directive was added.\r\n     */\r\n    function addDirective(tDirectives, name, location, maxPriority) {\r\n      var match = false;\r\n      if (hasDirectives.hasOwnProperty(name)) {\r\n        for(var directive, directives = $injector.get(name + Suffix),\r\n            i = 0, ii = directives.length; i<ii; i++) {\r\n          try {\r\n            directive = directives[i];\r\n            if ( (maxPriority === undefined || maxPriority > directive.priority) &&\r\n                 directive.restrict.indexOf(location) != -1) {\r\n              tDirectives.push(directive);\r\n              match = true;\r\n            }\r\n          } catch(e) { $exceptionHandler(e); }\r\n        }\r\n      }\r\n      return match;\r\n    }\r\n\r\n\r\n    /**\r\n     * When the element is replaced with HTML template then the new attributes\r\n     * on the template need to be merged with the existing attributes in the DOM.\r\n     * The desired effect is to have both of the attributes present.\r\n     *\r\n     * @param {object} dst destination attributes (original DOM)\r\n     * @param {object} src source attributes (from the directive template)\r\n     */\r\n    function mergeTemplateAttributes(dst, src) {\r\n      var srcAttr = src.$attr,\r\n          dstAttr = dst.$attr,\r\n          $element = dst.$$element;\r\n\r\n      // reapply the old attributes to the new element\r\n      forEach(dst, function(value, key) {\r\n        if (key.charAt(0) != '$') {\r\n          if (src[key]) {\r\n            value += (key === 'style' ? ';' : ' ') + src[key];\r\n          }\r\n          dst.$set(key, value, true, srcAttr[key]);\r\n        }\r\n      });\r\n\r\n      // copy the new attributes on the old attrs object\r\n      forEach(src, function(value, key) {\r\n        if (key == 'class') {\r\n          safeAddClass($element, value);\r\n          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;\r\n        } else if (key == 'style') {\r\n          $element.attr('style', $element.attr('style') + ';' + value);\r\n        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {\r\n          dst[key] = value;\r\n          dstAttr[key] = srcAttr[key];\r\n        }\r\n      });\r\n    }\r\n\r\n\r\n    function compileTemplateUrl(directives, beforeTemplateNodeLinkFn, $compileNode, tAttrs,\r\n        $rootElement, replace, childTranscludeFn) {\r\n      var linkQueue = [],\r\n          afterTemplateNodeLinkFn,\r\n          afterTemplateChildLinkFn,\r\n          beforeTemplateCompileNode = $compileNode[0],\r\n          origAsyncDirective = directives.shift(),\r\n          // The fact that we have to copy and patch the directive seems wrong!\r\n          derivedSyncDirective = extend({}, origAsyncDirective, {\r\n            controller: null, templateUrl: null, transclude: null\r\n          });\r\n\r\n      $compileNode.html('');\r\n\r\n      $http.get(origAsyncDirective.templateUrl, {cache: $templateCache}).\r\n        success(function(content) {\r\n          var compileNode, tempTemplateAttrs, $template;\r\n\r\n          if (replace) {\r\n            $template = jqLite('<div>' + trim(content) + '</div>').contents();\r\n            compileNode = $template[0];\r\n\r\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\r\n              throw new Error(MULTI_ROOT_TEMPLATE_ERROR + content);\r\n            }\r\n\r\n            tempTemplateAttrs = {$attr: {}};\r\n            replaceWith($rootElement, $compileNode, compileNode);\r\n            collectDirectives(compileNode, directives, tempTemplateAttrs);\r\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\r\n          } else {\r\n            compileNode = beforeTemplateCompileNode;\r\n            $compileNode.html(content);\r\n          }\r\n\r\n          directives.unshift(derivedSyncDirective);\r\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, $compileNode, tAttrs, childTranscludeFn);\r\n          afterTemplateChildLinkFn = compileNodes($compileNode.contents(), childTranscludeFn);\r\n\r\n\r\n          while(linkQueue.length) {\r\n            var controller = linkQueue.pop(),\r\n                linkRootElement = linkQueue.pop(),\r\n                beforeTemplateLinkNode = linkQueue.pop(),\r\n                scope = linkQueue.pop(),\r\n                linkNode = compileNode;\r\n\r\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\r\n              // it was cloned therefore we have to clone as well.\r\n              linkNode = JQLiteClone(compileNode);\r\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\r\n            }\r\n\r\n            afterTemplateNodeLinkFn(function() {\r\n              beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, controller);\r\n            }, scope, linkNode, $rootElement, controller);\r\n          }\r\n          linkQueue = null;\r\n        }).\r\n        error(function(response, code, headers, config) {\r\n          throw Error('Failed to load template: ' + config.url);\r\n        });\r\n\r\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, controller) {\r\n        if (linkQueue) {\r\n          linkQueue.push(scope);\r\n          linkQueue.push(node);\r\n          linkQueue.push(rootElement);\r\n          linkQueue.push(controller);\r\n        } else {\r\n          afterTemplateNodeLinkFn(function() {\r\n            beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, controller);\r\n          }, scope, node, rootElement, controller);\r\n        }\r\n      };\r\n    }\r\n\r\n\r\n    /**\r\n     * Sorting function for bound directives.\r\n     */\r\n    function byPriority(a, b) {\r\n      return b.priority - a.priority;\r\n    }\r\n\r\n\r\n    function assertNoDuplicate(what, previousDirective, directive, element) {\r\n      if (previousDirective) {\r\n        throw Error('Multiple directives [' + previousDirective.name + ', ' +\r\n          directive.name + '] asking for ' + what + ' on: ' +  startingTag(element));\r\n      }\r\n    }\r\n\r\n\r\n    function addTextInterpolateDirective(directives, text) {\r\n      var interpolateFn = $interpolate(text, true);\r\n      if (interpolateFn) {\r\n        directives.push({\r\n          priority: 0,\r\n          compile: valueFn(function(scope, node) {\r\n            var parent = node.parent(),\r\n                bindings = parent.data('$binding') || [];\r\n            bindings.push(interpolateFn);\r\n            safeAddClass(parent.data('$binding', bindings), 'ng-binding');\r\n            scope.$watch(interpolateFn, function(value) {\r\n              node[0].nodeValue = value;\r\n            });\r\n          })\r\n        });\r\n      }\r\n    }\r\n\r\n\r\n    function addAttrInterpolateDirective(node, directives, value, name) {\r\n      var interpolateFn = $interpolate(value, true);\r\n\r\n\r\n      // no interpolation found -> ignore\r\n      if (!interpolateFn) return;\r\n\r\n      directives.push({\r\n        priority: 100,\r\n        compile: valueFn(function(scope, element, attr) {\r\n          var $$observers = (attr.$$observers || (attr.$$observers = {}));\r\n\r\n          if (name === 'class') {\r\n            // we need to interpolate classes again, in the case the element was replaced\r\n            // and therefore the two class attrs got merged - we want to interpolate the result\r\n            interpolateFn = $interpolate(attr[name], true);\r\n          }\r\n\r\n          attr[name] = undefined;\r\n          ($$observers[name] || ($$observers[name] = [])).$$inter = true;\r\n          (attr.$$observers && attr.$$observers[name].$$scope || scope).\r\n            $watch(interpolateFn, function(value) {\r\n              attr.$set(name, value);\r\n            });\r\n        })\r\n      });\r\n    }\r\n\r\n\r\n    /**\r\n     * This is a special jqLite.replaceWith, which can replace items which\r\n     * have no parents, provided that the containing jqLite collection is provided.\r\n     *\r\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\r\n     *    in the root of the tree.\r\n     * @param {JqLite} $element The jqLite element which we are going to replace. We keep the shell,\r\n     *    but replace its DOM node reference.\r\n     * @param {Node} newNode The new DOM node.\r\n     */\r\n    function replaceWith($rootElement, $element, newNode) {\r\n      var oldNode = $element[0],\r\n          parent = oldNode.parentNode,\r\n          i, ii;\r\n\r\n      if ($rootElement) {\r\n        for(i = 0, ii = $rootElement.length; i < ii; i++) {\r\n          if ($rootElement[i] == oldNode) {\r\n            $rootElement[i] = newNode;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n\r\n      if (parent) {\r\n        parent.replaceChild(newNode, oldNode);\r\n      }\r\n\r\n      newNode[jqLite.expando] = oldNode[jqLite.expando];\r\n      $element[0] = newNode;\r\n    }\r\n  }];\r\n}\r\n\r\nvar PREFIX_REGEXP = /^(x[\\:\\-_]|data[\\:\\-_])/i;\r\n/**\r\n * Converts all accepted directives format into proper directive name.\r\n * All of these will become 'myDirective':\r\n *   my:DiRective\r\n *   my-directive\r\n *   x-my-directive\r\n *   data-my:directive\r\n *\r\n * Also there is special case for Moz prefix starting with upper case letter.\r\n * @param name Name to normalize\r\n */\r\nfunction directiveNormalize(name) {\r\n  return camelCase(name.replace(PREFIX_REGEXP, ''));\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$compile.directive.Attributes\r\n * @description\r\n *\r\n * A shared object between directive compile / linking functions which contains normalized DOM element\r\n * attributes. The the values reflect current binding state `{{ }}`. The normalization is needed\r\n * since all of these are treated as equivalent in Angular:\r\n *\r\n *          <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\r\n */\r\n\r\n/**\r\n * @ngdoc property\r\n * @name ng.$compile.directive.Attributes#$attr\r\n * @propertyOf ng.$compile.directive.Attributes\r\n * @returns {object} A map of DOM element attribute names to the normalized name. This is\r\n *          needed to do reverse lookup from normalized name back to actual name.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$compile.directive.Attributes#$set\r\n * @methodOf ng.$compile.directive.Attributes\r\n * @function\r\n *\r\n * @description\r\n * Set DOM element attribute value.\r\n *\r\n *\r\n * @param {string} name Normalized element attribute name of the property to modify. The name is\r\n *          revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\r\n *          property to the original name.\r\n * @param {string} value Value to set the attribute to.\r\n */\r\n\r\n\r\n\r\n/**\r\n * Closure compiler type information\r\n */\r\n\r\nfunction nodesetLinkingFn(\r\n  /* angular.Scope */ scope,\r\n  /* NodeList */ nodeList,\r\n  /* Element */ rootElement,\r\n  /* function(Function) */ boundTranscludeFn\r\n){}\r\n\r\nfunction directiveLinkingFn(\r\n  /* nodesetLinkingFn */ nodesetLinkingFn,\r\n  /* angular.Scope */ scope,\r\n  /* Node */ node,\r\n  /* Element */ rootElement,\r\n  /* function(Function) */ boundTranscludeFn\r\n){}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$controllerProvider\r\n * @description\r\n * The {@link ng.$controller $controller service} is used by Angular to create new\r\n * controllers.\r\n *\r\n * This provider allows controller registration via the\r\n * {@link ng.$controllerProvider#register register} method.\r\n */\r\nfunction $ControllerProvider() {\r\n  var controllers = {};\r\n\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.$controllerProvider#register\r\n   * @methodOf ng.$controllerProvider\r\n   * @param {string} name Controller name\r\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\r\n   *    annotations in the array notation).\r\n   */\r\n  this.register = function(name, constructor) {\r\n    if (isObject(name)) {\r\n      extend(controllers, name)\r\n    } else {\r\n      controllers[name] = constructor;\r\n    }\r\n  };\r\n\r\n\r\n  this.$get = ['$injector', '$window', function($injector, $window) {\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$controller\r\n     * @requires $injector\r\n     *\r\n     * @param {Function|string} constructor If called with a function then it's considered to be the\r\n     *    controller constructor function. Otherwise it's considered to be a string which is used\r\n     *    to retrieve the controller constructor using the following steps:\r\n     *\r\n     *    * check if a controller with given name is registered via `$controllerProvider`\r\n     *    * check if evaluating the string on the current scope returns a constructor\r\n     *    * check `window[constructor]` on the global `window` object\r\n     *\r\n     * @param {Object} locals Injection locals for Controller.\r\n     * @return {Object} Instance of given controller.\r\n     *\r\n     * @description\r\n     * `$controller` service is responsible for instantiating controllers.\r\n     *\r\n     * It's just simple call to {@link AUTO.$injector $injector}, but extracted into\r\n     * a service, so that one can override this service with {@link https://gist.github.com/1649788\r\n     * BC version}.\r\n     */\r\n    return function(constructor, locals) {\r\n      if(isString(constructor)) {\r\n        var name = constructor;\r\n        constructor = controllers.hasOwnProperty(name)\r\n            ? controllers[name]\r\n            : getter(locals.$scope, name, true) || getter($window, name, true);\r\n\r\n        assertArgFn(constructor, name, true);\r\n      }\r\n\r\n      return $injector.instantiate(constructor, locals);\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$document\r\n * @requires $window\r\n *\r\n * @description\r\n * A {@link angular.element jQuery (lite)}-wrapped reference to the browser's `window.document`\r\n * element.\r\n */\r\nfunction $DocumentProvider(){\r\n  this.$get = ['$window', function(window){\r\n    return jqLite(window.document);\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$exceptionHandler\r\n * @requires $log\r\n *\r\n * @description\r\n * Any uncaught exception in angular expressions is delegated to this service.\r\n * The default implementation simply delegates to `$log.error` which logs it into\r\n * the browser console.\r\n *\r\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\r\n * {@link ngMock.$exceptionHandler mock $exceptionHandler}\r\n *\r\n * @param {Error} exception Exception associated with the error.\r\n * @param {string=} cause optional information about the context in which\r\n *       the error was thrown.\r\n */\r\nfunction $ExceptionHandlerProvider() {\r\n  this.$get = ['$log', function($log){\r\n    return function(exception, cause) {\r\n      $log.error.apply($log, arguments);\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$interpolateProvider\r\n * @function\r\n *\r\n * @description\r\n *\r\n * Used for configuring the interpolation markup. Deafults to `{{` and `}}`.\r\n */\r\nfunction $InterpolateProvider() {\r\n  var startSymbol = '{{';\r\n  var endSymbol = '}}';\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$interpolateProvider#startSymbol\r\n   * @methodOf ng.$interpolateProvider\r\n   * @description\r\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\r\n   *\r\n   * @prop {string=} value new value to set the starting symbol to.\r\n   */\r\n  this.startSymbol = function(value){\r\n    if (value) {\r\n      startSymbol = value;\r\n      return this;\r\n    } else {\r\n      return startSymbol;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$interpolateProvider#endSymbol\r\n   * @methodOf ng.$interpolateProvider\r\n   * @description\r\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\r\n   *\r\n   * @prop {string=} value new value to set the ending symbol to.\r\n   */\r\n  this.endSymbol = function(value){\r\n    if (value) {\r\n      endSymbol = value;\r\n      return this;\r\n    } else {\r\n      return startSymbol;\r\n    }\r\n  };\r\n\r\n\r\n  this.$get = ['$parse', function($parse) {\r\n    var startSymbolLength = startSymbol.length,\r\n        endSymbolLength = endSymbol.length;\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$interpolate\r\n     * @function\r\n     *\r\n     * @requires $parse\r\n     *\r\n     * @description\r\n     *\r\n     * Compiles a string with markup into an interpolation function. This service is used by the\r\n     * HTML {@link ng.$compile $compile} service for data binding. See\r\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\r\n     * interpolation markup.\r\n     *\r\n     *\r\n       <pre>\r\n         var $interpolate = ...; // injected\r\n         var exp = $interpolate('Hello {{name}}!');\r\n         expect(exp({name:'Angular'}).toEqual('Hello Angular!');\r\n       </pre>\r\n     *\r\n     *\r\n     * @param {string} text The text with markup to interpolate.\r\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\r\n     *    embedded expression in order to return an interpolation function. Strings with no\r\n     *    embedded expression will return null for the interpolation function.\r\n     * @returns {function(context)} an interpolation function which is used to compute the interpolated\r\n     *    string. The function has these parameters:\r\n     *\r\n     *    * `context`: an object against which any expressions embedded in the strings are evaluated\r\n     *      against.\r\n     *\r\n     */\r\n    return function(text, mustHaveExpression) {\r\n      var startIndex,\r\n          endIndex,\r\n          index = 0,\r\n          parts = [],\r\n          length = text.length,\r\n          hasInterpolation = false,\r\n          fn,\r\n          exp,\r\n          concat = [];\r\n\r\n      while(index < length) {\r\n        if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&\r\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) {\r\n          (index != startIndex) && parts.push(text.substring(index, startIndex));\r\n          parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex)));\r\n          fn.exp = exp;\r\n          index = endIndex + endSymbolLength;\r\n          hasInterpolation = true;\r\n        } else {\r\n          // we did not find anything, so we have to add the remainder to the parts array\r\n          (index != length) && parts.push(text.substring(index));\r\n          index = length;\r\n        }\r\n      }\r\n\r\n      if (!(length = parts.length)) {\r\n        // we added, nothing, must have been an empty string.\r\n        parts.push('');\r\n        length = 1;\r\n      }\r\n\r\n      if (!mustHaveExpression  || hasInterpolation) {\r\n        concat.length = length;\r\n        fn = function(context) {\r\n          for(var i = 0, ii = length, part; i<ii; i++) {\r\n            if (typeof (part = parts[i]) == 'function') {\r\n              part = part(context);\r\n              if (part == null || part == undefined) {\r\n                part = '';\r\n              } else if (typeof part != 'string') {\r\n                part = toJson(part);\r\n              }\r\n            }\r\n            concat[i] = part;\r\n          }\r\n          return concat.join('');\r\n        };\r\n        fn.exp = text;\r\n        fn.parts = parts;\r\n        return fn;\r\n      }\r\n    };\r\n  }];\r\n}\r\n\r\nvar URL_MATCH = /^([^:]+):\\/\\/(\\w+:{0,1}\\w*@)?([\\w\\.-]*)(:([0-9]+))?(\\/[^\\?#]*)?(\\?([^#]*))?(#(.*))?$/,\r\n    PATH_MATCH = /^([^\\?#]*)?(\\?([^#]*))?(#(.*))?$/,\r\n    HASH_MATCH = PATH_MATCH,\r\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\r\n\r\n\r\n/**\r\n * Encode path using encodeUriSegment, ignoring forward slashes\r\n *\r\n * @param {string} path Path to encode\r\n * @returns {string}\r\n */\r\nfunction encodePath(path) {\r\n  var segments = path.split('/'),\r\n      i = segments.length;\r\n\r\n  while (i--) {\r\n    segments[i] = encodeUriSegment(segments[i]);\r\n  }\r\n\r\n  return segments.join('/');\r\n}\r\n\r\nfunction stripHash(url) {\r\n  return url.split('#')[0];\r\n}\r\n\r\n\r\nfunction matchUrl(url, obj) {\r\n  var match = URL_MATCH.exec(url);\r\n\r\n  match = {\r\n      protocol: match[1],\r\n      host: match[3],\r\n      port: int(match[5]) || DEFAULT_PORTS[match[1]] || null,\r\n      path: match[6] || '/',\r\n      search: match[8],\r\n      hash: match[10]\r\n    };\r\n\r\n  if (obj) {\r\n    obj.$$protocol = match.protocol;\r\n    obj.$$host = match.host;\r\n    obj.$$port = match.port;\r\n  }\r\n\r\n  return match;\r\n}\r\n\r\n\r\nfunction composeProtocolHostPort(protocol, host, port) {\r\n  return protocol + '://' + host + (port == DEFAULT_PORTS[protocol] ? '' : ':' + port);\r\n}\r\n\r\n\r\nfunction pathPrefixFromBase(basePath) {\r\n  return basePath.substr(0, basePath.lastIndexOf('/'));\r\n}\r\n\r\n\r\nfunction convertToHtml5Url(url, basePath, hashPrefix) {\r\n  var match = matchUrl(url);\r\n\r\n  // already html5 url\r\n  if (decodeURIComponent(match.path) != basePath || isUndefined(match.hash) ||\r\n      match.hash.indexOf(hashPrefix) !== 0) {\r\n    return url;\r\n  // convert hashbang url -> html5 url\r\n  } else {\r\n    return composeProtocolHostPort(match.protocol, match.host, match.port) +\r\n           pathPrefixFromBase(basePath) + match.hash.substr(hashPrefix.length);\r\n  }\r\n}\r\n\r\n\r\nfunction convertToHashbangUrl(url, basePath, hashPrefix) {\r\n  var match = matchUrl(url);\r\n\r\n  // already hashbang url\r\n  if (decodeURIComponent(match.path) == basePath) {\r\n    return url;\r\n  // convert html5 url -> hashbang url\r\n  } else {\r\n    var search = match.search && '?' + match.search || '',\r\n        hash = match.hash && '#' + match.hash || '',\r\n        pathPrefix = pathPrefixFromBase(basePath),\r\n        path = match.path.substr(pathPrefix.length);\r\n\r\n    if (match.path.indexOf(pathPrefix) !== 0) {\r\n      throw Error('Invalid url \"' + url + '\", missing path prefix \"' + pathPrefix + '\" !');\r\n    }\r\n\r\n    return composeProtocolHostPort(match.protocol, match.host, match.port) + basePath +\r\n           '#' + hashPrefix + path + search + hash;\r\n  }\r\n}\r\n\r\n\r\n/**\r\n * LocationUrl represents an url\r\n * This object is exposed as $location service when HTML5 mode is enabled and supported\r\n *\r\n * @constructor\r\n * @param {string} url HTML5 url\r\n * @param {string} pathPrefix\r\n */\r\nfunction LocationUrl(url, pathPrefix, appBaseUrl) {\r\n  pathPrefix = pathPrefix || '';\r\n\r\n  /**\r\n   * Parse given html5 (regular) url string into properties\r\n   * @param {string} newAbsoluteUrl HTML5 url\r\n   * @private\r\n   */\r\n  this.$$parse = function(newAbsoluteUrl) {\r\n    var match = matchUrl(newAbsoluteUrl, this);\r\n\r\n    if (match.path.indexOf(pathPrefix) !== 0) {\r\n      throw Error('Invalid url \"' + newAbsoluteUrl + '\", missing path prefix \"' + pathPrefix + '\" !');\r\n    }\r\n\r\n    this.$$path = decodeURIComponent(match.path.substr(pathPrefix.length));\r\n    this.$$search = parseKeyValue(match.search);\r\n    this.$$hash = match.hash && decodeURIComponent(match.hash) || '';\r\n\r\n    this.$$compose();\r\n  };\r\n\r\n  /**\r\n   * Compose url and update `absUrl` property\r\n   * @private\r\n   */\r\n  this.$$compose = function() {\r\n    var search = toKeyValue(this.$$search),\r\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\r\n\r\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\r\n    this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) +\r\n                    pathPrefix + this.$$url;\r\n  };\r\n\r\n\r\n  this.$$rewriteAppUrl = function(absoluteLinkUrl) {\r\n    if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) {\r\n      return absoluteLinkUrl;\r\n    }\r\n  }\r\n\r\n\r\n  this.$$parse(url);\r\n}\r\n\r\n\r\n/**\r\n * LocationHashbangUrl represents url\r\n * This object is exposed as $location service when html5 history api is disabled or not supported\r\n *\r\n * @constructor\r\n * @param {string} url Legacy url\r\n * @param {string} hashPrefix Prefix for hash part (containing path and search)\r\n */\r\nfunction LocationHashbangUrl(url, hashPrefix, appBaseUrl) {\r\n  var basePath;\r\n\r\n  /**\r\n   * Parse given hashbang url into properties\r\n   * @param {string} url Hashbang url\r\n   * @private\r\n   */\r\n  this.$$parse = function(url) {\r\n    var match = matchUrl(url, this);\r\n\r\n\r\n    if (match.hash && match.hash.indexOf(hashPrefix) !== 0) {\r\n      throw Error('Invalid url \"' + url + '\", missing hash prefix \"' + hashPrefix + '\" !');\r\n    }\r\n\r\n    basePath = match.path + (match.search ? '?' + match.search : '');\r\n    match = HASH_MATCH.exec((match.hash || '').substr(hashPrefix.length));\r\n    if (match[1]) {\r\n      this.$$path = (match[1].charAt(0) == '/' ? '' : '/') + decodeURIComponent(match[1]);\r\n    } else {\r\n      this.$$path = '';\r\n    }\r\n\r\n    this.$$search = parseKeyValue(match[3]);\r\n    this.$$hash = match[5] && decodeURIComponent(match[5]) || '';\r\n\r\n    this.$$compose();\r\n  };\r\n\r\n  /**\r\n   * Compose hashbang url and update `absUrl` property\r\n   * @private\r\n   */\r\n  this.$$compose = function() {\r\n    var search = toKeyValue(this.$$search),\r\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\r\n\r\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\r\n    this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) +\r\n                    basePath + (this.$$url ? '#' + hashPrefix + this.$$url : '');\r\n  };\r\n\r\n  this.$$rewriteAppUrl = function(absoluteLinkUrl) {\r\n    if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) {\r\n      return absoluteLinkUrl;\r\n    }\r\n  }\r\n\r\n\r\n  this.$$parse(url);\r\n}\r\n\r\n\r\nLocationUrl.prototype = {\r\n\r\n  /**\r\n   * Has any change been replacing ?\r\n   * @private\r\n   */\r\n  $$replace: false,\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#absUrl\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return full url representation with all segments encoded according to rules specified in\r\n   * {@link http://www.ietf.org/rfc/rfc3986.txt RFC 3986}.\r\n   *\r\n   * @return {string} full url\r\n   */\r\n  absUrl: locationGetter('$$absUrl'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#url\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.\r\n   *\r\n   * Change path, search and hash, when called with parameter and return `$location`.\r\n   *\r\n   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)\r\n   * @return {string} url\r\n   */\r\n  url: function(url, replace) {\r\n    if (isUndefined(url))\r\n      return this.$$url;\r\n\r\n    var match = PATH_MATCH.exec(url);\r\n    if (match[1]) this.path(decodeURIComponent(match[1]));\r\n    if (match[2] || match[1]) this.search(match[3] || '');\r\n    this.hash(match[5] || '', replace);\r\n\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#protocol\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return protocol of current url.\r\n   *\r\n   * @return {string} protocol of current url\r\n   */\r\n  protocol: locationGetter('$$protocol'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#host\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return host of current url.\r\n   *\r\n   * @return {string} host of current url.\r\n   */\r\n  host: locationGetter('$$host'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#port\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return port of current url.\r\n   *\r\n   * @return {Number} port\r\n   */\r\n  port: locationGetter('$$port'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#path\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return path of current url when called without any parameter.\r\n   *\r\n   * Change path when called with parameter and return `$location`.\r\n   *\r\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\r\n   * if it is missing.\r\n   *\r\n   * @param {string=} path New path\r\n   * @return {string} path\r\n   */\r\n  path: locationGetterSetter('$$path', function(path) {\r\n    return path.charAt(0) == '/' ? path : '/' + path;\r\n  }),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#search\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return search part (as object) of current url when called without any parameter.\r\n   *\r\n   * Change search part when called with parameter and return `$location`.\r\n   *\r\n   * @param {string|object<string,string>=} search New search params - string or hash object\r\n   * @param {string=} paramValue If `search` is a string, then `paramValue` will override only a\r\n   *    single search parameter. If the value is `null`, the parameter will be deleted.\r\n   *\r\n   * @return {string} search\r\n   */\r\n  search: function(search, paramValue) {\r\n    if (isUndefined(search))\r\n      return this.$$search;\r\n\r\n    if (isDefined(paramValue)) {\r\n      if (paramValue === null) {\r\n        delete this.$$search[search];\r\n      } else {\r\n        this.$$search[search] = paramValue;\r\n      }\r\n    } else {\r\n      this.$$search = isString(search) ? parseKeyValue(search) : search;\r\n    }\r\n\r\n    this.$$compose();\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#hash\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return hash fragment when called without any parameter.\r\n   *\r\n   * Change hash fragment when called with parameter and return `$location`.\r\n   *\r\n   * @param {string=} hash New hash fragment\r\n   * @return {string} hash\r\n   */\r\n  hash: locationGetterSetter('$$hash', identity),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#replace\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * If called, all changes to $location during current `$digest` will be replacing current history\r\n   * record, instead of adding new one.\r\n   */\r\n  replace: function() {\r\n    this.$$replace = true;\r\n    return this;\r\n  }\r\n};\r\n\r\nLocationHashbangUrl.prototype = inherit(LocationUrl.prototype);\r\n\r\nfunction LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExtra) {\r\n  LocationHashbangUrl.apply(this, arguments);\r\n\r\n\r\n  this.$$rewriteAppUrl = function(absoluteLinkUrl) {\r\n    if (absoluteLinkUrl.indexOf(appBaseUrl) == 0) {\r\n      return appBaseUrl + baseExtra + '#' + hashPrefix  + absoluteLinkUrl.substr(appBaseUrl.length);\r\n    }\r\n  }\r\n}\r\n\r\nLocationHashbangInHtml5Url.prototype = inherit(LocationHashbangUrl.prototype);\r\n\r\nfunction locationGetter(property) {\r\n  return function() {\r\n    return this[property];\r\n  };\r\n}\r\n\r\n\r\nfunction locationGetterSetter(property, preprocess) {\r\n  return function(value) {\r\n    if (isUndefined(value))\r\n      return this[property];\r\n\r\n    this[property] = preprocess(value);\r\n    this.$$compose();\r\n\r\n    return this;\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$location\r\n *\r\n * @requires $browser\r\n * @requires $sniffer\r\n * @requires $rootElement\r\n *\r\n * @description\r\n * The $location service parses the URL in the browser address bar (based on the\r\n * {@link https://developer.mozilla.org/en/window.location window.location}) and makes the URL\r\n * available to your application. Changes to the URL in the address bar are reflected into\r\n * $location service and changes to $location are reflected into the browser address bar.\r\n *\r\n * **The $location service:**\r\n *\r\n * - Exposes the current URL in the browser address bar, so you can\r\n *   - Watch and observe the URL.\r\n *   - Change the URL.\r\n * - Synchronizes the URL with the browser when the user\r\n *   - Changes the address bar.\r\n *   - Clicks the back or forward button (or clicks a History link).\r\n *   - Clicks on a link.\r\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\r\n *\r\n * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular\r\n * Services: Using $location}\r\n */\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$locationProvider\r\n * @description\r\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\r\n */\r\nfunction $LocationProvider(){\r\n  var hashPrefix = '',\r\n      html5Mode = false;\r\n\r\n  /**\r\n   * @ngdoc property\r\n   * @name ng.$locationProvider#hashPrefix\r\n   * @methodOf ng.$locationProvider\r\n   * @description\r\n   * @param {string=} prefix Prefix for hash part (containing path and search)\r\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\r\n   */\r\n  this.hashPrefix = function(prefix) {\r\n    if (isDefined(prefix)) {\r\n      hashPrefix = prefix;\r\n      return this;\r\n    } else {\r\n      return hashPrefix;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * @ngdoc property\r\n   * @name ng.$locationProvider#html5Mode\r\n   * @methodOf ng.$locationProvider\r\n   * @description\r\n   * @param {string=} mode Use HTML5 strategy if available.\r\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\r\n   */\r\n  this.html5Mode = function(mode) {\r\n    if (isDefined(mode)) {\r\n      html5Mode = mode;\r\n      return this;\r\n    } else {\r\n      return html5Mode;\r\n    }\r\n  };\r\n\r\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',\r\n      function( $rootScope,   $browser,   $sniffer,   $rootElement) {\r\n    var $location,\r\n        basePath,\r\n        pathPrefix,\r\n        initUrl = $browser.url(),\r\n        initUrlParts = matchUrl(initUrl),\r\n        appBaseUrl;\r\n\r\n    if (html5Mode) {\r\n      basePath = $browser.baseHref() || '/';\r\n      pathPrefix = pathPrefixFromBase(basePath);\r\n      appBaseUrl =\r\n          composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) +\r\n          pathPrefix + '/';\r\n\r\n      if ($sniffer.history) {\r\n        $location = new LocationUrl(\r\n          convertToHtml5Url(initUrl, basePath, hashPrefix),\r\n          pathPrefix, appBaseUrl);\r\n      } else {\r\n        $location = new LocationHashbangInHtml5Url(\r\n          convertToHashbangUrl(initUrl, basePath, hashPrefix),\r\n          hashPrefix, appBaseUrl, basePath.substr(pathPrefix.length + 1));\r\n      }\r\n    } else {\r\n      appBaseUrl =\r\n          composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) +\r\n          (initUrlParts.path || '') +\r\n          (initUrlParts.search ? ('?' + initUrlParts.search) : '') +\r\n          '#' + hashPrefix + '/';\r\n\r\n      $location = new LocationHashbangUrl(initUrl, hashPrefix, appBaseUrl);\r\n    }\r\n\r\n    $rootElement.bind('click', function(event) {\r\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\r\n      // currently we open nice url link and redirect then\r\n\r\n      if (event.ctrlKey || event.metaKey || event.which == 2) return;\r\n\r\n      var elm = jqLite(event.target);\r\n\r\n      // traverse the DOM up to find first A tag\r\n      while (lowercase(elm[0].nodeName) !== 'a') {\r\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\r\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\r\n      }\r\n\r\n      var absHref = elm.prop('href'),\r\n          rewrittenUrl = $location.$$rewriteAppUrl(absHref);\r\n\r\n      if (absHref && !elm.attr('target') && rewrittenUrl) {\r\n        // update location manually\r\n        $location.$$parse(rewrittenUrl);\r\n        $rootScope.$apply();\r\n        event.preventDefault();\r\n        // hack to work around FF6 bug 684208 when scenario runner clicks on links\r\n        window.angular['ff-684208-preventDefault'] = true;\r\n      }\r\n    });\r\n\r\n\r\n    // rewrite hashbang url <> html5 url\r\n    if ($location.absUrl() != initUrl) {\r\n      $browser.url($location.absUrl(), true);\r\n    }\r\n\r\n    // update $location when $browser url changes\r\n    $browser.onUrlChange(function(newUrl) {\r\n      if ($location.absUrl() != newUrl) {\r\n        $rootScope.$evalAsync(function() {\r\n          var oldUrl = $location.absUrl();\r\n\r\n          $location.$$parse(newUrl);\r\n          afterLocationChange(oldUrl);\r\n        });\r\n        if (!$rootScope.$$phase) $rootScope.$digest();\r\n      }\r\n    });\r\n\r\n    // update browser\r\n    var changeCounter = 0;\r\n    $rootScope.$watch(function $locationWatch() {\r\n      var oldUrl = $browser.url();\r\n\r\n      if (!changeCounter || oldUrl != $location.absUrl()) {\r\n        changeCounter++;\r\n        $rootScope.$evalAsync(function() {\r\n          if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\r\n              defaultPrevented) {\r\n            $location.$$parse(oldUrl);\r\n          } else {\r\n            $browser.url($location.absUrl(), $location.$$replace);\r\n            $location.$$replace = false;\r\n            afterLocationChange(oldUrl);\r\n          }\r\n        });\r\n      }\r\n\r\n      return changeCounter;\r\n    });\r\n\r\n    return $location;\r\n\r\n    function afterLocationChange(oldUrl) {\r\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);\r\n    }\r\n}];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$log\r\n * @requires $window\r\n *\r\n * @description\r\n * Simple service for logging. Default implementation writes the message\r\n * into the browser's console (if present).\r\n *\r\n * The main purpose of this service is to simplify debugging and troubleshooting.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n         <script>\r\n           function LogCtrl($log) {\r\n             this.$log = $log;\r\n             this.message = 'Hello World!';\r\n           }\r\n         </script>\r\n         <div ng-controller=\"LogCtrl\">\r\n           <p>Reload this page with open console, enter text and hit the log button...</p>\r\n           Message:\r\n           <input type=\"text\" ng-model=\"message\"/>\r\n           <button ng-click=\"$log.log(message)\">log</button>\r\n           <button ng-click=\"$log.warn(message)\">warn</button>\r\n           <button ng-click=\"$log.info(message)\">info</button>\r\n           <button ng-click=\"$log.error(message)\">error</button>\r\n         </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\n\r\nfunction $LogProvider(){\r\n  this.$get = ['$window', function($window){\r\n    return {\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#log\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write a log message\r\n       */\r\n      log: consoleLog('log'),\r\n\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#warn\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write a warning message\r\n       */\r\n      warn: consoleLog('warn'),\r\n\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#info\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write an information message\r\n       */\r\n      info: consoleLog('info'),\r\n\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#error\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write an error message\r\n       */\r\n      error: consoleLog('error')\r\n    };\r\n\r\n    function formatError(arg) {\r\n      if (arg instanceof Error) {\r\n        if (arg.stack) {\r\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\r\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\r\n              : arg.stack;\r\n        } else if (arg.sourceURL) {\r\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\r\n        }\r\n      }\r\n      return arg;\r\n    }\r\n\r\n    function consoleLog(type) {\r\n      var console = $window.console || {},\r\n          logFn = console[type] || console.log || noop;\r\n\r\n      if (logFn.apply) {\r\n        return function() {\r\n          var args = [];\r\n          forEach(arguments, function(arg) {\r\n            args.push(formatError(arg));\r\n          });\r\n          return logFn.apply(console, args);\r\n        };\r\n      }\r\n\r\n      // we are IE which either doesn't have window.console => this is noop and we do nothing,\r\n      // or we are IE where console.log doesn't have apply so we log at least first 2 args\r\n      return function(arg1, arg2) {\r\n        logFn(arg1, arg2);\r\n      }\r\n    }\r\n  }];\r\n}\r\n\r\nvar OPERATORS = {\r\n    'null':function(){return null;},\r\n    'true':function(){return true;},\r\n    'false':function(){return false;},\r\n    undefined:noop,\r\n    '+':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)+(isDefined(b)?b:0);},\r\n    '-':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)-(isDefined(b)?b:0);},\r\n    '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);},\r\n    '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);},\r\n    '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},\r\n    '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);},\r\n    '=':noop,\r\n    '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},\r\n    '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},\r\n    '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},\r\n    '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);},\r\n    '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);},\r\n    '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);},\r\n    '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);},\r\n    '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);},\r\n    '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);},\r\n//    '|':function(self, locals, a,b){return a|b;},\r\n    '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));},\r\n    '!':function(self, locals, a){return !a(self, locals);}\r\n};\r\nvar ESCAPE = {\"n\":\"\\n\", \"f\":\"\\f\", \"r\":\"\\r\", \"t\":\"\\t\", \"v\":\"\\v\", \"'\":\"'\", '\"':'\"'};\r\n\r\nfunction lex(text, csp){\r\n  var tokens = [],\r\n      token,\r\n      index = 0,\r\n      json = [],\r\n      ch,\r\n      lastCh = ':'; // can start regexp\r\n\r\n  while (index < text.length) {\r\n    ch = text.charAt(index);\r\n    if (is('\"\\'')) {\r\n      readString(ch);\r\n    } else if (isNumber(ch) || is('.') && isNumber(peek())) {\r\n      readNumber();\r\n    } else if (isIdent(ch)) {\r\n      readIdent();\r\n      // identifiers can only be if the preceding char was a { or ,\r\n      if (was('{,') && json[0]=='{' &&\r\n         (token=tokens[tokens.length-1])) {\r\n        token.json = token.text.indexOf('.') == -1;\r\n      }\r\n    } else if (is('(){}[].,;:')) {\r\n      tokens.push({\r\n        index:index,\r\n        text:ch,\r\n        json:(was(':[,') && is('{[')) || is('}]:,')\r\n      });\r\n      if (is('{[')) json.unshift(ch);\r\n      if (is('}]')) json.shift();\r\n      index++;\r\n    } else if (isWhitespace(ch)) {\r\n      index++;\r\n      continue;\r\n    } else {\r\n      var ch2 = ch + peek(),\r\n          fn = OPERATORS[ch],\r\n          fn2 = OPERATORS[ch2];\r\n      if (fn2) {\r\n        tokens.push({index:index, text:ch2, fn:fn2});\r\n        index += 2;\r\n      } else if (fn) {\r\n        tokens.push({index:index, text:ch, fn:fn, json: was('[,:') && is('+-')});\r\n        index += 1;\r\n      } else {\r\n        throwError(\"Unexpected next character \", index, index+1);\r\n      }\r\n    }\r\n    lastCh = ch;\r\n  }\r\n  return tokens;\r\n\r\n  function is(chars) {\r\n    return chars.indexOf(ch) != -1;\r\n  }\r\n\r\n  function was(chars) {\r\n    return chars.indexOf(lastCh) != -1;\r\n  }\r\n\r\n  function peek() {\r\n    return index + 1 < text.length ? text.charAt(index + 1) : false;\r\n  }\r\n  function isNumber(ch) {\r\n    return '0' <= ch && ch <= '9';\r\n  }\r\n  function isWhitespace(ch) {\r\n    return ch == ' ' || ch == '\\r' || ch == '\\t' ||\r\n           ch == '\\n' || ch == '\\v' || ch == '\\u00A0'; // IE treats non-breaking space as \\u00A0\r\n  }\r\n  function isIdent(ch) {\r\n    return 'a' <= ch && ch <= 'z' ||\r\n           'A' <= ch && ch <= 'Z' ||\r\n           '_' == ch || ch == '$';\r\n  }\r\n  function isExpOperator(ch) {\r\n    return ch == '-' || ch == '+' || isNumber(ch);\r\n  }\r\n\r\n  function throwError(error, start, end) {\r\n    end = end || index;\r\n    throw Error(\"Lexer Error: \" + error + \" at column\" +\r\n        (isDefined(start)\r\n            ? \"s \" + start +  \"-\" + index + \" [\" + text.substring(start, end) + \"]\"\r\n            : \" \" + end) +\r\n        \" in expression [\" + text + \"].\");\r\n  }\r\n\r\n  function readNumber() {\r\n    var number = \"\";\r\n    var start = index;\r\n    while (index < text.length) {\r\n      var ch = lowercase(text.charAt(index));\r\n      if (ch == '.' || isNumber(ch)) {\r\n        number += ch;\r\n      } else {\r\n        var peekCh = peek();\r\n        if (ch == 'e' && isExpOperator(peekCh)) {\r\n          number += ch;\r\n        } else if (isExpOperator(ch) &&\r\n            peekCh && isNumber(peekCh) &&\r\n            number.charAt(number.length - 1) == 'e') {\r\n          number += ch;\r\n        } else if (isExpOperator(ch) &&\r\n            (!peekCh || !isNumber(peekCh)) &&\r\n            number.charAt(number.length - 1) == 'e') {\r\n          throwError('Invalid exponent');\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n      index++;\r\n    }\r\n    number = 1 * number;\r\n    tokens.push({index:start, text:number, json:true,\r\n      fn:function() {return number;}});\r\n  }\r\n  function readIdent() {\r\n    var ident = \"\",\r\n        start = index,\r\n        lastDot, peekIndex, methodName;\r\n\r\n    while (index < text.length) {\r\n      var ch = text.charAt(index);\r\n      if (ch == '.' || isIdent(ch) || isNumber(ch)) {\r\n        if (ch == '.') lastDot = index;\r\n        ident += ch;\r\n      } else {\r\n        break;\r\n      }\r\n      index++;\r\n    }\r\n\r\n    //check if this is not a method invocation and if it is back out to last dot\r\n    if (lastDot) {\r\n      peekIndex = index;\r\n      while(peekIndex < text.length) {\r\n        var ch = text.charAt(peekIndex);\r\n        if (ch == '(') {\r\n          methodName = ident.substr(lastDot - start + 1);\r\n          ident = ident.substr(0, lastDot - start);\r\n          index = peekIndex;\r\n          break;\r\n        }\r\n        if(isWhitespace(ch)) {\r\n          peekIndex++;\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n\r\n    var token = {\r\n      index:start,\r\n      text:ident\r\n    };\r\n\r\n    if (OPERATORS.hasOwnProperty(ident)) {\r\n      token.fn = token.json = OPERATORS[ident];\r\n    } else {\r\n      var getter = getterFn(ident, csp);\r\n      token.fn = extend(function(self, locals) {\r\n        return (getter(self, locals));\r\n      }, {\r\n        assign: function(self, value) {\r\n          return setter(self, ident, value);\r\n        }\r\n      });\r\n    }\r\n\r\n    tokens.push(token);\r\n\r\n    if (methodName) {\r\n      tokens.push({\r\n        index:lastDot,\r\n        text: '.',\r\n        json: false\r\n      });\r\n      tokens.push({\r\n        index: lastDot + 1,\r\n        text: methodName,\r\n        json: false\r\n      });\r\n    }\r\n  }\r\n\r\n  function readString(quote) {\r\n    var start = index;\r\n    index++;\r\n    var string = \"\";\r\n    var rawString = quote;\r\n    var escape = false;\r\n    while (index < text.length) {\r\n      var ch = text.charAt(index);\r\n      rawString += ch;\r\n      if (escape) {\r\n        if (ch == 'u') {\r\n          var hex = text.substring(index + 1, index + 5);\r\n          if (!hex.match(/[\\da-f]{4}/i))\r\n            throwError( \"Invalid unicode escape [\\\\u\" + hex + \"]\");\r\n          index += 4;\r\n          string += String.fromCharCode(parseInt(hex, 16));\r\n        } else {\r\n          var rep = ESCAPE[ch];\r\n          if (rep) {\r\n            string += rep;\r\n          } else {\r\n            string += ch;\r\n          }\r\n        }\r\n        escape = false;\r\n      } else if (ch == '\\\\') {\r\n        escape = true;\r\n      } else if (ch == quote) {\r\n        index++;\r\n        tokens.push({\r\n          index:start,\r\n          text:rawString,\r\n          string:string,\r\n          json:true,\r\n          fn:function() { return string; }\r\n        });\r\n        return;\r\n      } else {\r\n        string += ch;\r\n      }\r\n      index++;\r\n    }\r\n    throwError(\"Unterminated quote\", start);\r\n  }\r\n}\r\n\r\n/////////////////////////////////////////\r\n\r\nfunction parser(text, json, $filter, csp){\r\n  var ZERO = valueFn(0),\r\n      value,\r\n      tokens = lex(text, csp),\r\n      assignment = _assignment,\r\n      functionCall = _functionCall,\r\n      fieldAccess = _fieldAccess,\r\n      objectIndex = _objectIndex,\r\n      filterChain = _filterChain;\r\n\r\n  if(json){\r\n    // The extra level of aliasing is here, just in case the lexer misses something, so that\r\n    // we prevent any accidental execution in JSON.\r\n    assignment = logicalOR;\r\n    functionCall =\r\n      fieldAccess =\r\n      objectIndex =\r\n      filterChain =\r\n        function() { throwError(\"is not valid json\", {text:text, index:0}); };\r\n    value = primary();\r\n  } else {\r\n    value = statements();\r\n  }\r\n  if (tokens.length !== 0) {\r\n    throwError(\"is an unexpected token\", tokens[0]);\r\n  }\r\n  return value;\r\n\r\n  ///////////////////////////////////\r\n  function throwError(msg, token) {\r\n    throw Error(\"Syntax Error: Token '\" + token.text +\r\n      \"' \" + msg + \" at column \" +\r\n      (token.index + 1) + \" of the expression [\" +\r\n      text + \"] starting at [\" + text.substring(token.index) + \"].\");\r\n  }\r\n\r\n  function peekToken() {\r\n    if (tokens.length === 0)\r\n      throw Error(\"Unexpected end of expression: \" + text);\r\n    return tokens[0];\r\n  }\r\n\r\n  function peek(e1, e2, e3, e4) {\r\n    if (tokens.length > 0) {\r\n      var token = tokens[0];\r\n      var t = token.text;\r\n      if (t==e1 || t==e2 || t==e3 || t==e4 ||\r\n          (!e1 && !e2 && !e3 && !e4)) {\r\n        return token;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function expect(e1, e2, e3, e4){\r\n    var token = peek(e1, e2, e3, e4);\r\n    if (token) {\r\n      if (json && !token.json) {\r\n        throwError(\"is not valid json\", token);\r\n      }\r\n      tokens.shift();\r\n      return token;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function consume(e1){\r\n    if (!expect(e1)) {\r\n      throwError(\"is unexpected, expecting [\" + e1 + \"]\", peek());\r\n    }\r\n  }\r\n\r\n  function unaryFn(fn, right) {\r\n    return function(self, locals) {\r\n      return fn(self, locals, right);\r\n    };\r\n  }\r\n\r\n  function binaryFn(left, fn, right) {\r\n    return function(self, locals) {\r\n      return fn(self, locals, left, right);\r\n    };\r\n  }\r\n\r\n  function statements() {\r\n    var statements = [];\r\n    while(true) {\r\n      if (tokens.length > 0 && !peek('}', ')', ';', ']'))\r\n        statements.push(filterChain());\r\n      if (!expect(';')) {\r\n        // optimize for the common case where there is only one statement.\r\n        // TODO(size): maybe we should not support multiple statements?\r\n        return statements.length == 1\r\n          ? statements[0]\r\n          : function(self, locals){\r\n            var value;\r\n            for ( var i = 0; i < statements.length; i++) {\r\n              var statement = statements[i];\r\n              if (statement)\r\n                value = statement(self, locals);\r\n            }\r\n            return value;\r\n          };\r\n      }\r\n    }\r\n  }\r\n\r\n  function _filterChain() {\r\n    var left = expression();\r\n    var token;\r\n    while(true) {\r\n      if ((token = expect('|'))) {\r\n        left = binaryFn(left, token.fn, filter());\r\n      } else {\r\n        return left;\r\n      }\r\n    }\r\n  }\r\n\r\n  function filter() {\r\n    var token = expect();\r\n    var fn = $filter(token.text);\r\n    var argsFn = [];\r\n    while(true) {\r\n      if ((token = expect(':'))) {\r\n        argsFn.push(expression());\r\n      } else {\r\n        var fnInvoke = function(self, locals, input){\r\n          var args = [input];\r\n          for ( var i = 0; i < argsFn.length; i++) {\r\n            args.push(argsFn[i](self, locals));\r\n          }\r\n          return fn.apply(self, args);\r\n        };\r\n        return function() {\r\n          return fnInvoke;\r\n        };\r\n      }\r\n    }\r\n  }\r\n\r\n  function expression() {\r\n    return assignment();\r\n  }\r\n\r\n  function _assignment() {\r\n    var left = logicalOR();\r\n    var right;\r\n    var token;\r\n    if ((token = expect('='))) {\r\n      if (!left.assign) {\r\n        throwError(\"implies assignment but [\" +\r\n          text.substring(0, token.index) + \"] can not be assigned to\", token);\r\n      }\r\n      right = logicalOR();\r\n      return function(self, locals){\r\n        return left.assign(self, right(self, locals), locals);\r\n      };\r\n    } else {\r\n      return left;\r\n    }\r\n  }\r\n\r\n  function logicalOR() {\r\n    var left = logicalAND();\r\n    var token;\r\n    while(true) {\r\n      if ((token = expect('||'))) {\r\n        left = binaryFn(left, token.fn, logicalAND());\r\n      } else {\r\n        return left;\r\n      }\r\n    }\r\n  }\r\n\r\n  function logicalAND() {\r\n    var left = equality();\r\n    var token;\r\n    if ((token = expect('&&'))) {\r\n      left = binaryFn(left, token.fn, logicalAND());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function equality() {\r\n    var left = relational();\r\n    var token;\r\n    if ((token = expect('==','!='))) {\r\n      left = binaryFn(left, token.fn, equality());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function relational() {\r\n    var left = additive();\r\n    var token;\r\n    if ((token = expect('<', '>', '<=', '>='))) {\r\n      left = binaryFn(left, token.fn, relational());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function additive() {\r\n    var left = multiplicative();\r\n    var token;\r\n    while ((token = expect('+','-'))) {\r\n      left = binaryFn(left, token.fn, multiplicative());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function multiplicative() {\r\n    var left = unary();\r\n    var token;\r\n    while ((token = expect('*','/','%'))) {\r\n      left = binaryFn(left, token.fn, unary());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function unary() {\r\n    var token;\r\n    if (expect('+')) {\r\n      return primary();\r\n    } else if ((token = expect('-'))) {\r\n      return binaryFn(ZERO, token.fn, unary());\r\n    } else if ((token = expect('!'))) {\r\n      return unaryFn(token.fn, unary());\r\n    } else {\r\n      return primary();\r\n    }\r\n  }\r\n\r\n\r\n  function primary() {\r\n    var primary;\r\n    if (expect('(')) {\r\n      primary = filterChain();\r\n      consume(')');\r\n    } else if (expect('[')) {\r\n      primary = arrayDeclaration();\r\n    } else if (expect('{')) {\r\n      primary = object();\r\n    } else {\r\n      var token = expect();\r\n      primary = token.fn;\r\n      if (!primary) {\r\n        throwError(\"not a primary expression\", token);\r\n      }\r\n    }\r\n\r\n    var next, context;\r\n    while ((next = expect('(', '[', '.'))) {\r\n      if (next.text === '(') {\r\n        primary = functionCall(primary, context);\r\n        context = null;\r\n      } else if (next.text === '[') {\r\n        context = primary;\r\n        primary = objectIndex(primary);\r\n      } else if (next.text === '.') {\r\n        context = primary;\r\n        primary = fieldAccess(primary);\r\n      } else {\r\n        throwError(\"IMPOSSIBLE\");\r\n      }\r\n    }\r\n    return primary;\r\n  }\r\n\r\n  function _fieldAccess(object) {\r\n    var field = expect().text;\r\n    var getter = getterFn(field, csp);\r\n    return extend(\r\n        function(self, locals) {\r\n          return getter(object(self, locals), locals);\r\n        },\r\n        {\r\n          assign:function(self, value, locals) {\r\n            return setter(object(self, locals), field, value);\r\n          }\r\n        }\r\n    );\r\n  }\r\n\r\n  function _objectIndex(obj) {\r\n    var indexFn = expression();\r\n    consume(']');\r\n    return extend(\r\n      function(self, locals){\r\n        var o = obj(self, locals),\r\n            i = indexFn(self, locals),\r\n            v, p;\r\n\r\n        if (!o) return undefined;\r\n        v = o[i];\r\n        if (v && v.then) {\r\n          p = v;\r\n          if (!('$$v' in v)) {\r\n            p.$$v = undefined;\r\n            p.then(function(val) { p.$$v = val; });\r\n          }\r\n          v = v.$$v;\r\n        }\r\n        return v;\r\n      }, {\r\n        assign:function(self, value, locals){\r\n          return obj(self, locals)[indexFn(self, locals)] = value;\r\n        }\r\n      });\r\n  }\r\n\r\n  function _functionCall(fn, contextGetter) {\r\n    var argsFn = [];\r\n    if (peekToken().text != ')') {\r\n      do {\r\n        argsFn.push(expression());\r\n      } while (expect(','));\r\n    }\r\n    consume(')');\r\n    return function(self, locals){\r\n      var args = [],\r\n          context = contextGetter ? contextGetter(self, locals) : self;\r\n\r\n      for ( var i = 0; i < argsFn.length; i++) {\r\n        args.push(argsFn[i](self, locals));\r\n      }\r\n      var fnPtr = fn(self, locals) || noop;\r\n      // IE stupidity!\r\n      return fnPtr.apply\r\n          ? fnPtr.apply(context, args)\r\n          : fnPtr(args[0], args[1], args[2], args[3], args[4]);\r\n    };\r\n  }\r\n\r\n  // This is used with json array declaration\r\n  function arrayDeclaration () {\r\n    var elementFns = [];\r\n    if (peekToken().text != ']') {\r\n      do {\r\n        elementFns.push(expression());\r\n      } while (expect(','));\r\n    }\r\n    consume(']');\r\n    return function(self, locals){\r\n      var array = [];\r\n      for ( var i = 0; i < elementFns.length; i++) {\r\n        array.push(elementFns[i](self, locals));\r\n      }\r\n      return array;\r\n    };\r\n  }\r\n\r\n  function object () {\r\n    var keyValues = [];\r\n    if (peekToken().text != '}') {\r\n      do {\r\n        var token = expect(),\r\n        key = token.string || token.text;\r\n        consume(\":\");\r\n        var value = expression();\r\n        keyValues.push({key:key, value:value});\r\n      } while (expect(','));\r\n    }\r\n    consume('}');\r\n    return function(self, locals){\r\n      var object = {};\r\n      for ( var i = 0; i < keyValues.length; i++) {\r\n        var keyValue = keyValues[i];\r\n        var value = keyValue.value(self, locals);\r\n        object[keyValue.key] = value;\r\n      }\r\n      return object;\r\n    };\r\n  }\r\n}\r\n\r\n//////////////////////////////////////////////////\r\n// Parser helper functions\r\n//////////////////////////////////////////////////\r\n\r\nfunction setter(obj, path, setValue) {\r\n  var element = path.split('.');\r\n  for (var i = 0; element.length > 1; i++) {\r\n    var key = element.shift();\r\n    var propertyObj = obj[key];\r\n    if (!propertyObj) {\r\n      propertyObj = {};\r\n      obj[key] = propertyObj;\r\n    }\r\n    obj = propertyObj;\r\n  }\r\n  obj[element.shift()] = setValue;\r\n  return setValue;\r\n}\r\n\r\n/**\r\n * Return the value accesible from the object by path. Any undefined traversals are ignored\r\n * @param {Object} obj starting object\r\n * @param {string} path path to traverse\r\n * @param {boolean=true} bindFnToScope\r\n * @returns value as accesbile by path\r\n */\r\n//TODO(misko): this function needs to be removed\r\nfunction getter(obj, path, bindFnToScope) {\r\n  if (!path) return obj;\r\n  var keys = path.split('.');\r\n  var key;\r\n  var lastInstance = obj;\r\n  var len = keys.length;\r\n\r\n  for (var i = 0; i < len; i++) {\r\n    key = keys[i];\r\n    if (obj) {\r\n      obj = (lastInstance = obj)[key];\r\n    }\r\n  }\r\n  if (!bindFnToScope && isFunction(obj)) {\r\n    return bind(lastInstance, obj);\r\n  }\r\n  return obj;\r\n}\r\n\r\nvar getterFnCache = {};\r\n\r\n/**\r\n * Implementation of the \"Black Hole\" variant from:\r\n * - http://jsperf.com/angularjs-parse-getter/4\r\n * - http://jsperf.com/path-evaluation-simplified/7\r\n */\r\nfunction cspSafeGetterFn(key0, key1, key2, key3, key4) {\r\n  return function(scope, locals) {\r\n    var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope,\r\n        promise;\r\n\r\n    if (pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key0];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key1 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key1];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key2 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key2];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key3 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key3];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key4 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key4];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    return pathVal;\r\n  };\r\n};\r\n\r\nfunction getterFn(path, csp) {\r\n  if (getterFnCache.hasOwnProperty(path)) {\r\n    return getterFnCache[path];\r\n  }\r\n\r\n  var pathKeys = path.split('.'),\r\n      pathKeysLength = pathKeys.length,\r\n      fn;\r\n\r\n  if (csp) {\r\n    fn = (pathKeysLength < 6)\r\n        ? cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4])\r\n        : function(scope, locals) {\r\n          var i = 0, val\r\n          do {\r\n            val = cspSafeGetterFn(\r\n                    pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++]\r\n                  )(scope, locals);\r\n\r\n            locals = undefined; // clear after first iteration\r\n            scope = val;\r\n          } while (i < pathKeysLength);\r\n          return val;\r\n        }\r\n  } else {\r\n    var code = 'var l, fn, p;\\n';\r\n    forEach(pathKeys, function(key, index) {\r\n      code += 'if(s === null || s === undefined) return s;\\n' +\r\n              'l=s;\\n' +\r\n              's='+ (index\r\n                      // we simply dereference 's' on any .dot notation\r\n                      ? 's'\r\n                      // but if we are first then we check locals first, and if so read it first\r\n                      : '((k&&k.hasOwnProperty(\"' + key + '\"))?k:s)') + '[\"' + key + '\"]' + ';\\n' +\r\n              'if (s && s.then) {\\n' +\r\n                ' if (!(\"$$v\" in s)) {\\n' +\r\n                  ' p=s;\\n' +\r\n                  ' p.$$v = undefined;\\n' +\r\n                  ' p.then(function(v) {p.$$v=v;});\\n' +\r\n                  '}\\n' +\r\n                ' s=s.$$v\\n' +\r\n              '}\\n';\r\n    });\r\n    code += 'return s;';\r\n    fn = Function('s', 'k', code); // s=scope, k=locals\r\n    fn.toString = function() { return code; };\r\n  }\r\n\r\n  return getterFnCache[path] = fn;\r\n}\r\n\r\n///////////////////////////////////\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$parse\r\n * @function\r\n *\r\n * @description\r\n *\r\n * Converts Angular {@link guide/expression expression} into a function.\r\n *\r\n * <pre>\r\n *   var getter = $parse('user.name');\r\n *   var setter = getter.assign;\r\n *   var context = {user:{name:'angular'}};\r\n *   var locals = {user:{name:'local'}};\r\n *\r\n *   expect(getter(context)).toEqual('angular');\r\n *   setter(context, 'newValue');\r\n *   expect(context.user.name).toEqual('newValue');\r\n *   expect(getter(context, locals)).toEqual('local');\r\n * </pre>\r\n *\r\n *\r\n * @param {string} expression String expression to compile.\r\n * @returns {function(context, locals)} a function which represents the compiled expression:\r\n *\r\n *    * `context`: an object against which any expressions embedded in the strings are evaluated\r\n *      against (Topically a scope object).\r\n *    * `locals`: local variables context object, useful for overriding values in `context`.\r\n *\r\n *    The return function also has an `assign` property, if the expression is assignable, which\r\n *    allows one to set values to expressions.\r\n *\r\n */\r\nfunction $ParseProvider() {\r\n  var cache = {};\r\n  this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {\r\n    return function(exp) {\r\n      switch(typeof exp) {\r\n        case 'string':\r\n          return cache.hasOwnProperty(exp)\r\n            ? cache[exp]\r\n            : cache[exp] =  parser(exp, false, $filter, $sniffer.csp);\r\n        case 'function':\r\n          return exp;\r\n        default:\r\n          return noop;\r\n      }\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc service\r\n * @name ng.$q\r\n * @requires $rootScope\r\n *\r\n * @description\r\n * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).\r\n *\r\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\r\n * interface for interacting with an object that represents the result of an action that is\r\n * performed asynchronously, and may or may not be finished at any given point in time.\r\n *\r\n * From the perspective of dealing with error handling, deferred and promise apis are to\r\n * asynchronous programing what `try`, `catch` and `throw` keywords are to synchronous programing.\r\n *\r\n * <pre>\r\n *   // for the purpose of this example let's assume that variables `$q` and `scope` are\r\n *   // available in the current lexical scope (they could have been injected or passed in).\r\n *\r\n *   function asyncGreet(name) {\r\n *     var deferred = $q.defer();\r\n *\r\n *     setTimeout(function() {\r\n *       // since this fn executes async in a future turn of the event loop, we need to wrap\r\n *       // our code into an $apply call so that the model changes are properly observed.\r\n *       scope.$apply(function() {\r\n *         if (okToGreet(name)) {\r\n *           deferred.resolve('Hello, ' + name + '!');\r\n *         } else {\r\n *           deferred.reject('Greeting ' + name + ' is not allowed.');\r\n *         }\r\n *       });\r\n *     }, 1000);\r\n *\r\n *     return deferred.promise;\r\n *   }\r\n *\r\n *   var promise = asyncGreet('Robin Hood');\r\n *   promise.then(function(greeting) {\r\n *     alert('Success: ' + greeting);\r\n *   }, function(reason) {\r\n *     alert('Failed: ' + reason);\r\n *   );\r\n * </pre>\r\n *\r\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\r\n * comes in the way of\r\n * [guarantees that promise and deferred apis make](https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md).\r\n *\r\n * Additionally the promise api allows for composition that is very hard to do with the\r\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\r\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\r\n * section on serial or parallel joining of promises.\r\n *\r\n *\r\n * # The Deferred API\r\n *\r\n * A new instance of deferred is constructed by calling `$q.defer()`.\r\n *\r\n * The purpose of the deferred object is to expose the associated Promise instance as well as apis\r\n * that can be used for signaling the successful or unsuccessful completion of the task.\r\n *\r\n * **Methods**\r\n *\r\n * - `resolve(value)` â€“ resolves the derived promise with the `value`. If the value is a rejection\r\n *   constructed via `$q.reject`, the promise will be rejected instead.\r\n * - `reject(reason)` â€“ rejects the derived promise with the `reason`. This is equivalent to\r\n *   resolving it with a rejection constructed via `$q.reject`.\r\n *\r\n * **Properties**\r\n *\r\n * - promise â€“ `{Promise}` â€“ promise object associated with this deferred.\r\n *\r\n *\r\n * # The Promise API\r\n *\r\n * A new promise instance is created when a deferred instance is created and can be retrieved by\r\n * calling `deferred.promise`.\r\n *\r\n * The purpose of the promise object is to allow for interested parties to get access to the result\r\n * of the deferred task when it completes.\r\n *\r\n * **Methods**\r\n *\r\n * - `then(successCallback, errorCallback)` â€“ regardless of when the promise was or will be resolved\r\n *   or rejected calls one of the success or error callbacks asynchronously as soon as the result\r\n *   is available. The callbacks are called with a single argument the result or rejection reason.\r\n *\r\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\r\n *   `successCallback` or `errorCallback`.\r\n *\r\n *\r\n * # Chaining promises\r\n *\r\n * Because calling `then` api of a promise returns a new derived promise, it is easily possible\r\n * to create a chain of promises:\r\n *\r\n * <pre>\r\n *   promiseB = promiseA.then(function(result) {\r\n *     return result + 1;\r\n *   });\r\n *\r\n *   // promiseB will be resolved immediately after promiseA is resolved and it's value will be\r\n *   // the result of promiseA incremented by 1\r\n * </pre>\r\n *\r\n * It is possible to create chains of any length and since a promise can be resolved with another\r\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\r\n * the promises at any point in the chain. This makes it possible to implement powerful apis like\r\n * $http's response interceptors.\r\n *\r\n *\r\n * # Differences between Kris Kowal's Q and $q\r\n *\r\n *  There are three main differences:\r\n *\r\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\r\n *   mechanism in angular, which means faster propagation of resolution or rejection into your\r\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\r\n * - $q promises are recognized by the templating engine in angular, which means that in templates\r\n *   you can treat promises attached to a scope as if they were the resulting values.\r\n * - Q has many more features that $q, but that comes at a cost of bytes. $q is tiny, but contains\r\n *   all the important functionality needed for common async tasks.\r\n */\r\nfunction $QProvider() {\r\n\r\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\r\n    return qFactory(function(callback) {\r\n      $rootScope.$evalAsync(callback);\r\n    }, $exceptionHandler);\r\n  }];\r\n}\r\n\r\n\r\n/**\r\n * Constructs a promise manager.\r\n *\r\n * @param {function(function)} nextTick Function for executing functions in the next turn.\r\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\r\n *     debugging purposes.\r\n * @returns {object} Promise manager.\r\n */\r\nfunction qFactory(nextTick, exceptionHandler) {\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#defer\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Creates a `Deferred` object which represents a task which will finish in the future.\r\n   *\r\n   * @returns {Deferred} Returns a new instance of deferred.\r\n   */\r\n  var defer = function() {\r\n    var pending = [],\r\n        value, deferred;\r\n\r\n    deferred = {\r\n\r\n      resolve: function(val) {\r\n        if (pending) {\r\n          var callbacks = pending;\r\n          pending = undefined;\r\n          value = ref(val);\r\n\r\n          if (callbacks.length) {\r\n            nextTick(function() {\r\n              var callback;\r\n              for (var i = 0, ii = callbacks.length; i < ii; i++) {\r\n                callback = callbacks[i];\r\n                value.then(callback[0], callback[1]);\r\n              }\r\n            });\r\n          }\r\n        }\r\n      },\r\n\r\n\r\n      reject: function(reason) {\r\n        deferred.resolve(reject(reason));\r\n      },\r\n\r\n\r\n      promise: {\r\n        then: function(callback, errback) {\r\n          var result = defer();\r\n\r\n          var wrappedCallback = function(value) {\r\n            try {\r\n              result.resolve((callback || defaultCallback)(value));\r\n            } catch(e) {\r\n              exceptionHandler(e);\r\n              result.reject(e);\r\n            }\r\n          };\r\n\r\n          var wrappedErrback = function(reason) {\r\n            try {\r\n              result.resolve((errback || defaultErrback)(reason));\r\n            } catch(e) {\r\n              exceptionHandler(e);\r\n              result.reject(e);\r\n            }\r\n          };\r\n\r\n          if (pending) {\r\n            pending.push([wrappedCallback, wrappedErrback]);\r\n          } else {\r\n            value.then(wrappedCallback, wrappedErrback);\r\n          }\r\n\r\n          return result.promise;\r\n        }\r\n      }\r\n    };\r\n\r\n    return deferred;\r\n  };\r\n\r\n\r\n  var ref = function(value) {\r\n    if (value && value.then) return value;\r\n    return {\r\n      then: function(callback) {\r\n        var result = defer();\r\n        nextTick(function() {\r\n          result.resolve(callback(value));\r\n        });\r\n        return result.promise;\r\n      }\r\n    };\r\n  };\r\n\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#reject\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\r\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\r\n   * a promise chain, you don't need to worry about it.\r\n   *\r\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\r\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\r\n   * a promise error callback and you want to forward the error to the promise derived from the\r\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\r\n   * `reject`.\r\n   *\r\n   * <pre>\r\n   *   promiseB = promiseA.then(function(result) {\r\n   *     // success: do something and resolve promiseB\r\n   *     //          with the old or a new result\r\n   *     return result;\r\n   *   }, function(reason) {\r\n   *     // error: handle the error if possible and\r\n   *     //        resolve promiseB with newPromiseOrValue,\r\n   *     //        otherwise forward the rejection to promiseB\r\n   *     if (canHandle(reason)) {\r\n   *      // handle the error and recover\r\n   *      return newPromiseOrValue;\r\n   *     }\r\n   *     return $q.reject(reason);\r\n   *   });\r\n   * </pre>\r\n   *\r\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\r\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\r\n   */\r\n  var reject = function(reason) {\r\n    return {\r\n      then: function(callback, errback) {\r\n        var result = defer();\r\n        nextTick(function() {\r\n          result.resolve((errback || defaultErrback)(reason));\r\n        });\r\n        return result.promise;\r\n      }\r\n    };\r\n  };\r\n\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#when\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\r\n   * This is useful when you are dealing with on object that might or might not be a promise, or if\r\n   * the promise comes from a source that can't be trusted.\r\n   *\r\n   * @param {*} value Value or a promise\r\n   * @returns {Promise} Returns a single promise that will be resolved with an array of values,\r\n   *   each value coresponding to the promise at the same index in the `promises` array. If any of\r\n   *   the promises is resolved with a rejection, this resulting promise will be resolved with the\r\n   *   same rejection.\r\n   */\r\n  var when = function(value, callback, errback) {\r\n    var result = defer(),\r\n        done;\r\n\r\n    var wrappedCallback = function(value) {\r\n      try {\r\n        return (callback || defaultCallback)(value);\r\n      } catch (e) {\r\n        exceptionHandler(e);\r\n        return reject(e);\r\n      }\r\n    };\r\n\r\n    var wrappedErrback = function(reason) {\r\n      try {\r\n        return (errback || defaultErrback)(reason);\r\n      } catch (e) {\r\n        exceptionHandler(e);\r\n        return reject(e);\r\n      }\r\n    };\r\n\r\n    nextTick(function() {\r\n      ref(value).then(function(value) {\r\n        if (done) return;\r\n        done = true;\r\n        result.resolve(ref(value).then(wrappedCallback, wrappedErrback));\r\n      }, function(reason) {\r\n        if (done) return;\r\n        done = true;\r\n        result.resolve(wrappedErrback(reason));\r\n      });\r\n    });\r\n\r\n    return result.promise;\r\n  };\r\n\r\n\r\n  function defaultCallback(value) {\r\n    return value;\r\n  }\r\n\r\n\r\n  function defaultErrback(reason) {\r\n    return reject(reason);\r\n  }\r\n\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#all\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Combines multiple promises into a single promise that is resolved when all of the input\r\n   * promises are resolved.\r\n   *\r\n   * @param {Array.<Promise>} promises An array of promises.\r\n   * @returns {Promise} Returns a single promise that will be resolved with an array of values,\r\n   *   each value coresponding to the promise at the same index in the `promises` array. If any of\r\n   *   the promises is resolved with a rejection, this resulting promise will be resolved with the\r\n   *   same rejection.\r\n   */\r\n  function all(promises) {\r\n    var deferred = defer(),\r\n        counter = promises.length,\r\n        results = [];\r\n\r\n    if (counter) {\r\n      forEach(promises, function(promise, index) {\r\n        ref(promise).then(function(value) {\r\n          if (index in results) return;\r\n          results[index] = value;\r\n          if (!(--counter)) deferred.resolve(results);\r\n        }, function(reason) {\r\n          if (index in results) return;\r\n          deferred.reject(reason);\r\n        });\r\n      });\r\n    } else {\r\n      deferred.resolve(results);\r\n    }\r\n\r\n    return deferred.promise;\r\n  }\r\n\r\n  return {\r\n    defer: defer,\r\n    reject: reject,\r\n    when: when,\r\n    all: all\r\n  };\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$routeProvider\r\n * @function\r\n *\r\n * @description\r\n *\r\n * Used for configuring routes. See {@link ng.$route $route} for an example.\r\n */\r\nfunction $RouteProvider(){\r\n  var routes = {};\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$routeProvider#when\r\n   * @methodOf ng.$routeProvider\r\n   *\r\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\r\n   *    contains redundant trailing slash or is missing one, the route will still match and the\r\n   *    `$location.path` will be updated to add or drop the trailing slash to exacly match the\r\n   *    route definition.\r\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\r\n   *    match.\r\n   *\r\n   *    Object properties:\r\n   *\r\n   *    - `controller` â€“ `{function()=}` â€“ Controller fn that should be associated with newly\r\n   *      created scope.\r\n   *    - `template` â€“ `{string=}` â€“  html template as a string that should be used by\r\n   *      {@link ng.directive:ngView ngView} or\r\n   *      {@link ng.directive:ngInclude ngInclude} directives.\r\n   *      this property takes precedence over `templateUrl`.\r\n   *    - `templateUrl` â€“ `{string=}` â€“ path to an html template that should be used by\r\n   *      {@link ng.directive:ngView ngView}.\r\n   *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\r\n   *      be injected into the controller. If any of these dependencies are promises, they will be\r\n   *      resolved and converted to a value before the controller is instantiated and the\r\n   *      `$aftreRouteChange` event is fired. The map object is:\r\n   *\r\n   *      - `key` â€“ `{string}`: a name of a dependency to be injected into the controller.\r\n   *      - `factory` - `{string|function}`: If `string` then it is an alias for a service.\r\n   *        Otherwise if function, then it is {@link api/AUTO.$injector#invoke injected}\r\n   *        and the return value is treated as the dependency. If the result is a promise, it is resolved\r\n   *        before its value is injected into the controller.\r\n   *\r\n   *    - `redirectTo` â€“ {(string|function())=} â€“ value to update\r\n   *      {@link ng.$location $location} path with and trigger route redirection.\r\n   *\r\n   *      If `redirectTo` is a function, it will be called with the following parameters:\r\n   *\r\n   *      - `{Object.<string>}` - route parameters extracted from the current\r\n   *        `$location.path()` by applying the current route templateUrl.\r\n   *      - `{string}` - current `$location.path()`\r\n   *      - `{Object}` - current `$location.search()`\r\n   *\r\n   *      The custom `redirectTo` function is expected to return a string which will be used\r\n   *      to update `$location.path()` and `$location.search()`.\r\n   *\r\n   *    - `[reloadOnSearch=true]` - {boolean=} - reload route when only $location.search()\r\n   *    changes.\r\n   *\r\n   *      If the option is set to `false` and url in the browser changes, then\r\n   *      `$routeUpdate` event is broadcasted on the root scope.\r\n   *\r\n   * @returns {Object} self\r\n   *\r\n   * @description\r\n   * Adds a new route definition to the `$route` service.\r\n   */\r\n  this.when = function(path, route) {\r\n    routes[path] = extend({reloadOnSearch: true}, route);\r\n\r\n    // create redirection for trailing slashes\r\n    if (path) {\r\n      var redirectPath = (path[path.length-1] == '/')\r\n          ? path.substr(0, path.length-1)\r\n          : path +'/';\r\n\r\n      routes[redirectPath] = {redirectTo: path};\r\n    }\r\n\r\n    return this;\r\n  };\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$routeProvider#otherwise\r\n   * @methodOf ng.$routeProvider\r\n   *\r\n   * @description\r\n   * Sets route definition that will be used on route change when no other route definition\r\n   * is matched.\r\n   *\r\n   * @param {Object} params Mapping information to be assigned to `$route.current`.\r\n   * @returns {Object} self\r\n   */\r\n  this.otherwise = function(params) {\r\n    this.when(null, params);\r\n    return this;\r\n  };\r\n\r\n\r\n  this.$get = ['$rootScope', '$location', '$routeParams', '$q', '$injector', '$http', '$templateCache',\r\n      function( $rootScope,   $location,   $routeParams,   $q,   $injector,   $http,   $templateCache) {\r\n\r\n    /**\r\n     * @ngdoc object\r\n     * @name ng.$route\r\n     * @requires $location\r\n     * @requires $routeParams\r\n     *\r\n     * @property {Object} current Reference to the current route definition.\r\n     * The route definition contains:\r\n     *\r\n     *   - `controller`: The controller constructor as define in route definition.\r\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\r\n     *     controller instantiation. The `locals` contain\r\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\r\n     *\r\n     *     - `$scope` - The current route scope.\r\n     *     - `$template` - The current route template HTML.\r\n     *\r\n     * @property {Array.<Object>} routes Array of all configured routes.\r\n     *\r\n     * @description\r\n     * Is used for deep-linking URLs to controllers and views (HTML partials).\r\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\r\n     *\r\n     * You can define routes through {@link ng.$routeProvider $routeProvider}'s API.\r\n     *\r\n     * The `$route` service is typically used in conjunction with {@link ng.directive:ngView ngView}\r\n     * directive and the {@link ng.$routeParams $routeParams} service.\r\n     *\r\n     * @example\r\n       This example shows how changing the URL hash causes the `$route` to match a route against the\r\n       URL, and the `ngView` pulls in the partial.\r\n\r\n       Note that this example is using {@link ng.directive:script inlined templates}\r\n       to get it working on jsfiddle as well.\r\n\r\n     <example module=\"ngView\">\r\n       <file name=\"index.html\">\r\n         <div ng-controller=\"MainCntl\">\r\n           Choose:\r\n           <a href=\"Book/Moby\">Moby</a> |\r\n           <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\r\n           <a href=\"Book/Gatsby\">Gatsby</a> |\r\n           <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\r\n           <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\r\n\r\n           <div ng-view></div>\r\n           <hr />\r\n\r\n           <pre>$location.path() = {{$location.path()}}</pre>\r\n           <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\r\n           <pre>$route.current.params = {{$route.current.params}}</pre>\r\n           <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\r\n           <pre>$routeParams = {{$routeParams}}</pre>\r\n         </div>\r\n       </file>\r\n\r\n       <file name=\"book.html\">\r\n         controller: {{name}}<br />\r\n         Book Id: {{params.bookId}}<br />\r\n       </file>\r\n\r\n       <file name=\"chapter.html\">\r\n         controller: {{name}}<br />\r\n         Book Id: {{params.bookId}}<br />\r\n         Chapter Id: {{params.chapterId}}\r\n       </file>\r\n\r\n       <file name=\"script.js\">\r\n         angular.module('ngView', [], function($routeProvider, $locationProvider) {\r\n           $routeProvider.when('/Book/:bookId', {\r\n             templateUrl: 'book.html',\r\n             controller: BookCntl,\r\n             resolve: {\r\n               // I will cause a 1 second delay\r\n               delay: function($q, $timeout) {\r\n                 var delay = $q.defer();\r\n                 $timeout(delay.resolve, 1000);\r\n                 return delay.promise;\r\n               }\r\n             }\r\n           });\r\n           $routeProvider.when('/Book/:bookId/ch/:chapterId', {\r\n             templateUrl: 'chapter.html',\r\n             controller: ChapterCntl\r\n           });\r\n\r\n           // configure html5 to get links working on jsfiddle\r\n           $locationProvider.html5Mode(true);\r\n         });\r\n\r\n         function MainCntl($scope, $route, $routeParams, $location) {\r\n           $scope.$route = $route;\r\n           $scope.$location = $location;\r\n           $scope.$routeParams = $routeParams;\r\n         }\r\n\r\n         function BookCntl($scope, $routeParams) {\r\n           $scope.name = \"BookCntl\";\r\n           $scope.params = $routeParams;\r\n         }\r\n\r\n         function ChapterCntl($scope, $routeParams) {\r\n           $scope.name = \"ChapterCntl\";\r\n           $scope.params = $routeParams;\r\n         }\r\n       </file>\r\n\r\n       <file name=\"scenario.js\">\r\n         it('should load and compile correct template', function() {\r\n           element('a:contains(\"Moby: Ch1\")').click();\r\n           var content = element('.doc-example-live [ng-view]').text();\r\n           expect(content).toMatch(/controller\\: ChapterCntl/);\r\n           expect(content).toMatch(/Book Id\\: Moby/);\r\n           expect(content).toMatch(/Chapter Id\\: 1/);\r\n\r\n           element('a:contains(\"Scarlet\")').click();\r\n           sleep(2); // promises are not part of scenario waiting\r\n           content = element('.doc-example-live [ng-view]').text();\r\n           expect(content).toMatch(/controller\\: BookCntl/);\r\n           expect(content).toMatch(/Book Id\\: Scarlet/);\r\n         });\r\n       </file>\r\n     </example>\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeChangeStart\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     * Broadcasted before a route change. At this  point the route services starts\r\n     * resolving all of the dependencies needed for the route change to occurs.\r\n     * Typically this involves fetching the view template as well as any dependencies\r\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\r\n     * `$routeChangeSuccess` is fired.\r\n     *\r\n     * @param {Route} next Future route information.\r\n     * @param {Route} current Current route information.\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeChangeSuccess\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     * Broadcasted after a route dependencies are resolved.\r\n     * {@link ng.directive:ngView ngView} listens for the directive\r\n     * to instantiate the controller and render the view.\r\n     *\r\n     * @param {Route} current Current route information.\r\n     * @param {Route} previous Previous route information.\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeChangeError\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     * Broadcasted if any of the resolve promises are rejected.\r\n     *\r\n     * @param {Route} current Current route information.\r\n     * @param {Route} previous Previous route information.\r\n     * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeUpdate\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     *\r\n     * The `reloadOnSearch` property has been set to false, and we are reusing the same\r\n     * instance of the Controller.\r\n     */\r\n\r\n    var matcher = switchRouteMatcher,\r\n        forceReload = false,\r\n        $route = {\r\n          routes: routes,\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name ng.$route#reload\r\n           * @methodOf ng.$route\r\n           *\r\n           * @description\r\n           * Causes `$route` service to reload the current route even if\r\n           * {@link ng.$location $location} hasn't changed.\r\n           *\r\n           * As a result of that, {@link ng.directive:ngView ngView}\r\n           * creates new scope, reinstantiates the controller.\r\n           */\r\n          reload: function() {\r\n            forceReload = true;\r\n            $rootScope.$evalAsync(updateRoute);\r\n          }\r\n        };\r\n\r\n    $rootScope.$on('$locationChangeSuccess', updateRoute);\r\n\r\n    return $route;\r\n\r\n    /////////////////////////////////////////////////////\r\n\r\n    function switchRouteMatcher(on, when) {\r\n      // TODO(i): this code is convoluted and inefficient, we should construct the route matching\r\n      //   regex only once and then reuse it\r\n      var regex = '^' + when.replace(/([\\.\\\\\\(\\)\\^\\$])/g, \"\\\\$1\") + '$',\r\n          params = [],\r\n          dst = {};\r\n      forEach(when.split(/\\W/), function(param) {\r\n        if (param) {\r\n          var paramRegExp = new RegExp(\":\" + param + \"([\\\\W])\");\r\n          if (regex.match(paramRegExp)) {\r\n            regex = regex.replace(paramRegExp, \"([^\\\\/]*)$1\");\r\n            params.push(param);\r\n          }\r\n        }\r\n      });\r\n      var match = on.match(new RegExp(regex));\r\n      if (match) {\r\n        forEach(params, function(name, index) {\r\n          dst[name] = match[index + 1];\r\n        });\r\n      }\r\n      return match ? dst : null;\r\n    }\r\n\r\n    function updateRoute() {\r\n      var next = parseRoute(),\r\n          last = $route.current;\r\n\r\n      if (next && last && next.$route === last.$route\r\n          && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) {\r\n        last.params = next.params;\r\n        copy(last.params, $routeParams);\r\n        $rootScope.$broadcast('$routeUpdate', last);\r\n      } else if (next || last) {\r\n        forceReload = false;\r\n        $rootScope.$broadcast('$routeChangeStart', next, last);\r\n        $route.current = next;\r\n        if (next) {\r\n          if (next.redirectTo) {\r\n            if (isString(next.redirectTo)) {\r\n              $location.path(interpolate(next.redirectTo, next.params)).search(next.params)\r\n                       .replace();\r\n            } else {\r\n              $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))\r\n                       .replace();\r\n            }\r\n          }\r\n        }\r\n\r\n        $q.when(next).\r\n          then(function() {\r\n            if (next) {\r\n              var keys = [],\r\n                  values = [],\r\n                  template;\r\n\r\n              forEach(next.resolve || {}, function(value, key) {\r\n                keys.push(key);\r\n                values.push(isFunction(value) ? $injector.invoke(value) : $injector.get(value));\r\n              });\r\n              if (isDefined(template = next.template)) {\r\n              } else if (isDefined(template = next.templateUrl)) {\r\n                template = $http.get(template, {cache: $templateCache}).\r\n                    then(function(response) { return response.data; });\r\n              }\r\n              if (isDefined(template)) {\r\n                keys.push('$template');\r\n                values.push(template);\r\n              }\r\n              return $q.all(values).then(function(values) {\r\n                var locals = {};\r\n                forEach(values, function(value, index) {\r\n                  locals[keys[index]] = value;\r\n                });\r\n                return locals;\r\n              });\r\n            }\r\n          }).\r\n          // after route change\r\n          then(function(locals) {\r\n            if (next == $route.current) {\r\n              if (next) {\r\n                next.locals = locals;\r\n                copy(next.params, $routeParams);\r\n              }\r\n              $rootScope.$broadcast('$routeChangeSuccess', next, last);\r\n            }\r\n          }, function(error) {\r\n            if (next == $route.current) {\r\n              $rootScope.$broadcast('$routeChangeError', next, last, error);\r\n            }\r\n          });\r\n      }\r\n    }\r\n\r\n\r\n    /**\r\n     * @returns the current active route, by matching it against the URL\r\n     */\r\n    function parseRoute() {\r\n      // Match a route\r\n      var params, match;\r\n      forEach(routes, function(route, path) {\r\n        if (!match && (params = matcher($location.path(), path))) {\r\n          match = inherit(route, {\r\n            params: extend({}, $location.search(), params),\r\n            pathParams: params});\r\n          match.$route = route;\r\n        }\r\n      });\r\n      // No route matched; fallback to \"otherwise\" route\r\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\r\n    }\r\n\r\n    /**\r\n     * @returns interpolation of the redirect path with the parametrs\r\n     */\r\n    function interpolate(string, params) {\r\n      var result = [];\r\n      forEach((string||'').split(':'), function(segment, i) {\r\n        if (i == 0) {\r\n          result.push(segment);\r\n        } else {\r\n          var segmentMatch = segment.match(/(\\w+)(.*)/);\r\n          var key = segmentMatch[1];\r\n          result.push(params[key]);\r\n          result.push(segmentMatch[2] || '');\r\n          delete params[key];\r\n        }\r\n      });\r\n      return result.join('');\r\n    }\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$routeParams\r\n * @requires $route\r\n *\r\n * @description\r\n * Current set of route parameters. The route parameters are a combination of the\r\n * {@link ng.$location $location} `search()`, and `path()`. The `path` parameters\r\n * are extracted when the {@link ng.$route $route} path is matched.\r\n *\r\n * In case of parameter name collision, `path` params take precedence over `search` params.\r\n *\r\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\r\n * (but its properties will likely change) even when a route change occurs.\r\n *\r\n * @example\r\n * <pre>\r\n *  // Given:\r\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\r\n *  // Route: /Chapter/:chapterId/Section/:sectionId\r\n *  //\r\n *  // Then\r\n *  $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}\r\n * </pre>\r\n */\r\nfunction $RouteParamsProvider() {\r\n  this.$get = valueFn({});\r\n}\r\n\r\n/**\r\n * DESIGN NOTES\r\n *\r\n * The design decisions behind the scope ware heavily favored for speed and memory consumption.\r\n *\r\n * The typical use of scope is to watch the expressions, which most of the time return the same\r\n * value as last time so we optimize the operation.\r\n *\r\n * Closures construction is expensive from speed as well as memory:\r\n *   - no closures, instead ups prototypical inheritance for API\r\n *   - Internal state needs to be stored on scope directly, which means that private state is\r\n *     exposed as $$____ properties\r\n *\r\n * Loop operations are optimized by using while(count--) { ... }\r\n *   - this means that in order to keep the same order of execution as addition we have to add\r\n *     items to the array at the begging (shift) instead of at the end (push)\r\n *\r\n * Child scopes are created and removed often\r\n *   - Using array would be slow since inserts in meddle are expensive so we use linked list\r\n *\r\n * There are few watches then a lot of observers. This is why you don't want the observer to be\r\n * implemented in the same way as watch. Watch requires return of initialization function which\r\n * are expensive to construct.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$rootScopeProvider\r\n * @description\r\n *\r\n * Provider for the $rootScope service.\r\n */\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$rootScopeProvider#digestTtl\r\n * @methodOf ng.$rootScopeProvider\r\n * @description\r\n *\r\n * Sets the number of digest iteration the scope should attempt to execute before giving up and\r\n * assuming that the model is unstable.\r\n *\r\n * The current default is 10 iterations.\r\n *\r\n * @param {number} limit The number of digest iterations.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$rootScope\r\n * @description\r\n *\r\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\r\n * All other scopes are child scopes of the root scope. Scopes provide mechanism for watching the model and provide\r\n * event processing life-cycle. See {@link guide/scope developer guide on scopes}.\r\n */\r\nfunction $RootScopeProvider(){\r\n  var TTL = 10;\r\n\r\n  this.digestTtl = function(value) {\r\n    if (arguments.length) {\r\n      TTL = value;\r\n    }\r\n    return TTL;\r\n  };\r\n\r\n  this.$get = ['$injector', '$exceptionHandler', '$parse',\r\n      function( $injector,   $exceptionHandler,   $parse) {\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$rootScope.Scope\r\n     *\r\n     * @description\r\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\r\n     * {@link AUTO.$injector $injector}. Child scopes are created using the\r\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\r\n     * compiled HTML template is executed.)\r\n     *\r\n     * Here is a simple scope snippet to show how you can interact with the scope.\r\n     * <pre>\r\n        angular.injector(['ng']).invoke(function($rootScope) {\r\n           var scope = $rootScope.$new();\r\n           scope.salutation = 'Hello';\r\n           scope.name = 'World';\r\n\r\n           expect(scope.greeting).toEqual(undefined);\r\n\r\n           scope.$watch('name', function() {\r\n             this.greeting = this.salutation + ' ' + this.name + '!';\r\n           }); // initialize the watch\r\n\r\n           expect(scope.greeting).toEqual(undefined);\r\n           scope.name = 'Misko';\r\n           // still old value, since watches have not been called yet\r\n           expect(scope.greeting).toEqual(undefined);\r\n\r\n           scope.$digest(); // fire all  the watches\r\n           expect(scope.greeting).toEqual('Hello Misko!');\r\n        });\r\n     * </pre>\r\n     *\r\n     * # Inheritance\r\n     * A scope can inherit from a parent scope, as in this example:\r\n     * <pre>\r\n         var parent = $rootScope;\r\n         var child = parent.$new();\r\n\r\n         parent.salutation = \"Hello\";\r\n         child.name = \"World\";\r\n         expect(child.salutation).toEqual('Hello');\r\n\r\n         child.salutation = \"Welcome\";\r\n         expect(child.salutation).toEqual('Welcome');\r\n         expect(parent.salutation).toEqual('Hello');\r\n     * </pre>\r\n     *\r\n     *\r\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be provided\r\n     *     for the current scope. Defaults to {@link ng}.\r\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\r\n     *     append/override services provided by `providers`. This is handy when unit-testing and having\r\n     *     the need to override a default service.\r\n     * @returns {Object} Newly created scope.\r\n     *\r\n     */\r\n    function Scope() {\r\n      this.$id = nextUid();\r\n      this.$$phase = this.$parent = this.$$watchers =\r\n                     this.$$nextSibling = this.$$prevSibling =\r\n                     this.$$childHead = this.$$childTail = null;\r\n      this['this'] = this.$root =  this;\r\n      this.$$asyncQueue = [];\r\n      this.$$listeners = {};\r\n    }\r\n\r\n    /**\r\n     * @ngdoc property\r\n     * @name ng.$rootScope.Scope#$id\r\n     * @propertyOf ng.$rootScope.Scope\r\n     * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for\r\n     *   debugging.\r\n     */\r\n\r\n\r\n    Scope.prototype = {\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$new\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\r\n       *\r\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and\r\n       * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the scope\r\n       * hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\r\n       *\r\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is desired for\r\n       * the scope and its child scopes to be permanently detached from the parent and thus stop\r\n       * participating in model change detection and listener notification by invoking.\r\n       *\r\n       * @param {boolean} isolate if true then the scoped does not prototypically inherit from the\r\n       *         parent scope. The scope is isolated, as it can not se parent scope properties.\r\n       *         When creating widgets it is useful for the widget to not accidently read parent\r\n       *         state.\r\n       *\r\n       * @returns {Object} The newly created child scope.\r\n       *\r\n       */\r\n      $new: function(isolate) {\r\n        var Child,\r\n            child;\r\n\r\n        if (isFunction(isolate)) {\r\n          // TODO: remove at some point\r\n          throw Error('API-CHANGE: Use $controller to instantiate controllers.');\r\n        }\r\n        if (isolate) {\r\n          child = new Scope();\r\n          child.$root = this.$root;\r\n        } else {\r\n          Child = function() {}; // should be anonymous; This is so that when the minifier munges\r\n            // the name it does not become random set of chars. These will then show up as class\r\n            // name in the debugger.\r\n          Child.prototype = this;\r\n          child = new Child();\r\n          child.$id = nextUid();\r\n        }\r\n        child['this'] = child;\r\n        child.$$listeners = {};\r\n        child.$parent = this;\r\n        child.$$asyncQueue = [];\r\n        child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null;\r\n        child.$$prevSibling = this.$$childTail;\r\n        if (this.$$childHead) {\r\n          this.$$childTail.$$nextSibling = child;\r\n          this.$$childTail = child;\r\n        } else {\r\n          this.$$childHead = this.$$childTail = child;\r\n        }\r\n        return child;\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$watch\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\r\n       *\r\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest $digest()} and\r\n       *   should return the value which will be watched. (Since {@link ng.$rootScope.Scope#$digest $digest()}\r\n       *   reruns when it detects changes the `watchExpression` can execute multiple times per\r\n       *   {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)\r\n       * - The `listener` is called only when the value from the current `watchExpression` and the\r\n       *   previous call to `watchExpression' are not equal (with the exception of the initial run\r\n       *   see below). The inequality is determined according to\r\n       *   {@link angular.equals} function. To save the value of the object for later comparison\r\n       *   {@link angular.copy} function is used. It also means that watching complex options will\r\n       *   have adverse memory and performance implications.\r\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire. This\r\n       *   is achieved by rerunning the watchers until no changes are detected. The rerun iteration\r\n       *   limit is 100 to prevent infinity loop deadlock.\r\n       *\r\n       *\r\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\r\n       * you can register an `watchExpression` function with no `listener`. (Since `watchExpression`,\r\n       * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a change is\r\n       * detected, be prepared for multiple calls to your listener.)\r\n       *\r\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\r\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\r\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\r\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\r\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\r\n       * listener was called due to initialization.\r\n       *\r\n       *\r\n       * # Example\r\n       * <pre>\r\n           // let's assume that scope was dependency injected as the $rootScope\r\n           var scope = $rootScope;\r\n           scope.name = 'misko';\r\n           scope.counter = 0;\r\n\r\n           expect(scope.counter).toEqual(0);\r\n           scope.$watch('name', function(newValue, oldValue) { counter = counter + 1; });\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.$digest();\r\n           // no variable change\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.name = 'adam';\r\n           scope.$digest();\r\n           expect(scope.counter).toEqual(1);\r\n       * </pre>\r\n       *\r\n       *\r\n       *\r\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\r\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers a\r\n       *    call to the `listener`.\r\n       *\r\n       *    - `string`: Evaluated as {@link guide/expression expression}\r\n       *    - `function(scope)`: called with current `scope` as a parameter.\r\n       * @param {(function()|string)=} listener Callback called whenever the return value of\r\n       *   the `watchExpression` changes.\r\n       *\r\n       *    - `string`: Evaluated as {@link guide/expression expression}\r\n       *    - `function(newValue, oldValue, scope)`: called with current and previous values as parameters.\r\n       *\r\n       * @param {boolean=} objectEquality Compare object for equality rather then for refference.\r\n       * @returns {function()} Returns a deregistration function for this listener.\r\n       */\r\n      $watch: function(watchExp, listener, objectEquality) {\r\n        var scope = this,\r\n            get = compileToFn(watchExp, 'watch'),\r\n            array = scope.$$watchers,\r\n            watcher = {\r\n              fn: listener,\r\n              last: initWatchVal,\r\n              get: get,\r\n              exp: watchExp,\r\n              eq: !!objectEquality\r\n            };\r\n\r\n        // in the case user pass string, we need to compile it, do we really need this ?\r\n        if (!isFunction(listener)) {\r\n          var listenFn = compileToFn(listener || noop, 'listener');\r\n          watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);};\r\n        }\r\n\r\n        if (!array) {\r\n          array = scope.$$watchers = [];\r\n        }\r\n        // we use unshift since we use a while loop in $digest for speed.\r\n        // the while loop reads in reverse order.\r\n        array.unshift(watcher);\r\n\r\n        return function() {\r\n          arrayRemove(array, watcher);\r\n        };\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$digest\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Process all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and its children.\r\n       * Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change the model, the\r\n       * `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} until no more listeners are\r\n       * firing. This means that it is possible to get into an infinite loop. This function will throw\r\n       * `'Maximum iteration limit exceeded.'` if the number of iterations exceeds 10.\r\n       *\r\n       * Usually you don't call `$digest()` directly in\r\n       * {@link ng.directive:ngController controllers} or in\r\n       * {@link ng.$compileProvider.directive directives}.\r\n       * Instead a call to {@link ng.$rootScope.Scope#$apply $apply()} (typically from within a\r\n       * {@link ng.$compileProvider.directive directives}) will force a `$digest()`.\r\n       *\r\n       * If you want to be notified whenever `$digest()` is called,\r\n       * you can register a `watchExpression` function  with {@link ng.$rootScope.Scope#$watch $watch()}\r\n       * with no `listener`.\r\n       *\r\n       * You may have a need to call `$digest()` from within unit-tests, to simulate the scope\r\n       * life-cycle.\r\n       *\r\n       * # Example\r\n       * <pre>\r\n           var scope = ...;\r\n           scope.name = 'misko';\r\n           scope.counter = 0;\r\n\r\n           expect(scope.counter).toEqual(0);\r\n           scope.$watch('name', function(newValue, oldValue) {\r\n             counter = counter + 1;\r\n           });\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.$digest();\r\n           // no variable change\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.name = 'adam';\r\n           scope.$digest();\r\n           expect(scope.counter).toEqual(1);\r\n       * </pre>\r\n       *\r\n       */\r\n      $digest: function() {\r\n        var watch, value, last,\r\n            watchers,\r\n            asyncQueue,\r\n            length,\r\n            dirty, ttl = TTL,\r\n            next, current, target = this,\r\n            watchLog = [],\r\n            logIdx, logMsg;\r\n\r\n        beginPhase('$digest');\r\n\r\n        do {\r\n          dirty = false;\r\n          current = target;\r\n          do {\r\n            asyncQueue = current.$$asyncQueue;\r\n            while(asyncQueue.length) {\r\n              try {\r\n                current.$eval(asyncQueue.shift());\r\n              } catch (e) {\r\n                $exceptionHandler(e);\r\n              }\r\n            }\r\n            if ((watchers = current.$$watchers)) {\r\n              // process our watches\r\n              length = watchers.length;\r\n              while (length--) {\r\n                try {\r\n                  watch = watchers[length];\r\n                  // Most common watches are on primitives, in which case we can short\r\n                  // circuit it with === operator, only when === fails do we use .equals\r\n                  if ((value = watch.get(current)) !== (last = watch.last) &&\r\n                      !(watch.eq\r\n                          ? equals(value, last)\r\n                          : (typeof value == 'number' && typeof last == 'number'\r\n                             && isNaN(value) && isNaN(last)))) {\r\n                    dirty = true;\r\n                    watch.last = watch.eq ? copy(value) : value;\r\n                    watch.fn(value, ((last === initWatchVal) ? value : last), current);\r\n                    if (ttl < 5) {\r\n                      logIdx = 4 - ttl;\r\n                      if (!watchLog[logIdx]) watchLog[logIdx] = [];\r\n                      logMsg = (isFunction(watch.exp))\r\n                          ? 'fn: ' + (watch.exp.name || watch.exp.toString())\r\n                          : watch.exp;\r\n                      logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);\r\n                      watchLog[logIdx].push(logMsg);\r\n                    }\r\n                  }\r\n                } catch (e) {\r\n                  $exceptionHandler(e);\r\n                }\r\n              }\r\n            }\r\n\r\n            // Insanity Warning: scope depth-first traversal\r\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\r\n            // this piece should be kept in sync with the traversal in $broadcast\r\n            if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {\r\n              while(current !== target && !(next = current.$$nextSibling)) {\r\n                current = current.$parent;\r\n              }\r\n            }\r\n          } while ((current = next));\r\n\r\n          if(dirty && !(ttl--)) {\r\n            clearPhase();\r\n            throw Error(TTL + ' $digest() iterations reached. Aborting!\\n' +\r\n                'Watchers fired in the last 5 iterations: ' + toJson(watchLog));\r\n          }\r\n        } while (dirty || asyncQueue.length);\r\n\r\n        clearPhase();\r\n      },\r\n\r\n\r\n      /**\r\n       * @ngdoc event\r\n       * @name ng.$rootScope.Scope#$destroy\r\n       * @eventOf ng.$rootScope.Scope\r\n       * @eventType broadcast on scope being destroyed\r\n       *\r\n       * @description\r\n       * Broadcasted when a scope and its children are being destroyed.\r\n       */\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$destroy\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Remove the current scope (and all of its children) from the parent scope. Removal implies\r\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\r\n       * propagate to the current scope and its children. Removal also implies that the current\r\n       * scope is eligible for garbage collection.\r\n       *\r\n       * The `$destroy()` is usually used by directives such as\r\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\r\n       * unrolling of the loop.\r\n       *\r\n       * Just before a scope is destroyed a `$destroy` event is broadcasted on this scope.\r\n       * Application code can register a `$destroy` event handler that will give it chance to\r\n       * perform any necessary cleanup.\r\n       */\r\n      $destroy: function() {\r\n        if ($rootScope == this) return; // we can't remove the root node;\r\n        var parent = this.$parent;\r\n\r\n        this.$broadcast('$destroy');\r\n\r\n        if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;\r\n        if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;\r\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\r\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$eval\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Executes the `expression` on the current scope returning the result. Any exceptions in the\r\n       * expression are propagated (uncaught). This is useful when evaluating engular expressions.\r\n       *\r\n       * # Example\r\n       * <pre>\r\n           var scope = ng.$rootScope.Scope();\r\n           scope.a = 1;\r\n           scope.b = 2;\r\n\r\n           expect(scope.$eval('a+b')).toEqual(3);\r\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\r\n       * </pre>\r\n       *\r\n       * @param {(string|function())=} expression An angular expression to be executed.\r\n       *\r\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\r\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\r\n       *\r\n       * @returns {*} The result of evaluating the expression.\r\n       */\r\n      $eval: function(expr, locals) {\r\n        return $parse(expr)(this, locals);\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$evalAsync\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Executes the expression on the current scope at a later point in time.\r\n       *\r\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only that:\r\n       *\r\n       *   - it will execute in the current script execution context (before any DOM rendering).\r\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\r\n       *     `expression` execution.\r\n       *\r\n       * Any exceptions from the execution of the expression are forwarded to the\r\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       *\r\n       * @param {(string|function())=} expression An angular expression to be executed.\r\n       *\r\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\r\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\r\n       *\r\n       */\r\n      $evalAsync: function(expr) {\r\n        this.$$asyncQueue.push(expr);\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$apply\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * `$apply()` is used to execute an expression in angular from outside of the angular framework.\r\n       * (For example from browser DOM events, setTimeout, XHR or third party libraries).\r\n       * Because we are calling into the angular framework we need to perform proper scope life-cycle\r\n       * of {@link ng.$exceptionHandler exception handling},\r\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\r\n       *\r\n       * ## Life cycle\r\n       *\r\n       * # Pseudo-Code of `$apply()`\r\n       * <pre>\r\n           function $apply(expr) {\r\n             try {\r\n               return $eval(expr);\r\n             } catch (e) {\r\n               $exceptionHandler(e);\r\n             } finally {\r\n               $root.$digest();\r\n             }\r\n           }\r\n       * </pre>\r\n       *\r\n       *\r\n       * Scope's `$apply()` method transitions through the following stages:\r\n       *\r\n       * 1. The {@link guide/expression expression} is executed using the\r\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\r\n       * 2. Any exceptions from the execution of the expression are forwarded to the\r\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the expression\r\n       *    was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\r\n       *\r\n       *\r\n       * @param {(string|function())=} exp An angular expression to be executed.\r\n       *\r\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\r\n       *    - `function(scope)`: execute the function with current `scope` parameter.\r\n       *\r\n       * @returns {*} The result of evaluating the expression.\r\n       */\r\n      $apply: function(expr) {\r\n        try {\r\n          beginPhase('$apply');\r\n          return this.$eval(expr);\r\n        } catch (e) {\r\n          $exceptionHandler(e);\r\n        } finally {\r\n          clearPhase();\r\n          try {\r\n            $rootScope.$digest();\r\n          } catch (e) {\r\n            $exceptionHandler(e);\r\n            throw e;\r\n          }\r\n        }\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$on\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Listen on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for discussion of\r\n       * event life cycle.\r\n       *\r\n       * @param {string} name Event name to listen on.\r\n       * @param {function(event)} listener Function to call when the event is emitted.\r\n       * @returns {function()} Returns a deregistration function for this listener.\r\n       *\r\n       * The event listener function format is: `function(event)`. The `event` object passed into the\r\n       * listener has the following attributes\r\n       *\r\n       *   - `targetScope` - {Scope}: the scope on which the event was `$emit`-ed or `$broadcast`-ed.\r\n       *   - `currentScope` - {Scope}: the current scope which is handling the event.\r\n       *   - `name` - {string}: Name of the event.\r\n       *   - `stopPropagation` - {function=}: calling `stopPropagation` function will cancel further event propagation\r\n       *     (available only for events that were `$emit`-ed).\r\n       *   - `preventDefault` - {function}: calling `preventDefault` sets `defaultPrevented` flag to true.\r\n       *   - `defaultPrevented` - {boolean}: true if `preventDefault` was called.\r\n       */\r\n      $on: function(name, listener) {\r\n        var namedListeners = this.$$listeners[name];\r\n        if (!namedListeners) {\r\n          this.$$listeners[name] = namedListeners = [];\r\n        }\r\n        namedListeners.push(listener);\r\n\r\n        return function() {\r\n          arrayRemove(namedListeners, listener);\r\n        };\r\n      },\r\n\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$emit\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\r\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\r\n       *\r\n       * The event life cycle starts at the scope on which `$emit` was called. All\r\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified.\r\n       * Afterwards, the event traverses upwards toward the root scope and calls all registered\r\n       * listeners along the way. The event will stop propagating if one of the listeners cancels it.\r\n       *\r\n       * Any exception emmited from the {@link ng.$rootScope.Scope#$on listeners} will be passed\r\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       *\r\n       * @param {string} name Event name to emit.\r\n       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.\r\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\r\n       */\r\n      $emit: function(name, args) {\r\n        var empty = [],\r\n            namedListeners,\r\n            scope = this,\r\n            stopPropagation = false,\r\n            event = {\r\n              name: name,\r\n              targetScope: scope,\r\n              stopPropagation: function() {stopPropagation = true;},\r\n              preventDefault: function() {\r\n                event.defaultPrevented = true;\r\n              },\r\n              defaultPrevented: false\r\n            },\r\n            listenerArgs = concat([event], arguments, 1),\r\n            i, length;\r\n\r\n        do {\r\n          namedListeners = scope.$$listeners[name] || empty;\r\n          event.currentScope = scope;\r\n          for (i=0, length=namedListeners.length; i<length; i++) {\r\n            try {\r\n              namedListeners[i].apply(null, listenerArgs);\r\n              if (stopPropagation) return event;\r\n            } catch (e) {\r\n              $exceptionHandler(e);\r\n            }\r\n          }\r\n          //traverse upwards\r\n          scope = scope.$parent;\r\n        } while (scope);\r\n\r\n        return event;\r\n      },\r\n\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$broadcast\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\r\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\r\n       *\r\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\r\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified.\r\n       * Afterwards, the event propagates to all direct and indirect scopes of the current scope and\r\n       * calls all registered listeners along the way. The event cannot be canceled.\r\n       *\r\n       * Any exception emmited from the {@link ng.$rootScope.Scope#$on listeners} will be passed\r\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       *\r\n       * @param {string} name Event name to emit.\r\n       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.\r\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\r\n       */\r\n      $broadcast: function(name, args) {\r\n        var target = this,\r\n            current = target,\r\n            next = target,\r\n            event = {\r\n              name: name,\r\n              targetScope: target,\r\n              preventDefault: function() {\r\n                event.defaultPrevented = true;\r\n              },\r\n              defaultPrevented: false\r\n            },\r\n            listenerArgs = concat([event], arguments, 1);\r\n\r\n        //down while you can, then up and next sibling or up and next sibling until back at root\r\n        do {\r\n          current = next;\r\n          event.currentScope = current;\r\n          forEach(current.$$listeners[name], function(listener) {\r\n            try {\r\n              listener.apply(null, listenerArgs);\r\n            } catch(e) {\r\n              $exceptionHandler(e);\r\n            }\r\n          });\r\n\r\n          // Insanity Warning: scope depth-first traversal\r\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\r\n          // this piece should be kept in sync with the traversal in $digest\r\n          if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {\r\n            while(current !== target && !(next = current.$$nextSibling)) {\r\n              current = current.$parent;\r\n            }\r\n          }\r\n        } while ((current = next));\r\n\r\n        return event;\r\n      }\r\n    };\r\n\r\n    var $rootScope = new Scope();\r\n\r\n    return $rootScope;\r\n\r\n\r\n    function beginPhase(phase) {\r\n      if ($rootScope.$$phase) {\r\n        throw Error($rootScope.$$phase + ' already in progress');\r\n      }\r\n\r\n      $rootScope.$$phase = phase;\r\n    }\r\n\r\n    function clearPhase() {\r\n      $rootScope.$$phase = null;\r\n    }\r\n\r\n    function compileToFn(exp, name) {\r\n      var fn = $parse(exp);\r\n      assertArgFn(fn, name);\r\n      return fn;\r\n    }\r\n\r\n    /**\r\n     * function used as an initial value for watchers.\r\n     * because it's uniqueue we can easily tell it apart from other values\r\n     */\r\n    function initWatchVal() {}\r\n  }];\r\n}\r\n\r\n/**\r\n * !!! This is an undocumented \"private\" service !!!\r\n *\r\n * @name ng.$sniffer\r\n * @requires $window\r\n *\r\n * @property {boolean} history Does the browser support html5 history api ?\r\n * @property {boolean} hashchange Does the browser support hashchange event ?\r\n *\r\n * @description\r\n * This is very simple implementation of testing browser's features.\r\n */\r\nfunction $SnifferProvider() {\r\n  this.$get = ['$window', function($window) {\r\n    var eventSupport = {},\r\n        android = int((/android (\\d+)/.exec(lowercase($window.navigator.userAgent)) || [])[1]);\r\n\r\n    return {\r\n      // Android has history.pushState, but it does not update location correctly\r\n      // so let's not use the history API at all.\r\n      // http://code.google.com/p/android/issues/detail?id=17471\r\n      // https://github.com/angular/angular.js/issues/904\r\n      history: !!($window.history && $window.history.pushState && !(android < 4)),\r\n      hashchange: 'onhashchange' in $window &&\r\n                  // IE8 compatible mode lies\r\n                  (!$window.document.documentMode || $window.document.documentMode > 7),\r\n      hasEvent: function(event) {\r\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\r\n        // it. In particular the event is not fired when backspace or delete key are pressed or\r\n        // when cut operation is performed.\r\n        if (event == 'input' && msie == 9) return false;\r\n\r\n        if (isUndefined(eventSupport[event])) {\r\n          var divElm = $window.document.createElement('div');\r\n          eventSupport[event] = 'on' + event in divElm;\r\n        }\r\n\r\n        return eventSupport[event];\r\n      },\r\n      // TODO(i): currently there is no way to feature detect CSP without triggering alerts\r\n      csp: false\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$window\r\n *\r\n * @description\r\n * A reference to the browser's `window` object. While `window`\r\n * is globally available in JavaScript, it causes testability problems, because\r\n * it is a global variable. In angular we always refer to it through the\r\n * `$window` service, so it may be overriden, removed or mocked for testing.\r\n *\r\n * All expressions are evaluated with respect to current scope so they don't\r\n * suffer from window globality.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <input ng-init=\"$window = $service('$window'); greeting='Hello World!'\" type=\"text\" ng-model=\"greeting\" />\r\n       <button ng-click=\"$window.alert(greeting)\">ALERT</button>\r\n     </doc:source>\r\n     <doc:scenario>\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nfunction $WindowProvider(){\r\n  this.$get = valueFn(window);\r\n}\r\n\r\n/**\r\n * Parse headers into key value object\r\n *\r\n * @param {string} headers Raw headers as a string\r\n * @returns {Object} Parsed headers as key value object\r\n */\r\nfunction parseHeaders(headers) {\r\n  var parsed = {}, key, val, i;\r\n\r\n  if (!headers) return parsed;\r\n\r\n  forEach(headers.split('\\n'), function(line) {\r\n    i = line.indexOf(':');\r\n    key = lowercase(trim(line.substr(0, i)));\r\n    val = trim(line.substr(i + 1));\r\n\r\n    if (key) {\r\n      if (parsed[key]) {\r\n        parsed[key] += ', ' + val;\r\n      } else {\r\n        parsed[key] = val;\r\n      }\r\n    }\r\n  });\r\n\r\n  return parsed;\r\n}\r\n\r\n\r\n/**\r\n * Returns a function that provides access to parsed headers.\r\n *\r\n * Headers are lazy parsed when first requested.\r\n * @see parseHeaders\r\n *\r\n * @param {(string|Object)} headers Headers to provide access to.\r\n * @returns {function(string=)} Returns a getter function which if called with:\r\n *\r\n *   - if called with single an argument returns a single header value or null\r\n *   - if called with no arguments returns an object containing all headers.\r\n */\r\nfunction headersGetter(headers) {\r\n  var headersObj = isObject(headers) ? headers : undefined;\r\n\r\n  return function(name) {\r\n    if (!headersObj) headersObj =  parseHeaders(headers);\r\n\r\n    if (name) {\r\n      return headersObj[lowercase(name)] || null;\r\n    }\r\n\r\n    return headersObj;\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * Chain all given functions\r\n *\r\n * This function is used for both request and response transforming\r\n *\r\n * @param {*} data Data to transform.\r\n * @param {function(string=)} headers Http headers getter fn.\r\n * @param {(function|Array.<function>)} fns Function or an array of functions.\r\n * @returns {*} Transformed data.\r\n */\r\nfunction transformData(data, headers, fns) {\r\n  if (isFunction(fns))\r\n    return fns(data, headers);\r\n\r\n  forEach(fns, function(fn) {\r\n    data = fn(data, headers);\r\n  });\r\n\r\n  return data;\r\n}\r\n\r\n\r\nfunction isSuccess(status) {\r\n  return 200 <= status && status < 300;\r\n}\r\n\r\n\r\nfunction $HttpProvider() {\r\n  var JSON_START = /^\\s*(\\[|\\{[^\\{])/,\r\n      JSON_END = /[\\}\\]]\\s*$/,\r\n      PROTECTION_PREFIX = /^\\)\\]\\}',?\\n/;\r\n\r\n  var $config = this.defaults = {\r\n    // transform incoming response data\r\n    transformResponse: [function(data) {\r\n      if (isString(data)) {\r\n        // strip json vulnerability protection prefix\r\n        data = data.replace(PROTECTION_PREFIX, '');\r\n        if (JSON_START.test(data) && JSON_END.test(data))\r\n          data = fromJson(data, true);\r\n      }\r\n      return data;\r\n    }],\r\n\r\n    // transform outgoing request data\r\n    transformRequest: [function(d) {\r\n      return isObject(d) && !isFile(d) ? toJson(d) : d;\r\n    }],\r\n\r\n    // default headers\r\n    headers: {\r\n      common: {\r\n        'Accept': 'application/json, text/plain, */*',\r\n        'X-Requested-With': 'XMLHttpRequest'\r\n      },\r\n      post: {'Content-Type': 'application/json;charset=utf-8'},\r\n      put:  {'Content-Type': 'application/json;charset=utf-8'}\r\n    }\r\n  };\r\n\r\n  var providerResponseInterceptors = this.responseInterceptors = [];\r\n\r\n  this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',\r\n      function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {\r\n\r\n    var defaultCache = $cacheFactory('$http'),\r\n        responseInterceptors = [];\r\n\r\n    forEach(providerResponseInterceptors, function(interceptor) {\r\n      responseInterceptors.push(\r\n          isString(interceptor)\r\n              ? $injector.get(interceptor)\r\n              : $injector.invoke(interceptor)\r\n      );\r\n    });\r\n\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$http\r\n     * @requires $httpBacked\r\n     * @requires $browser\r\n     * @requires $cacheFactory\r\n     * @requires $rootScope\r\n     * @requires $q\r\n     * @requires $injector\r\n     *\r\n     * @description\r\n     * The `$http` service is a core Angular service that facilitates communication with the remote\r\n     * HTTP servers via browser's {@link https://developer.mozilla.org/en/xmlhttprequest\r\n     * XMLHttpRequest} object or via {@link http://en.wikipedia.org/wiki/JSONP JSONP}.\r\n     *\r\n     * For unit testing applications that use `$http` service, see\r\n     * {@link ngMock.$httpBackend $httpBackend mock}.\r\n     *\r\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\r\n     * $resource} service.\r\n     *\r\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\r\n     * the $q service. While for simple usage patters this doesn't matter much, for advanced usage,\r\n     * it is important to familiarize yourself with these apis and guarantees they provide.\r\n     *\r\n     *\r\n     * # General usage\r\n     * The `$http` service is a function which takes a single argument â€” a configuration object â€”\r\n     * that is used to generate an http request and returns  a {@link ng.$q promise}\r\n     * with two $http specific methods: `success` and `error`.\r\n     *\r\n     * <pre>\r\n     *   $http({method: 'GET', url: '/someUrl'}).\r\n     *     success(function(data, status, headers, config) {\r\n     *       // this callback will be called asynchronously\r\n     *       // when the response is available\r\n     *     }).\r\n     *     error(function(data, status, headers, config) {\r\n     *       // called asynchronously if an error occurs\r\n     *       // or server returns response with status\r\n     *       // code outside of the <200, 400) range\r\n     *     });\r\n     * </pre>\r\n     *\r\n     * Since the returned value of calling the $http function is a Promise object, you can also use\r\n     * the `then` method to register callbacks, and these callbacks will receive a single argument â€“\r\n     * an object representing the response. See the api signature and type info below for more\r\n     * details.\r\n     *\r\n     *\r\n     * # Shortcut methods\r\n     *\r\n     * Since all invocation of the $http service require definition of the http method and url and\r\n     * POST and PUT requests require response body/data to be provided as well, shortcut methods\r\n     * were created to simplify using the api:\r\n     *\r\n     * <pre>\r\n     *   $http.get('/someUrl').success(successCallback);\r\n     *   $http.post('/someUrl', data).success(successCallback);\r\n     * </pre>\r\n     *\r\n     * Complete list of shortcut methods:\r\n     *\r\n     * - {@link ng.$http#get $http.get}\r\n     * - {@link ng.$http#head $http.head}\r\n     * - {@link ng.$http#post $http.post}\r\n     * - {@link ng.$http#put $http.put}\r\n     * - {@link ng.$http#delete $http.delete}\r\n     * - {@link ng.$http#jsonp $http.jsonp}\r\n     *\r\n     *\r\n     * # Setting HTTP Headers\r\n     *\r\n     * The $http service will automatically add certain http headers to all requests. These defaults\r\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\r\n     * object, which currently contains this default configuration:\r\n     *\r\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\r\n     *   - `Accept: application/json, text/plain, * / *`\r\n     *   - `X-Requested-With: XMLHttpRequest`\r\n     * - `$httpProvider.defaults.headers.post`: (header defaults for HTTP POST requests)\r\n     *   - `Content-Type: application/json`\r\n     * - `$httpProvider.defaults.headers.put` (header defaults for HTTP PUT requests)\r\n     *   - `Content-Type: application/json`\r\n     *\r\n     * To add or overwrite these defaults, simply add or remove a property from this configuration\r\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\r\n     * with name equal to the lower-cased http method name, e.g.\r\n     * `$httpProvider.defaults.headers.get['My-Header']='value'`.\r\n     *\r\n     * Additionally, the defaults can be set at runtime via the `$http.defaults` object in a similar\r\n     * fassion as described above.\r\n     *\r\n     *\r\n     * # Transforming Requests and Responses\r\n     *\r\n     * Both requests and responses can be transformed using transform functions. By default, Angular\r\n     * applies these transformations:\r\n     *\r\n     * Request transformations:\r\n     *\r\n     * - if the `data` property of the request config object contains an object, serialize it into\r\n     *   JSON format.\r\n     *\r\n     * Response transformations:\r\n     *\r\n     *  - if XSRF prefix is detected, strip it (see Security Considerations section below)\r\n     *  - if json response is detected, deserialize it using a JSON parser\r\n     *\r\n     * To override these transformation locally, specify transform functions as `transformRequest`\r\n     * and/or `transformResponse` properties of the config object. To globally override the default\r\n     * transforms, override the `$httpProvider.defaults.transformRequest` and\r\n     * `$httpProvider.defaults.transformResponse` properties of the `$httpProvider`.\r\n     *\r\n     *\r\n     * # Caching\r\n     *\r\n     * To enable caching set the configuration property `cache` to `true`. When the cache is\r\n     * enabled, `$http` stores the response from the server in local cache. Next time the\r\n     * response is served from the cache without sending a request to the server.\r\n     *\r\n     * Note that even if the response is served from cache, delivery of the data is asynchronous in\r\n     * the same way that real requests are.\r\n     *\r\n     * If there are multiple GET requests for the same url that should be cached using the same\r\n     * cache, but the cache is not populated yet, only one request to the server will be made and\r\n     * the remaining requests will be fulfilled using the response for the first request.\r\n     *\r\n     *\r\n     * # Response interceptors\r\n     *\r\n     * Before you start creating interceptors, be sure to understand the\r\n     * {@link ng.$q $q and deferred/promise APIs}.\r\n     *\r\n     * For purposes of global error handling, authentication or any kind of synchronous or\r\n     * asynchronous preprocessing of received responses, it is desirable to be able to intercept\r\n     * responses for http requests before they are handed over to the application code that\r\n     * initiated these requests. The response interceptors leverage the {@link ng.$q\r\n     * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing.\r\n     *\r\n     * The interceptors are service factories that are registered with the $httpProvider by\r\n     * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and\r\n     * injected with dependencies (if specified) and returns the interceptor  â€” a function that\r\n     * takes a {@link ng.$q promise} and returns the original or a new promise.\r\n     *\r\n     * <pre>\r\n     *   // register the interceptor as a service\r\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\r\n     *     return function(promise) {\r\n     *       return promise.then(function(response) {\r\n     *         // do something on success\r\n     *       }, function(response) {\r\n     *         // do something on error\r\n     *         if (canRecover(response)) {\r\n     *           return responseOrNewPromise\r\n     *         }\r\n     *         return $q.reject(response);\r\n     *       });\r\n     *     }\r\n     *   });\r\n     *\r\n     *   $httpProvider.responseInterceptors.push('myHttpInterceptor');\r\n     *\r\n     *\r\n     *   // register the interceptor via an anonymous factory\r\n     *   $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {\r\n     *     return function(promise) {\r\n     *       // same as above\r\n     *     }\r\n     *   });\r\n     * </pre>\r\n     *\r\n     *\r\n     * # Security Considerations\r\n     *\r\n     * When designing web applications, consider security threats from:\r\n     *\r\n     * - {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx\r\n     *   JSON Vulnerability}\r\n     * - {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF}\r\n     *\r\n     * Both server and the client must cooperate in order to eliminate these threats. Angular comes\r\n     * pre-configured with strategies that address these issues, but for this to work backend server\r\n     * cooperation is required.\r\n     *\r\n     * ## JSON Vulnerability Protection\r\n     *\r\n     * A {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx\r\n     * JSON Vulnerability} allows third party web-site to turn your JSON resource URL into\r\n     * {@link http://en.wikipedia.org/wiki/JSON#JSONP JSONP} request under some conditions. To\r\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\r\n     * Angular will automatically strip the prefix before processing it as JSON.\r\n     *\r\n     * For example if your server needs to return:\r\n     * <pre>\r\n     * ['one','two']\r\n     * </pre>\r\n     *\r\n     * which is vulnerable to attack, your server can return:\r\n     * <pre>\r\n     * )]}',\r\n     * ['one','two']\r\n     * </pre>\r\n     *\r\n     * Angular will strip the prefix, before processing the JSON.\r\n     *\r\n     *\r\n     * ## Cross Site Request Forgery (XSRF) Protection\r\n     *\r\n     * {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} is a technique by which\r\n     * an unauthorized site can gain your user's private data. Angular provides following mechanism\r\n     * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie\r\n     * called `XSRF-TOKEN` and sets it as the HTTP header `X-XSRF-TOKEN`. Since only JavaScript that\r\n     * runs on your domain could read the cookie, your server can be assured that the XHR came from\r\n     * JavaScript running on your domain.\r\n     *\r\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\r\n     * cookie called `XSRF-TOKEN` on first HTTP GET request. On subsequent non-GET requests the\r\n     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\r\n     * that only JavaScript running on your domain could have read the token. The token must be\r\n     * unique for each user and must be verifiable by the server (to prevent the JavaScript making\r\n     * up its own tokens). We recommend that the token is a digest of your site's authentication\r\n     * cookie with {@link http://en.wikipedia.org/wiki/Rainbow_table salt for added security}.\r\n     *\r\n     *\r\n     * @param {object} config Object describing the request to be made and how it should be\r\n     *    processed. The object has following properties:\r\n     *\r\n     *    - **method** â€“ `{string}` â€“ HTTP method (e.g. 'GET', 'POST', etc)\r\n     *    - **url** â€“ `{string}` â€“ Absolute or relative URL of the resource that is being requested.\r\n     *    - **params** â€“ `{Object.<string|Object>}` â€“ Map of strings or objects which will be turned to\r\n     *      `?key1=value1&key2=value2` after the url. If the value is not a string, it will be JSONified.\r\n     *    - **data** â€“ `{string|Object}` â€“ Data to be sent as the request message data.\r\n     *    - **headers** â€“ `{Object}` â€“ Map of strings representing HTTP headers to send to the server.\r\n     *    - **transformRequest** â€“ `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` â€“\r\n     *      transform function or an array of such functions. The transform function takes the http\r\n     *      request body and headers and returns its transformed (typically serialized) version.\r\n     *    - **transformResponse** â€“ `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` â€“\r\n     *      transform function or an array of such functions. The transform function takes the http\r\n     *      response body and headers and returns its transformed (typically deserialized) version.\r\n     *    - **cache** â€“ `{boolean|Cache}` â€“ If true, a default $http cache will be used to cache the\r\n     *      GET request, otherwise if a cache instance built with\r\n     *      {@link ng.$cacheFactory $cacheFactory}, this cache will be used for\r\n     *      caching.\r\n     *    - **timeout** â€“ `{number}` â€“ timeout in milliseconds.\r\n     *    - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the\r\n     *      XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5\r\n     *      requests with credentials} for more information.\r\n     *\r\n     * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the\r\n     *   standard `then` method and two http specific methods: `success` and `error`. The `then`\r\n     *   method takes two arguments a success and an error callback which will be called with a\r\n     *   response object. The `success` and `error` methods take a single argument - a function that\r\n     *   will be called when the request succeeds or fails respectively. The arguments passed into\r\n     *   these functions are destructured representation of the response object passed into the\r\n     *   `then` method. The response object has these properties:\r\n     *\r\n     *   - **data** â€“ `{string|Object}` â€“ The response body transformed with the transform functions.\r\n     *   - **status** â€“ `{number}` â€“ HTTP status code of the response.\r\n     *   - **headers** â€“ `{function([headerName])}` â€“ Header getter function.\r\n     *   - **config** â€“ `{Object}` â€“ The configuration object that was used to generate the request.\r\n     *\r\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\r\n     *   requests. This is primarily meant to be used for debugging purposes.\r\n     *\r\n     *\r\n     * @example\r\n      <example>\r\n        <file name=\"index.html\">\r\n          <div ng-controller=\"FetchCtrl\">\r\n            <select ng-model=\"method\">\r\n              <option>GET</option>\r\n              <option>JSONP</option>\r\n            </select>\r\n            <input type=\"text\" ng-model=\"url\" size=\"80\"/>\r\n            <button ng-click=\"fetch()\">fetch</button><br>\r\n            <button ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\r\n            <button ng-click=\"updateModel('JSONP', 'http://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')\">Sample JSONP</button>\r\n            <button ng-click=\"updateModel('JSONP', 'http://angularjs.org/doesntexist&callback=JSON_CALLBACK')\">Invalid JSONP</button>\r\n            <pre>http status code: {{status}}</pre>\r\n            <pre>http response data: {{data}}</pre>\r\n          </div>\r\n        </file>\r\n        <file name=\"script.js\">\r\n          function FetchCtrl($scope, $http, $templateCache) {\r\n            $scope.method = 'GET';\r\n            $scope.url = 'http-hello.html';\r\n\r\n            $scope.fetch = function() {\r\n              $scope.code = null;\r\n              $scope.response = null;\r\n\r\n              $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\r\n                success(function(data, status) {\r\n                  $scope.status = status;\r\n                  $scope.data = data;\r\n                }).\r\n                error(function(data, status) {\r\n                  $scope.data = data || \"Request failed\";\r\n                  $scope.status = status;\r\n              });\r\n            };\r\n\r\n            $scope.updateModel = function(method, url) {\r\n              $scope.method = method;\r\n              $scope.url = url;\r\n            };\r\n          }\r\n        </file>\r\n        <file name=\"http-hello.html\">\r\n          Hello, $http!\r\n        </file>\r\n        <file name=\"scenario.js\">\r\n          it('should make an xhr GET request', function() {\r\n            element(':button:contains(\"Sample GET\")').click();\r\n            element(':button:contains(\"fetch\")').click();\r\n            expect(binding('status')).toBe('200');\r\n            expect(binding('data')).toMatch(/Hello, \\$http!/);\r\n          });\r\n\r\n          it('should make a JSONP request to angularjs.org', function() {\r\n            element(':button:contains(\"Sample JSONP\")').click();\r\n            element(':button:contains(\"fetch\")').click();\r\n            expect(binding('status')).toBe('200');\r\n            expect(binding('data')).toMatch(/Super Hero!/);\r\n          });\r\n\r\n          it('should make JSONP request to invalid URL and invoke the error handler',\r\n              function() {\r\n            element(':button:contains(\"Invalid JSONP\")').click();\r\n            element(':button:contains(\"fetch\")').click();\r\n            expect(binding('status')).toBe('0');\r\n            expect(binding('data')).toBe('Request failed');\r\n          });\r\n        </file>\r\n      </example>\r\n     */\r\n    function $http(config) {\r\n      config.method = uppercase(config.method);\r\n\r\n      var reqTransformFn = config.transformRequest || $config.transformRequest,\r\n          respTransformFn = config.transformResponse || $config.transformResponse,\r\n          defHeaders = $config.headers,\r\n          reqHeaders = extend({'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']},\r\n              defHeaders.common, defHeaders[lowercase(config.method)], config.headers),\r\n          reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn),\r\n          promise;\r\n\r\n      // strip content-type if data is undefined\r\n      if (isUndefined(config.data)) {\r\n        delete reqHeaders['Content-Type'];\r\n      }\r\n\r\n      // send request\r\n      promise = sendReq(config, reqData, reqHeaders);\r\n\r\n\r\n      // transform future response\r\n      promise = promise.then(transformResponse, transformResponse);\r\n\r\n      // apply interceptors\r\n      forEach(responseInterceptors, function(interceptor) {\r\n        promise = interceptor(promise);\r\n      });\r\n\r\n      promise.success = function(fn) {\r\n        promise.then(function(response) {\r\n          fn(response.data, response.status, response.headers, config);\r\n        });\r\n        return promise;\r\n      };\r\n\r\n      promise.error = function(fn) {\r\n        promise.then(null, function(response) {\r\n          fn(response.data, response.status, response.headers, config);\r\n        });\r\n        return promise;\r\n      };\r\n\r\n      return promise;\r\n\r\n      function transformResponse(response) {\r\n        // make a copy since the response must be cacheable\r\n        var resp = extend({}, response, {\r\n          data: transformData(response.data, response.headers, respTransformFn)\r\n        });\r\n        return (isSuccess(response.status))\r\n          ? resp\r\n          : $q.reject(resp);\r\n      }\r\n    }\r\n\r\n    $http.pendingRequests = [];\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#get\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `GET` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#delete\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `DELETE` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#head\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `HEAD` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#jsonp\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `JSONP` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request.\r\n     *                     Should contain `JSON_CALLBACK` string.\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n    createShortMethods('get', 'delete', 'head', 'jsonp');\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#post\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `POST` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {*} data Request content\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#put\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `PUT` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {*} data Request content\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n    createShortMethodsWithData('post', 'put');\r\n\r\n        /**\r\n         * @ngdoc property\r\n         * @name ng.$http#defaults\r\n         * @propertyOf ng.$http\r\n         *\r\n         * @description\r\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\r\n         * default headers as well as request and response transformations.\r\n         *\r\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\r\n         */\r\n    $http.defaults = $config;\r\n\r\n\r\n    return $http;\r\n\r\n\r\n    function createShortMethods(names) {\r\n      forEach(arguments, function(name) {\r\n        $http[name] = function(url, config) {\r\n          return $http(extend(config || {}, {\r\n            method: name,\r\n            url: url\r\n          }));\r\n        };\r\n      });\r\n    }\r\n\r\n\r\n    function createShortMethodsWithData(name) {\r\n      forEach(arguments, function(name) {\r\n        $http[name] = function(url, data, config) {\r\n          return $http(extend(config || {}, {\r\n            method: name,\r\n            url: url,\r\n            data: data\r\n          }));\r\n        };\r\n      });\r\n    }\r\n\r\n\r\n    /**\r\n     * Makes the request\r\n     *\r\n     * !!! ACCESSES CLOSURE VARS:\r\n     * $httpBackend, $config, $log, $rootScope, defaultCache, $http.pendingRequests\r\n     */\r\n    function sendReq(config, reqData, reqHeaders) {\r\n      var deferred = $q.defer(),\r\n          promise = deferred.promise,\r\n          cache,\r\n          cachedResp,\r\n          url = buildUrl(config.url, config.params);\r\n\r\n      $http.pendingRequests.push(config);\r\n      promise.then(removePendingReq, removePendingReq);\r\n\r\n\r\n      if (config.cache && config.method == 'GET') {\r\n        cache = isObject(config.cache) ? config.cache : defaultCache;\r\n      }\r\n\r\n      if (cache) {\r\n        cachedResp = cache.get(url);\r\n        if (cachedResp) {\r\n          if (cachedResp.then) {\r\n            // cached request has already been sent, but there is no response yet\r\n            cachedResp.then(removePendingReq, removePendingReq);\r\n            return cachedResp;\r\n          } else {\r\n            // serving from cache\r\n            if (isArray(cachedResp)) {\r\n              resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2]));\r\n            } else {\r\n              resolvePromise(cachedResp, 200, {});\r\n            }\r\n          }\r\n        } else {\r\n          // put the promise for the non-transformed response into cache as a placeholder\r\n          cache.put(url, promise);\r\n        }\r\n      }\r\n\r\n      // if we won't have the response in cache, send the request to the backend\r\n      if (!cachedResp) {\r\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\r\n            config.withCredentials);\r\n      }\r\n\r\n      return promise;\r\n\r\n\r\n      /**\r\n       * Callback registered to $httpBackend():\r\n       *  - caches the response if desired\r\n       *  - resolves the raw $http promise\r\n       *  - calls $apply\r\n       */\r\n      function done(status, response, headersString) {\r\n        if (cache) {\r\n          if (isSuccess(status)) {\r\n            cache.put(url, [status, response, parseHeaders(headersString)]);\r\n          } else {\r\n            // remove promise from the cache\r\n            cache.remove(url);\r\n          }\r\n        }\r\n\r\n        resolvePromise(response, status, headersString);\r\n        $rootScope.$apply();\r\n      }\r\n\r\n\r\n      /**\r\n       * Resolves the raw $http promise.\r\n       */\r\n      function resolvePromise(response, status, headers) {\r\n        // normalize internal statuses to 0\r\n        status = Math.max(status, 0);\r\n\r\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\r\n          data: response,\r\n          status: status,\r\n          headers: headersGetter(headers),\r\n          config: config\r\n        });\r\n      }\r\n\r\n\r\n      function removePendingReq() {\r\n        var idx = indexOf($http.pendingRequests, config);\r\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\r\n      }\r\n    }\r\n\r\n\r\n    function buildUrl(url, params) {\r\n          if (!params) return url;\r\n          var parts = [];\r\n          forEachSorted(params, function(value, key) {\r\n            if (value == null || value == undefined) return;\r\n            if (isObject(value)) {\r\n              value = toJson(value);\r\n            }\r\n            parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n          });\r\n          return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');\r\n        }\r\n\r\n\r\n  }];\r\n}\r\nvar XHR = window.XMLHttpRequest || function() {\r\n  try { return new ActiveXObject(\"Msxml2.XMLHTTP.6.0\"); } catch (e1) {}\r\n  try { return new ActiveXObject(\"Msxml2.XMLHTTP.3.0\"); } catch (e2) {}\r\n  try { return new ActiveXObject(\"Msxml2.XMLHTTP\"); } catch (e3) {}\r\n  throw new Error(\"This browser does not support XMLHttpRequest.\");\r\n};\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$httpBackend\r\n * @requires $browser\r\n * @requires $window\r\n * @requires $document\r\n *\r\n * @description\r\n * HTTP backend used by the {@link ng.$http service} that delegates to\r\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\r\n *\r\n * You should never need to use this service directly, instead use the higher-level abstractions:\r\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\r\n *\r\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\r\n * $httpBackend} which can be trained with responses.\r\n */\r\nfunction $HttpBackendProvider() {\r\n  this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {\r\n    return createHttpBackend($browser, XHR, $browser.defer, $window.angular.callbacks,\r\n        $document[0], $window.location.protocol.replace(':', ''));\r\n  }];\r\n}\r\n\r\nfunction createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, locationProtocol) {\r\n  // TODO(vojta): fix the signature\r\n  return function(method, url, post, callback, headers, timeout, withCredentials) {\r\n    $browser.$$incOutstandingRequestCount();\r\n    url = url || $browser.url();\r\n\r\n    if (lowercase(method) == 'jsonp') {\r\n      var callbackId = '_' + (callbacks.counter++).toString(36);\r\n      callbacks[callbackId] = function(data) {\r\n        callbacks[callbackId].data = data;\r\n      };\r\n\r\n      jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),\r\n          function() {\r\n        if (callbacks[callbackId].data) {\r\n          completeRequest(callback, 200, callbacks[callbackId].data);\r\n        } else {\r\n          completeRequest(callback, -2);\r\n        }\r\n        delete callbacks[callbackId];\r\n      });\r\n    } else {\r\n      var xhr = new XHR();\r\n      xhr.open(method, url, true);\r\n      forEach(headers, function(value, key) {\r\n        if (value) xhr.setRequestHeader(key, value);\r\n      });\r\n\r\n      var status;\r\n\r\n      // In IE6 and 7, this might be called synchronously when xhr.send below is called and the\r\n      // response is in the cache. the promise api will ensure that to the app code the api is\r\n      // always async\r\n      xhr.onreadystatechange = function() {\r\n        if (xhr.readyState == 4) {\r\n          completeRequest(\r\n              callback, status || xhr.status, xhr.responseText, xhr.getAllResponseHeaders());\r\n        }\r\n      };\r\n\r\n      if (withCredentials) {\r\n        xhr.withCredentials = true;\r\n      }\r\n\r\n      xhr.send(post || '');\r\n\r\n      if (timeout > 0) {\r\n        $browserDefer(function() {\r\n          status = -1;\r\n          xhr.abort();\r\n        }, timeout);\r\n      }\r\n    }\r\n\r\n\r\n    function completeRequest(callback, status, response, headersString) {\r\n      // URL_MATCH is defined in src/service/location.js\r\n      var protocol = (url.match(URL_MATCH) || ['', locationProtocol])[1];\r\n\r\n      // fix status code for file protocol (it's always 0)\r\n      status = (protocol == 'file') ? (response ? 200 : 404) : status;\r\n\r\n      // normalize IE bug (http://bugs.jquery.com/ticket/1450)\r\n      status = status == 1223 ? 204 : status;\r\n\r\n      callback(status, response, headersString);\r\n      $browser.$$completeOutstandingRequest(noop);\r\n    }\r\n  };\r\n\r\n  function jsonpReq(url, done) {\r\n    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:\r\n    // - fetches local scripts via XHR and evals them\r\n    // - adds and immediately removes script elements from the document\r\n    var script = rawDocument.createElement('script'),\r\n        doneWrapper = function() {\r\n          rawDocument.body.removeChild(script);\r\n          if (done) done();\r\n        };\r\n\r\n    script.type = 'text/javascript';\r\n    script.src = url;\r\n\r\n    if (msie) {\r\n      script.onreadystatechange = function() {\r\n        if (/loaded|complete/.test(script.readyState)) doneWrapper();\r\n      };\r\n    } else {\r\n      script.onload = script.onerror = doneWrapper;\r\n    }\r\n\r\n    rawDocument.body.appendChild(script);\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$locale\r\n *\r\n * @description\r\n * $locale service provides localization rules for various Angular components. As of right now the\r\n * only public api is:\r\n *\r\n * * `id` â€“ `{string}` â€“ locale id formatted as `languageId-countryId` (e.g. `en-us`)\r\n */\r\nfunction $LocaleProvider(){\r\n  this.$get = function() {\r\n    return {\r\n      id: 'en-us',\r\n\r\n      NUMBER_FORMATS: {\r\n        DECIMAL_SEP: '.',\r\n        GROUP_SEP: ',',\r\n        PATTERNS: [\r\n          { // Decimal Pattern\r\n            minInt: 1,\r\n            minFrac: 0,\r\n            maxFrac: 3,\r\n            posPre: '',\r\n            posSuf: '',\r\n            negPre: '-',\r\n            negSuf: '',\r\n            gSize: 3,\r\n            lgSize: 3\r\n          },{ //Currency Pattern\r\n            minInt: 1,\r\n            minFrac: 2,\r\n            maxFrac: 2,\r\n            posPre: '\\u00A4',\r\n            posSuf: '',\r\n            negPre: '(\\u00A4',\r\n            negSuf: ')',\r\n            gSize: 3,\r\n            lgSize: 3\r\n          }\r\n        ],\r\n        CURRENCY_SYM: '$'\r\n      },\r\n\r\n      DATETIME_FORMATS: {\r\n        MONTH: 'January,February,March,April,May,June,July,August,September,October,November,December'\r\n                .split(','),\r\n        SHORTMONTH:  'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),\r\n        DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),\r\n        SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),\r\n        AMPMS: ['AM','PM'],\r\n        medium: 'MMM d, y h:mm:ss a',\r\n        short: 'M/d/yy h:mm a',\r\n        fullDate: 'EEEE, MMMM d, y',\r\n        longDate: 'MMMM d, y',\r\n        mediumDate: 'MMM d, y',\r\n        shortDate: 'M/d/yy',\r\n        mediumTime: 'h:mm:ss a',\r\n        shortTime: 'h:mm a'\r\n      },\r\n\r\n      pluralCat: function(num) {\r\n        if (num === 1) {\r\n          return 'one';\r\n        }\r\n        return 'other';\r\n      }\r\n    };\r\n  };\r\n}\r\n\r\nfunction $TimeoutProvider() {\r\n  this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',\r\n       function($rootScope,   $browser,   $q,   $exceptionHandler) {\r\n    var deferreds = {};\r\n\r\n\r\n     /**\r\n      * @ngdoc function\r\n      * @name ng.$timeout\r\n      * @requires $browser\r\n      *\r\n      * @description\r\n      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\r\n      * block and delegates any exceptions to\r\n      * {@link ng.$exceptionHandler $exceptionHandler} service.\r\n      *\r\n      * The return value of registering a timeout function is a promise which will be resolved when\r\n      * the timeout is reached and the timeout function is executed.\r\n      *\r\n      * To cancel a the timeout request, call `$timeout.cancel(promise)`.\r\n      *\r\n      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\r\n      * synchronously flush the queue of deferred functions.\r\n      *\r\n      * @param {function()} fn A function, who's execution should be delayed.\r\n      * @param {number=} [delay=0] Delay in milliseconds.\r\n      * @param {boolean=} [invokeApply=true] If set to false skips model dirty checking, otherwise\r\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\r\n      * @returns {*} Promise that will be resolved when the timeout is reached. The value this\r\n      *   promise will be resolved with is the return value of the `fn` function.\r\n      */\r\n    function timeout(fn, delay, invokeApply) {\r\n      var deferred = $q.defer(),\r\n          promise = deferred.promise,\r\n          skipApply = (isDefined(invokeApply) && !invokeApply),\r\n          timeoutId, cleanup;\r\n\r\n      timeoutId = $browser.defer(function() {\r\n        try {\r\n          deferred.resolve(fn());\r\n        } catch(e) {\r\n          deferred.reject(e);\r\n          $exceptionHandler(e);\r\n        }\r\n\r\n        if (!skipApply) $rootScope.$apply();\r\n      }, delay);\r\n\r\n      cleanup = function() {\r\n        delete deferreds[promise.$$timeoutId];\r\n      };\r\n\r\n      promise.$$timeoutId = timeoutId;\r\n      deferreds[timeoutId] = deferred;\r\n      promise.then(cleanup, cleanup);\r\n\r\n      return promise;\r\n    }\r\n\r\n\r\n     /**\r\n      * @ngdoc function\r\n      * @name ng.$timeout#cancel\r\n      * @methodOf ng.$timeout\r\n      *\r\n      * @description\r\n      * Cancels a task associated with the `promise`. As a result of this the promise will be\r\n      * resolved with a rejection.\r\n      *\r\n      * @param {Promise=} promise Promise returned by the `$timeout` function.\r\n      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\r\n      *   canceled.\r\n      */\r\n    timeout.cancel = function(promise) {\r\n      if (promise && promise.$$timeoutId in deferreds) {\r\n        deferreds[promise.$$timeoutId].reject('canceled');\r\n        return $browser.defer.cancel(promise.$$timeoutId);\r\n      }\r\n      return false;\r\n    };\r\n\r\n    return timeout;\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$filterProvider\r\n * @description\r\n *\r\n * Filters are just functions which transform input to an output. However filters need to be Dependency Injected. To\r\n * achieve this a filter definition consists of a factory function which is annotated with dependencies and is\r\n * responsible for creating a the filter function.\r\n *\r\n * <pre>\r\n *   // Filter registration\r\n *   function MyModule($provide, $filterProvider) {\r\n *     // create a service to demonstrate injection (not always needed)\r\n *     $provide.value('greet', function(name){\r\n *       return 'Hello ' + name + '!';\r\n *     });\r\n *\r\n *     // register a filter factory which uses the\r\n *     // greet service to demonstrate DI.\r\n *     $filterProvider.register('greet', function(greet){\r\n *       // return the filter function which uses the greet service\r\n *       // to generate salutation\r\n *       return function(text) {\r\n *         // filters need to be forgiving so check input validity\r\n *         return text && greet(text) || text;\r\n *       };\r\n *     });\r\n *   }\r\n * </pre>\r\n *\r\n * The filter function is registered with the `$injector` under the filter name suffixe with `Filter`.\r\n * <pre>\r\n *   it('should be the same instance', inject(\r\n *     function($filterProvider) {\r\n *       $filterProvider.register('reverse', function(){\r\n *         return ...;\r\n *       });\r\n *     },\r\n *     function($filter, reverseFilter) {\r\n *       expect($filter('reverse')).toBe(reverseFilter);\r\n *     });\r\n * </pre>\r\n *\r\n *\r\n * For more information about how angular filters work, and how to create your own filters, see\r\n * {@link guide/dev_guide.templates.filters Understanding Angular Filters} in the angular Developer\r\n * Guide.\r\n */\r\n/**\r\n * @ngdoc method\r\n * @name ng.$filterProvider#register\r\n * @methodOf ng.$filterProvider\r\n * @description\r\n * Register filter factory function.\r\n *\r\n * @param {String} name Name of the filter.\r\n * @param {function} fn The filter factory function which is injectable.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$filter\r\n * @function\r\n * @description\r\n * Filters are used for formatting data displayed to the user.\r\n *\r\n * The general syntax in templates is as follows:\r\n *\r\n *         {{ expression | [ filter_name ] }}\r\n *\r\n * @param {String} name Name of the filter function to retrieve\r\n * @return {Function} the filter function\r\n */\r\n$FilterProvider.$inject = ['$provide'];\r\nfunction $FilterProvider($provide) {\r\n  var suffix = 'Filter';\r\n\r\n  function register(name, factory) {\r\n    return $provide.factory(name + suffix, factory);\r\n  }\r\n  this.register = register;\r\n\r\n  this.$get = ['$injector', function($injector) {\r\n    return function(name) {\r\n      return $injector.get(name + suffix);\r\n    }\r\n  }];\r\n\r\n  ////////////////////////////////////////\r\n\r\n  register('currency', currencyFilter);\r\n  register('date', dateFilter);\r\n  register('filter', filterFilter);\r\n  register('json', jsonFilter);\r\n  register('limitTo', limitToFilter);\r\n  register('lowercase', lowercaseFilter);\r\n  register('number', numberFilter);\r\n  register('orderBy', orderByFilter);\r\n  register('uppercase', uppercaseFilter);\r\n}\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:filter\r\n * @function\r\n *\r\n * @description\r\n * Selects a subset of items from `array` and returns it as a new array.\r\n *\r\n * Note: This function is used to augment the `Array` type in Angular expressions. See\r\n * {@link ng.$filter} for more information about Angular arrays.\r\n *\r\n * @param {Array} array The source array.\r\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\r\n *   `array`.\r\n *\r\n *   Can be one of:\r\n *\r\n *   - `string`: Predicate that results in a substring match using the value of `expression`\r\n *     string. All strings or objects with string properties in `array` that contain this string\r\n *     will be returned. The predicate can be negated by prefixing the string with `!`.\r\n *\r\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\r\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\r\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\r\n *     property name `$` can be used (as in `{$:\"text\"}`) to accept a match against any\r\n *     property of the object. That's equivalent to the simple substring match with a `string`\r\n *     as described above.\r\n *\r\n *   - `function`: A predicate function can be used to write arbitrary filters. The function is\r\n *     called for each element of `array`. The final result is an array of those elements that\r\n *     the predicate returned true for.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\r\n                                {name:'Mary', phone:'800-BIG-MARY'},\r\n                                {name:'Mike', phone:'555-4321'},\r\n                                {name:'Adam', phone:'555-5678'},\r\n                                {name:'Julie', phone:'555-8765'}]\"></div>\r\n\r\n       Search: <input ng-model=\"searchText\">\r\n       <table id=\"searchTextResults\">\r\n         <tr><th>Name</th><th>Phone</th><tr>\r\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\r\n           <td>{{friend.name}}</td>\r\n           <td>{{friend.phone}}</td>\r\n         <tr>\r\n       </table>\r\n       <hr>\r\n       Any: <input ng-model=\"search.$\"> <br>\r\n       Name only <input ng-model=\"search.name\"><br>\r\n       Phone only <input ng-model=\"search.phone\"Ã¥><br>\r\n       <table id=\"searchObjResults\">\r\n         <tr><th>Name</th><th>Phone</th><tr>\r\n         <tr ng-repeat=\"friend in friends | filter:search\">\r\n           <td>{{friend.name}}</td>\r\n           <td>{{friend.phone}}</td>\r\n         <tr>\r\n       </table>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should search across all fields when filtering with a string', function() {\r\n         input('searchText').enter('m');\r\n         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).\r\n           toEqual(['Mary', 'Mike', 'Adam']);\r\n\r\n         input('searchText').enter('76');\r\n         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).\r\n           toEqual(['John', 'Julie']);\r\n       });\r\n\r\n       it('should search in specific fields when filtering with a predicate object', function() {\r\n         input('search.$').enter('i');\r\n         expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')).\r\n           toEqual(['Mary', 'Mike', 'Julie']);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nfunction filterFilter() {\r\n  return function(array, expression) {\r\n    if (!(array instanceof Array)) return array;\r\n    var predicates = [];\r\n    predicates.check = function(value) {\r\n      for (var j = 0; j < predicates.length; j++) {\r\n        if(!predicates[j](value)) {\r\n          return false;\r\n        }\r\n      }\r\n      return true;\r\n    };\r\n    var search = function(obj, text){\r\n      if (text.charAt(0) === '!') {\r\n        return !search(obj, text.substr(1));\r\n      }\r\n      switch (typeof obj) {\r\n        case \"boolean\":\r\n        case \"number\":\r\n        case \"string\":\r\n          return ('' + obj).toLowerCase().indexOf(text) > -1;\r\n        case \"object\":\r\n          for ( var objKey in obj) {\r\n            if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {\r\n              return true;\r\n            }\r\n          }\r\n          return false;\r\n        case \"array\":\r\n          for ( var i = 0; i < obj.length; i++) {\r\n            if (search(obj[i], text)) {\r\n              return true;\r\n            }\r\n          }\r\n          return false;\r\n        default:\r\n          return false;\r\n      }\r\n    };\r\n    switch (typeof expression) {\r\n      case \"boolean\":\r\n      case \"number\":\r\n      case \"string\":\r\n        expression = {$:expression};\r\n      case \"object\":\r\n        for (var key in expression) {\r\n          if (key == '$') {\r\n            (function() {\r\n              var text = (''+expression[key]).toLowerCase();\r\n              if (!text) return;\r\n              predicates.push(function(value) {\r\n                return search(value, text);\r\n              });\r\n            })();\r\n          } else {\r\n            (function() {\r\n              var path = key;\r\n              var text = (''+expression[key]).toLowerCase();\r\n              if (!text) return;\r\n              predicates.push(function(value) {\r\n                return search(getter(value, path), text);\r\n              });\r\n            })();\r\n          }\r\n        }\r\n        break;\r\n      case 'function':\r\n        predicates.push(expression);\r\n        break;\r\n      default:\r\n        return array;\r\n    }\r\n    var filtered = [];\r\n    for ( var j = 0; j < array.length; j++) {\r\n      var value = array[j];\r\n      if (predicates.check(value)) {\r\n        filtered.push(value);\r\n      }\r\n    }\r\n    return filtered;\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:currency\r\n * @function\r\n *\r\n * @description\r\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\r\n * symbol for current locale is used.\r\n *\r\n * @param {number} amount Input to filter.\r\n * @param {string=} symbol Currency symbol or identifier to be displayed.\r\n * @returns {string} Formatted number.\r\n *\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.amount = 1234.56;\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <input type=\"number\" ng-model=\"amount\"> <br>\r\n         default currency symbol ($): {{amount | currency}}<br>\r\n         custom currency identifier (USD$): {{amount | currency:\"USD$\"}}\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should init with 1234.56', function() {\r\n         expect(binding('amount | currency')).toBe('$1,234.56');\r\n         expect(binding('amount | currency:\"USD$\"')).toBe('USD$1,234.56');\r\n       });\r\n       it('should update', function() {\r\n         input('amount').enter('-1234');\r\n         expect(binding('amount | currency')).toBe('($1,234.00)');\r\n         expect(binding('amount | currency:\"USD$\"')).toBe('(USD$1,234.00)');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\ncurrencyFilter.$inject = ['$locale'];\r\nfunction currencyFilter($locale) {\r\n  var formats = $locale.NUMBER_FORMATS;\r\n  return function(amount, currencySymbol){\r\n    if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM;\r\n    return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).\r\n                replace(/\\u00A4/g, currencySymbol);\r\n  };\r\n}\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:number\r\n * @function\r\n *\r\n * @description\r\n * Formats a number as text.\r\n *\r\n * If the input is not a number an empty string is returned.\r\n *\r\n * @param {number|string} number Number to format.\r\n * @param {(number|string)=} [fractionSize=2] Number of decimal places to round the number to.\r\n * @returns {string} Number rounded to decimalPlaces and places a â€œ,â€ after each third digit.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.val = 1234.56789;\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         Enter number: <input ng-model='val'><br>\r\n         Default formatting: {{val | number}}<br>\r\n         No fractions: {{val | number:0}}<br>\r\n         Negative number: {{-val | number:4}}\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should format numbers', function() {\r\n         expect(binding('val | number')).toBe('1,234.568');\r\n         expect(binding('val | number:0')).toBe('1,235');\r\n         expect(binding('-val | number:4')).toBe('-1,234.5679');\r\n       });\r\n\r\n       it('should update', function() {\r\n         input('val').enter('3374.333');\r\n         expect(binding('val | number')).toBe('3,374.333');\r\n         expect(binding('val | number:0')).toBe('3,374');\r\n         expect(binding('-val | number:4')).toBe('-3,374.3330');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n\r\n\r\nnumberFilter.$inject = ['$locale'];\r\nfunction numberFilter($locale) {\r\n  var formats = $locale.NUMBER_FORMATS;\r\n  return function(number, fractionSize) {\r\n    return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\r\n      fractionSize);\r\n  };\r\n}\r\n\r\nvar DECIMAL_SEP = '.';\r\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\r\n  if (isNaN(number) || !isFinite(number)) return '';\r\n\r\n  var isNegative = number < 0;\r\n  number = Math.abs(number);\r\n  var numStr = number + '',\r\n      formatedText = '',\r\n      parts = [];\r\n\r\n  if (numStr.indexOf('e') !== -1) {\r\n    formatedText = numStr;\r\n  } else {\r\n    var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;\r\n\r\n    // determine fractionSize if it is not specified\r\n    if (isUndefined(fractionSize)) {\r\n      fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);\r\n    }\r\n\r\n    var pow = Math.pow(10, fractionSize);\r\n    number = Math.round(number * pow) / pow;\r\n    var fraction = ('' + number).split(DECIMAL_SEP);\r\n    var whole = fraction[0];\r\n    fraction = fraction[1] || '';\r\n\r\n    var pos = 0,\r\n        lgroup = pattern.lgSize,\r\n        group = pattern.gSize;\r\n\r\n    if (whole.length >= (lgroup + group)) {\r\n      pos = whole.length - lgroup;\r\n      for (var i = 0; i < pos; i++) {\r\n        if ((pos - i)%group === 0 && i !== 0) {\r\n          formatedText += groupSep;\r\n        }\r\n        formatedText += whole.charAt(i);\r\n      }\r\n    }\r\n\r\n    for (i = pos; i < whole.length; i++) {\r\n      if ((whole.length - i)%lgroup === 0 && i !== 0) {\r\n        formatedText += groupSep;\r\n      }\r\n      formatedText += whole.charAt(i);\r\n    }\r\n\r\n    // format fraction part.\r\n    while(fraction.length < fractionSize) {\r\n      fraction += '0';\r\n    }\r\n\r\n    if (fractionSize) formatedText += decimalSep + fraction.substr(0, fractionSize);\r\n  }\r\n\r\n  parts.push(isNegative ? pattern.negPre : pattern.posPre);\r\n  parts.push(formatedText);\r\n  parts.push(isNegative ? pattern.negSuf : pattern.posSuf);\r\n  return parts.join('');\r\n}\r\n\r\nfunction padNumber(num, digits, trim) {\r\n  var neg = '';\r\n  if (num < 0) {\r\n    neg =  '-';\r\n    num = -num;\r\n  }\r\n  num = '' + num;\r\n  while(num.length < digits) num = '0' + num;\r\n  if (trim)\r\n    num = num.substr(num.length - digits);\r\n  return neg + num;\r\n}\r\n\r\n\r\nfunction dateGetter(name, size, offset, trim) {\r\n  return function(date) {\r\n    var value = date['get' + name]();\r\n    if (offset > 0 || value > -offset)\r\n      value += offset;\r\n    if (value === 0 && offset == -12 ) value = 12;\r\n    return padNumber(value, size, trim);\r\n  };\r\n}\r\n\r\nfunction dateStrGetter(name, shortForm) {\r\n  return function(date, formats) {\r\n    var value = date['get' + name]();\r\n    var get = uppercase(shortForm ? ('SHORT' + name) : name);\r\n\r\n    return formats[get][value];\r\n  };\r\n}\r\n\r\nfunction timeZoneGetter(date) {\r\n  var offset = date.getTimezoneOffset();\r\n  return padNumber(offset / 60, 2) + padNumber(Math.abs(offset % 60), 2);\r\n}\r\n\r\nfunction ampmGetter(date, formats) {\r\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\r\n}\r\n\r\nvar DATE_FORMATS = {\r\n  yyyy: dateGetter('FullYear', 4),\r\n    yy: dateGetter('FullYear', 2, 0, true),\r\n     y: dateGetter('FullYear', 1),\r\n  MMMM: dateStrGetter('Month'),\r\n   MMM: dateStrGetter('Month', true),\r\n    MM: dateGetter('Month', 2, 1),\r\n     M: dateGetter('Month', 1, 1),\r\n    dd: dateGetter('Date', 2),\r\n     d: dateGetter('Date', 1),\r\n    HH: dateGetter('Hours', 2),\r\n     H: dateGetter('Hours', 1),\r\n    hh: dateGetter('Hours', 2, -12),\r\n     h: dateGetter('Hours', 1, -12),\r\n    mm: dateGetter('Minutes', 2),\r\n     m: dateGetter('Minutes', 1),\r\n    ss: dateGetter('Seconds', 2),\r\n     s: dateGetter('Seconds', 1),\r\n  EEEE: dateStrGetter('Day'),\r\n   EEE: dateStrGetter('Day', true),\r\n     a: ampmGetter,\r\n     Z: timeZoneGetter\r\n};\r\n\r\nvar DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,\r\n    NUMBER_STRING = /^\\d+$/;\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:date\r\n * @function\r\n *\r\n * @description\r\n *   Formats `date` to a string based on the requested `format`.\r\n *\r\n *   `format` string can be composed of the following elements:\r\n *\r\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\r\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\r\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\r\n *   * `'MMMM'`: Month in year (January-December)\r\n *   * `'MMM'`: Month in year (Jan-Dec)\r\n *   * `'MM'`: Month in year, padded (01-12)\r\n *   * `'M'`: Month in year (1-12)\r\n *   * `'dd'`: Day in month, padded (01-31)\r\n *   * `'d'`: Day in month (1-31)\r\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\r\n *   * `'EEE'`: Day in Week, (Sun-Sat)\r\n *   * `'HH'`: Hour in day, padded (00-23)\r\n *   * `'H'`: Hour in day (0-23)\r\n *   * `'hh'`: Hour in am/pm, padded (01-12)\r\n *   * `'h'`: Hour in am/pm, (1-12)\r\n *   * `'mm'`: Minute in hour, padded (00-59)\r\n *   * `'m'`: Minute in hour (0-59)\r\n *   * `'ss'`: Second in minute, padded (00-59)\r\n *   * `'s'`: Second in minute (0-59)\r\n *   * `'a'`: am/pm marker\r\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-1200)\r\n *\r\n *   `format` string can also be one of the following predefined\r\n *   {@link guide/i18n localizable formats}:\r\n *\r\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\r\n *     (e.g. Sep 3, 2010 12:05:08 pm)\r\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 pm)\r\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US  locale\r\n *     (e.g. Friday, September 3, 2010)\r\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010\r\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\r\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\r\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)\r\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)\r\n *\r\n *   `format` string can contain literal values. These need to be quoted with single quotes (e.g.\r\n *   `\"h 'in the morning'\"`). In order to output single quote, use two single quotes in a sequence\r\n *   (e.g. `\"h o''clock\"`).\r\n *\r\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\r\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and it's\r\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ).\r\n * @param {string=} format Formatting rules (see Description). If not specified,\r\n *    `mediumDate` is used.\r\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\r\n           {{1288323623006 | date:'medium'}}<br>\r\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\r\n          {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}<br>\r\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\r\n          {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}<br>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should format date', function() {\r\n         expect(binding(\"1288323623006 | date:'medium'\")).\r\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\r\n         expect(binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).\r\n            toMatch(/2010\\-10\\-2\\d \\d{2}:\\d{2}:\\d{2} \\-?\\d{4}/);\r\n         expect(binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).\r\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\ndateFilter.$inject = ['$locale'];\r\nfunction dateFilter($locale) {\r\n\r\n\r\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{3}))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d)))?$/;\r\n  function jsonStringToDate(string){\r\n    var match;\r\n    if (match = string.match(R_ISO8601_STR)) {\r\n      var date = new Date(0),\r\n          tzHour = 0,\r\n          tzMin  = 0;\r\n      if (match[9]) {\r\n        tzHour = int(match[9] + match[10]);\r\n        tzMin = int(match[9] + match[11]);\r\n      }\r\n      date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));\r\n      date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));\r\n      return date;\r\n    }\r\n    return string;\r\n  }\r\n\r\n\r\n  return function(date, format) {\r\n    var text = '',\r\n        parts = [],\r\n        fn, match;\r\n\r\n    format = format || 'mediumDate';\r\n    format = $locale.DATETIME_FORMATS[format] || format;\r\n    if (isString(date)) {\r\n      if (NUMBER_STRING.test(date)) {\r\n        date = int(date);\r\n      } else {\r\n        date = jsonStringToDate(date);\r\n      }\r\n    }\r\n\r\n    if (isNumber(date)) {\r\n      date = new Date(date);\r\n    }\r\n\r\n    if (!isDate(date)) {\r\n      return date;\r\n    }\r\n\r\n    while(format) {\r\n      match = DATE_FORMATS_SPLIT.exec(format);\r\n      if (match) {\r\n        parts = concat(parts, match, 1);\r\n        format = parts.pop();\r\n      } else {\r\n        parts.push(format);\r\n        format = null;\r\n      }\r\n    }\r\n\r\n    forEach(parts, function(value){\r\n      fn = DATE_FORMATS[value];\r\n      text += fn ? fn(date, $locale.DATETIME_FORMATS)\r\n                 : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\r\n    });\r\n\r\n    return text;\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:json\r\n * @function\r\n *\r\n * @description\r\n *   Allows you to convert a JavaScript object into JSON string.\r\n *\r\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\r\n *   the binding is automatically converted to JSON.\r\n *\r\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\r\n * @returns {string} JSON string.\r\n *\r\n *\r\n * @example:\r\n   <doc:example>\r\n     <doc:source>\r\n       <pre>{{ {'name':'value'} | json }}</pre>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should jsonify filtered objects', function() {\r\n         expect(binding(\"{'name':'value'}\")).toMatch(/\\{\\n  \"name\": ?\"value\"\\n}/);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n *\r\n */\r\nfunction jsonFilter() {\r\n  return function(object) {\r\n    return toJson(object, true);\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:lowercase\r\n * @function\r\n * @description\r\n * Converts string to lowercase.\r\n * @see angular.lowercase\r\n */\r\nvar lowercaseFilter = valueFn(lowercase);\r\n\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:uppercase\r\n * @function\r\n * @description\r\n * Converts string to uppercase.\r\n * @see angular.uppercase\r\n */\r\nvar uppercaseFilter = valueFn(uppercase);\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.filter:limitTo\r\n * @function\r\n *\r\n * @description\r\n * Creates a new array containing only a specified number of elements in an array. The elements\r\n * are taken from either the beginning or the end of the source array, as specified by the\r\n * value and sign (positive or negative) of `limit`.\r\n *\r\n * Note: This function is used to augment the `Array` type in Angular expressions. See\r\n * {@link ng.$filter} for more information about Angular arrays.\r\n *\r\n * @param {Array} array Source array to be limited.\r\n * @param {string|Number} limit The length of the returned array. If the `limit` number is\r\n *     positive, `limit` number of items from the beginning of the source array are copied.\r\n *     If the number is negative, `limit` number  of items from the end of the source array are\r\n *     copied. The `limit` will be trimmed if it exceeds `array.length`\r\n * @returns {Array} A new sub-array of length `limit` or less if input array had less than `limit`\r\n *     elements.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.numbers = [1,2,3,4,5,6,7,8,9];\r\n           $scope.limit = 3;\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         Limit {{numbers}} to: <input type=\"integer\" ng-model=\"limit\">\r\n         <p>Output: {{ numbers | limitTo:limit }}</p>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should limit the numer array to first three items', function() {\r\n         expect(element('.doc-example-live input[ng-model=limit]').val()).toBe('3');\r\n         expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3]');\r\n       });\r\n\r\n       it('should update the output when -3 is entered', function() {\r\n         input('limit').enter(-3);\r\n         expect(binding('numbers | limitTo:limit')).toEqual('[7,8,9]');\r\n       });\r\n\r\n       it('should not exceed the maximum size of input array', function() {\r\n         input('limit').enter(100);\r\n         expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3,4,5,6,7,8,9]');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nfunction limitToFilter(){\r\n  return function(array, limit) {\r\n    if (!(array instanceof Array)) return array;\r\n    limit = int(limit);\r\n    var out = [],\r\n      i, n;\r\n\r\n    // check that array is iterable\r\n    if (!array || !(array instanceof Array))\r\n      return out;\r\n\r\n    // if abs(limit) exceeds maximum length, trim it\r\n    if (limit > array.length)\r\n      limit = array.length;\r\n    else if (limit < -array.length)\r\n      limit = -array.length;\r\n\r\n    if (limit > 0) {\r\n      i = 0;\r\n      n = limit;\r\n    } else {\r\n      i = array.length + limit;\r\n      n = array.length;\r\n    }\r\n\r\n    for (; i<n; i++) {\r\n      out.push(array[i]);\r\n    }\r\n\r\n    return out;\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.filter:orderBy\r\n * @function\r\n *\r\n * @description\r\n * Orders a specified `array` by the `expression` predicate.\r\n *\r\n * Note: this function is used to augment the `Array` type in Angular expressions. See\r\n * {@link ng.$filter} for more informaton about Angular arrays.\r\n *\r\n * @param {Array} array The array to sort.\r\n * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be\r\n *    used by the comparator to determine the order of elements.\r\n *\r\n *    Can be one of:\r\n *\r\n *    - `function`: Getter function. The result of this function will be sorted using the\r\n *      `<`, `=`, `>` operator.\r\n *    - `string`: An Angular expression which evaluates to an object to order by, such as 'name'\r\n *      to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control\r\n *      ascending or descending sort order (for example, +name or -name).\r\n *    - `Array`: An array of function or string predicates. The first predicate in the array\r\n *      is used for sorting, but when two items are equivalent, the next predicate is used.\r\n *\r\n * @param {boolean=} reverse Reverse the order the array.\r\n * @returns {Array} Sorted copy of the source array.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.friends =\r\n               [{name:'John', phone:'555-1212', age:10},\r\n                {name:'Mary', phone:'555-9876', age:19},\r\n                {name:'Mike', phone:'555-4321', age:21},\r\n                {name:'Adam', phone:'555-5678', age:35},\r\n                {name:'Julie', phone:'555-8765', age:29}]\r\n           $scope.predicate = '-age';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\r\n         <hr/>\r\n         [ <a href=\"\" ng-click=\"predicate=''\">unsorted</a> ]\r\n         <table class=\"friend\">\r\n           <tr>\r\n             <th><a href=\"\" ng-click=\"predicate = 'name'; reverse=false\">Name</a>\r\n                 (<a href ng-click=\"predicate = '-name'; reverse=false\">^</a>)</th>\r\n             <th><a href=\"\" ng-click=\"predicate = 'phone'; reverse=!reverse\">Phone Number</a></th>\r\n             <th><a href=\"\" ng-click=\"predicate = 'age'; reverse=!reverse\">Age</a></th>\r\n           <tr>\r\n           <tr ng-repeat=\"friend in friends | orderBy:predicate:reverse\">\r\n             <td>{{friend.name}}</td>\r\n             <td>{{friend.phone}}</td>\r\n             <td>{{friend.age}}</td>\r\n           <tr>\r\n         </table>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should be reverse ordered by aged', function() {\r\n         expect(binding('predicate')).toBe('-age');\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.age')).\r\n           toEqual(['35', '29', '21', '19', '10']);\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.name')).\r\n           toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']);\r\n       });\r\n\r\n       it('should reorder the table when user selects different predicate', function() {\r\n         element('.doc-example-live a:contains(\"Name\")').click();\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.name')).\r\n           toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']);\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.age')).\r\n           toEqual(['35', '10', '29', '19', '21']);\r\n\r\n         element('.doc-example-live a:contains(\"Phone\")').click();\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.phone')).\r\n           toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']);\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.name')).\r\n           toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\norderByFilter.$inject = ['$parse'];\r\nfunction orderByFilter($parse){\r\n  return function(array, sortPredicate, reverseOrder) {\r\n    if (!(array instanceof Array)) return array;\r\n    if (!sortPredicate) return array;\r\n    sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];\r\n    sortPredicate = map(sortPredicate, function(predicate){\r\n      var descending = false, get = predicate || identity;\r\n      if (isString(predicate)) {\r\n        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {\r\n          descending = predicate.charAt(0) == '-';\r\n          predicate = predicate.substring(1);\r\n        }\r\n        get = $parse(predicate);\r\n      }\r\n      return reverseComparator(function(a,b){\r\n        return compare(get(a),get(b));\r\n      }, descending);\r\n    });\r\n    var arrayCopy = [];\r\n    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }\r\n    return arrayCopy.sort(reverseComparator(comparator, reverseOrder));\r\n\r\n    function comparator(o1, o2){\r\n      for ( var i = 0; i < sortPredicate.length; i++) {\r\n        var comp = sortPredicate[i](o1, o2);\r\n        if (comp !== 0) return comp;\r\n      }\r\n      return 0;\r\n    }\r\n    function reverseComparator(comp, descending) {\r\n      return toBoolean(descending)\r\n          ? function(a,b){return comp(b,a);}\r\n          : comp;\r\n    }\r\n    function compare(v1, v2){\r\n      var t1 = typeof v1;\r\n      var t2 = typeof v2;\r\n      if (t1 == t2) {\r\n        if (t1 == \"string\") v1 = v1.toLowerCase();\r\n        if (t1 == \"string\") v2 = v2.toLowerCase();\r\n        if (v1 === v2) return 0;\r\n        return v1 < v2 ? -1 : 1;\r\n      } else {\r\n        return t1 < t2 ? -1 : 1;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nfunction ngDirective(directive) {\r\n  if (isFunction(directive)) {\r\n    directive = {\r\n      link: directive\r\n    }\r\n  }\r\n  directive.restrict = directive.restrict || 'AC';\r\n  return valueFn(directive);\r\n}\r\n\r\n/*\r\n * Modifies the default behavior of html A tag, so that the default action is prevented when href\r\n * attribute is empty.\r\n *\r\n * The reasoning for this change is to allow easy creation of action links with `ngClick` directive\r\n * without changing the location or causing page reloads, e.g.:\r\n * <a href=\"\" ng-click=\"model.$save()\">Save</a>\r\n */\r\nvar htmlAnchorDirective = valueFn({\r\n  restrict: 'E',\r\n  compile: function(element, attr) {\r\n    // turn <a href ng-click=\"..\">link</a> into a link in IE\r\n    // but only if it doesn't have name attribute, in which case it's an anchor\r\n    if (!attr.href) {\r\n      attr.$set('href', '');\r\n    }\r\n\r\n    return function(scope, element) {\r\n      element.bind('click', function(event){\r\n        // if we have no href url, then don't navigate anywhere.\r\n        if (!element.attr('href')) {\r\n          event.preventDefault();\r\n        }\r\n      });\r\n    }\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngHref\r\n * @restrict A\r\n *\r\n * @description\r\n * Using Angular markup like {{hash}} in an href attribute makes\r\n * the page open to a wrong URL, if the user clicks that link before\r\n * angular has a chance to replace the {{hash}} with actual URL, the\r\n * link will be broken and will most likely return a 404 error.\r\n * The `ngHref` directive solves this problem.\r\n *\r\n * The buggy way to write it:\r\n * <pre>\r\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * The correct way to write it:\r\n * <pre>\r\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * @element A\r\n * @param {template} ngHref any string which can contain `{{}}` markup.\r\n *\r\n * @example\r\n * This example uses `link` variable inside `href` attribute:\r\n    <doc:example>\r\n      <doc:source>\r\n        <input ng-model=\"value\" /><br />\r\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\r\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\r\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\r\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\r\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\r\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should execute ng-click but not reload when href without value', function() {\r\n          element('#link-1').click();\r\n          expect(input('value').val()).toEqual('1');\r\n          expect(element('#link-1').attr('href')).toBe(\"\");\r\n        });\r\n\r\n        it('should execute ng-click but not reload when href empty string', function() {\r\n          element('#link-2').click();\r\n          expect(input('value').val()).toEqual('2');\r\n          expect(element('#link-2').attr('href')).toBe(\"\");\r\n        });\r\n\r\n        it('should execute ng-click and change url when ng-href specified', function() {\r\n          expect(element('#link-3').attr('href')).toBe(\"/123\");\r\n\r\n          element('#link-3').click();\r\n          expect(browser().window().path()).toEqual('/123');\r\n        });\r\n\r\n        it('should execute ng-click but not reload when href empty string and name specified', function() {\r\n          element('#link-4').click();\r\n          expect(input('value').val()).toEqual('4');\r\n          expect(element('#link-4').attr('href')).toBe('');\r\n        });\r\n\r\n        it('should execute ng-click but not reload when no href but name specified', function() {\r\n          element('#link-5').click();\r\n          expect(input('value').val()).toEqual('5');\r\n          expect(element('#link-5').attr('href')).toBe('');\r\n        });\r\n\r\n        it('should only change url when only ng-href', function() {\r\n          input('value').enter('6');\r\n          expect(element('#link-6').attr('href')).toBe('6');\r\n\r\n          element('#link-6').click();\r\n          expect(browser().location().url()).toEqual('/6');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSrc\r\n * @restrict A\r\n *\r\n * @description\r\n * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\r\n * work right: The browser will fetch from the URL with the literal\r\n * text `{{hash}}` until Angular replaces the expression inside\r\n * `{{hash}}`. The `ngSrc` directive solves this problem.\r\n *\r\n * The buggy way to write it:\r\n * <pre>\r\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * The correct way to write it:\r\n * <pre>\r\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * @element IMG\r\n * @param {template} ngSrc any string which can contain `{{}}` markup.\r\n */\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngDisabled\r\n * @restrict A\r\n *\r\n * @description\r\n *\r\n * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:\r\n * <pre>\r\n * <div ng-init=\"scope = { isDisabled: false }\">\r\n *  <button disabled=\"{{scope.isDisabled}}\">Disabled</button>\r\n * </div>\r\n * </pre>\r\n *\r\n * The HTML specs do not require browsers to preserve the special attributes such as disabled.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngDisabled` directive.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should toggle button', function() {\r\n          expect(element('.doc-example-live :button').prop('disabled')).toBeFalsy();\r\n          input('checked').check();\r\n          expect(element('.doc-example-live :button').prop('disabled')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element INPUT\r\n * @param {expression} ngDisabled Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngChecked\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as checked.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngChecked` directive.\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Check me to check both: <input type=\"checkbox\" ng-model=\"master\"><br/>\r\n        <input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\">\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should check both checkBoxes', function() {\r\n          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeFalsy();\r\n          input('master').check();\r\n          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element INPUT\r\n * @param {expression} ngChecked Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMultiple\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as multiple.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngMultiple` directive.\r\n *\r\n * @example\r\n     <doc:example>\r\n       <doc:source>\r\n         Check me check multiple: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n         <select id=\"select\" ng-multiple=\"checked\">\r\n           <option>Misko</option>\r\n           <option>Igor</option>\r\n           <option>Vojta</option>\r\n           <option>Di</option>\r\n         </select>\r\n       </doc:source>\r\n       <doc:scenario>\r\n         it('should toggle multiple', function() {\r\n           expect(element('.doc-example-live #select').prop('multiple')).toBeFalsy();\r\n           input('checked').check();\r\n           expect(element('.doc-example-live #select').prop('multiple')).toBeTruthy();\r\n         });\r\n       </doc:scenario>\r\n     </doc:example>\r\n *\r\n * @element SELECT\r\n * @param {expression} ngMultiple Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngReadonly\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as readonly.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngReadonly` directive.\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\"/>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should toggle readonly attr', function() {\r\n          expect(element('.doc-example-live :text').prop('readonly')).toBeFalsy();\r\n          input('checked').check();\r\n          expect(element('.doc-example-live :text').prop('readonly')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element INPUT\r\n * @param {string} expression Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSelected\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as selected.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduced the `ngSelected` directive.\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Check me to select: <input type=\"checkbox\" ng-model=\"selected\"><br/>\r\n        <select>\r\n          <option>Hello!</option>\r\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\r\n        </select>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should select Greetings!', function() {\r\n          expect(element('.doc-example-live #greet').prop('selected')).toBeFalsy();\r\n          input('selected').check();\r\n          expect(element('.doc-example-live #greet').prop('selected')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element OPTION\r\n * @param {string} expression Angular expression that will be evaluated.\r\n */\r\n\r\n\r\nvar ngAttributeAliasDirectives = {};\r\n\r\n\r\n// boolean attrs are evaluated\r\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\r\n  var normalized = directiveNormalize('ng-' + attrName);\r\n  ngAttributeAliasDirectives[normalized] = function() {\r\n    return {\r\n      priority: 100,\r\n      compile: function() {\r\n        return function(scope, element, attr) {\r\n          scope.$watch(attr[normalized], function(value) {\r\n            attr.$set(attrName, !!value);\r\n          });\r\n        };\r\n      }\r\n    };\r\n  };\r\n});\r\n\r\n\r\n// ng-src, ng-href are interpolated\r\nforEach(['src', 'href'], function(attrName) {\r\n  var normalized = directiveNormalize('ng-' + attrName);\r\n  ngAttributeAliasDirectives[normalized] = function() {\r\n    return {\r\n      priority: 99, // it needs to run after the attributes are interpolated\r\n      link: function(scope, element, attr) {\r\n        attr.$observe(normalized, function(value) {\r\n          attr.$set(attrName, value);\r\n\r\n          // on IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\r\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\r\n          // to set the property as well to achieve the desired effect\r\n          if (msie) element.prop(attrName, value);\r\n        });\r\n      }\r\n    };\r\n  };\r\n});\r\n\r\nvar nullFormCtrl = {\r\n  $addControl: noop,\r\n  $removeControl: noop,\r\n  $setValidity: noop,\r\n  $setDirty: noop\r\n};\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.directive:form.FormController\r\n *\r\n * @property {boolean} $pristine True if user has not interacted with the form yet.\r\n * @property {boolean} $dirty True if user has already interacted with the form.\r\n * @property {boolean} $valid True if all of the containg forms and controls are valid.\r\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\r\n *\r\n * @property {Object} $error Is an object hash, containing references to all invalid controls or\r\n *  forms, where:\r\n *\r\n *  - keys are validation tokens (error names) â€” such as `REQUIRED`, `URL` or `EMAIL`),\r\n *  - values are arrays of controls or forms that are invalid with given error.\r\n *\r\n * @description\r\n * `FormController` keeps track of all its controls and nested forms as well as state of them,\r\n * such as being valid/invalid or dirty/pristine.\r\n *\r\n * Each {@link ng.directive:form form} directive creates an instance\r\n * of `FormController`.\r\n *\r\n */\r\n//asks for $scope to fool the BC controller module\r\nFormController.$inject = ['$element', '$attrs', '$scope'];\r\nfunction FormController(element, attrs) {\r\n  var form = this,\r\n      parentForm = element.parent().controller('form') || nullFormCtrl,\r\n      invalidCount = 0, // used to easily determine if we are valid\r\n      errors = form.$error = {};\r\n\r\n  // init state\r\n  form.$name = attrs.name;\r\n  form.$dirty = false;\r\n  form.$pristine = true;\r\n  form.$valid = true;\r\n  form.$invalid = false;\r\n\r\n  parentForm.$addControl(form);\r\n\r\n  // Setup initial state of the control\r\n  element.addClass(PRISTINE_CLASS);\r\n  toggleValidCss(true);\r\n\r\n  // convenience method for easy toggling of classes\r\n  function toggleValidCss(isValid, validationErrorKey) {\r\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\r\n    element.\r\n      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).\r\n      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\r\n  }\r\n\r\n  form.$addControl = function(control) {\r\n    if (control.$name && !form.hasOwnProperty(control.$name)) {\r\n      form[control.$name] = control;\r\n    }\r\n  };\r\n\r\n  form.$removeControl = function(control) {\r\n    if (control.$name && form[control.$name] === control) {\r\n      delete form[control.$name];\r\n    }\r\n    forEach(errors, function(queue, validationToken) {\r\n      form.$setValidity(validationToken, true, control);\r\n    });\r\n  };\r\n\r\n  form.$setValidity = function(validationToken, isValid, control) {\r\n    var queue = errors[validationToken];\r\n\r\n    if (isValid) {\r\n      if (queue) {\r\n        arrayRemove(queue, control);\r\n        if (!queue.length) {\r\n          invalidCount--;\r\n          if (!invalidCount) {\r\n            toggleValidCss(isValid);\r\n            form.$valid = true;\r\n            form.$invalid = false;\r\n          }\r\n          errors[validationToken] = false;\r\n          toggleValidCss(true, validationToken);\r\n          parentForm.$setValidity(validationToken, true, form);\r\n        }\r\n      }\r\n\r\n    } else {\r\n      if (!invalidCount) {\r\n        toggleValidCss(isValid);\r\n      }\r\n      if (queue) {\r\n        if (includes(queue, control)) return;\r\n      } else {\r\n        errors[validationToken] = queue = [];\r\n        invalidCount++;\r\n        toggleValidCss(false, validationToken);\r\n        parentForm.$setValidity(validationToken, false, form);\r\n      }\r\n      queue.push(control);\r\n\r\n      form.$valid = false;\r\n      form.$invalid = true;\r\n    }\r\n  };\r\n\r\n  form.$setDirty = function() {\r\n    element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);\r\n    form.$dirty = true;\r\n    form.$pristine = false;\r\n  };\r\n\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngForm\r\n * @restrict EAC\r\n *\r\n * @description\r\n * Nestable alias of {@link ng.directive:form `form`} directive. HTML\r\n * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\r\n * sub-group of controls needs to be determined.\r\n *\r\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\r\n *                       related scope, under this name.\r\n *\r\n */\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ng.directive:form\r\n * @restrict E\r\n *\r\n * @description\r\n * Directive that instantiates\r\n * {@link ng.directive:form.FormController FormController}.\r\n *\r\n * If `name` attribute is specified, the form controller is published onto the current scope under\r\n * this name.\r\n *\r\n * # Alias: {@link ng.directive:ngForm `ngForm`}\r\n *\r\n * In angular forms can be nested. This means that the outer form is valid when all of the child\r\n * forms are valid as well. However browsers do not allow nesting of `<form>` elements, for this\r\n * reason angular provides {@link ng.directive:ngForm `ngForm`} alias\r\n * which behaves identical to `<form>` but allows form nesting.\r\n *\r\n *\r\n * # CSS classes\r\n *  - `ng-valid` Is set if the form is valid.\r\n *  - `ng-invalid` Is set if the form is invalid.\r\n *  - `ng-pristine` Is set if the form is pristine.\r\n *  - `ng-dirty` Is set if the form is dirty.\r\n *\r\n *\r\n * # Submitting a form and preventing default action\r\n *\r\n * Since the role of forms in client-side Angular applications is different than in classical\r\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\r\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\r\n * to handle the form submission in application specific way.\r\n *\r\n * For this reason, Angular prevents the default action (form submission to the server) unless the\r\n * `<form>` element has an `action` attribute specified.\r\n *\r\n * You can use one of the following two ways to specify what javascript method should be called when\r\n * a form is submitted:\r\n *\r\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\r\n * - {@link ng.directive:ngClick ngClick} directive on the first\r\n  *  button or input field of type submit (input[type=submit])\r\n *\r\n * To prevent double execution of the handler, use only one of ngSubmit or ngClick directives. This\r\n * is because of the following form submission rules coming from the html spec:\r\n *\r\n * - If a form has only one input field then hitting enter in this field triggers form submit\r\n * (`ngSubmit`)\r\n * - if a form has has 2+ input fields and no buttons or input[type=submit] then hitting enter\r\n * doesn't trigger submit\r\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\r\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\r\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\r\n *\r\n * @param {string=} name Name of the form. If specified, the form controller will be published into\r\n *                       related scope, under this name.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.userType = 'guest';\r\n         }\r\n       </script>\r\n       <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n         userType: <input name=\"input\" ng-model=\"userType\" required>\r\n         <span class=\"error\" ng-show=\"myForm.input.$error.REQUIRED\">Required!</span><br>\r\n         <tt>userType = {{userType}}</tt><br>\r\n         <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>\r\n         <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>\r\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\r\n         <tt>myForm.$error.REQUIRED = {{!!myForm.$error.REQUIRED}}</tt><br>\r\n        </form>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should initialize to model', function() {\r\n         expect(binding('userType')).toEqual('guest');\r\n         expect(binding('myForm.input.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if empty', function() {\r\n         input('userType').enter('');\r\n         expect(binding('userType')).toEqual('');\r\n         expect(binding('myForm.input.$valid')).toEqual('false');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar formDirectiveDir = {\r\n  name: 'form',\r\n  restrict: 'E',\r\n  controller: FormController,\r\n  compile: function() {\r\n    return {\r\n      pre: function(scope, formElement, attr, controller) {\r\n        if (!attr.action) {\r\n          formElement.bind('submit', function(event) {\r\n            event.preventDefault();\r\n          });\r\n        }\r\n\r\n        var parentFormCtrl = formElement.parent().controller('form'),\r\n            alias = attr.name || attr.ngForm;\r\n\r\n        if (alias) {\r\n          scope[alias] = controller;\r\n        }\r\n        if (parentFormCtrl) {\r\n          formElement.bind('$destroy', function() {\r\n            parentFormCtrl.$removeControl(controller);\r\n            if (alias) {\r\n              scope[alias] = undefined;\r\n            }\r\n            extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\r\n          });\r\n        }\r\n      }\r\n    };\r\n  }\r\n};\r\n\r\nvar formDirective = valueFn(formDirectiveDir);\r\nvar ngFormDirective = valueFn(extend(copy(formDirectiveDir), {restrict: 'EAC'}));\r\n\r\nvar URL_REGEXP = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/;\r\nvar EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$/;\r\nvar NUMBER_REGEXP = /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/;\r\n\r\nvar inputType = {\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.text\r\n   *\r\n   * @description\r\n   * Standard HTML text input with angular data binding.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.text = 'guest';\r\n             $scope.word = /^\\w*$/;\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           Single word: <input type=\"text\" name=\"input\" ng-model=\"text\"\r\n                               ng-pattern=\"word\" required>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n             Required!</span>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\r\n             Single word only!</span>\r\n\r\n           <tt>text = {{text}}</tt><br/>\r\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n            expect(binding('text')).toEqual('guest');\r\n            expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n            input('text').enter('');\r\n            expect(binding('text')).toEqual('');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if multi word', function() {\r\n            input('text').enter('hello world');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'text': textInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.number\r\n   *\r\n   * @description\r\n   * Text input with number validation and transformation. Sets the `number` validation\r\n   * error if not a valid number.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} min Sets the `min` validation error key if the value entered is less then `min`.\r\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater then `min`.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.value = 12;\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           Number: <input type=\"number\" name=\"input\" ng-model=\"value\"\r\n                          min=\"0\" max=\"99\" required>\r\n           <span class=\"error\" ng-show=\"myForm.list.$error.required\">\r\n             Required!</span>\r\n           <span class=\"error\" ng-show=\"myForm.list.$error.number\">\r\n             Not valid number!</span>\r\n           <tt>value = {{value}}</tt><br/>\r\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n           expect(binding('value')).toEqual('12');\r\n           expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n           input('value').enter('');\r\n           expect(binding('value')).toEqual('');\r\n           expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if over max', function() {\r\n           input('value').enter('123');\r\n           expect(binding('value')).toEqual('');\r\n           expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'number': numberInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.url\r\n   *\r\n   * @description\r\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\r\n   * valid URL.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.text = 'http://google.com';\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           URL: <input type=\"url\" name=\"input\" ng-model=\"text\" required>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n             Required!</span>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.url\">\r\n             Not valid url!</span>\r\n           <tt>text = {{text}}</tt><br/>\r\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n            expect(binding('text')).toEqual('http://google.com');\r\n            expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n            input('text').enter('');\r\n            expect(binding('text')).toEqual('');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if not url', function() {\r\n            input('text').enter('xxx');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'url': urlInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.email\r\n   *\r\n   * @description\r\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\r\n   * address.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.text = 'me@example.com';\r\n           }\r\n         </script>\r\n           <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n             Email: <input type=\"email\" name=\"input\" ng-model=\"text\" required>\r\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n               Required!</span>\r\n             <span class=\"error\" ng-show=\"myForm.input.$error.email\">\r\n               Not valid email!</span>\r\n             <tt>text = {{text}}</tt><br/>\r\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\r\n           </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n            expect(binding('text')).toEqual('me@example.com');\r\n            expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n            input('text').enter('');\r\n            expect(binding('text')).toEqual('');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if not email', function() {\r\n            input('text').enter('xxx');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'email': emailInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.radio\r\n   *\r\n   * @description\r\n   * HTML radio button.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string} value The value to which the expression should be set when selected.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.color = 'blue';\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           <input type=\"radio\" ng-model=\"color\" value=\"red\">  Red <br/>\r\n           <input type=\"radio\" ng-model=\"color\" value=\"green\"> Green <br/>\r\n           <input type=\"radio\" ng-model=\"color\" value=\"blue\"> Blue <br/>\r\n           <tt>color = {{color}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should change state', function() {\r\n            expect(binding('color')).toEqual('blue');\r\n\r\n            input('color').select('red');\r\n            expect(binding('color')).toEqual('red');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'radio': radioInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.checkbox\r\n   *\r\n   * @description\r\n   * HTML checkbox.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} ngTrueValue The value to which the expression should be set when selected.\r\n   * @param {string=} ngFalseValue The value to which the expression should be set when not selected.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.value1 = true;\r\n             $scope.value2 = 'YES'\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           Value1: <input type=\"checkbox\" ng-model=\"value1\"> <br/>\r\n           Value2: <input type=\"checkbox\" ng-model=\"value2\"\r\n                          ng-true-value=\"YES\" ng-false-value=\"NO\"> <br/>\r\n           <tt>value1 = {{value1}}</tt><br/>\r\n           <tt>value2 = {{value2}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should change state', function() {\r\n            expect(binding('value1')).toEqual('true');\r\n            expect(binding('value2')).toEqual('YES');\r\n\r\n            input('value1').check();\r\n            input('value2').check();\r\n            expect(binding('value1')).toEqual('false');\r\n            expect(binding('value2')).toEqual('NO');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'checkbox': checkboxInputType,\r\n\r\n  'hidden': noop,\r\n  'button': noop,\r\n  'submit': noop,\r\n  'reset': noop\r\n};\r\n\r\n\r\nfunction isEmpty(value) {\r\n  return isUndefined(value) || value === '' || value === null || value !== value;\r\n}\r\n\r\n\r\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n\r\n  var listener = function() {\r\n    var value = trim(element.val());\r\n\r\n    if (ctrl.$viewValue !== value) {\r\n      scope.$apply(function() {\r\n        ctrl.$setViewValue(value);\r\n      });\r\n    }\r\n  };\r\n\r\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\r\n  // input event on backspace, delete or cut\r\n  if ($sniffer.hasEvent('input')) {\r\n    element.bind('input', listener);\r\n  } else {\r\n    var timeout;\r\n\r\n    element.bind('keydown', function(event) {\r\n      var key = event.keyCode;\r\n\r\n      // ignore\r\n      //    command            modifiers                   arrows\r\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\r\n\r\n      if (!timeout) {\r\n        timeout = $browser.defer(function() {\r\n          listener();\r\n          timeout = null;\r\n        });\r\n      }\r\n    });\r\n\r\n    // if user paste into input using mouse, we need \"change\" event to catch it\r\n    element.bind('change', listener);\r\n  }\r\n\r\n\r\n  ctrl.$render = function() {\r\n    element.val(isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);\r\n  };\r\n\r\n  // pattern validator\r\n  var pattern = attr.ngPattern,\r\n      patternValidator;\r\n\r\n  var validate = function(regexp, value) {\r\n    if (isEmpty(value) || regexp.test(value)) {\r\n      ctrl.$setValidity('pattern', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('pattern', false);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  if (pattern) {\r\n    if (pattern.match(/^\\/(.*)\\/$/)) {\r\n      pattern = new RegExp(pattern.substr(1, pattern.length - 2));\r\n      patternValidator = function(value) {\r\n        return validate(pattern, value)\r\n      };\r\n    } else {\r\n      patternValidator = function(value) {\r\n        var patternObj = scope.$eval(pattern);\r\n\r\n        if (!patternObj || !patternObj.test) {\r\n          throw new Error('Expected ' + pattern + ' to be a RegExp but was ' + patternObj);\r\n        }\r\n        return validate(patternObj, value);\r\n      };\r\n    }\r\n\r\n    ctrl.$formatters.push(patternValidator);\r\n    ctrl.$parsers.push(patternValidator);\r\n  }\r\n\r\n  // min length validator\r\n  if (attr.ngMinlength) {\r\n    var minlength = int(attr.ngMinlength);\r\n    var minLengthValidator = function(value) {\r\n      if (!isEmpty(value) && value.length < minlength) {\r\n        ctrl.$setValidity('minlength', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('minlength', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(minLengthValidator);\r\n    ctrl.$formatters.push(minLengthValidator);\r\n  }\r\n\r\n  // max length validator\r\n  if (attr.ngMaxlength) {\r\n    var maxlength = int(attr.ngMaxlength);\r\n    var maxLengthValidator = function(value) {\r\n      if (!isEmpty(value) && value.length > maxlength) {\r\n        ctrl.$setValidity('maxlength', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('maxlength', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(maxLengthValidator);\r\n    ctrl.$formatters.push(maxLengthValidator);\r\n  }\r\n}\r\n\r\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n  ctrl.$parsers.push(function(value) {\r\n    var empty = isEmpty(value);\r\n    if (empty || NUMBER_REGEXP.test(value)) {\r\n      ctrl.$setValidity('number', true);\r\n      return value === '' ? null : (empty ? value : parseFloat(value));\r\n    } else {\r\n      ctrl.$setValidity('number', false);\r\n      return undefined;\r\n    }\r\n  });\r\n\r\n  ctrl.$formatters.push(function(value) {\r\n    return isEmpty(value) ? '' : '' + value;\r\n  });\r\n\r\n  if (attr.min) {\r\n    var min = parseFloat(attr.min);\r\n    var minValidator = function(value) {\r\n      if (!isEmpty(value) && value < min) {\r\n        ctrl.$setValidity('min', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('min', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(minValidator);\r\n    ctrl.$formatters.push(minValidator);\r\n  }\r\n\r\n  if (attr.max) {\r\n    var max = parseFloat(attr.max);\r\n    var maxValidator = function(value) {\r\n      if (!isEmpty(value) && value > max) {\r\n        ctrl.$setValidity('max', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('max', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(maxValidator);\r\n    ctrl.$formatters.push(maxValidator);\r\n  }\r\n\r\n  ctrl.$formatters.push(function(value) {\r\n\r\n    if (isEmpty(value) || isNumber(value)) {\r\n      ctrl.$setValidity('number', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('number', false);\r\n      return undefined;\r\n    }\r\n  });\r\n}\r\n\r\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n  var urlValidator = function(value) {\r\n    if (isEmpty(value) || URL_REGEXP.test(value)) {\r\n      ctrl.$setValidity('url', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('url', false);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  ctrl.$formatters.push(urlValidator);\r\n  ctrl.$parsers.push(urlValidator);\r\n}\r\n\r\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n  var emailValidator = function(value) {\r\n    if (isEmpty(value) || EMAIL_REGEXP.test(value)) {\r\n      ctrl.$setValidity('email', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('email', false);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  ctrl.$formatters.push(emailValidator);\r\n  ctrl.$parsers.push(emailValidator);\r\n}\r\n\r\nfunction radioInputType(scope, element, attr, ctrl) {\r\n  // make the name unique, if not defined\r\n  if (isUndefined(attr.name)) {\r\n    element.attr('name', nextUid());\r\n  }\r\n\r\n  element.bind('click', function() {\r\n    if (element[0].checked) {\r\n      scope.$apply(function() {\r\n        ctrl.$setViewValue(attr.value);\r\n      });\r\n    }\r\n  });\r\n\r\n  ctrl.$render = function() {\r\n    var value = attr.value;\r\n    element[0].checked = (value == ctrl.$viewValue);\r\n  };\r\n\r\n  attr.$observe('value', ctrl.$render);\r\n}\r\n\r\nfunction checkboxInputType(scope, element, attr, ctrl) {\r\n  var trueValue = attr.ngTrueValue,\r\n      falseValue = attr.ngFalseValue;\r\n\r\n  if (!isString(trueValue)) trueValue = true;\r\n  if (!isString(falseValue)) falseValue = false;\r\n\r\n  element.bind('click', function() {\r\n    scope.$apply(function() {\r\n      ctrl.$setViewValue(element[0].checked);\r\n    });\r\n  });\r\n\r\n  ctrl.$render = function() {\r\n    element[0].checked = ctrl.$viewValue;\r\n  };\r\n\r\n  ctrl.$formatters.push(function(value) {\r\n    return value === trueValue;\r\n  });\r\n\r\n  ctrl.$parsers.push(function(value) {\r\n    return value ? trueValue : falseValue;\r\n  });\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:textarea\r\n * @restrict E\r\n *\r\n * @description\r\n * HTML textarea element control with angular data-binding. The data-binding and validation\r\n * properties of this element are exactly the same as those of the\r\n * {@link ng.directive:input input element}.\r\n *\r\n * @param {string} ngModel Assignable angular expression to data-bind to.\r\n * @param {string=} name Property name of the form under which the control is published.\r\n * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n *    minlength.\r\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n *    maxlength.\r\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n *    patterns defined as scope expressions.\r\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n *    interaction with the input element.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:input\r\n * @restrict E\r\n *\r\n * @description\r\n * HTML input element control with angular data-binding. Input control follows HTML5 input types\r\n * and polyfills the HTML5 validation behavior for older browsers.\r\n *\r\n * @param {string} ngModel Assignable angular expression to data-bind to.\r\n * @param {string=} name Property name of the form under which the control is published.\r\n * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n *    minlength.\r\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n *    maxlength.\r\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n *    patterns defined as scope expressions.\r\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n *    interaction with the input element.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.user = {name: 'guest', last: 'visitor'};\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <form name=\"myForm\">\r\n           User name: <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\r\n           <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\r\n             Required!</span><br>\r\n           Last name: <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\r\n             ng-minlength=\"3\" ng-maxlength=\"10\">\r\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\r\n             Too short!</span>\r\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\r\n             Too long!</span><br>\r\n         </form>\r\n         <hr>\r\n         <tt>user = {{user}}</tt><br/>\r\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>\r\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>\r\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>\r\n         <tt>myForm.userName.$error = {{myForm.lastName.$error}}</tt><br>\r\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\r\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\r\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>\r\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>\r\n       </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should initialize to model', function() {\r\n          expect(binding('user')).toEqual('{\"name\":\"guest\",\"last\":\"visitor\"}');\r\n          expect(binding('myForm.userName.$valid')).toEqual('true');\r\n          expect(binding('myForm.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if empty when required', function() {\r\n          input('user.name').enter('');\r\n          expect(binding('user')).toEqual('{\"last\":\"visitor\"}');\r\n          expect(binding('myForm.userName.$valid')).toEqual('false');\r\n          expect(binding('myForm.$valid')).toEqual('false');\r\n        });\r\n\r\n        it('should be valid if empty when min length is set', function() {\r\n          input('user.last').enter('');\r\n          expect(binding('user')).toEqual('{\"name\":\"guest\",\"last\":\"\"}');\r\n          expect(binding('myForm.lastName.$valid')).toEqual('true');\r\n          expect(binding('myForm.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if less than required min length', function() {\r\n          input('user.last').enter('xx');\r\n          expect(binding('user')).toEqual('{\"name\":\"guest\"}');\r\n          expect(binding('myForm.lastName.$valid')).toEqual('false');\r\n          expect(binding('myForm.lastName.$error')).toMatch(/minlength/);\r\n          expect(binding('myForm.$valid')).toEqual('false');\r\n        });\r\n\r\n        it('should be invalid if longer than max length', function() {\r\n          input('user.last').enter('some ridiculously long name');\r\n          expect(binding('user'))\r\n            .toEqual('{\"name\":\"guest\"}');\r\n          expect(binding('myForm.lastName.$valid')).toEqual('false');\r\n          expect(binding('myForm.lastName.$error')).toMatch(/maxlength/);\r\n          expect(binding('myForm.$valid')).toEqual('false');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) {\r\n  return {\r\n    restrict: 'E',\r\n    require: '?ngModel',\r\n    link: function(scope, element, attr, ctrl) {\r\n      if (ctrl) {\r\n        (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer,\r\n                                                            $browser);\r\n      }\r\n    }\r\n  };\r\n}];\r\n\r\nvar VALID_CLASS = 'ng-valid',\r\n    INVALID_CLASS = 'ng-invalid',\r\n    PRISTINE_CLASS = 'ng-pristine',\r\n    DIRTY_CLASS = 'ng-dirty';\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.directive:ngModel.NgModelController\r\n *\r\n * @property {string} $viewValue Actual string value in the view.\r\n * @property {*} $modelValue The value in the model, that the control is bound to.\r\n * @property {Array.<Function>} $parsers Whenever the control reads value from the DOM, it executes\r\n *     all of these functions to sanitize / convert the value as well as validate.\r\n *\r\n * @property {Array.<Function>} $formatters Whenever the model value changes, it executes all of\r\n *     these functions to convert the value as well as validate.\r\n *\r\n * @property {Object} $error An bject hash with all errors as keys.\r\n *\r\n * @property {boolean} $pristine True if user has not interacted with the control yet.\r\n * @property {boolean} $dirty True if user has already interacted with the control.\r\n * @property {boolean} $valid True if there is no error.\r\n * @property {boolean} $invalid True if at least one error on the control.\r\n *\r\n * @description\r\n *\r\n * `NgModelController` provides API for the `ng-model` directive. The controller contains\r\n * services for data-binding, validation, CSS update, value formatting and parsing. It\r\n * specifically does not contain any logic which deals with DOM rendering or listening to\r\n * DOM events. The `NgModelController` is meant to be extended by other directives where, the\r\n * directive provides DOM manipulation and the `NgModelController` provides the data-binding.\r\n *\r\n * This example shows how to use `NgModelController` with a custom control to achieve\r\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\r\n * collaborate together to achieve the desired result.\r\n *\r\n * <example module=\"customControl\">\r\n    <file name=\"style.css\">\r\n      [contenteditable] {\r\n        border: 1px solid black;\r\n        background-color: white;\r\n        min-height: 20px;\r\n      }\r\n\r\n      .ng-invalid {\r\n        border: 1px solid red;\r\n      }\r\n\r\n    </file>\r\n    <file name=\"script.js\">\r\n      angular.module('customControl', []).\r\n        directive('contenteditable', function() {\r\n          return {\r\n            restrict: 'A', // only activate on element attribute\r\n            require: '?ngModel', // get a hold of NgModelController\r\n            link: function(scope, element, attrs, ngModel) {\r\n              if(!ngModel) return; // do nothing if no ng-model\r\n\r\n              // Specify how UI should be updated\r\n              ngModel.$render = function() {\r\n                element.html(ngModel.$viewValue || '');\r\n              };\r\n\r\n              // Listen for change events to enable binding\r\n              element.bind('blur keyup change', function() {\r\n                scope.$apply(read);\r\n              });\r\n              read(); // initialize\r\n\r\n              // Write data to the model\r\n              function read() {\r\n                ngModel.$setViewValue(element.html());\r\n              }\r\n            }\r\n          };\r\n        });\r\n    </file>\r\n    <file name=\"index.html\">\r\n      <form name=\"myForm\">\r\n       <div contenteditable\r\n            name=\"myWidget\" ng-model=\"userContent\"\r\n            required>Change me!</div>\r\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\r\n       <hr>\r\n       <textarea ng-model=\"userContent\"></textarea>\r\n      </form>\r\n    </file>\r\n    <file name=\"scenario.js\">\r\n      it('should data-bind and become invalid', function() {\r\n        var contentEditable = element('[contenteditable]');\r\n\r\n        expect(contentEditable.text()).toEqual('Change me!');\r\n        input('userContent').enter('');\r\n        expect(contentEditable.text()).toEqual('');\r\n        expect(contentEditable.prop('className')).toMatch(/ng-invalid-required/);\r\n      });\r\n    </file>\r\n * </example>\r\n *\r\n */\r\nvar NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse',\r\n    function($scope, $exceptionHandler, $attr, $element, $parse) {\r\n  this.$viewValue = Number.NaN;\r\n  this.$modelValue = Number.NaN;\r\n  this.$parsers = [];\r\n  this.$formatters = [];\r\n  this.$viewChangeListeners = [];\r\n  this.$pristine = true;\r\n  this.$dirty = false;\r\n  this.$valid = true;\r\n  this.$invalid = false;\r\n  this.$name = $attr.name;\r\n\r\n  var ngModelGet = $parse($attr.ngModel),\r\n      ngModelSet = ngModelGet.assign;\r\n\r\n  if (!ngModelSet) {\r\n    throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + $attr.ngModel +\r\n        ' (' + startingTag($element) + ')');\r\n  }\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.directive:ngModel.NgModelController#$render\r\n   * @methodOf ng.directive:ngModel.NgModelController\r\n   *\r\n   * @description\r\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\r\n   * directive will implement this method.\r\n   */\r\n  this.$render = noop;\r\n\r\n  var parentForm = $element.inheritedData('$formController') || nullFormCtrl,\r\n      invalidCount = 0, // used to easily determine if we are valid\r\n      $error = this.$error = {}; // keep invalid keys here\r\n\r\n\r\n  // Setup initial state of the control\r\n  $element.addClass(PRISTINE_CLASS);\r\n  toggleValidCss(true);\r\n\r\n  // convenience method for easy toggling of classes\r\n  function toggleValidCss(isValid, validationErrorKey) {\r\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\r\n    $element.\r\n      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).\r\n      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\r\n  }\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.directive:ngModel.NgModelController#$setValidity\r\n   * @methodOf ng.directive:ngModel.NgModelController\r\n   *\r\n   * @description\r\n   * Change the validity state, and notifies the form when the control changes validity. (i.e. it\r\n   * does not notify form if given validator is already marked as invalid).\r\n   *\r\n   * This method should be called by validators - i.e. the parser or formatter functions.\r\n   *\r\n   * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign\r\n   *        to `$error[validationErrorKey]=isValid` so that it is available for data-binding.\r\n   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\r\n   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\r\n   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .\r\n   * @param {boolean} isValid Whether the current state is valid (true) or invalid (false).\r\n   */\r\n  this.$setValidity = function(validationErrorKey, isValid) {\r\n    if ($error[validationErrorKey] === !isValid) return;\r\n\r\n    if (isValid) {\r\n      if ($error[validationErrorKey]) invalidCount--;\r\n      if (!invalidCount) {\r\n        toggleValidCss(true);\r\n        this.$valid = true;\r\n        this.$invalid = false;\r\n      }\r\n    } else {\r\n      toggleValidCss(false);\r\n      this.$invalid = true;\r\n      this.$valid = false;\r\n      invalidCount++;\r\n    }\r\n\r\n    $error[validationErrorKey] = !isValid;\r\n    toggleValidCss(isValid, validationErrorKey);\r\n\r\n    parentForm.$setValidity(validationErrorKey, isValid, this);\r\n  };\r\n\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.directive:ngModel.NgModelController#$setViewValue\r\n   * @methodOf ng.directive:ngModel.NgModelController\r\n   *\r\n   * @description\r\n   * Read a value from view.\r\n   *\r\n   * This method should be called from within a DOM event handler.\r\n   * For example {@link ng.directive:input input} or\r\n   * {@link ng.directive:select select} directives call it.\r\n   *\r\n   * It internally calls all `formatters` and if resulted value is valid, updates the model and\r\n   * calls all registered change listeners.\r\n   *\r\n   * @param {string} value Value from the view.\r\n   */\r\n  this.$setViewValue = function(value) {\r\n    this.$viewValue = value;\r\n\r\n    // change to dirty\r\n    if (this.$pristine) {\r\n      this.$dirty = true;\r\n      this.$pristine = false;\r\n      $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);\r\n      parentForm.$setDirty();\r\n    }\r\n\r\n    forEach(this.$parsers, function(fn) {\r\n      value = fn(value);\r\n    });\r\n\r\n    if (this.$modelValue !== value) {\r\n      this.$modelValue = value;\r\n      ngModelSet($scope, value);\r\n      forEach(this.$viewChangeListeners, function(listener) {\r\n        try {\r\n          listener();\r\n        } catch(e) {\r\n          $exceptionHandler(e);\r\n        }\r\n      })\r\n    }\r\n  };\r\n\r\n  // model -> value\r\n  var ctrl = this;\r\n  $scope.$watch(ngModelGet, function(value) {\r\n\r\n    // ignore change from view\r\n    if (ctrl.$modelValue === value) return;\r\n\r\n    var formatters = ctrl.$formatters,\r\n        idx = formatters.length;\r\n\r\n    ctrl.$modelValue = value;\r\n    while(idx--) {\r\n      value = formatters[idx](value);\r\n    }\r\n\r\n    if (ctrl.$viewValue !== value) {\r\n      ctrl.$viewValue = value;\r\n      ctrl.$render();\r\n    }\r\n  });\r\n}];\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngModel\r\n *\r\n * @element input\r\n *\r\n * @description\r\n * Is directive that tells Angular to do two-way data binding. It works together with `input`,\r\n * `select`, `textarea`. You can easily write your own directives to use `ngModel` as well.\r\n *\r\n * `ngModel` is responsible for:\r\n *\r\n * - binding the view into the model, which other directives such as `input`, `textarea` or `select`\r\n *   require,\r\n * - providing validation behavior (i.e. required, number, email, url),\r\n * - keeping state of the control (valid/invalid, dirty/pristine, validation errors),\r\n * - setting related css class onto the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`),\r\n * - register the control with parent {@link ng.directive:form form}.\r\n *\r\n * For basic examples, how to use `ngModel`, see:\r\n *\r\n *  - {@link ng.directive:input input}\r\n *    - {@link ng.directive:input.text text}\r\n *    - {@link ng.directive:input.checkbox checkbox}\r\n *    - {@link ng.directive:input.radio radio}\r\n *    - {@link ng.directive:input.number number}\r\n *    - {@link ng.directive:input.email email}\r\n *    - {@link ng.directive:input.url url}\r\n *  - {@link ng.directive:select select}\r\n *  - {@link ng.directive:textarea textarea}\r\n *\r\n */\r\nvar ngModelDirective = function() {\r\n  return {\r\n    require: ['ngModel', '^?form'],\r\n    controller: NgModelController,\r\n    link: function(scope, element, attr, ctrls) {\r\n      // notify others, especially parent forms\r\n\r\n      var modelCtrl = ctrls[0],\r\n          formCtrl = ctrls[1] || nullFormCtrl;\r\n\r\n      formCtrl.$addControl(modelCtrl);\r\n\r\n      element.bind('$destroy', function() {\r\n        formCtrl.$removeControl(modelCtrl);\r\n      });\r\n    }\r\n  };\r\n};\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngChange\r\n * @restrict E\r\n *\r\n * @description\r\n * Evaluate given expression when user changes the input.\r\n * The expression is not evaluated when the value change is coming from the model.\r\n *\r\n * Note, this directive requires `ngModel` to be present.\r\n *\r\n * @element input\r\n *\r\n * @example\r\n * <doc:example>\r\n *   <doc:source>\r\n *     <script>\r\n *       function Controller($scope) {\r\n *         $scope.counter = 0;\r\n *         $scope.change = function() {\r\n *           $scope.counter++;\r\n *         };\r\n *       }\r\n *     </script>\r\n *     <div ng-controller=\"Controller\">\r\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\r\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\r\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\r\n *       debug = {{confirmed}}<br />\r\n *       counter = {{counter}}\r\n *     </div>\r\n *   </doc:source>\r\n *   <doc:scenario>\r\n *     it('should evaluate the expression if changing from view', function() {\r\n *       expect(binding('counter')).toEqual('0');\r\n *       element('#ng-change-example1').click();\r\n *       expect(binding('counter')).toEqual('1');\r\n *       expect(binding('confirmed')).toEqual('true');\r\n *     });\r\n *\r\n *     it('should not evaluate the expression if changing from model', function() {\r\n *       element('#ng-change-example2').click();\r\n *       expect(binding('counter')).toEqual('0');\r\n *       expect(binding('confirmed')).toEqual('true');\r\n *     });\r\n *   </doc:scenario>\r\n * </doc:example>\r\n */\r\nvar ngChangeDirective = valueFn({\r\n  require: 'ngModel',\r\n  link: function(scope, element, attr, ctrl) {\r\n    ctrl.$viewChangeListeners.push(function() {\r\n      scope.$eval(attr.ngChange);\r\n    });\r\n  }\r\n});\r\n\r\n\r\nvar requiredDirective = function() {\r\n  return {\r\n    require: '?ngModel',\r\n    link: function(scope, elm, attr, ctrl) {\r\n      if (!ctrl) return;\r\n      attr.required = true; // force truthy in case we are on non input element\r\n\r\n      var validator = function(value) {\r\n        if (attr.required && (isEmpty(value) || value === false)) {\r\n          ctrl.$setValidity('required', false);\r\n          return;\r\n        } else {\r\n          ctrl.$setValidity('required', true);\r\n          return value;\r\n        }\r\n      };\r\n\r\n      ctrl.$formatters.push(validator);\r\n      ctrl.$parsers.unshift(validator);\r\n\r\n      attr.$observe('required', function() {\r\n        validator(ctrl.$viewValue);\r\n      });\r\n    }\r\n  };\r\n};\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngList\r\n *\r\n * @description\r\n * Text input that converts between comma-seperated string into an array of strings.\r\n *\r\n * @element input\r\n * @param {string=} ngList optional delimiter that should be used to split the value. If\r\n *   specified in form `/something/` then the value will be converted into a regular expression.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.names = ['igor', 'misko', 'vojta'];\r\n         }\r\n       </script>\r\n       <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n         List: <input name=\"namesInput\" ng-model=\"names\" ng-list required>\r\n         <span class=\"error\" ng-show=\"myForm.list.$error.required\">\r\n           Required!</span>\r\n         <tt>names = {{names}}</tt><br/>\r\n         <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\r\n         <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\r\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n        </form>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should initialize to model', function() {\r\n          expect(binding('names')).toEqual('[\"igor\",\"misko\",\"vojta\"]');\r\n          expect(binding('myForm.namesInput.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if empty', function() {\r\n          input('names').enter('');\r\n          expect(binding('names')).toEqual('[]');\r\n          expect(binding('myForm.namesInput.$valid')).toEqual('false');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngListDirective = function() {\r\n  return {\r\n    require: 'ngModel',\r\n    link: function(scope, element, attr, ctrl) {\r\n      var match = /\\/(.*)\\//.exec(attr.ngList),\r\n          separator = match && new RegExp(match[1]) || attr.ngList || ',';\r\n\r\n      var parse = function(viewValue) {\r\n        var list = [];\r\n\r\n        if (viewValue) {\r\n          forEach(viewValue.split(separator), function(value) {\r\n            if (value) list.push(trim(value));\r\n          });\r\n        }\r\n\r\n        return list;\r\n      };\r\n\r\n      ctrl.$parsers.push(parse);\r\n      ctrl.$formatters.push(function(value) {\r\n        if (isArray(value) && !equals(parse(ctrl.$viewValue), value)) {\r\n          return value.join(', ');\r\n        }\r\n\r\n        return undefined;\r\n      });\r\n    }\r\n  };\r\n};\r\n\r\n\r\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\r\n\r\nvar ngValueDirective = function() {\r\n  return {\r\n    priority: 100,\r\n    compile: function(tpl, tplAttr) {\r\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\r\n        return function(scope, elm, attr) {\r\n          attr.$set('value', scope.$eval(attr.ngValue));\r\n        };\r\n      } else {\r\n        return function(scope, elm, attr) {\r\n          scope.$watch(attr.ngValue, function(value) {\r\n            attr.$set('value', value, false);\r\n          });\r\n        };\r\n      }\r\n    }\r\n  };\r\n};\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngBind\r\n *\r\n * @description\r\n * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\r\n * with the value of a given expression, and to update the text content when the value of that\r\n * expression changes.\r\n *\r\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\r\n * `{{ expression }}` which is similar but less verbose.\r\n *\r\n * Once scenario in which the use of `ngBind` is prefered over `{{ expression }}` binding is when\r\n * it's desirable to put bindings into template that is momentarily displayed by the browser in its\r\n * raw state before Angular compiles it. Since `ngBind` is an element attribute, it makes the\r\n * bindings invisible to the user while the page is loading.\r\n *\r\n * An alternative solution to this problem would be using the\r\n * {@link ng.directive:ngCloak ngCloak} directive.\r\n *\r\n *\r\n * @element ANY\r\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\r\n *\r\n * @example\r\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.name = 'Whirled';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         Enter name: <input type=\"text\" ng-model=\"name\"><br>\r\n         Hello <span ng-bind=\"name\"></span>!\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-bind', function() {\r\n         expect(using('.doc-example-live').binding('name')).toBe('Whirled');\r\n         using('.doc-example-live').input('name').enter('world');\r\n         expect(using('.doc-example-live').binding('name')).toBe('world');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngBindDirective = ngDirective(function(scope, element, attr) {\r\n  element.addClass('ng-binding').data('$binding', attr.ngBind);\r\n  scope.$watch(attr.ngBind, function(value) {\r\n    element.text(value == undefined ? '' : value);\r\n  });\r\n});\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngBindTemplate\r\n *\r\n * @description\r\n * The `ngBindTemplate` directive specifies that the element\r\n * text should be replaced with the template in ngBindTemplate.\r\n * Unlike ngBind the ngBindTemplate can contain multiple `{{` `}}`\r\n * expressions. (This is required since some HTML elements\r\n * can not have SPAN elements such as TITLE, or OPTION to name a few.)\r\n *\r\n * @element ANY\r\n * @param {string} ngBindTemplate template of form\r\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\r\n *\r\n * @example\r\n * Try it here: enter text in text box and watch the greeting change.\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.salutation = 'Hello';\r\n           $scope.name = 'World';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n        Salutation: <input type=\"text\" ng-model=\"salutation\"><br>\r\n        Name: <input type=\"text\" ng-model=\"name\"><br>\r\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-bind', function() {\r\n         expect(using('.doc-example-live').binding('salutation')).\r\n           toBe('Hello');\r\n         expect(using('.doc-example-live').binding('name')).\r\n           toBe('World');\r\n         using('.doc-example-live').input('salutation').enter('Greetings');\r\n         using('.doc-example-live').input('name').enter('user');\r\n         expect(using('.doc-example-live').binding('salutation')).\r\n           toBe('Greetings');\r\n         expect(using('.doc-example-live').binding('name')).\r\n           toBe('user');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngBindTemplateDirective = ['$interpolate', function($interpolate) {\r\n  return function(scope, element, attr) {\r\n    // TODO: move this to scenario runner\r\n    var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\r\n    element.addClass('ng-binding').data('$binding', interpolateFn);\r\n    attr.$observe('ngBindTemplate', function(value) {\r\n      element.text(value);\r\n    });\r\n  }\r\n}];\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngBindHtmlUnsafe\r\n *\r\n * @description\r\n * Creates a binding that will innerHTML the result of evaluating the `expression` into the current\r\n * element. *The innerHTML-ed content will not be sanitized!* You should use this directive only if\r\n * {@link ngSanitize.directive:ngBindHtml ngBindHtml} directive is too\r\n * restrictive and when you absolutely trust the source of the content you are binding to.\r\n *\r\n * See {@link ngSanitize.$sanitize $sanitize} docs for examples.\r\n *\r\n * @element ANY\r\n * @param {expression} ngBindHtmlUnsafe {@link guide/expression Expression} to evaluate.\r\n */\r\nvar ngBindHtmlUnsafeDirective = [function() {\r\n  return function(scope, element, attr) {\r\n    element.addClass('ng-binding').data('$binding', attr.ngBindHtmlUnsafe);\r\n    scope.$watch(attr.ngBindHtmlUnsafe, function(value) {\r\n      element.html(value || '');\r\n    });\r\n  };\r\n}];\r\n\r\nfunction classDirective(name, selector) {\r\n  name = 'ngClass' + name;\r\n  return ngDirective(function(scope, element, attr) {\r\n    scope.$watch(attr[name], function(newVal, oldVal) {\r\n      if (selector === true || scope.$index % 2 === selector) {\r\n        if (oldVal && (newVal !== oldVal)) {\r\n           if (isObject(oldVal) && !isArray(oldVal))\r\n             oldVal = map(oldVal, function(v, k) { if (v) return k });\r\n           element.removeClass(isArray(oldVal) ? oldVal.join(' ') : oldVal);\r\n         }\r\n         if (isObject(newVal) && !isArray(newVal))\r\n            newVal = map(newVal, function(v, k) { if (v) return k });\r\n         if (newVal) element.addClass(isArray(newVal) ? newVal.join(' ') : newVal);      }\r\n    }, true);\r\n  });\r\n}\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClass\r\n *\r\n * @description\r\n * The `ngClass` allows you to set CSS class on HTML element dynamically by databinding an\r\n * expression that represents all classes to be added.\r\n *\r\n * The directive won't add duplicate classes if a particular class was already set.\r\n *\r\n * When the expression changes, the previously added classes are removed and only then the classes\r\n * new classes are added.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\r\n *   of the evaluation can be a string representing space delimited class\r\n *   names, an array, or a map of class names to boolean values.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n      <input type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\r\n      <input type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\r\n      <br>\r\n      <span ng-class=\"myVar\">Sample Text</span>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       .my-class {\r\n         color: red;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-class', function() {\r\n         expect(element('.doc-example-live span').prop('className')).not().\r\n           toMatch(/my-class/);\r\n\r\n         using('.doc-example-live').element(':button:first').click();\r\n\r\n         expect(element('.doc-example-live span').prop('className')).\r\n           toMatch(/my-class/);\r\n\r\n         using('.doc-example-live').element(':button:last').click();\r\n\r\n         expect(element('.doc-example-live span').prop('className')).not().\r\n           toMatch(/my-class/);\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngClassDirective = classDirective('', true);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClassOdd\r\n *\r\n * @description\r\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\r\n * {@link ng.directive:ngClass ngClass}, except it works in\r\n * conjunction with `ngRepeat` and takes affect only on odd (even) rows.\r\n *\r\n * This directive can be applied only within a scope of an\r\n * {@link ng.directive:ngRepeat ngRepeat}.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\r\n *   of the evaluation can be a string representing space delimited class names or an array.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\r\n          <li ng-repeat=\"name in names\">\r\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\r\n             {{name}}\r\n           </span>\r\n          </li>\r\n        </ol>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       .odd {\r\n         color: red;\r\n       }\r\n       .even {\r\n         color: blue;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-class-odd and ng-class-even', function() {\r\n         expect(element('.doc-example-live li:first span').prop('className')).\r\n           toMatch(/odd/);\r\n         expect(element('.doc-example-live li:last span').prop('className')).\r\n           toMatch(/even/);\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngClassOddDirective = classDirective('Odd', 0);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClassEven\r\n *\r\n * @description\r\n * The `ngClassOdd` and `ngClassEven` works exactly as\r\n * {@link ng.directive:ngClass ngClass}, except it works in\r\n * conjunction with `ngRepeat` and takes affect only on odd (even) rows.\r\n *\r\n * This directive can be applied only within a scope of an\r\n * {@link ng.directive:ngRepeat ngRepeat}.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\r\n *   result of the evaluation can be a string representing space delimited class names or an array.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\r\n          <li ng-repeat=\"name in names\">\r\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\r\n             {{name}} &nbsp; &nbsp; &nbsp;\r\n           </span>\r\n          </li>\r\n        </ol>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       .odd {\r\n         color: red;\r\n       }\r\n       .even {\r\n         color: blue;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-class-odd and ng-class-even', function() {\r\n         expect(element('.doc-example-live li:first span').prop('className')).\r\n           toMatch(/odd/);\r\n         expect(element('.doc-example-live li:last span').prop('className')).\r\n           toMatch(/even/);\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngClassEvenDirective = classDirective('Even', 1);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngCloak\r\n *\r\n * @description\r\n * The `ngCloak` directive is used to prevent the Angular html template from being briefly\r\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\r\n * directive to avoid the undesirable flicker effect caused by the html template display.\r\n *\r\n * The directive can be applied to the `<body>` element, but typically a fine-grained application is\r\n * prefered in order to benefit from progressive rendering of the browser view.\r\n *\r\n * `ngCloak` works in cooperation with a css rule that is embedded within `angular.js` and\r\n *  `angular.min.js` files. Following is the css rule:\r\n *\r\n * <pre>\r\n * [ng\\:cloak], [ng-cloak], .ng-cloak {\r\n *   display: none;\r\n * }\r\n * </pre>\r\n *\r\n * When this css rule is loaded by the browser, all html elements (including their children) that\r\n * are tagged with the `ng-cloak` directive are hidden. When Angular comes across this directive\r\n * during the compilation of the template it deletes the `ngCloak` element attribute, which\r\n * makes the compiled element visible.\r\n *\r\n * For the best result, `angular.js` script must be loaded in the head section of the html file;\r\n * alternatively, the css rule (above) must be included in the external stylesheet of the\r\n * application.\r\n *\r\n * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they\r\n * cannot match the `[ng\\:cloak]` selector. To work around this limitation, you must add the css\r\n * class `ngCloak` in addition to `ngCloak` directive as shown in the example below.\r\n *\r\n * @element ANY\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\r\n        <div id=\"template2\" ng-cloak class=\"ng-cloak\">{{ 'hello IE7' }}</div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should remove the template directive and css class', function() {\r\n         expect(element('.doc-example-live #template1').attr('ng-cloak')).\r\n           not().toBeDefined();\r\n         expect(element('.doc-example-live #template2').attr('ng-cloak')).\r\n           not().toBeDefined();\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n *\r\n */\r\nvar ngCloakDirective = ngDirective({\r\n  compile: function(element, attr) {\r\n    attr.$set('ngCloak', undefined);\r\n    element.removeClass('ng-cloak');\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngController\r\n *\r\n * @description\r\n * The `ngController` directive assigns behavior to a scope. This is a key aspect of how angular\r\n * supports the principles behind the Model-View-Controller design pattern.\r\n *\r\n * MVC components in angular:\r\n *\r\n * * Model â€” The Model is data in scope properties; scopes are attached to the DOM.\r\n * * View â€” The template (HTML with data bindings) is rendered into the View.\r\n * * Controller â€” The `ngController` directive specifies a Controller class; the class has\r\n *   methods that typically express the business logic behind the application.\r\n *\r\n * Note that an alternative way to define controllers is via the `{@link ng.$route}`\r\n * service.\r\n *\r\n * @element ANY\r\n * @scope\r\n * @param {expression} ngController Name of a globally accessible constructor function or an\r\n *     {@link guide/expression expression} that on the current scope evaluates to a\r\n *     constructor function.\r\n *\r\n * @example\r\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\r\n * greeting are methods declared on the controller (see source tab). These methods can\r\n * easily be called from the angular markup. Notice that the scope becomes the `this` for the\r\n * controller's instance. This allows for easy access to the view data from the controller. Also\r\n * notice that any changes to the data are automatically reflected in the View without the need\r\n * for a manual update.\r\n   <doc:example>\r\n     <doc:source>\r\n      <script>\r\n        function SettingsController($scope) {\r\n          $scope.name = \"John Smith\";\r\n          $scope.contacts = [\r\n            {type:'phone', value:'408 555 1212'},\r\n            {type:'email', value:'john.smith@example.org'} ];\r\n\r\n          $scope.greet = function() {\r\n           alert(this.name);\r\n          };\r\n\r\n          $scope.addContact = function() {\r\n           this.contacts.push({type:'email', value:'yourname@example.org'});\r\n          };\r\n\r\n          $scope.removeContact = function(contactToRemove) {\r\n           var index = this.contacts.indexOf(contactToRemove);\r\n           this.contacts.splice(index, 1);\r\n          };\r\n\r\n          $scope.clearContact = function(contact) {\r\n           contact.type = 'phone';\r\n           contact.value = '';\r\n          };\r\n        }\r\n      </script>\r\n      <div ng-controller=\"SettingsController\">\r\n        Name: <input type=\"text\" ng-model=\"name\"/>\r\n        [ <a href=\"\" ng-click=\"greet()\">greet</a> ]<br/>\r\n        Contact:\r\n        <ul>\r\n          <li ng-repeat=\"contact in contacts\">\r\n            <select ng-model=\"contact.type\">\r\n               <option>phone</option>\r\n               <option>email</option>\r\n            </select>\r\n            <input type=\"text\" ng-model=\"contact.value\"/>\r\n            [ <a href=\"\" ng-click=\"clearContact(contact)\">clear</a>\r\n            | <a href=\"\" ng-click=\"removeContact(contact)\">X</a> ]\r\n          </li>\r\n          <li>[ <a href=\"\" ng-click=\"addContact()\">add</a> ]</li>\r\n       </ul>\r\n      </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check controller', function() {\r\n         expect(element('.doc-example-live div>:input').val()).toBe('John Smith');\r\n         expect(element('.doc-example-live li:nth-child(1) input').val())\r\n           .toBe('408 555 1212');\r\n         expect(element('.doc-example-live li:nth-child(2) input').val())\r\n           .toBe('john.smith@example.org');\r\n\r\n         element('.doc-example-live li:first a:contains(\"clear\")').click();\r\n         expect(element('.doc-example-live li:first input').val()).toBe('');\r\n\r\n         element('.doc-example-live li:last a:contains(\"add\")').click();\r\n         expect(element('.doc-example-live li:nth-child(3) input').val())\r\n           .toBe('yourname@example.org');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngControllerDirective = [function() {\r\n  return {\r\n    scope: true,\r\n    controller: '@'\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngCsp\r\n * @priority 1000\r\n *\r\n * @description\r\n * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.\r\n * This directive should be used on the root element of the application (typically the `<html>`\r\n * element or other element with the {@link ng.directive:ngApp ngApp}\r\n * directive).\r\n *\r\n * If enabled the performance of template expression evaluator will suffer slightly, so don't enable\r\n * this mode unless you need it.\r\n *\r\n * @element html\r\n */\r\n\r\nvar ngCspDirective = ['$sniffer', function($sniffer) {\r\n  return {\r\n    priority: 1000,\r\n    compile: function() {\r\n      $sniffer.csp = true;\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClick\r\n *\r\n * @description\r\n * The ngClick allows you to specify custom behavior when\r\n * element is clicked.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\r\n * click. (Event object is available as `$event`)\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\r\n        Increment\r\n      </button>\r\n      count: {{count}}\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-click', function() {\r\n         expect(binding('count')).toBe('0');\r\n         element('.doc-example-live :button').click();\r\n         expect(binding('count')).toBe('1');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n/*\r\n * A directive that allows creation of custom onclick handlers that are defined as angular\r\n * expressions and are compiled and executed within the current scope.\r\n *\r\n * Events that are handled via these handler are always configured not to propagate further.\r\n */\r\nvar ngEventDirectives = {};\r\nforEach(\r\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave'.split(' '),\r\n  function(name) {\r\n    var directiveName = directiveNormalize('ng-' + name);\r\n    ngEventDirectives[directiveName] = ['$parse', function($parse) {\r\n      return function(scope, element, attr) {\r\n        var fn = $parse(attr[directiveName]);\r\n        element.bind(lowercase(name), function(event) {\r\n          scope.$apply(function() {\r\n            fn(scope, {$event:event});\r\n          });\r\n        });\r\n      };\r\n    }];\r\n  }\r\n);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngDblclick\r\n *\r\n * @description\r\n * The `ngDblclick` directive allows you to specify custom behavior on dblclick event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\r\n * dblclick. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMousedown\r\n *\r\n * @description\r\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\r\n * mousedown. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseup\r\n *\r\n * @description\r\n * Specify custom behavior on mouseup event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\r\n * mouseup. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseover\r\n *\r\n * @description\r\n * Specify custom behavior on mouseover event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\r\n * mouseover. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseenter\r\n *\r\n * @description\r\n * Specify custom behavior on mouseenter event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\r\n * mouseenter. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseleave\r\n *\r\n * @description\r\n * Specify custom behavior on mouseleave event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\r\n * mouseleave. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMousemove\r\n *\r\n * @description\r\n * Specify custom behavior on mousemove event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\r\n * mousemove. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSubmit\r\n *\r\n * @description\r\n * Enables binding angular expressions to onsubmit events.\r\n *\r\n * Additionally it prevents the default action (which for form means sending the request to the\r\n * server and reloading the current page).\r\n *\r\n * @element form\r\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n      <script>\r\n        function Ctrl($scope) {\r\n          $scope.list = [];\r\n          $scope.text = 'hello';\r\n          $scope.submit = function() {\r\n            if (this.text) {\r\n              this.list.push(this.text);\r\n              this.text = '';\r\n            }\r\n          };\r\n        }\r\n      </script>\r\n      <form ng-submit=\"submit()\" ng-controller=\"Ctrl\">\r\n        Enter text and hit enter:\r\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\r\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\r\n        <pre>list={{list}}</pre>\r\n      </form>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-submit', function() {\r\n         expect(binding('list')).toBe('[]');\r\n         element('.doc-example-live #submit').click();\r\n         expect(binding('list')).toBe('[\"hello\"]');\r\n         expect(input('text').val()).toBe('');\r\n       });\r\n       it('should ignore empty strings', function() {\r\n         expect(binding('list')).toBe('[]');\r\n         element('.doc-example-live #submit').click();\r\n         element('.doc-example-live #submit').click();\r\n         expect(binding('list')).toBe('[\"hello\"]');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngSubmitDirective = ngDirective(function(scope, element, attrs) {\r\n  element.bind('submit', function() {\r\n    scope.$apply(attrs.ngSubmit);\r\n  });\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngInclude\r\n * @restrict ECA\r\n *\r\n * @description\r\n * Fetches, compiles and includes an external HTML fragment.\r\n *\r\n * Keep in mind that Same Origin Policy applies to included resources\r\n * (e.g. ngInclude won't work for cross-domain requests on all browsers and for\r\n *  file:// access on some browsers).\r\n *\r\n * @scope\r\n *\r\n * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\r\n *                 make sure you wrap it in quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\r\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\r\n *\r\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\r\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\r\n *\r\n *                  - If the attribute is not set, disable scrolling.\r\n *                  - If the attribute is set without value, enable scrolling.\r\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\r\n *\r\n * @example\r\n  <example>\r\n    <file name=\"index.html\">\r\n     <div ng-controller=\"Ctrl\">\r\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\r\n        <option value=\"\">(blank)</option>\r\n       </select>\r\n       url of the template: <tt>{{template.url}}</tt>\r\n       <hr/>\r\n       <div ng-include src=\"template.url\"></div>\r\n     </div>\r\n    </file>\r\n    <file name=\"script.js\">\r\n      function Ctrl($scope) {\r\n        $scope.templates =\r\n          [ { name: 'template1.html', url: 'template1.html'}\r\n          , { name: 'template2.html', url: 'template2.html'} ];\r\n        $scope.template = $scope.templates[0];\r\n      }\r\n     </file>\r\n    <file name=\"template1.html\">\r\n      Content of template1.html\r\n    </file>\r\n    <file name=\"template2.html\">\r\n      Content of template2.html\r\n    </file>\r\n    <file name=\"scenario.js\">\r\n      it('should load template1.html', function() {\r\n       expect(element('.doc-example-live [ng-include]').text()).\r\n         toMatch(/Content of template1.html/);\r\n      });\r\n      it('should load template2.html', function() {\r\n       select('template').option('1');\r\n       expect(element('.doc-example-live [ng-include]').text()).\r\n         toMatch(/Content of template2.html/);\r\n      });\r\n      it('should change to blank', function() {\r\n       select('template').option('');\r\n       expect(element('.doc-example-live [ng-include]').text()).toEqual('');\r\n      });\r\n    </file>\r\n  </example>\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc event\r\n * @name ng.directive:ngInclude#$includeContentLoaded\r\n * @eventOf ng.directive:ngInclude\r\n * @eventType emit on the current ngInclude scope\r\n * @description\r\n * Emitted every time the ngInclude content is reloaded.\r\n */\r\nvar ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile',\r\n                  function($http,   $templateCache,   $anchorScroll,   $compile) {\r\n  return {\r\n    restrict: 'ECA',\r\n    terminal: true,\r\n    compile: function(element, attr) {\r\n      var srcExp = attr.ngInclude || attr.src,\r\n          onloadExp = attr.onload || '',\r\n          autoScrollExp = attr.autoscroll;\r\n\r\n      return function(scope, element) {\r\n        var changeCounter = 0,\r\n            childScope;\r\n\r\n        var clearContent = function() {\r\n          if (childScope) {\r\n            childScope.$destroy();\r\n            childScope = null;\r\n          }\r\n\r\n          element.html('');\r\n        };\r\n\r\n        scope.$watch(srcExp, function(src) {\r\n          var thisChangeId = ++changeCounter;\r\n\r\n          if (src) {\r\n            $http.get(src, {cache: $templateCache}).success(function(response) {\r\n              if (thisChangeId !== changeCounter) return;\r\n\r\n              if (childScope) childScope.$destroy();\r\n              childScope = scope.$new();\r\n\r\n              element.html(response);\r\n              $compile(element.contents())(childScope);\r\n\r\n              if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {\r\n                $anchorScroll();\r\n              }\r\n\r\n              childScope.$emit('$includeContentLoaded');\r\n              scope.$eval(onloadExp);\r\n            }).error(function() {\r\n              if (thisChangeId === changeCounter) clearContent();\r\n            });\r\n          } else clearContent();\r\n        });\r\n      };\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngInit\r\n *\r\n * @description\r\n * The `ngInit` directive specifies initialization tasks to be executed\r\n *  before the template enters execution mode during bootstrap.\r\n *\r\n * @element ANY\r\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n    <div ng-init=\"greeting='Hello'; person='World'\">\r\n      {{greeting}} {{person}}!\r\n    </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check greeting', function() {\r\n         expect(binding('greeting')).toBe('Hello');\r\n         expect(binding('person')).toBe('World');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngInitDirective = ngDirective({\r\n  compile: function() {\r\n    return {\r\n      pre: function(scope, element, attrs) {\r\n        scope.$eval(attrs.ngInit);\r\n      }\r\n    }\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngNonBindable\r\n * @priority 1000\r\n *\r\n * @description\r\n * Sometimes it is necessary to write code which looks like bindings but which should be left alone\r\n * by angular. Use `ngNonBindable` to make angular ignore a chunk of HTML.\r\n *\r\n * @element ANY\r\n *\r\n * @example\r\n * In this example there are two location where a simple binding (`{{}}`) is present, but the one\r\n * wrapped in `ngNonBindable` is left alone.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <div>Normal: {{1 + 2}}</div>\r\n        <div ng-non-bindable>Ignored: {{1 + 2}}</div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n       it('should check ng-non-bindable', function() {\r\n         expect(using('.doc-example-live').binding('1 + 2')).toBe('3');\r\n         expect(using('.doc-example-live').element('div:last').text()).\r\n           toMatch(/1 \\+ 2/);\r\n       });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngPluralize\r\n * @restrict EA\r\n *\r\n * @description\r\n * # Overview\r\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\r\n * These rules are bundled with angular.js and the rules can be overridden\r\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\r\n * by specifying the mappings between\r\n * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\r\n * plural categories} and the strings to be displayed.\r\n *\r\n * # Plural categories and explicit number rules\r\n * There are two\r\n * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\r\n * plural categories} in Angular's default en-US locale: \"one\" and \"other\".\r\n *\r\n * While a pural category may match many numbers (for example, in en-US locale, \"other\" can match\r\n * any number that is not 1), an explicit number rule can only match one number. For example, the\r\n * explicit number rule for \"3\" matches the number 3. You will see the use of plural categories\r\n * and explicit number rules throughout later parts of this documentation.\r\n *\r\n * # Configuring ngPluralize\r\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\r\n * You can also provide an optional attribute, `offset`.\r\n *\r\n * The value of the `count` attribute can be either a string or an {@link guide/expression\r\n * Angular expression}; these are evaluated on the current scope for its bound value.\r\n *\r\n * The `when` attribute specifies the mappings between plural categories and the actual\r\n * string to be displayed. The value of the attribute should be a JSON object so that Angular\r\n * can interpret it correctly.\r\n *\r\n * The following example shows how to configure ngPluralize:\r\n *\r\n * <pre>\r\n * <ng-pluralize count=\"personCount\"\r\n                 when=\"{'0': 'Nobody is viewing.',\r\n *                      'one': '1 person is viewing.',\r\n *                      'other': '{} people are viewing.'}\">\r\n * </ng-pluralize>\r\n *</pre>\r\n *\r\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\r\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\r\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\r\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\r\n * show \"a dozen people are viewing\".\r\n *\r\n * You can use a set of closed braces(`{}`) as a placeholder for the number that you want substituted\r\n * into pluralized strings. In the previous example, Angular will replace `{}` with\r\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\r\n * for <span ng-non-bindable>{{numberExpression}}</span>.\r\n *\r\n * # Configuring ngPluralize with offset\r\n * The `offset` attribute allows further customization of pluralized text, which can result in\r\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\r\n * you might display \"John, Kate and 2 others are viewing this document\".\r\n * The offset attribute allows you to offset a number by any desired value.\r\n * Let's take a look at an example:\r\n *\r\n * <pre>\r\n * <ng-pluralize count=\"personCount\" offset=2\r\n *               when=\"{'0': 'Nobody is viewing.',\r\n *                      '1': '{{person1}} is viewing.',\r\n *                      '2': '{{person1}} and {{person2}} are viewing.',\r\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\r\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\r\n * </ng-pluralize>\r\n * </pre>\r\n *\r\n * Notice that we are still using two plural categories(one, other), but we added\r\n * three explicit number rules 0, 1 and 2.\r\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\r\n * When three people view the document, no explicit number rule is found, so\r\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\r\n * In this case, plural category 'one' is matched and \"John, Marry and one other person are viewing\"\r\n * is shown.\r\n *\r\n * Note that when you specify offsets, you must provide explicit number rules for\r\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\r\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\r\n * plural categories \"one\" and \"other\".\r\n *\r\n * @param {string|expression} count The variable to be bounded to.\r\n * @param {string} when The mapping between plural category to its correspoding strings.\r\n * @param {number=} offset Offset to deduct from the total number.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <script>\r\n          function Ctrl($scope) {\r\n            $scope.person1 = 'Igor';\r\n            $scope.person2 = 'Misko';\r\n            $scope.personCount = 1;\r\n          }\r\n        </script>\r\n        <div ng-controller=\"Ctrl\">\r\n          Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /><br/>\r\n          Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /><br/>\r\n          Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /><br/>\r\n\r\n          <!--- Example with simple pluralization rules for en locale --->\r\n          Without Offset:\r\n          <ng-pluralize count=\"personCount\"\r\n                        when=\"{'0': 'Nobody is viewing.',\r\n                               'one': '1 person is viewing.',\r\n                               'other': '{} people are viewing.'}\">\r\n          </ng-pluralize><br>\r\n\r\n          <!--- Example with offset --->\r\n          With Offset(2):\r\n          <ng-pluralize count=\"personCount\" offset=2\r\n                        when=\"{'0': 'Nobody is viewing.',\r\n                               '1': '{{person1}} is viewing.',\r\n                               '2': '{{person1}} and {{person2}} are viewing.',\r\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\r\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\r\n          </ng-pluralize>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should show correct pluralized string', function() {\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                             toBe('1 person is viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                                                toBe('Igor is viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('0');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                               toBe('Nobody is viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                                              toBe('Nobody is viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('2');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                            toBe('2 people are viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                              toBe('Igor and Misko are viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('3');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                            toBe('3 people are viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                              toBe('Igor, Misko and one other person are viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('4');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                            toBe('4 people are viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                              toBe('Igor, Misko and 2 other people are viewing.');\r\n        });\r\n\r\n        it('should show data-binded names', function() {\r\n          using('.doc-example-live').input('personCount').enter('4');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n              toBe('Igor, Misko and 2 other people are viewing.');\r\n\r\n          using('.doc-example-live').input('person1').enter('Di');\r\n          using('.doc-example-live').input('person2').enter('Vojta');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n              toBe('Di, Vojta and 2 other people are viewing.');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {\r\n  var BRACE = /{}/g;\r\n  return {\r\n    restrict: 'EA',\r\n    link: function(scope, element, attr) {\r\n      var numberExp = attr.count,\r\n          whenExp = element.attr(attr.$attr.when), // this is because we have {{}} in attrs\r\n          offset = attr.offset || 0,\r\n          whens = scope.$eval(whenExp),\r\n          whensExpFns = {};\r\n\r\n      forEach(whens, function(expression, key) {\r\n        whensExpFns[key] =\r\n          $interpolate(expression.replace(BRACE, '{{' + numberExp + '-' + offset + '}}'));\r\n      });\r\n\r\n      scope.$watch(function() {\r\n        var value = parseFloat(scope.$eval(numberExp));\r\n\r\n        if (!isNaN(value)) {\r\n          //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,\r\n          //check it against pluralization rules in $locale service\r\n          if (!whens[value]) value = $locale.pluralCat(value - offset);\r\n           return whensExpFns[value](scope, element, true);\r\n        } else {\r\n          return '';\r\n        }\r\n      }, function(newVal) {\r\n        element.text(newVal);\r\n      });\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngRepeat\r\n *\r\n * @description\r\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\r\n * instance gets its own scope, where the given loop variable is set to the current collection item,\r\n * and `$index` is set to the item index or key.\r\n *\r\n * Special properties are exposed on the local scope of each template instance, including:\r\n *\r\n *   * `$index` â€“ `{number}` â€“ iterator offset of the repeated element (0..length-1)\r\n *   * `$first` â€“ `{boolean}` â€“ true if the repeated element is first in the iterator.\r\n *   * `$middle` â€“ `{boolean}` â€“ true if the repeated element is between the first and last in the iterator.\r\n *   * `$last` â€“ `{boolean}` â€“ true if the repeated element is last in the iterator.\r\n *\r\n *\r\n * @element ANY\r\n * @scope\r\n * @priority 1000\r\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. Two\r\n *   formats are currently supported:\r\n *\r\n *   * `variable in expression` â€“ where variable is the user defined loop variable and `expression`\r\n *     is a scope expression giving the collection to enumerate.\r\n *\r\n *     For example: `track in cd.tracks`.\r\n *\r\n *   * `(key, value) in expression` â€“ where `key` and `value` can be any user defined identifiers,\r\n *     and `expression` is the scope expression giving the collection to enumerate.\r\n *\r\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\r\n *\r\n * @example\r\n * This example initializes the scope to a list of names and\r\n * then uses `ngRepeat` to display every person:\r\n    <doc:example>\r\n      <doc:source>\r\n        <div ng-init=\"friends = [{name:'John', age:25}, {name:'Mary', age:28}]\">\r\n          I have {{friends.length}} friends. They are:\r\n          <ul>\r\n            <li ng-repeat=\"friend in friends\">\r\n              [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\r\n            </li>\r\n          </ul>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n         it('should check ng-repeat', function() {\r\n           var r = using('.doc-example-live').repeater('ul li');\r\n           expect(r.count()).toBe(2);\r\n           expect(r.row(0)).toEqual([\"1\",\"John\",\"25\"]);\r\n           expect(r.row(1)).toEqual([\"2\",\"Mary\",\"28\"]);\r\n         });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngRepeatDirective = ngDirective({\r\n  transclude: 'element',\r\n  priority: 1000,\r\n  terminal: true,\r\n  compile: function(element, attr, linker) {\r\n    return function(scope, iterStartElement, attr){\r\n      var expression = attr.ngRepeat;\r\n      var match = expression.match(/^\\s*(.+)\\s+in\\s+(.*)\\s*$/),\r\n        lhs, rhs, valueIdent, keyIdent;\r\n      if (! match) {\r\n        throw Error(\"Expected ngRepeat in form of '_item_ in _collection_' but got '\" +\r\n          expression + \"'.\");\r\n      }\r\n      lhs = match[1];\r\n      rhs = match[2];\r\n      match = lhs.match(/^(?:([\\$\\w]+)|\\(([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\))$/);\r\n      if (!match) {\r\n        throw Error(\"'item' in 'item in collection' should be identifier or (key, value) but got '\" +\r\n            lhs + \"'.\");\r\n      }\r\n      valueIdent = match[3] || match[1];\r\n      keyIdent = match[2];\r\n\r\n      // Store a list of elements from previous run. This is a hash where key is the item from the\r\n      // iterator, and the value is an array of objects with following properties.\r\n      //   - scope: bound scope\r\n      //   - element: previous element.\r\n      //   - index: position\r\n      // We need an array of these objects since the same object can be returned from the iterator.\r\n      // We expect this to be a rare case.\r\n      var lastOrder = new HashQueueMap();\r\n      scope.$watch(function(scope){\r\n        var index, length,\r\n            collection = scope.$eval(rhs),\r\n            collectionLength = size(collection, true),\r\n            childScope,\r\n            // Same as lastOrder but it has the current state. It will become the\r\n            // lastOrder on the next iteration.\r\n            nextOrder = new HashQueueMap(),\r\n            key, value, // key/value of iteration\r\n            array, last,       // last object information {scope, element, index}\r\n            cursor = iterStartElement;     // current position of the node\r\n\r\n        if (!isArray(collection)) {\r\n          // if object, extract keys, sort them and use to determine order of iteration over obj props\r\n          array = [];\r\n          for(key in collection) {\r\n            if (collection.hasOwnProperty(key) && key.charAt(0) != '$') {\r\n              array.push(key);\r\n            }\r\n          }\r\n          array.sort();\r\n        } else {\r\n          array = collection || [];\r\n        }\r\n\r\n        // we are not using forEach for perf reasons (trying to avoid #call)\r\n        for (index = 0, length = array.length; index < length; index++) {\r\n          key = (collection === array) ? index : array[index];\r\n          value = collection[key];\r\n          last = lastOrder.shift(value);\r\n          if (last) {\r\n            // if we have already seen this object, then we need to reuse the\r\n            // associated scope/element\r\n            childScope = last.scope;\r\n            nextOrder.push(value, last);\r\n\r\n            if (index === last.index) {\r\n              // do nothing\r\n              cursor = last.element;\r\n            } else {\r\n              // existing item which got moved\r\n              last.index = index;\r\n              // This may be a noop, if the element is next, but I don't know of a good way to\r\n              // figure this out,  since it would require extra DOM access, so let's just hope that\r\n              // the browsers realizes that it is noop, and treats it as such.\r\n              cursor.after(last.element);\r\n              cursor = last.element;\r\n            }\r\n          } else {\r\n            // new item which we don't know about\r\n            childScope = scope.$new();\r\n          }\r\n\r\n          childScope[valueIdent] = value;\r\n          if (keyIdent) childScope[keyIdent] = key;\r\n          childScope.$index = index;\r\n\r\n          childScope.$first = (index === 0);\r\n          childScope.$last = (index === (collectionLength - 1));\r\n          childScope.$middle = !(childScope.$first || childScope.$last);\r\n\r\n          if (!last) {\r\n            linker(childScope, function(clone){\r\n              cursor.after(clone);\r\n              last = {\r\n                  scope: childScope,\r\n                  element: (cursor = clone),\r\n                  index: index\r\n                };\r\n              nextOrder.push(value, last);\r\n            });\r\n          }\r\n        }\r\n\r\n        //shrink children\r\n        for (key in lastOrder) {\r\n          if (lastOrder.hasOwnProperty(key)) {\r\n            array = lastOrder[key];\r\n            while(array.length) {\r\n              value = array.pop();\r\n              value.element.remove();\r\n              value.scope.$destroy();\r\n            }\r\n          }\r\n        }\r\n\r\n        lastOrder = nextOrder;\r\n      });\r\n    };\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngShow\r\n *\r\n * @description\r\n * The `ngShow` and `ngHide` directives show or hide a portion of the DOM tree (HTML)\r\n * conditionally.\r\n *\r\n * @element ANY\r\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy\r\n *     then the element is shown or hidden respectively.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n        Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        Show: <span ng-show=\"checked\">I show up when your checkbox is checked.</span> <br/>\r\n        Hide: <span ng-hide=\"checked\">I hide when your checkbox is checked.</span>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-show / ng-hide', function() {\r\n         expect(element('.doc-example-live span:first:hidden').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:visible').count()).toEqual(1);\r\n\r\n         input('checked').check();\r\n\r\n         expect(element('.doc-example-live span:first:visible').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:hidden').count()).toEqual(1);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n//TODO(misko): refactor to remove element from the DOM\r\nvar ngShowDirective = ngDirective(function(scope, element, attr){\r\n  scope.$watch(attr.ngShow, function(value){\r\n    element.css('display', toBoolean(value) ? '' : 'none');\r\n  });\r\n});\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngHide\r\n *\r\n * @description\r\n * The `ngHide` and `ngShow` directives hide or show a portion\r\n * of the HTML conditionally.\r\n *\r\n * @element ANY\r\n * @param {expression} ngHide If the {@link guide/expression expression} truthy then\r\n *     the element is shown or hidden respectively.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n        Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        Show: <span ng-show=\"checked\">I show up when you checkbox is checked?</span> <br/>\r\n        Hide: <span ng-hide=\"checked\">I hide when you checkbox is checked?</span>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-show / ng-hide', function() {\r\n         expect(element('.doc-example-live span:first:hidden').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:visible').count()).toEqual(1);\r\n\r\n         input('checked').check();\r\n\r\n         expect(element('.doc-example-live span:first:visible').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:hidden').count()).toEqual(1);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n//TODO(misko): refactor to remove element from the DOM\r\nvar ngHideDirective = ngDirective(function(scope, element, attr){\r\n  scope.$watch(attr.ngHide, function(value){\r\n    element.css('display', toBoolean(value) ? 'none' : '');\r\n  });\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngStyle\r\n *\r\n * @description\r\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\r\n *\r\n * @element ANY\r\n * @param {expression} ngStyle {@link guide/expression Expression} which evals to an\r\n *      object whose keys are CSS style names and values are corresponding values for those CSS\r\n *      keys.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n        <input type=\"button\" value=\"set\" ng-click=\"myStyle={color:'red'}\">\r\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\r\n        <br/>\r\n        <span ng-style=\"myStyle\">Sample Text</span>\r\n        <pre>myStyle={{myStyle}}</pre>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       span {\r\n         color: black;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-style', function() {\r\n         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');\r\n         element('.doc-example-live :button[value=set]').click();\r\n         expect(element('.doc-example-live span').css('color')).toBe('rgb(255, 0, 0)');\r\n         element('.doc-example-live :button[value=clear]').click();\r\n         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\r\n  scope.$watch(attr.ngStyle, function(newStyles, oldStyles) {\r\n    if (oldStyles && (newStyles !== oldStyles)) {\r\n      forEach(oldStyles, function(val, style) { element.css(style, '');});\r\n    }\r\n    if (newStyles) element.css(newStyles);\r\n  }, true);\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSwitch\r\n * @restrict EA\r\n *\r\n * @description\r\n * Conditionally change the DOM structure.\r\n *\r\n * @usageContent\r\n * <ANY ng-switch-when=\"matchValue1\">...</ANY>\r\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\r\n *   ...\r\n *   <ANY ng-switch-default>...</ANY>\r\n *\r\n * @scope\r\n * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.\r\n * @paramDescription\r\n * On child elments add:\r\n *\r\n * * `ngSwitchWhen`: the case statement to match against. If match then this\r\n *   case will be displayed.\r\n * * `ngSwitchDefault`: the default case when no other casses match.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <script>\r\n          function Ctrl($scope) {\r\n            $scope.items = ['settings', 'home', 'other'];\r\n            $scope.selection = $scope.items[0];\r\n          }\r\n        </script>\r\n        <div ng-controller=\"Ctrl\">\r\n          <select ng-model=\"selection\" ng-options=\"item for item in items\">\r\n          </select>\r\n          <tt>selection={{selection}}</tt>\r\n          <hr/>\r\n          <div ng-switch on=\"selection\" >\r\n            <div ng-switch-when=\"settings\">Settings Div</div>\r\n            <span ng-switch-when=\"home\">Home Span</span>\r\n            <span ng-switch-default>default</span>\r\n          </div>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should start in settings', function() {\r\n         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Settings Div/);\r\n        });\r\n        it('should change to home', function() {\r\n         select('selection').option('home');\r\n         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Home Span/);\r\n        });\r\n        it('should select deafault', function() {\r\n         select('selection').option('other');\r\n         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/default/);\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar NG_SWITCH = 'ng-switch';\r\nvar ngSwitchDirective = valueFn({\r\n  restrict: 'EA',\r\n  compile: function(element, attr) {\r\n    var watchExpr = attr.ngSwitch || attr.on,\r\n        cases = {};\r\n\r\n    element.data(NG_SWITCH, cases);\r\n    return function(scope, element){\r\n      var selectedTransclude,\r\n          selectedElement,\r\n          selectedScope;\r\n\r\n      scope.$watch(watchExpr, function(value) {\r\n        if (selectedElement) {\r\n          selectedScope.$destroy();\r\n          selectedElement.remove();\r\n          selectedElement = selectedScope = null;\r\n        }\r\n        if ((selectedTransclude = cases['!' + value] || cases['?'])) {\r\n          scope.$eval(attr.change);\r\n          selectedScope = scope.$new();\r\n          selectedTransclude(selectedScope, function(caseElement) {\r\n            selectedElement = caseElement;\r\n            element.append(caseElement);\r\n          });\r\n        }\r\n      });\r\n    };\r\n  }\r\n});\r\n\r\nvar ngSwitchWhenDirective = ngDirective({\r\n  transclude: 'element',\r\n  priority: 500,\r\n  compile: function(element, attrs, transclude) {\r\n    var cases = element.inheritedData(NG_SWITCH);\r\n    assertArg(cases);\r\n    cases['!' + attrs.ngSwitchWhen] = transclude;\r\n  }\r\n});\r\n\r\nvar ngSwitchDefaultDirective = ngDirective({\r\n  transclude: 'element',\r\n  priority: 500,\r\n  compile: function(element, attrs, transclude) {\r\n    var cases = element.inheritedData(NG_SWITCH);\r\n    assertArg(cases);\r\n    cases['?'] = transclude;\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngTransclude\r\n *\r\n * @description\r\n * Insert the transcluded DOM here.\r\n *\r\n * @element ANY\r\n *\r\n * @example\r\n   <doc:example module=\"transclude\">\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.title = 'Lorem Ipsum';\r\n           $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\r\n         }\r\n\r\n         angular.module('transclude', [])\r\n          .directive('pane', function(){\r\n             return {\r\n               restrict: 'E',\r\n               transclude: true,\r\n               scope: 'isolate',\r\n               locals: { title:'bind' },\r\n               template: '<div style=\"border: 1px solid black;\">' +\r\n                           '<div style=\"background-color: gray\">{{title}}</div>' +\r\n                           '<div ng-transclude></div>' +\r\n                         '</div>'\r\n             };\r\n         });\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <input ng-model=\"title\"><br>\r\n         <textarea ng-model=\"text\"></textarea> <br/>\r\n         <pane title=\"{{title}}\">{{text}}</pane>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n        it('should have transcluded', function() {\r\n          input('title').enter('TITLE');\r\n          input('text').enter('TEXT');\r\n          expect(binding('title')).toEqual('TITLE');\r\n          expect(binding('text')).toEqual('TEXT');\r\n        });\r\n     </doc:scenario>\r\n   </doc:example>\r\n *\r\n */\r\nvar ngTranscludeDirective = ngDirective({\r\n  controller: ['$transclude', '$element', function($transclude, $element) {\r\n    $transclude(function(clone) {\r\n      $element.append(clone);\r\n    });\r\n  }]\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngView\r\n * @restrict ECA\r\n *\r\n * @description\r\n * # Overview\r\n * `ngView` is a directive that complements the {@link ng.$route $route} service by\r\n * including the rendered template of the current route into the main layout (`index.html`) file.\r\n * Every time the current route changes, the included view changes with it according to the\r\n * configuration of the `$route` service.\r\n *\r\n * @scope\r\n * @example\r\n    <example module=\"ngView\">\r\n      <file name=\"index.html\">\r\n        <div ng-controller=\"MainCntl\">\r\n          Choose:\r\n          <a href=\"Book/Moby\">Moby</a> |\r\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\r\n          <a href=\"Book/Gatsby\">Gatsby</a> |\r\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\r\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\r\n\r\n          <div ng-view></div>\r\n          <hr />\r\n\r\n          <pre>$location.path() = {{$location.path()}}</pre>\r\n          <pre>$route.current.template = {{$route.current.template}}</pre>\r\n          <pre>$route.current.params = {{$route.current.params}}</pre>\r\n          <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\r\n          <pre>$routeParams = {{$routeParams}}</pre>\r\n        </div>\r\n      </file>\r\n\r\n      <file name=\"book.html\">\r\n        controller: {{name}}<br />\r\n        Book Id: {{params.bookId}}<br />\r\n      </file>\r\n\r\n      <file name=\"chapter.html\">\r\n        controller: {{name}}<br />\r\n        Book Id: {{params.bookId}}<br />\r\n        Chapter Id: {{params.chapterId}}\r\n      </file>\r\n\r\n      <file name=\"script.js\">\r\n        angular.module('ngView', [], function($routeProvider, $locationProvider) {\r\n          $routeProvider.when('/Book/:bookId', {\r\n            templateUrl: 'book.html',\r\n            controller: BookCntl\r\n          });\r\n          $routeProvider.when('/Book/:bookId/ch/:chapterId', {\r\n            templateUrl: 'chapter.html',\r\n            controller: ChapterCntl\r\n          });\r\n\r\n          // configure html5 to get links working on jsfiddle\r\n          $locationProvider.html5Mode(true);\r\n        });\r\n\r\n        function MainCntl($scope, $route, $routeParams, $location) {\r\n          $scope.$route = $route;\r\n          $scope.$location = $location;\r\n          $scope.$routeParams = $routeParams;\r\n        }\r\n\r\n        function BookCntl($scope, $routeParams) {\r\n          $scope.name = \"BookCntl\";\r\n          $scope.params = $routeParams;\r\n        }\r\n\r\n        function ChapterCntl($scope, $routeParams) {\r\n          $scope.name = \"ChapterCntl\";\r\n          $scope.params = $routeParams;\r\n        }\r\n      </file>\r\n\r\n      <file name=\"scenario.js\">\r\n        it('should load and compile correct template', function() {\r\n          element('a:contains(\"Moby: Ch1\")').click();\r\n          var content = element('.doc-example-live [ng-view]').text();\r\n          expect(content).toMatch(/controller\\: ChapterCntl/);\r\n          expect(content).toMatch(/Book Id\\: Moby/);\r\n          expect(content).toMatch(/Chapter Id\\: 1/);\r\n\r\n          element('a:contains(\"Scarlet\")').click();\r\n          content = element('.doc-example-live [ng-view]').text();\r\n          expect(content).toMatch(/controller\\: BookCntl/);\r\n          expect(content).toMatch(/Book Id\\: Scarlet/);\r\n        });\r\n      </file>\r\n    </example>\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc event\r\n * @name ng.directive:ngView#$viewContentLoaded\r\n * @eventOf ng.directive:ngView\r\n * @eventType emit on the current ngView scope\r\n * @description\r\n * Emitted every time the ngView content is reloaded.\r\n */\r\nvar ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$compile',\r\n                       '$controller',\r\n               function($http,   $templateCache,   $route,   $anchorScroll,   $compile,\r\n                        $controller) {\r\n  return {\r\n    restrict: 'ECA',\r\n    terminal: true,\r\n    link: function(scope, element, attr) {\r\n      var lastScope,\r\n          onloadExp = attr.onload || '';\r\n\r\n      scope.$on('$routeChangeSuccess', update);\r\n      update();\r\n\r\n\r\n      function destroyLastScope() {\r\n        if (lastScope) {\r\n          lastScope.$destroy();\r\n          lastScope = null;\r\n        }\r\n      }\r\n\r\n      function clearContent() {\r\n        element.html('');\r\n        destroyLastScope();\r\n      }\r\n\r\n      function update() {\r\n        var locals = $route.current && $route.current.locals,\r\n            template = locals && locals.$template;\r\n\r\n        if (template) {\r\n          element.html(template);\r\n          destroyLastScope();\r\n\r\n          var link = $compile(element.contents()),\r\n              current = $route.current,\r\n              controller;\r\n\r\n          lastScope = current.scope = scope.$new();\r\n          if (current.controller) {\r\n            locals.$scope = lastScope;\r\n            controller = $controller(current.controller, locals);\r\n            element.contents().data('$ngControllerController', controller);\r\n          }\r\n\r\n          link(lastScope);\r\n          lastScope.$emit('$viewContentLoaded');\r\n          lastScope.$eval(onloadExp);\r\n\r\n          // $anchorScroll might listen on event...\r\n          $anchorScroll();\r\n        } else {\r\n          clearContent();\r\n        }\r\n      }\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:script\r\n *\r\n * @description\r\n * Load content of a script tag, with type `text/ng-template`, into `$templateCache`, so that the\r\n * template can be used by `ngInclude`, `ngView` or directive templates.\r\n *\r\n * @restrict E\r\n * @param {'text/ng-template'} type must be set to `'text/ng-template'`\r\n *\r\n * @example\r\n  <doc:example>\r\n    <doc:source>\r\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\r\n        Content of the template.\r\n      </script>\r\n\r\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\r\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\r\n    </doc:source>\r\n    <doc:scenario>\r\n      it('should load template defined inside script tag', function() {\r\n        element('#tpl-link').click();\r\n        expect(element('#tpl-content').text()).toMatch(/Content of the template/);\r\n      });\r\n    </doc:scenario>\r\n  </doc:example>\r\n */\r\nvar scriptDirective = ['$templateCache', function($templateCache) {\r\n  return {\r\n    restrict: 'E',\r\n    terminal: true,\r\n    compile: function(element, attr) {\r\n      if (attr.type == 'text/ng-template') {\r\n        var templateUrl = attr.id,\r\n            // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent\r\n            text = element[0].text;\r\n\r\n        $templateCache.put(templateUrl, text);\r\n      }\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:select\r\n * @restrict E\r\n *\r\n * @description\r\n * HTML `SELECT` element with angular data-binding.\r\n *\r\n * # `ngOptions`\r\n *\r\n * Optionally `ngOptions` attribute can be used to dynamically generate a list of `<option>`\r\n * elements for a `<select>` element using an array or an object obtained by evaluating the\r\n * `ngOptions` expression.\r\n *ËË\r\n * When an item in the select menu is select, the value of array element or object property\r\n * represented by the selected option will be bound to the model identified by the `ngModel`\r\n * directive of the parent select element.\r\n *\r\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\r\n * be nested into the `<select>` element. This element will then represent `null` or \"not selected\"\r\n * option. See example below for demonstration.\r\n *\r\n * Note: `ngOptions` provides iterator facility for `<option>` element which should be used instead\r\n * of {@link ng.directive:ngRepeat ngRepeat} when you want the\r\n * `select` model to be bound to a non-string value. This is because an option element can currently\r\n * be bound to string values only.\r\n *\r\n * @param {string} name assignable expression to data-bind to.\r\n * @param {string=} required The control is considered valid only if value is entered.\r\n * @param {comprehension_expression=} ngOptions in one of the following forms:\r\n *\r\n *   * for array data sources:\r\n *     * `label` **`for`** `value` **`in`** `array`\r\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\r\n *     * `label`  **`group by`** `group` **`for`** `value` **`in`** `array`\r\n *     * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array`\r\n *   * for object data sources:\r\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\r\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\r\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\r\n *     * `select` **`as`** `label` **`group by`** `group`\r\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\r\n *\r\n * Where:\r\n *\r\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\r\n *   * `value`: local variable which will refer to each item in the `array` or each property value\r\n *      of `object` during iteration.\r\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\r\n *   * `label`: The result of this expression will be the label for `<option>` element. The\r\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\r\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\r\n *      element. If not specified, `select` expression will default to `value`.\r\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\r\n *      DOM element.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <script>\r\n        function MyCntrl($scope) {\r\n          $scope.colors = [\r\n            {name:'black', shade:'dark'},\r\n            {name:'white', shade:'light'},\r\n            {name:'red', shade:'dark'},\r\n            {name:'blue', shade:'dark'},\r\n            {name:'yellow', shade:'light'}\r\n          ];\r\n          $scope.color = $scope.colors[2]; // red\r\n        }\r\n        </script>\r\n        <div ng-controller=\"MyCntrl\">\r\n          <ul>\r\n            <li ng-repeat=\"color in colors\">\r\n              Name: <input ng-model=\"color.name\">\r\n              [<a href ng-click=\"colors.splice($index, 1)\">X</a>]\r\n            </li>\r\n            <li>\r\n              [<a href ng-click=\"colors.push({})\">add</a>]\r\n            </li>\r\n          </ul>\r\n          <hr/>\r\n          Color (null not allowed):\r\n          <select ng-model=\"color\" ng-options=\"c.name for c in colors\"></select><br>\r\n\r\n          Color (null allowed):\r\n          <span  class=\"nullable\">\r\n            <select ng-model=\"color\" ng-options=\"c.name for c in colors\">\r\n              <option value=\"\">-- chose color --</option>\r\n            </select>\r\n          </span><br/>\r\n\r\n          Color grouped by shade:\r\n          <select ng-model=\"color\" ng-options=\"c.name group by c.shade for c in colors\">\r\n          </select><br/>\r\n\r\n\r\n          Select <a href ng-click=\"color={name:'not in list'}\">bogus</a>.<br>\r\n          <hr/>\r\n          Currently selected: {{ {selected_color:color}  }}\r\n          <div style=\"border:solid 1px black; height:20px\"\r\n               ng-style=\"{'background-color':color.name}\">\r\n          </div>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n         it('should check ng-options', function() {\r\n           expect(binding('{selected_color:color}')).toMatch('red');\r\n           select('color').option('0');\r\n           expect(binding('{selected_color:color}')).toMatch('black');\r\n           using('.nullable').select('color').option('');\r\n           expect(binding('{selected_color:color}')).toMatch('null');\r\n         });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\n\r\nvar ngOptionsDirective = valueFn({ terminal: true });\r\nvar selectDirective = ['$compile', '$parse', function($compile,   $parse) {\r\n                         //00001111100000000000222200000000000000000000003333000000000000044444444444444444000000000555555555555555550000000666666666666666660000000000000007777\r\n  var NG_OPTIONS_REGEXP = /^\\s*(.*?)(?:\\s+as\\s+(.*?))?(?:\\s+group\\s+by\\s+(.*))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*)|(?:\\(\\s*([\\$\\w][\\$\\w\\d]*)\\s*,\\s*([\\$\\w][\\$\\w\\d]*)\\s*\\)))\\s+in\\s+(.*)$/,\r\n      nullModelCtrl = {$setViewValue: noop};\r\n\r\n  return {\r\n    restrict: 'E',\r\n    require: ['select', '?ngModel'],\r\n    controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {\r\n      var self = this,\r\n          optionsMap = {},\r\n          ngModelCtrl = nullModelCtrl,\r\n          nullOption,\r\n          unknownOption;\r\n\r\n\r\n      self.databound = $attrs.ngModel;\r\n\r\n\r\n      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {\r\n        ngModelCtrl = ngModelCtrl_;\r\n        nullOption = nullOption_;\r\n        unknownOption = unknownOption_;\r\n      }\r\n\r\n\r\n      self.addOption = function(value) {\r\n        optionsMap[value] = true;\r\n\r\n        if (ngModelCtrl.$viewValue == value) {\r\n          $element.val(value);\r\n          if (unknownOption.parent()) unknownOption.remove();\r\n        }\r\n      };\r\n\r\n\r\n      self.removeOption = function(value) {\r\n        if (this.hasOption(value)) {\r\n          delete optionsMap[value];\r\n          if (ngModelCtrl.$viewValue == value) {\r\n            this.renderUnknownOption(value);\r\n          }\r\n        }\r\n      };\r\n\r\n\r\n      self.renderUnknownOption = function(val) {\r\n        var unknownVal = '? ' + hashKey(val) + ' ?';\r\n        unknownOption.val(unknownVal);\r\n        $element.prepend(unknownOption);\r\n        $element.val(unknownVal);\r\n        unknownOption.prop('selected', true); // needed for IE\r\n      }\r\n\r\n\r\n      self.hasOption = function(value) {\r\n        return optionsMap.hasOwnProperty(value);\r\n      }\r\n\r\n      $scope.$on('$destroy', function() {\r\n        // disable unknown option so that we don't do work when the whole select is being destroyed\r\n        self.renderUnknownOption = noop;\r\n      });\r\n    }],\r\n\r\n    link: function(scope, element, attr, ctrls) {\r\n      // if ngModel is not defined, we don't need to do anything\r\n      if (!ctrls[1]) return;\r\n\r\n      var selectCtrl = ctrls[0],\r\n          ngModelCtrl = ctrls[1],\r\n          multiple = attr.multiple,\r\n          optionsExp = attr.ngOptions,\r\n          nullOption = false, // if false, user will not be able to select it (used by ngOptions)\r\n          emptyOption,\r\n          // we can't just jqLite('<option>') since jqLite is not smart enough\r\n          // to create it in <select> and IE barfs otherwise.\r\n          optionTemplate = jqLite(document.createElement('option')),\r\n          optGroupTemplate =jqLite(document.createElement('optgroup')),\r\n          unknownOption = optionTemplate.clone();\r\n\r\n      // find \"null\" option\r\n      for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {\r\n        if (children[i].value == '') {\r\n          emptyOption = nullOption = children.eq(i);\r\n          break;\r\n        }\r\n      }\r\n\r\n      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);\r\n\r\n      // required validator\r\n      if (multiple && (attr.required || attr.ngRequired)) {\r\n        var requiredValidator = function(value) {\r\n          ngModelCtrl.$setValidity('required', !attr.required || (value && value.length));\r\n          return value;\r\n        };\r\n\r\n        ngModelCtrl.$parsers.push(requiredValidator);\r\n        ngModelCtrl.$formatters.unshift(requiredValidator);\r\n\r\n        attr.$observe('required', function() {\r\n          requiredValidator(ngModelCtrl.$viewValue);\r\n        });\r\n      }\r\n\r\n      if (optionsExp) Options(scope, element, ngModelCtrl);\r\n      else if (multiple) Multiple(scope, element, ngModelCtrl);\r\n      else Single(scope, element, ngModelCtrl, selectCtrl);\r\n\r\n\r\n      ////////////////////////////\r\n\r\n\r\n\r\n      function Single(scope, selectElement, ngModelCtrl, selectCtrl) {\r\n        ngModelCtrl.$render = function() {\r\n          var viewValue = ngModelCtrl.$viewValue;\r\n\r\n          if (selectCtrl.hasOption(viewValue)) {\r\n            if (unknownOption.parent()) unknownOption.remove();\r\n            selectElement.val(viewValue);\r\n            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy\r\n          } else {\r\n            if (isUndefined(viewValue) && emptyOption) {\r\n              selectElement.val('');\r\n            } else {\r\n              selectCtrl.renderUnknownOption(viewValue);\r\n            }\r\n          }\r\n        };\r\n\r\n        selectElement.bind('change', function() {\r\n          scope.$apply(function() {\r\n            if (unknownOption.parent()) unknownOption.remove();\r\n            ngModelCtrl.$setViewValue(selectElement.val());\r\n          });\r\n        });\r\n      }\r\n\r\n      function Multiple(scope, selectElement, ctrl) {\r\n        var lastView;\r\n        ctrl.$render = function() {\r\n          var items = new HashMap(ctrl.$viewValue);\r\n          forEach(selectElement.children(), function(option) {\r\n            option.selected = isDefined(items.get(option.value));\r\n          });\r\n        };\r\n\r\n        // we have to do it on each watch since ngModel watches reference, but\r\n        // we need to work of an array, so we need to see if anything was inserted/removed\r\n        scope.$watch(function() {\r\n          if (!equals(lastView, ctrl.$viewValue)) {\r\n            lastView = copy(ctrl.$viewValue);\r\n            ctrl.$render();\r\n          }\r\n        });\r\n\r\n        selectElement.bind('change', function() {\r\n          scope.$apply(function() {\r\n            var array = [];\r\n            forEach(selectElement.children(), function(option) {\r\n              if (option.selected) {\r\n                array.push(option.value);\r\n              }\r\n            });\r\n            ctrl.$setViewValue(array);\r\n          });\r\n        });\r\n      }\r\n\r\n      function Options(scope, selectElement, ctrl) {\r\n        var match;\r\n\r\n        if (! (match = optionsExp.match(NG_OPTIONS_REGEXP))) {\r\n          throw Error(\r\n            \"Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\" +\r\n            \" but got '\" + optionsExp + \"'.\");\r\n        }\r\n\r\n        var displayFn = $parse(match[2] || match[1]),\r\n            valueName = match[4] || match[6],\r\n            keyName = match[5],\r\n            groupByFn = $parse(match[3] || ''),\r\n            valueFn = $parse(match[2] ? match[1] : valueName),\r\n            valuesFn = $parse(match[7]),\r\n            // This is an array of array of existing option groups in DOM. We try to reuse these if possible\r\n            // optionGroupsCache[0] is the options with no option group\r\n            // optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element\r\n            optionGroupsCache = [[{element: selectElement, label:''}]];\r\n\r\n        if (nullOption) {\r\n          // compile the element since there might be bindings in it\r\n          $compile(nullOption)(scope);\r\n\r\n          // remove the class, which is added automatically because we recompile the element and it\r\n          // becomes the compilation root\r\n          nullOption.removeClass('ng-scope');\r\n\r\n          // we need to remove it before calling selectElement.html('') because otherwise IE will\r\n          // remove the label from the element. wtf?\r\n          nullOption.remove();\r\n        }\r\n\r\n        // clear contents, we'll add what's needed based on the model\r\n        selectElement.html('');\r\n\r\n        selectElement.bind('change', function() {\r\n          scope.$apply(function() {\r\n            var optionGroup,\r\n                collection = valuesFn(scope) || [],\r\n                locals = {},\r\n                key, value, optionElement, index, groupIndex, length, groupLength;\r\n\r\n            if (multiple) {\r\n              value = [];\r\n              for (groupIndex = 0, groupLength = optionGroupsCache.length;\r\n                   groupIndex < groupLength;\r\n                   groupIndex++) {\r\n                // list of options for that group. (first item has the parent)\r\n                optionGroup = optionGroupsCache[groupIndex];\r\n\r\n                for(index = 1, length = optionGroup.length; index < length; index++) {\r\n                  if ((optionElement = optionGroup[index].element)[0].selected) {\r\n                    key = optionElement.val();\r\n                    if (keyName) locals[keyName] = key;\r\n                    locals[valueName] = collection[key];\r\n                    value.push(valueFn(scope, locals));\r\n                  }\r\n                }\r\n              }\r\n            } else {\r\n              key = selectElement.val();\r\n              if (key == '?') {\r\n                value = undefined;\r\n              } else if (key == ''){\r\n                value = null;\r\n              } else {\r\n                locals[valueName] = collection[key];\r\n                if (keyName) locals[keyName] = key;\r\n                value = valueFn(scope, locals);\r\n              }\r\n            }\r\n            ctrl.$setViewValue(value);\r\n          });\r\n        });\r\n\r\n        ctrl.$render = render;\r\n\r\n        // TODO(vojta): can't we optimize this ?\r\n        scope.$watch(render);\r\n\r\n        function render() {\r\n          var optionGroups = {'':[]}, // Temporary location for the option groups before we render them\r\n              optionGroupNames = [''],\r\n              optionGroupName,\r\n              optionGroup,\r\n              option,\r\n              existingParent, existingOptions, existingOption,\r\n              modelValue = ctrl.$modelValue,\r\n              values = valuesFn(scope) || [],\r\n              keys = keyName ? sortedKeys(values) : values,\r\n              groupLength, length,\r\n              groupIndex, index,\r\n              locals = {},\r\n              selected,\r\n              selectedSet = false, // nothing is selected yet\r\n              lastElement,\r\n              element;\r\n\r\n          if (multiple) {\r\n            selectedSet = new HashMap(modelValue);\r\n          } else if (modelValue === null || nullOption) {\r\n            // if we are not multiselect, and we are null then we have to add the nullOption\r\n            optionGroups[''].push({selected:modelValue === null, id:'', label:''});\r\n            selectedSet = true;\r\n          }\r\n\r\n          // We now build up the list of options we need (we merge later)\r\n          for (index = 0; length = keys.length, index < length; index++) {\r\n               locals[valueName] = values[keyName ? locals[keyName]=keys[index]:index];\r\n               optionGroupName = groupByFn(scope, locals) || '';\r\n            if (!(optionGroup = optionGroups[optionGroupName])) {\r\n              optionGroup = optionGroups[optionGroupName] = [];\r\n              optionGroupNames.push(optionGroupName);\r\n            }\r\n            if (multiple) {\r\n              selected = selectedSet.remove(valueFn(scope, locals)) != undefined;\r\n            } else {\r\n              selected = modelValue === valueFn(scope, locals);\r\n              selectedSet = selectedSet || selected; // see if at least one item is selected\r\n            }\r\n            optionGroup.push({\r\n              id: keyName ? keys[index] : index,   // either the index into array or key from object\r\n              label: displayFn(scope, locals) || '', // what will be seen by the user\r\n              selected: selected                   // determine if we should be selected\r\n            });\r\n          }\r\n          if (!multiple && !selectedSet) {\r\n            // nothing was selected, we have to insert the undefined item\r\n            optionGroups[''].unshift({id:'?', label:'', selected:true});\r\n          }\r\n\r\n          // Now we need to update the list of DOM nodes to match the optionGroups we computed above\r\n          for (groupIndex = 0, groupLength = optionGroupNames.length;\r\n               groupIndex < groupLength;\r\n               groupIndex++) {\r\n            // current option group name or '' if no group\r\n            optionGroupName = optionGroupNames[groupIndex];\r\n\r\n            // list of options for that group. (first item has the parent)\r\n            optionGroup = optionGroups[optionGroupName];\r\n\r\n            if (optionGroupsCache.length <= groupIndex) {\r\n              // we need to grow the optionGroups\r\n              existingParent = {\r\n                element: optGroupTemplate.clone().attr('label', optionGroupName),\r\n                label: optionGroup.label\r\n              };\r\n              existingOptions = [existingParent];\r\n              optionGroupsCache.push(existingOptions);\r\n              selectElement.append(existingParent.element);\r\n            } else {\r\n              existingOptions = optionGroupsCache[groupIndex];\r\n              existingParent = existingOptions[0];  // either SELECT (no group) or OPTGROUP element\r\n\r\n              // update the OPTGROUP label if not the same.\r\n              if (existingParent.label != optionGroupName) {\r\n                existingParent.element.attr('label', existingParent.label = optionGroupName);\r\n              }\r\n            }\r\n\r\n            lastElement = null;  // start at the beginning\r\n            for(index = 0, length = optionGroup.length; index < length; index++) {\r\n              option = optionGroup[index];\r\n              if ((existingOption = existingOptions[index+1])) {\r\n                // reuse elements\r\n                lastElement = existingOption.element;\r\n                if (existingOption.label !== option.label) {\r\n                  lastElement.text(existingOption.label = option.label);\r\n                }\r\n                if (existingOption.id !== option.id) {\r\n                  lastElement.val(existingOption.id = option.id);\r\n                }\r\n                if (existingOption.element.selected !== option.selected) {\r\n                  lastElement.prop('selected', (existingOption.selected = option.selected));\r\n                }\r\n              } else {\r\n                // grow elements\r\n\r\n                // if it's a null option\r\n                if (option.id === '' && nullOption) {\r\n                  // put back the pre-compiled element\r\n                  element = nullOption;\r\n                } else {\r\n                  // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but\r\n                  // in this version of jQuery on some browser the .text() returns a string\r\n                  // rather then the element.\r\n                  (element = optionTemplate.clone())\r\n                      .val(option.id)\r\n                      .attr('selected', option.selected)\r\n                      .text(option.label);\r\n                }\r\n\r\n                existingOptions.push(existingOption = {\r\n                    element: element,\r\n                    label: option.label,\r\n                    id: option.id,\r\n                    selected: option.selected\r\n                });\r\n                if (lastElement) {\r\n                  lastElement.after(element);\r\n                } else {\r\n                  existingParent.element.append(element);\r\n                }\r\n                lastElement = element;\r\n              }\r\n            }\r\n            // remove any excessive OPTIONs in a group\r\n            index++; // increment since the existingOptions[0] is parent element not OPTION\r\n            while(existingOptions.length > index) {\r\n              existingOptions.pop().element.remove();\r\n            }\r\n          }\r\n          // remove any excessive OPTGROUPs from select\r\n          while(optionGroupsCache.length > groupIndex) {\r\n            optionGroupsCache.pop()[0].element.remove();\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}];\r\n\r\nvar optionDirective = ['$interpolate', function($interpolate) {\r\n  var nullSelectCtrl = {\r\n    addOption: noop,\r\n    removeOption: noop\r\n  };\r\n\r\n  return {\r\n    restrict: 'E',\r\n    priority: 100,\r\n    require: '^select',\r\n    compile: function(element, attr) {\r\n      if (isUndefined(attr.value)) {\r\n        var interpolateFn = $interpolate(element.text(), true);\r\n        if (!interpolateFn) {\r\n          attr.$set('value', element.text());\r\n        }\r\n      }\r\n\r\n      return function (scope, element, attr, selectCtrl) {\r\n        if (selectCtrl.databound) {\r\n          // For some reason Opera defaults to true and if not overridden this messes up the repeater.\r\n          // We don't want the view to drive the initialization of the model anyway.\r\n          element.prop('selected', false);\r\n        } else {\r\n          selectCtrl = nullSelectCtrl;\r\n        }\r\n\r\n        if (interpolateFn) {\r\n          scope.$watch(interpolateFn, function(newVal, oldVal) {\r\n            attr.$set('value', newVal);\r\n            if (newVal !== oldVal) selectCtrl.removeOption(oldVal);\r\n            selectCtrl.addOption(newVal);\r\n          });\r\n        } else {\r\n          selectCtrl.addOption(attr.value);\r\n        }\r\n\r\n        element.bind('$destroy', function() {\r\n          selectCtrl.removeOption(attr.value);\r\n        });\r\n      };\r\n    }\r\n  }\r\n}];\r\n\r\nvar styleDirective = valueFn({\r\n  restrict: 'E',\r\n  terminal: true\r\n});\r\n  //try to bind to jquery now so that one can write angular.element().read()\r\n  //but we will rebind on bootstrap again.\r\n  bindJQuery();\r\n\r\n  publishExternalAPI(angular);\r\n\r\n  jqLite(document).ready(function() {\r\n    angularInit(document, bootstrap);\r\n  });\r\n\r\n})(window, document);\r\nangular.element(document).find('head').append('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none;}ng\\\\:form{display:block;}</style>');"
  },
  {
    "path": "servers/embed/assets/js/vendor/jquery.cookie.js",
    "content": "/*!\r\n * jQuery Cookie Plugin\r\n * https://github.com/carhartl/jquery-cookie\r\n *\r\n * Copyright 2011, Klaus Hartl\r\n * Dual licensed under the MIT or GPL Version 2 licenses.\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.opensource.org/licenses/GPL-2.0\r\n */\r\n(function($) {\r\n    $.cookie = function(key, value, options) {\r\n\r\n        // key and at least value given, set cookie...\r\n        if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {\r\n            options = $.extend({}, options);\r\n\r\n            if (value === null || value === undefined) {\r\n                options.expires = -1;\r\n            }\r\n\r\n            if (typeof options.expires === 'number') {\r\n                var days = options.expires, t = options.expires = new Date();\r\n                t.setDate(t.getDate() + days);\r\n            }\r\n\r\n            value = String(value);\r\n\r\n            return (document.cookie = [\r\n                encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),\r\n                options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE\r\n                options.path    ? '; path=' + options.path : '',\r\n                options.domain  ? '; domain=' + options.domain : '',\r\n                options.secure  ? '; secure' : ''\r\n            ].join(''));\r\n        }\r\n\r\n        // key and possibly options given, get cookie...\r\n        options = value || {};\r\n        var decode = options.raw ? function(s) { return s; } : decodeURIComponent;\r\n\r\n        var pairs = document.cookie.split('; ');\r\n        for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {\r\n            if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as \"c; \", e.g. without \"=\" as opposed to EOMB, thus pair[1] may be undefined\r\n        }\r\n        return null;\r\n    };\r\n})(jQuery);"
  },
  {
    "path": "servers/embed/assets/js/vendor/jquery.js",
    "content": "/*!\r\n * jQuery JavaScript Library v1.7.2\r\n * http://jquery.com/\r\n *\r\n * Copyright 2011, John Resig\r\n * Dual licensed under the MIT or GPL Version 2 licenses.\r\n * http://jquery.org/license\r\n *\r\n * Includes Sizzle.js\r\n * http://sizzlejs.com/\r\n * Copyright 2011, The Dojo Foundation\r\n * Released under the MIT, BSD, and GPL Licenses.\r\n *\r\n * Date: Wed Mar 21 12:46:34 2012 -0700\r\n */\r\n(function( window, undefined ) {\r\n\r\n// Use the correct document accordingly with window argument (sandbox)\r\nvar document = window.document,\r\n  navigator = window.navigator,\r\n\tlocation = window.location;\r\nvar jQuery = (function() {\r\n\r\n// Define a local copy of jQuery\r\nvar jQuery = function( selector, context ) {\r\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\r\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\r\n\t},\r\n\r\n\t// Map over jQuery in case of overwrite\r\n\t_jQuery = window.jQuery,\r\n\r\n\t// Map over the $ in case of overwrite\r\n\t_$ = window.$,\r\n\r\n\t// A central reference to the root jQuery(document)\r\n\trootjQuery,\r\n\r\n\t// A simple way to check for HTML strings or ID strings\r\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\r\n\tquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\r\n\r\n\t// Check if a string has a non-whitespace character in it\r\n\trnotwhite = /\\S/,\r\n\r\n\t// Used for trimming whitespace\r\n\ttrimLeft = /^\\s+/,\r\n\ttrimRight = /\\s+$/,\r\n\r\n\t// Match a standalone tag\r\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\r\n\r\n\t// JSON RegExp\r\n\trvalidchars = /^[\\],:{}\\s]*$/,\r\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\r\n\trvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\r\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\r\n\r\n\t// Useragent RegExp\r\n\trwebkit = /(webkit)[ \\/]([\\w.]+)/,\r\n\tropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\r\n\trmsie = /(msie) ([\\w.]+)/,\r\n\trmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\r\n\r\n\t// Matches dashed string for camelizing\r\n\trdashAlpha = /-([a-z]|[0-9])/ig,\r\n\trmsPrefix = /^-ms-/,\r\n\r\n\t// Used by jQuery.camelCase as callback to replace()\r\n\tfcamelCase = function( all, letter ) {\r\n\t\treturn ( letter + \"\" ).toUpperCase();\r\n\t},\r\n\r\n\t// Keep a UserAgent string for use with jQuery.browser\r\n\tuserAgent = navigator.userAgent,\r\n\r\n\t// For matching the engine and version of the browser\r\n\tbrowserMatch,\r\n\r\n\t// The deferred used on DOM ready\r\n\treadyList,\r\n\r\n\t// The ready event handler\r\n\tDOMContentLoaded,\r\n\r\n\t// Save a reference to some core methods\r\n\ttoString = Object.prototype.toString,\r\n\thasOwn = Object.prototype.hasOwnProperty,\r\n\tpush = Array.prototype.push,\r\n\tslice = Array.prototype.slice,\r\n\ttrim = String.prototype.trim,\r\n\tindexOf = Array.prototype.indexOf,\r\n\r\n\t// [[Class]] -> type pairs\r\n\tclass2type = {};\r\n\r\njQuery.fn = jQuery.prototype = {\r\n\tconstructor: jQuery,\r\n\tinit: function( selector, context, rootjQuery ) {\r\n\t\tvar match, elem, ret, doc;\r\n\r\n\t\t// Handle $(\"\"), $(null), or $(undefined)\r\n\t\tif ( !selector ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// Handle $(DOMElement)\r\n\t\tif ( selector.nodeType ) {\r\n\t\t\tthis.context = this[0] = selector;\r\n\t\t\tthis.length = 1;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// The body element only exists once, optimize finding it\r\n\t\tif ( selector === \"body\" && !context && document.body ) {\r\n\t\t\tthis.context = document;\r\n\t\t\tthis[0] = document.body;\r\n\t\t\tthis.selector = selector;\r\n\t\t\tthis.length = 1;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// Handle HTML strings\r\n\t\tif ( typeof selector === \"string\" ) {\r\n\t\t\t// Are we dealing with HTML string or an ID?\r\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\r\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\r\n\t\t\t\tmatch = [ null, selector, null ];\r\n\r\n\t\t\t} else {\r\n\t\t\t\tmatch = quickExpr.exec( selector );\r\n\t\t\t}\r\n\r\n\t\t\t// Verify a match, and that no context was specified for #id\r\n\t\t\tif ( match && (match[1] || !context) ) {\r\n\r\n\t\t\t\t// HANDLE: $(html) -> $(array)\r\n\t\t\t\tif ( match[1] ) {\r\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\r\n\t\t\t\t\tdoc = ( context ? context.ownerDocument || context : document );\r\n\r\n\t\t\t\t\t// If a single string is passed in and it's a single tag\r\n\t\t\t\t\t// just do a createElement and skip the rest\r\n\t\t\t\t\tret = rsingleTag.exec( selector );\r\n\r\n\t\t\t\t\tif ( ret ) {\r\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\r\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\r\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tret = jQuery.buildFragment( [ match[1] ], [ doc ] );\r\n\t\t\t\t\t\tselector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn jQuery.merge( this, selector );\r\n\r\n\t\t\t\t// HANDLE: $(\"#id\")\r\n\t\t\t\t} else {\r\n\t\t\t\t\telem = document.getElementById( match[2] );\r\n\r\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\t\tif ( elem && elem.parentNode ) {\r\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\r\n\t\t\t\t\t\t// by name instead of ID\r\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\r\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\r\n\t\t\t\t\t\tthis.length = 1;\r\n\t\t\t\t\t\tthis[0] = elem;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.context = document;\r\n\t\t\t\t\tthis.selector = selector;\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\r\n\t\t\t// HANDLE: $(expr, $(...))\r\n\t\t\t} else if ( !context || context.jquery ) {\r\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\r\n\r\n\t\t\t// HANDLE: $(expr, context)\r\n\t\t\t// (which is just equivalent to: $(context).find(expr)\r\n\t\t\t} else {\r\n\t\t\t\treturn this.constructor( context ).find( selector );\r\n\t\t\t}\r\n\r\n\t\t// HANDLE: $(function)\r\n\t\t// Shortcut for document ready\r\n\t\t} else if ( jQuery.isFunction( selector ) ) {\r\n\t\t\treturn rootjQuery.ready( selector );\r\n\t\t}\r\n\r\n\t\tif ( selector.selector !== undefined ) {\r\n\t\t\tthis.selector = selector.selector;\r\n\t\t\tthis.context = selector.context;\r\n\t\t}\r\n\r\n\t\treturn jQuery.makeArray( selector, this );\r\n\t},\r\n\r\n\t// Start with an empty selector\r\n\tselector: \"\",\r\n\r\n\t// The current version of jQuery being used\r\n\tjquery: \"1.7.2\",\r\n\r\n\t// The default length of a jQuery object is 0\r\n\tlength: 0,\r\n\r\n\t// The number of elements contained in the matched element set\r\n\tsize: function() {\r\n\t\treturn this.length;\r\n\t},\r\n\r\n\ttoArray: function() {\r\n\t\treturn slice.call( this, 0 );\r\n\t},\r\n\r\n\t// Get the Nth element in the matched element set OR\r\n\t// Get the whole matched element set as a clean array\r\n\tget: function( num ) {\r\n\t\treturn num == null ?\r\n\r\n\t\t\t// Return a 'clean' array\r\n\t\t\tthis.toArray() :\r\n\r\n\t\t\t// Return just the object\r\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\r\n\t},\r\n\r\n\t// Take an array of elements and push it onto the stack\r\n\t// (returning the new matched element set)\r\n\tpushStack: function( elems, name, selector ) {\r\n\t\t// Build a new jQuery matched element set\r\n\t\tvar ret = this.constructor();\r\n\r\n\t\tif ( jQuery.isArray( elems ) ) {\r\n\t\t\tpush.apply( ret, elems );\r\n\r\n\t\t} else {\r\n\t\t\tjQuery.merge( ret, elems );\r\n\t\t}\r\n\r\n\t\t// Add the old object onto the stack (as a reference)\r\n\t\tret.prevObject = this;\r\n\r\n\t\tret.context = this.context;\r\n\r\n\t\tif ( name === \"find\" ) {\r\n\t\t\tret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\r\n\t\t} else if ( name ) {\r\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\r\n\t\t}\r\n\r\n\t\t// Return the newly-formed element set\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t// Execute a callback for every element in the matched set.\r\n\t// (You can seed the arguments with an array of args, but this is\r\n\t// only used internally.)\r\n\teach: function( callback, args ) {\r\n\t\treturn jQuery.each( this, callback, args );\r\n\t},\r\n\r\n\tready: function( fn ) {\r\n\t\t// Attach the listeners\r\n\t\tjQuery.bindReady();\r\n\r\n\t\t// Add the callback\r\n\t\treadyList.add( fn );\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\teq: function( i ) {\r\n\t\ti = +i;\r\n\t\treturn i === -1 ?\r\n\t\t\tthis.slice( i ) :\r\n\t\t\tthis.slice( i, i + 1 );\r\n\t},\r\n\r\n\tfirst: function() {\r\n\t\treturn this.eq( 0 );\r\n\t},\r\n\r\n\tlast: function() {\r\n\t\treturn this.eq( -1 );\r\n\t},\r\n\r\n\tslice: function() {\r\n\t\treturn this.pushStack( slice.apply( this, arguments ),\r\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\r\n\t},\r\n\r\n\tmap: function( callback ) {\r\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\r\n\t\t\treturn callback.call( elem, i, elem );\r\n\t\t}));\r\n\t},\r\n\r\n\tend: function() {\r\n\t\treturn this.prevObject || this.constructor(null);\r\n\t},\r\n\r\n\t// For internal use only.\r\n\t// Behaves like an Array's method, not like a jQuery method.\r\n\tpush: push,\r\n\tsort: [].sort,\r\n\tsplice: [].splice\r\n};\r\n\r\n// Give the init function the jQuery prototype for later instantiation\r\njQuery.fn.init.prototype = jQuery.fn;\r\n\r\njQuery.extend = jQuery.fn.extend = function() {\r\n\tvar options, name, src, copy, copyIsArray, clone,\r\n\t\ttarget = arguments[0] || {},\r\n\t\ti = 1,\r\n\t\tlength = arguments.length,\r\n\t\tdeep = false;\r\n\r\n\t// Handle a deep copy situation\r\n\tif ( typeof target === \"boolean\" ) {\r\n\t\tdeep = target;\r\n\t\ttarget = arguments[1] || {};\r\n\t\t// skip the boolean and the target\r\n\t\ti = 2;\r\n\t}\r\n\r\n\t// Handle case when target is a string or something (possible in deep copy)\r\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\r\n\t\ttarget = {};\r\n\t}\r\n\r\n\t// extend jQuery itself if only one argument is passed\r\n\tif ( length === i ) {\r\n\t\ttarget = this;\r\n\t\t--i;\r\n\t}\r\n\r\n\tfor ( ; i < length; i++ ) {\r\n\t\t// Only deal with non-null/undefined values\r\n\t\tif ( (options = arguments[ i ]) != null ) {\r\n\t\t\t// Extend the base object\r\n\t\t\tfor ( name in options ) {\r\n\t\t\t\tsrc = target[ name ];\r\n\t\t\t\tcopy = options[ name ];\r\n\r\n\t\t\t\t// Prevent never-ending loop\r\n\t\t\t\tif ( target === copy ) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Recurse if we're merging plain objects or arrays\r\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\r\n\t\t\t\t\tif ( copyIsArray ) {\r\n\t\t\t\t\t\tcopyIsArray = false;\r\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Never move original objects, clone them\r\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\r\n\r\n\t\t\t\t// Don't bring in undefined values\r\n\t\t\t\t} else if ( copy !== undefined ) {\r\n\t\t\t\t\ttarget[ name ] = copy;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Return the modified object\r\n\treturn target;\r\n};\r\n\r\njQuery.extend({\r\n\tnoConflict: function( deep ) {\r\n\t\tif ( window.$ === jQuery ) {\r\n\t\t\twindow.$ = _$;\r\n\t\t}\r\n\r\n\t\tif ( deep && window.jQuery === jQuery ) {\r\n\t\t\twindow.jQuery = _jQuery;\r\n\t\t}\r\n\r\n\t\treturn jQuery;\r\n\t},\r\n\r\n\t// Is the DOM ready to be used? Set to true once it occurs.\r\n\tisReady: false,\r\n\r\n\t// A counter to track how many items to wait for before\r\n\t// the ready event fires. See #6781\r\n\treadyWait: 1,\r\n\r\n\t// Hold (or release) the ready event\r\n\tholdReady: function( hold ) {\r\n\t\tif ( hold ) {\r\n\t\t\tjQuery.readyWait++;\r\n\t\t} else {\r\n\t\t\tjQuery.ready( true );\r\n\t\t}\r\n\t},\r\n\r\n\t// Handle when the DOM is ready\r\n\tready: function( wait ) {\r\n\t\t// Either a released hold or an DOMready/load event and not yet ready\r\n\t\tif ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\r\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\r\n\t\t\tif ( !document.body ) {\r\n\t\t\t\treturn setTimeout( jQuery.ready, 1 );\r\n\t\t\t}\r\n\r\n\t\t\t// Remember that the DOM is ready\r\n\t\t\tjQuery.isReady = true;\r\n\r\n\t\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\r\n\t\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// If there are functions bound, to execute\r\n\t\t\treadyList.fireWith( document, [ jQuery ] );\r\n\r\n\t\t\t// Trigger any bound ready events\r\n\t\t\tif ( jQuery.fn.trigger ) {\r\n\t\t\t\tjQuery( document ).trigger( \"ready\" ).off( \"ready\" );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tbindReady: function() {\r\n\t\tif ( readyList ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treadyList = jQuery.Callbacks( \"once memory\" );\r\n\r\n\t\t// Catch cases where $(document).ready() is called after the\r\n\t\t// browser event has already occurred.\r\n\t\tif ( document.readyState === \"complete\" ) {\r\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\r\n\t\t\treturn setTimeout( jQuery.ready, 1 );\r\n\t\t}\r\n\r\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\r\n\t\tif ( document.addEventListener ) {\r\n\t\t\t// Use the handy event callback\r\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\r\n\r\n\t\t\t// A fallback to window.onload, that will always work\r\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\r\n\r\n\t\t// If IE event model is used\r\n\t\t} else if ( document.attachEvent ) {\r\n\t\t\t// ensure firing before onload,\r\n\t\t\t// maybe late but safe also for iframes\r\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\r\n\r\n\t\t\t// A fallback to window.onload, that will always work\r\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\r\n\r\n\t\t\t// If IE and not a frame\r\n\t\t\t// continually check to see if the document is ready\r\n\t\t\tvar toplevel = false;\r\n\r\n\t\t\ttry {\r\n\t\t\t\ttoplevel = window.frameElement == null;\r\n\t\t\t} catch(e) {}\r\n\r\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\r\n\t\t\t\tdoScrollCheck();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// See test/unit/core.js for details concerning isFunction.\r\n\t// Since version 1.3, DOM methods and functions like alert\r\n\t// aren't supported. They return false on IE (#2968).\r\n\tisFunction: function( obj ) {\r\n\t\treturn jQuery.type(obj) === \"function\";\r\n\t},\r\n\r\n\tisArray: Array.isArray || function( obj ) {\r\n\t\treturn jQuery.type(obj) === \"array\";\r\n\t},\r\n\r\n\tisWindow: function( obj ) {\r\n\t\treturn obj != null && obj == obj.window;\r\n\t},\r\n\r\n\tisNumeric: function( obj ) {\r\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\r\n\t},\r\n\r\n\ttype: function( obj ) {\r\n\t\treturn obj == null ?\r\n\t\t\tString( obj ) :\r\n\t\t\tclass2type[ toString.call(obj) ] || \"object\";\r\n\t},\r\n\r\n\tisPlainObject: function( obj ) {\r\n\t\t// Must be an Object.\r\n\t\t// Because of IE, we also have to check the presence of the constructor property.\r\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\r\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// Not own constructor property must be Object\r\n\t\t\tif ( obj.constructor &&\r\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\r\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} catch ( e ) {\r\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Own properties are enumerated firstly, so to speed up,\r\n\t\t// if last one is own, then all properties are own.\r\n\r\n\t\tvar key;\r\n\t\tfor ( key in obj ) {}\r\n\r\n\t\treturn key === undefined || hasOwn.call( obj, key );\r\n\t},\r\n\r\n\tisEmptyObject: function( obj ) {\r\n\t\tfor ( var name in obj ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\terror: function( msg ) {\r\n\t\tthrow new Error( msg );\r\n\t},\r\n\r\n\tparseJSON: function( data ) {\r\n\t\tif ( typeof data !== \"string\" || !data ) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\r\n\t\tdata = jQuery.trim( data );\r\n\r\n\t\t// Attempt to parse using the native JSON parser first\r\n\t\tif ( window.JSON && window.JSON.parse ) {\r\n\t\t\treturn window.JSON.parse( data );\r\n\t\t}\r\n\r\n\t\t// Make sure the incoming data is actual JSON\r\n\t\t// Logic borrowed from http://json.org/json2.js\r\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\r\n\t\t\t.replace( rvalidtokens, \"]\" )\r\n\t\t\t.replace( rvalidbraces, \"\")) ) {\r\n\r\n\t\t\treturn ( new Function( \"return \" + data ) )();\r\n\r\n\t\t}\r\n\t\tjQuery.error( \"Invalid JSON: \" + data );\r\n\t},\r\n\r\n\t// Cross-browser xml parsing\r\n\tparseXML: function( data ) {\r\n\t\tif ( typeof data !== \"string\" || !data ) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tvar xml, tmp;\r\n\t\ttry {\r\n\t\t\tif ( window.DOMParser ) { // Standard\r\n\t\t\t\ttmp = new DOMParser();\r\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\r\n\t\t\t} else { // IE\r\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\r\n\t\t\t\txml.async = \"false\";\r\n\t\t\t\txml.loadXML( data );\r\n\t\t\t}\r\n\t\t} catch( e ) {\r\n\t\t\txml = undefined;\r\n\t\t}\r\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\r\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\r\n\t\t}\r\n\t\treturn xml;\r\n\t},\r\n\r\n\tnoop: function() {},\r\n\r\n\t// Evaluates a script in a global context\r\n\t// Workarounds based on findings by Jim Driscoll\r\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\r\n\tglobalEval: function( data ) {\r\n\t\tif ( data && rnotwhite.test( data ) ) {\r\n\t\t\t// We use execScript on Internet Explorer\r\n\t\t\t// We use an anonymous function so that context is window\r\n\t\t\t// rather than jQuery in Firefox\r\n\t\t\t( window.execScript || function( data ) {\r\n\t\t\t\twindow[ \"eval\" ].call( window, data );\r\n\t\t\t} )( data );\r\n\t\t}\r\n\t},\r\n\r\n\t// Convert dashed to camelCase; used by the css and data modules\r\n\t// Microsoft forgot to hump their vendor prefix (#9572)\r\n\tcamelCase: function( string ) {\r\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\r\n\t},\r\n\r\n\tnodeName: function( elem, name ) {\r\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\r\n\t},\r\n\r\n\t// args is for internal usage only\r\n\teach: function( object, callback, args ) {\r\n\t\tvar name, i = 0,\r\n\t\t\tlength = object.length,\r\n\t\t\tisObj = length === undefined || jQuery.isFunction( object );\r\n\r\n\t\tif ( args ) {\r\n\t\t\tif ( isObj ) {\r\n\t\t\t\tfor ( name in object ) {\r\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; i < length; ) {\r\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// A special, fast, case for the most common use of each\r\n\t\t} else {\r\n\t\t\tif ( isObj ) {\r\n\t\t\t\tfor ( name in object ) {\r\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; i < length; ) {\r\n\t\t\t\t\tif ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn object;\r\n\t},\r\n\r\n\t// Use native String.trim function wherever possible\r\n\ttrim: trim ?\r\n\t\tfunction( text ) {\r\n\t\t\treturn text == null ?\r\n\t\t\t\t\"\" :\r\n\t\t\t\ttrim.call( text );\r\n\t\t} :\r\n\r\n\t\t// Otherwise use our own trimming functionality\r\n\t\tfunction( text ) {\r\n\t\t\treturn text == null ?\r\n\t\t\t\t\"\" :\r\n\t\t\t\ttext.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\r\n\t\t},\r\n\r\n\t// results is for internal usage only\r\n\tmakeArray: function( array, results ) {\r\n\t\tvar ret = results || [];\r\n\r\n\t\tif ( array != null ) {\r\n\t\t\t// The window, strings (and functions) also have 'length'\r\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\r\n\t\t\tvar type = jQuery.type( array );\r\n\r\n\t\t\tif ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\r\n\t\t\t\tpush.call( ret, array );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery.merge( ret, array );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\tinArray: function( elem, array, i ) {\r\n\t\tvar len;\r\n\r\n\t\tif ( array ) {\r\n\t\t\tif ( indexOf ) {\r\n\t\t\t\treturn indexOf.call( array, elem, i );\r\n\t\t\t}\r\n\r\n\t\t\tlen = array.length;\r\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\r\n\r\n\t\t\tfor ( ; i < len; i++ ) {\r\n\t\t\t\t// Skip accessing in sparse arrays\r\n\t\t\t\tif ( i in array && array[ i ] === elem ) {\r\n\t\t\t\t\treturn i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn -1;\r\n\t},\r\n\r\n\tmerge: function( first, second ) {\r\n\t\tvar i = first.length,\r\n\t\t\tj = 0;\r\n\r\n\t\tif ( typeof second.length === \"number\" ) {\r\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\r\n\t\t\t\tfirst[ i++ ] = second[ j ];\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\twhile ( second[j] !== undefined ) {\r\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfirst.length = i;\r\n\r\n\t\treturn first;\r\n\t},\r\n\r\n\tgrep: function( elems, callback, inv ) {\r\n\t\tvar ret = [], retVal;\r\n\t\tinv = !!inv;\r\n\r\n\t\t// Go through the array, only saving the items\r\n\t\t// that pass the validator function\r\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\r\n\t\t\tretVal = !!callback( elems[ i ], i );\r\n\t\t\tif ( inv !== retVal ) {\r\n\t\t\t\tret.push( elems[ i ] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t// arg is for internal usage only\r\n\tmap: function( elems, callback, arg ) {\r\n\t\tvar value, key, ret = [],\r\n\t\t\ti = 0,\r\n\t\t\tlength = elems.length,\r\n\t\t\t// jquery objects are treated as arrays\r\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\r\n\r\n\t\t// Go through the array, translating each of the items to their\r\n\t\tif ( isArray ) {\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\r\n\r\n\t\t\t\tif ( value != null ) {\r\n\t\t\t\t\tret[ ret.length ] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// Go through every key on the object,\r\n\t\t} else {\r\n\t\t\tfor ( key in elems ) {\r\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\r\n\r\n\t\t\t\tif ( value != null ) {\r\n\t\t\t\t\tret[ ret.length ] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Flatten any nested arrays\r\n\t\treturn ret.concat.apply( [], ret );\r\n\t},\r\n\r\n\t// A global GUID counter for objects\r\n\tguid: 1,\r\n\r\n\t// Bind a function to a context, optionally partially applying any\r\n\t// arguments.\r\n\tproxy: function( fn, context ) {\r\n\t\tif ( typeof context === \"string\" ) {\r\n\t\t\tvar tmp = fn[ context ];\r\n\t\t\tcontext = fn;\r\n\t\t\tfn = tmp;\r\n\t\t}\r\n\r\n\t\t// Quick check to determine if target is callable, in the spec\r\n\t\t// this throws a TypeError, but we will just return undefined.\r\n\t\tif ( !jQuery.isFunction( fn ) ) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\t// Simulated bind\r\n\t\tvar args = slice.call( arguments, 2 ),\r\n\t\t\tproxy = function() {\r\n\t\t\t\treturn fn.apply( context, args.concat( slice.call( arguments ) ) );\r\n\t\t\t};\r\n\r\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\r\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\r\n\r\n\t\treturn proxy;\r\n\t},\r\n\r\n\t// Mutifunctional method to get and set values to a collection\r\n\t// The value/s can optionally be executed if it's a function\r\n\taccess: function( elems, fn, key, value, chainable, emptyGet, pass ) {\r\n\t\tvar exec,\r\n\t\t\tbulk = key == null,\r\n\t\t\ti = 0,\r\n\t\t\tlength = elems.length;\r\n\r\n\t\t// Sets many values\r\n\t\tif ( key && typeof key === \"object\" ) {\r\n\t\t\tfor ( i in key ) {\r\n\t\t\t\tjQuery.access( elems, fn, i, key[i], 1, emptyGet, value );\r\n\t\t\t}\r\n\t\t\tchainable = 1;\r\n\r\n\t\t// Sets one value\r\n\t\t} else if ( value !== undefined ) {\r\n\t\t\t// Optionally, function values get executed if exec is true\r\n\t\t\texec = pass === undefined && jQuery.isFunction( value );\r\n\r\n\t\t\tif ( bulk ) {\r\n\t\t\t\t// Bulk operations only iterate when executing function values\r\n\t\t\t\tif ( exec ) {\r\n\t\t\t\t\texec = fn;\r\n\t\t\t\t\tfn = function( elem, key, value ) {\r\n\t\t\t\t\t\treturn exec.call( jQuery( elem ), value );\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t// Otherwise they run against the entire set\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfn.call( elems, value );\r\n\t\t\t\t\tfn = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( fn ) {\r\n\t\t\t\tfor (; i < length; i++ ) {\r\n\t\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tchainable = 1;\r\n\t\t}\r\n\r\n\t\treturn chainable ?\r\n\t\t\telems :\r\n\r\n\t\t\t// Gets\r\n\t\t\tbulk ?\r\n\t\t\t\tfn.call( elems ) :\r\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\r\n\t},\r\n\r\n\tnow: function() {\r\n\t\treturn ( new Date() ).getTime();\r\n\t},\r\n\r\n\t// Use of jQuery.browser is frowned upon.\r\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\r\n\tuaMatch: function( ua ) {\r\n\t\tua = ua.toLowerCase();\r\n\r\n\t\tvar match = rwebkit.exec( ua ) ||\r\n\t\t\tropera.exec( ua ) ||\r\n\t\t\trmsie.exec( ua ) ||\r\n\t\t\tua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\r\n\t\t\t[];\r\n\r\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\r\n\t},\r\n\r\n\tsub: function() {\r\n\t\tfunction jQuerySub( selector, context ) {\r\n\t\t\treturn new jQuerySub.fn.init( selector, context );\r\n\t\t}\r\n\t\tjQuery.extend( true, jQuerySub, this );\r\n\t\tjQuerySub.superclass = this;\r\n\t\tjQuerySub.fn = jQuerySub.prototype = this();\r\n\t\tjQuerySub.fn.constructor = jQuerySub;\r\n\t\tjQuerySub.sub = this.sub;\r\n\t\tjQuerySub.fn.init = function init( selector, context ) {\r\n\t\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\r\n\t\t\t\tcontext = jQuerySub( context );\r\n\t\t\t}\r\n\r\n\t\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\r\n\t\t};\r\n\t\tjQuerySub.fn.init.prototype = jQuerySub.fn;\r\n\t\tvar rootjQuerySub = jQuerySub(document);\r\n\t\treturn jQuerySub;\r\n\t},\r\n\r\n\tbrowser: {}\r\n});\r\n\r\n// Populate the class2type map\r\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\r\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\r\n});\r\n\r\nbrowserMatch = jQuery.uaMatch( userAgent );\r\nif ( browserMatch.browser ) {\r\n\tjQuery.browser[ browserMatch.browser ] = true;\r\n\tjQuery.browser.version = browserMatch.version;\r\n}\r\n\r\n// Deprecated, use jQuery.browser.webkit instead\r\nif ( jQuery.browser.webkit ) {\r\n\tjQuery.browser.safari = true;\r\n}\r\n\r\n// IE doesn't match non-breaking spaces with \\s\r\nif ( rnotwhite.test( \"\\xA0\" ) ) {\r\n\ttrimLeft = /^[\\s\\xA0]+/;\r\n\ttrimRight = /[\\s\\xA0]+$/;\r\n}\r\n\r\n// All jQuery objects should point back to these\r\nrootjQuery = jQuery(document);\r\n\r\n// Cleanup functions for the document ready method\r\nif ( document.addEventListener ) {\r\n\tDOMContentLoaded = function() {\r\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\r\n\t\tjQuery.ready();\r\n\t};\r\n\r\n} else if ( document.attachEvent ) {\r\n\tDOMContentLoaded = function() {\r\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\r\n\t\tif ( document.readyState === \"complete\" ) {\r\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\r\n\t\t\tjQuery.ready();\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// The DOM ready check for Internet Explorer\r\nfunction doScrollCheck() {\r\n\tif ( jQuery.isReady ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttry {\r\n\t\t// If IE is used, use the trick by Diego Perini\r\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\r\n\t\tdocument.documentElement.doScroll(\"left\");\r\n\t} catch(e) {\r\n\t\tsetTimeout( doScrollCheck, 1 );\r\n\t\treturn;\r\n\t}\r\n\r\n\t// and execute any waiting functions\r\n\tjQuery.ready();\r\n}\r\n\r\nreturn jQuery;\r\n\r\n})();\r\n\r\n\r\n// String to Object flags format cache\r\nvar flagsCache = {};\r\n\r\n// Convert String-formatted flags into Object-formatted ones and store in cache\r\nfunction createFlags( flags ) {\r\n\tvar object = flagsCache[ flags ] = {},\r\n\t\ti, length;\r\n\tflags = flags.split( /\\s+/ );\r\n\tfor ( i = 0, length = flags.length; i < length; i++ ) {\r\n\t\tobject[ flags[i] ] = true;\r\n\t}\r\n\treturn object;\r\n}\r\n\r\n/*\r\n * Create a callback list using the following parameters:\r\n *\r\n *\tflags:\tan optional list of space-separated flags that will change how\r\n *\t\t\tthe callback list behaves\r\n *\r\n * By default a callback list will act like an event callback list and can be\r\n * \"fired\" multiple times.\r\n *\r\n * Possible flags:\r\n *\r\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\r\n *\r\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\r\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\r\n *\t\t\t\t\tvalues (like a Deferred)\r\n *\r\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\r\n *\r\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\r\n *\r\n */\r\njQuery.Callbacks = function( flags ) {\r\n\r\n\t// Convert flags from String-formatted to Object-formatted\r\n\t// (we check in cache first)\r\n\tflags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};\r\n\r\n\tvar // Actual callback list\r\n\t\tlist = [],\r\n\t\t// Stack of fire calls for repeatable lists\r\n\t\tstack = [],\r\n\t\t// Last fire value (for non-forgettable lists)\r\n\t\tmemory,\r\n\t\t// Flag to know if list was already fired\r\n\t\tfired,\r\n\t\t// Flag to know if list is currently firing\r\n\t\tfiring,\r\n\t\t// First callback to fire (used internally by add and fireWith)\r\n\t\tfiringStart,\r\n\t\t// End of the loop when firing\r\n\t\tfiringLength,\r\n\t\t// Index of currently firing callback (modified by remove if needed)\r\n\t\tfiringIndex,\r\n\t\t// Add one or several callbacks to the list\r\n\t\tadd = function( args ) {\r\n\t\t\tvar i,\r\n\t\t\t\tlength,\r\n\t\t\t\telem,\r\n\t\t\t\ttype,\r\n\t\t\t\tactual;\r\n\t\t\tfor ( i = 0, length = args.length; i < length; i++ ) {\r\n\t\t\t\telem = args[ i ];\r\n\t\t\t\ttype = jQuery.type( elem );\r\n\t\t\t\tif ( type === \"array\" ) {\r\n\t\t\t\t\t// Inspect recursively\r\n\t\t\t\t\tadd( elem );\r\n\t\t\t\t} else if ( type === \"function\" ) {\r\n\t\t\t\t\t// Add if not in unique mode and callback is not in\r\n\t\t\t\t\tif ( !flags.unique || !self.has( elem ) ) {\r\n\t\t\t\t\t\tlist.push( elem );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// Fire callbacks\r\n\t\tfire = function( context, args ) {\r\n\t\t\targs = args || [];\r\n\t\t\tmemory = !flags.memory || [ context, args ];\r\n\t\t\tfired = true;\r\n\t\t\tfiring = true;\r\n\t\t\tfiringIndex = firingStart || 0;\r\n\t\t\tfiringStart = 0;\r\n\t\t\tfiringLength = list.length;\r\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\r\n\t\t\t\tif ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {\r\n\t\t\t\t\tmemory = true; // Mark as halted\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfiring = false;\r\n\t\t\tif ( list ) {\r\n\t\t\t\tif ( !flags.once ) {\r\n\t\t\t\t\tif ( stack && stack.length ) {\r\n\t\t\t\t\t\tmemory = stack.shift();\r\n\t\t\t\t\t\tself.fireWith( memory[ 0 ], memory[ 1 ] );\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if ( memory === true ) {\r\n\t\t\t\t\tself.disable();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlist = [];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// Actual Callbacks object\r\n\t\tself = {\r\n\t\t\t// Add a callback or a collection of callbacks to the list\r\n\t\t\tadd: function() {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\tvar length = list.length;\r\n\t\t\t\t\tadd( arguments );\r\n\t\t\t\t\t// Do we need to add the callbacks to the\r\n\t\t\t\t\t// current firing batch?\r\n\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\tfiringLength = list.length;\r\n\t\t\t\t\t// With memory, if we're not firing then\r\n\t\t\t\t\t// we should call right away, unless previous\r\n\t\t\t\t\t// firing was halted (stopOnFalse)\r\n\t\t\t\t\t} else if ( memory && memory !== true ) {\r\n\t\t\t\t\t\tfiringStart = length;\r\n\t\t\t\t\t\tfire( memory[ 0 ], memory[ 1 ] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Remove a callback from the list\r\n\t\t\tremove: function() {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\tvar args = arguments,\r\n\t\t\t\t\t\targIndex = 0,\r\n\t\t\t\t\t\targLength = args.length;\r\n\t\t\t\t\tfor ( ; argIndex < argLength ; argIndex++ ) {\r\n\t\t\t\t\t\tfor ( var i = 0; i < list.length; i++ ) {\r\n\t\t\t\t\t\t\tif ( args[ argIndex ] === list[ i ] ) {\r\n\t\t\t\t\t\t\t\t// Handle firingIndex and firingLength\r\n\t\t\t\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\t\t\t\tif ( i <= firingLength ) {\r\n\t\t\t\t\t\t\t\t\t\tfiringLength--;\r\n\t\t\t\t\t\t\t\t\t\tif ( i <= firingIndex ) {\r\n\t\t\t\t\t\t\t\t\t\t\tfiringIndex--;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// Remove the element\r\n\t\t\t\t\t\t\t\tlist.splice( i--, 1 );\r\n\t\t\t\t\t\t\t\t// If we have some unicity property then\r\n\t\t\t\t\t\t\t\t// we only need to do this once\r\n\t\t\t\t\t\t\t\tif ( flags.unique ) {\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Control if a given callback is in the list\r\n\t\t\thas: function( fn ) {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\tvar i = 0,\r\n\t\t\t\t\t\tlength = list.length;\r\n\t\t\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\t\t\tif ( fn === list[ i ] ) {\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t},\r\n\t\t\t// Remove all callbacks from the list\r\n\t\t\tempty: function() {\r\n\t\t\t\tlist = [];\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Have the list do nothing anymore\r\n\t\t\tdisable: function() {\r\n\t\t\t\tlist = stack = memory = undefined;\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Is it disabled?\r\n\t\t\tdisabled: function() {\r\n\t\t\t\treturn !list;\r\n\t\t\t},\r\n\t\t\t// Lock the list in its current state\r\n\t\t\tlock: function() {\r\n\t\t\t\tstack = undefined;\r\n\t\t\t\tif ( !memory || memory === true ) {\r\n\t\t\t\t\tself.disable();\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Is it locked?\r\n\t\t\tlocked: function() {\r\n\t\t\t\treturn !stack;\r\n\t\t\t},\r\n\t\t\t// Call all callbacks with the given context and arguments\r\n\t\t\tfireWith: function( context, args ) {\r\n\t\t\t\tif ( stack ) {\r\n\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\tif ( !flags.once ) {\r\n\t\t\t\t\t\t\tstack.push( [ context, args ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if ( !( flags.once && memory ) ) {\r\n\t\t\t\t\t\tfire( context, args );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Call all the callbacks with the given arguments\r\n\t\t\tfire: function() {\r\n\t\t\t\tself.fireWith( this, arguments );\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// To know if the callbacks have already been called at least once\r\n\t\t\tfired: function() {\r\n\t\t\t\treturn !!fired;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\treturn self;\r\n};\r\n\r\n\r\n\r\n\r\nvar // Static reference to slice\r\n\tsliceDeferred = [].slice;\r\n\r\njQuery.extend({\r\n\r\n\tDeferred: function( func ) {\r\n\t\tvar doneList = jQuery.Callbacks( \"once memory\" ),\r\n\t\t\tfailList = jQuery.Callbacks( \"once memory\" ),\r\n\t\t\tprogressList = jQuery.Callbacks( \"memory\" ),\r\n\t\t\tstate = \"pending\",\r\n\t\t\tlists = {\r\n\t\t\t\tresolve: doneList,\r\n\t\t\t\treject: failList,\r\n\t\t\t\tnotify: progressList\r\n\t\t\t},\r\n\t\t\tpromise = {\r\n\t\t\t\tdone: doneList.add,\r\n\t\t\t\tfail: failList.add,\r\n\t\t\t\tprogress: progressList.add,\r\n\r\n\t\t\t\tstate: function() {\r\n\t\t\t\t\treturn state;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Deprecated\r\n\t\t\t\tisResolved: doneList.fired,\r\n\t\t\t\tisRejected: failList.fired,\r\n\r\n\t\t\t\tthen: function( doneCallbacks, failCallbacks, progressCallbacks ) {\r\n\t\t\t\t\tdeferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\t\t\t\talways: function() {\r\n\t\t\t\t\tdeferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\t\t\t\tpipe: function( fnDone, fnFail, fnProgress ) {\r\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\r\n\t\t\t\t\t\tjQuery.each( {\r\n\t\t\t\t\t\t\tdone: [ fnDone, \"resolve\" ],\r\n\t\t\t\t\t\t\tfail: [ fnFail, \"reject\" ],\r\n\t\t\t\t\t\t\tprogress: [ fnProgress, \"notify\" ]\r\n\t\t\t\t\t\t}, function( handler, data ) {\r\n\t\t\t\t\t\t\tvar fn = data[ 0 ],\r\n\t\t\t\t\t\t\t\taction = data[ 1 ],\r\n\t\t\t\t\t\t\t\treturned;\r\n\t\t\t\t\t\t\tif ( jQuery.isFunction( fn ) ) {\r\n\t\t\t\t\t\t\t\tdeferred[ handler ](function() {\r\n\t\t\t\t\t\t\t\t\treturned = fn.apply( this, arguments );\r\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\r\n\t\t\t\t\t\t\t\t\t\treturned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tdeferred[ handler ]( newDefer[ action ] );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}).promise();\r\n\t\t\t\t},\r\n\t\t\t\t// Get a promise for this deferred\r\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\r\n\t\t\t\tpromise: function( obj ) {\r\n\t\t\t\t\tif ( obj == null ) {\r\n\t\t\t\t\t\tobj = promise;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor ( var key in promise ) {\r\n\t\t\t\t\t\t\tobj[ key ] = promise[ key ];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn obj;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tdeferred = promise.promise({}),\r\n\t\t\tkey;\r\n\r\n\t\tfor ( key in lists ) {\r\n\t\t\tdeferred[ key ] = lists[ key ].fire;\r\n\t\t\tdeferred[ key + \"With\" ] = lists[ key ].fireWith;\r\n\t\t}\r\n\r\n\t\t// Handle state\r\n\t\tdeferred.done( function() {\r\n\t\t\tstate = \"resolved\";\r\n\t\t}, failList.disable, progressList.lock ).fail( function() {\r\n\t\t\tstate = \"rejected\";\r\n\t\t}, doneList.disable, progressList.lock );\r\n\r\n\t\t// Call given func if any\r\n\t\tif ( func ) {\r\n\t\t\tfunc.call( deferred, deferred );\r\n\t\t}\r\n\r\n\t\t// All done!\r\n\t\treturn deferred;\r\n\t},\r\n\r\n\t// Deferred helper\r\n\twhen: function( firstParam ) {\r\n\t\tvar args = sliceDeferred.call( arguments, 0 ),\r\n\t\t\ti = 0,\r\n\t\t\tlength = args.length,\r\n\t\t\tpValues = new Array( length ),\r\n\t\t\tcount = length,\r\n\t\t\tpCount = length,\r\n\t\t\tdeferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\r\n\t\t\t\tfirstParam :\r\n\t\t\t\tjQuery.Deferred(),\r\n\t\t\tpromise = deferred.promise();\r\n\t\tfunction resolveFunc( i ) {\r\n\t\t\treturn function( value ) {\r\n\t\t\t\targs[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\r\n\t\t\t\tif ( !( --count ) ) {\r\n\t\t\t\t\tdeferred.resolveWith( deferred, args );\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t\tfunction progressFunc( i ) {\r\n\t\t\treturn function( value ) {\r\n\t\t\t\tpValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\r\n\t\t\t\tdeferred.notifyWith( promise, pValues );\r\n\t\t\t};\r\n\t\t}\r\n\t\tif ( length > 1 ) {\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tif ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {\r\n\t\t\t\t\targs[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t--count;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ( !count ) {\r\n\t\t\t\tdeferred.resolveWith( deferred, args );\r\n\t\t\t}\r\n\t\t} else if ( deferred !== firstParam ) {\r\n\t\t\tdeferred.resolveWith( deferred, length ? [ firstParam ] : [] );\r\n\t\t}\r\n\t\treturn promise;\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\njQuery.support = (function() {\r\n\r\n\tvar support,\r\n\t\tall,\r\n\t\ta,\r\n\t\tselect,\r\n\t\topt,\r\n\t\tinput,\r\n\t\tfragment,\r\n\t\ttds,\r\n\t\tevents,\r\n\t\teventName,\r\n\t\ti,\r\n\t\tisSupported,\r\n\t\tdiv = document.createElement( \"div\" ),\r\n\t\tdocumentElement = document.documentElement;\r\n\r\n\t// Preliminary tests\r\n\tdiv.setAttribute(\"className\", \"t\");\r\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\r\n\r\n\tall = div.getElementsByTagName( \"*\" );\r\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\r\n\r\n\t// Can't get basic test support\r\n\tif ( !all || !all.length || !a ) {\r\n\t\treturn {};\r\n\t}\r\n\r\n\t// First batch of supports tests\r\n\tselect = document.createElement( \"select\" );\r\n\topt = select.appendChild( document.createElement(\"option\") );\r\n\tinput = div.getElementsByTagName( \"input\" )[ 0 ];\r\n\r\n\tsupport = {\r\n\t\t// IE strips leading whitespace when .innerHTML is used\r\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\r\n\r\n\t\t// Make sure that tbody elements aren't automatically inserted\r\n\t\t// IE will insert them into empty tables\r\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\r\n\r\n\t\t// Make sure that link elements get serialized correctly by innerHTML\r\n\t\t// This requires a wrapper element in IE\r\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\r\n\r\n\t\t// Get the style information from getAttribute\r\n\t\t// (IE uses .cssText instead)\r\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\r\n\r\n\t\t// Make sure that URLs aren't manipulated\r\n\t\t// (IE normalizes it by default)\r\n\t\threfNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\r\n\r\n\t\t// Make sure that element opacity exists\r\n\t\t// (IE uses filter instead)\r\n\t\t// Use a regex to work around a WebKit issue. See #5145\r\n\t\topacity: /^0.55/.test( a.style.opacity ),\r\n\r\n\t\t// Verify style float existence\r\n\t\t// (IE uses styleFloat instead of cssFloat)\r\n\t\tcssFloat: !!a.style.cssFloat,\r\n\r\n\t\t// Make sure that if no value is specified for a checkbox\r\n\t\t// that it defaults to \"on\".\r\n\t\t// (WebKit defaults to \"\" instead)\r\n\t\tcheckOn: ( input.value === \"on\" ),\r\n\r\n\t\t// Make sure that a selected-by-default option has a working selected property.\r\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\r\n\t\toptSelected: opt.selected,\r\n\r\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\r\n\t\tgetSetAttribute: div.className !== \"t\",\r\n\r\n\t\t// Tests for enctype support on a form(#6743)\r\n\t\tenctype: !!document.createElement(\"form\").enctype,\r\n\r\n\t\t// Makes sure cloning an html5 element does not cause problems\r\n\t\t// Where outerHTML is undefined, this still works\r\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\r\n\r\n\t\t// Will be defined later\r\n\t\tsubmitBubbles: true,\r\n\t\tchangeBubbles: true,\r\n\t\tfocusinBubbles: false,\r\n\t\tdeleteExpando: true,\r\n\t\tnoCloneEvent: true,\r\n\t\tinlineBlockNeedsLayout: false,\r\n\t\tshrinkWrapBlocks: false,\r\n\t\treliableMarginRight: true,\r\n\t\tpixelMargin: true\r\n\t};\r\n\r\n\t// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead\r\n\tjQuery.boxModel = support.boxModel = (document.compatMode === \"CSS1Compat\");\r\n\r\n\t// Make sure checked status is properly cloned\r\n\tinput.checked = true;\r\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\r\n\r\n\t// Make sure that the options inside disabled selects aren't marked as disabled\r\n\t// (WebKit marks them as disabled)\r\n\tselect.disabled = true;\r\n\tsupport.optDisabled = !opt.disabled;\r\n\r\n\t// Test to see if it's possible to delete an expando from an element\r\n\t// Fails in Internet Explorer\r\n\ttry {\r\n\t\tdelete div.test;\r\n\t} catch( e ) {\r\n\t\tsupport.deleteExpando = false;\r\n\t}\r\n\r\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\r\n\t\tdiv.attachEvent( \"onclick\", function() {\r\n\t\t\t// Cloning a node shouldn't copy over any\r\n\t\t\t// bound event handlers (IE does this)\r\n\t\t\tsupport.noCloneEvent = false;\r\n\t\t});\r\n\t\tdiv.cloneNode( true ).fireEvent( \"onclick\" );\r\n\t}\r\n\r\n\t// Check if a radio maintains its value\r\n\t// after being appended to the DOM\r\n\tinput = document.createElement(\"input\");\r\n\tinput.value = \"t\";\r\n\tinput.setAttribute(\"type\", \"radio\");\r\n\tsupport.radioValue = input.value === \"t\";\r\n\r\n\tinput.setAttribute(\"checked\", \"checked\");\r\n\r\n\t// #11217 - WebKit loses check when the name is after the checked attribute\r\n\tinput.setAttribute( \"name\", \"t\" );\r\n\r\n\tdiv.appendChild( input );\r\n\tfragment = document.createDocumentFragment();\r\n\tfragment.appendChild( div.lastChild );\r\n\r\n\t// WebKit doesn't clone checked state correctly in fragments\r\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\r\n\r\n\t// Check if a disconnected checkbox will retain its checked\r\n\t// value of true after appended to the DOM (IE6/7)\r\n\tsupport.appendChecked = input.checked;\r\n\r\n\tfragment.removeChild( input );\r\n\tfragment.appendChild( div );\r\n\r\n\t// Technique from Juriy Zaytsev\r\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\r\n\t// We only care about the case where non-standard event systems\r\n\t// are used, namely in IE. Short-circuiting here helps us to\r\n\t// avoid an eval call (in setAttribute) which can cause CSP\r\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\r\n\tif ( div.attachEvent ) {\r\n\t\tfor ( i in {\r\n\t\t\tsubmit: 1,\r\n\t\t\tchange: 1,\r\n\t\t\tfocusin: 1\r\n\t\t}) {\r\n\t\t\teventName = \"on\" + i;\r\n\t\t\tisSupported = ( eventName in div );\r\n\t\t\tif ( !isSupported ) {\r\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\r\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\r\n\t\t\t}\r\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\r\n\t\t}\r\n\t}\r\n\r\n\tfragment.removeChild( div );\r\n\r\n\t// Null elements to avoid leaks in IE\r\n\tfragment = select = opt = div = input = null;\r\n\r\n\t// Run tests that need a body at doc ready\r\n\tjQuery(function() {\r\n\t\tvar container, outer, inner, table, td, offsetSupport,\r\n\t\t\tmarginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,\r\n\t\t\tpaddingMarginBorderVisibility, paddingMarginBorder,\r\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\r\n\r\n\t\tif ( !body ) {\r\n\t\t\t// Return for frameset docs that don't have a body\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconMarginTop = 1;\r\n\t\tpaddingMarginBorder = \"padding:0;margin:0;border:\";\r\n\t\tpositionTopLeftWidthHeight = \"position:absolute;top:0;left:0;width:1px;height:1px;\";\r\n\t\tpaddingMarginBorderVisibility = paddingMarginBorder + \"0;visibility:hidden;\";\r\n\t\tstyle = \"style='\" + positionTopLeftWidthHeight + paddingMarginBorder + \"5px solid #000;\";\r\n\t\thtml = \"<div \" + style + \"display:block;'><div style='\" + paddingMarginBorder + \"0;display:block;overflow:hidden;'></div></div>\" +\r\n\t\t\t\"<table \" + style + \"' cellpadding='0' cellspacing='0'>\" +\r\n\t\t\t\"<tr><td></td></tr></table>\";\r\n\r\n\t\tcontainer = document.createElement(\"div\");\r\n\t\tcontainer.style.cssText = paddingMarginBorderVisibility + \"width:0;height:0;position:static;top:0;margin-top:\" + conMarginTop + \"px\";\r\n\t\tbody.insertBefore( container, body.firstChild );\r\n\r\n\t\t// Construct the test element\r\n\t\tdiv = document.createElement(\"div\");\r\n\t\tcontainer.appendChild( div );\r\n\r\n\t\t// Check if table cells still have offsetWidth/Height when they are set\r\n\t\t// to display:none and there are still other visible table cells in a\r\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\r\n\t\t// determining if an element has been hidden directly using\r\n\t\t// display:none (it is still safe to use offsets if a parent element is\r\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\r\n\t\t// (only IE 8 fails this test)\r\n\t\tdiv.innerHTML = \"<table><tr><td style='\" + paddingMarginBorder + \"0;display:none'></td><td>t</td></tr></table>\";\r\n\t\ttds = div.getElementsByTagName( \"td\" );\r\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\r\n\r\n\t\ttds[ 0 ].style.display = \"\";\r\n\t\ttds[ 1 ].style.display = \"none\";\r\n\r\n\t\t// Check if empty table cells still have offsetWidth/Height\r\n\t\t// (IE <= 8 fail this test)\r\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\r\n\r\n\t\t// Check if div with explicit width and no margin-right incorrectly\r\n\t\t// gets computed margin-right based on width of container. For more\r\n\t\t// info see bug #3333\r\n\t\t// Fails in WebKit before Feb 2011 nightlies\r\n\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\r\n\t\tif ( window.getComputedStyle ) {\r\n\t\t\tdiv.innerHTML = \"\";\r\n\t\t\tmarginDiv = document.createElement( \"div\" );\r\n\t\t\tmarginDiv.style.width = \"0\";\r\n\t\t\tmarginDiv.style.marginRight = \"0\";\r\n\t\t\tdiv.style.width = \"2px\";\r\n\t\t\tdiv.appendChild( marginDiv );\r\n\t\t\tsupport.reliableMarginRight =\r\n\t\t\t\t( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\r\n\t\t}\r\n\r\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\r\n\t\t\t// Check if natively block-level elements act like inline-block\r\n\t\t\t// elements when setting their display to 'inline' and giving\r\n\t\t\t// them layout\r\n\t\t\t// (IE < 8 does this)\r\n\t\t\tdiv.innerHTML = \"\";\r\n\t\t\tdiv.style.width = div.style.padding = \"1px\";\r\n\t\t\tdiv.style.border = 0;\r\n\t\t\tdiv.style.overflow = \"hidden\";\r\n\t\t\tdiv.style.display = \"inline\";\r\n\t\t\tdiv.style.zoom = 1;\r\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\r\n\r\n\t\t\t// Check if elements with layout shrink-wrap their children\r\n\t\t\t// (IE 6 does this)\r\n\t\t\tdiv.style.display = \"block\";\r\n\t\t\tdiv.style.overflow = \"visible\";\r\n\t\t\tdiv.innerHTML = \"<div style='width:5px;'></div>\";\r\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\r\n\t\t}\r\n\r\n\t\tdiv.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;\r\n\t\tdiv.innerHTML = html;\r\n\r\n\t\touter = div.firstChild;\r\n\t\tinner = outer.firstChild;\r\n\t\ttd = outer.nextSibling.firstChild.firstChild;\r\n\r\n\t\toffsetSupport = {\r\n\t\t\tdoesNotAddBorder: ( inner.offsetTop !== 5 ),\r\n\t\t\tdoesAddBorderForTableAndCells: ( td.offsetTop === 5 )\r\n\t\t};\r\n\r\n\t\tinner.style.position = \"fixed\";\r\n\t\tinner.style.top = \"20px\";\r\n\r\n\t\t// safari subtracts parent border width here which is 5px\r\n\t\toffsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );\r\n\t\tinner.style.position = inner.style.top = \"\";\r\n\r\n\t\touter.style.overflow = \"hidden\";\r\n\t\touter.style.position = \"relative\";\r\n\r\n\t\toffsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );\r\n\t\toffsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );\r\n\r\n\t\tif ( window.getComputedStyle ) {\r\n\t\t\tdiv.style.marginTop = \"1%\";\r\n\t\t\tsupport.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== \"1%\";\r\n\t\t}\r\n\r\n\t\tif ( typeof container.style.zoom !== \"undefined\" ) {\r\n\t\t\tcontainer.style.zoom = 1;\r\n\t\t}\r\n\r\n\t\tbody.removeChild( container );\r\n\t\tmarginDiv = div = container = null;\r\n\r\n\t\tjQuery.extend( support, offsetSupport );\r\n\t});\r\n\r\n\treturn support;\r\n})();\r\n\r\n\r\n\r\n\r\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\r\n\trmultiDash = /([A-Z])/g;\r\n\r\njQuery.extend({\r\n\tcache: {},\r\n\r\n\t// Please use with caution\r\n\tuuid: 0,\r\n\r\n\t// Unique for each copy of jQuery on the page\r\n\t// Non-digits removed to match rinlinejQuery\r\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\r\n\r\n\t// The following elements throw uncatchable exceptions if you\r\n\t// attempt to add expando properties to them.\r\n\tnoData: {\r\n\t\t\"embed\": true,\r\n\t\t// Ban all objects except for Flash (which handle expandos)\r\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\r\n\t\t\"applet\": true\r\n\t},\r\n\r\n\thasData: function( elem ) {\r\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\r\n\t\treturn !!elem && !isEmptyDataObject( elem );\r\n\t},\r\n\r\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\r\n\t\tif ( !jQuery.acceptData( elem ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar privateCache, thisCache, ret,\r\n\t\t\tinternalKey = jQuery.expando,\r\n\t\t\tgetByName = typeof name === \"string\",\r\n\r\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\r\n\t\t\t// can't GC object references properly across the DOM-JS boundary\r\n\t\t\tisNode = elem.nodeType,\r\n\r\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\r\n\t\t\t// attached directly to the object so GC can occur automatically\r\n\t\t\tcache = isNode ? jQuery.cache : elem,\r\n\r\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\r\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\r\n\t\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,\r\n\t\t\tisEvents = name === \"events\";\r\n\r\n\t\t// Avoid doing any more work than we need to when trying to get data on an\r\n\t\t// object that has no data at all\r\n\t\tif ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( !id ) {\r\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\r\n\t\t\t// ends up in the global cache\r\n\t\t\tif ( isNode ) {\r\n\t\t\t\telem[ internalKey ] = id = ++jQuery.uuid;\r\n\t\t\t} else {\r\n\t\t\t\tid = internalKey;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( !cache[ id ] ) {\r\n\t\t\tcache[ id ] = {};\r\n\r\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\r\n\t\t\t// is serialized using JSON.stringify\r\n\t\t\tif ( !isNode ) {\r\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\r\n\t\t// shallow copied over onto the existing cache\r\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\r\n\t\t\tif ( pvt ) {\r\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\r\n\t\t\t} else {\r\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivateCache = thisCache = cache[ id ];\r\n\r\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\r\n\t\t// cache in order to avoid key collisions between internal data and user-defined\r\n\t\t// data.\r\n\t\tif ( !pvt ) {\r\n\t\t\tif ( !thisCache.data ) {\r\n\t\t\t\tthisCache.data = {};\r\n\t\t\t}\r\n\r\n\t\t\tthisCache = thisCache.data;\r\n\t\t}\r\n\r\n\t\tif ( data !== undefined ) {\r\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\r\n\t\t}\r\n\r\n\t\t// Users should not attempt to inspect the internal events object using jQuery.data,\r\n\t\t// it is undocumented and subject to change. But does anyone listen? No.\r\n\t\tif ( isEvents && !thisCache[ name ] ) {\r\n\t\t\treturn privateCache.events;\r\n\t\t}\r\n\r\n\t\t// Check for both converted-to-camel and non-converted data property names\r\n\t\t// If a data property was specified\r\n\t\tif ( getByName ) {\r\n\r\n\t\t\t// First Try to find as-is property data\r\n\t\t\tret = thisCache[ name ];\r\n\r\n\t\t\t// Test for null|undefined property data\r\n\t\t\tif ( ret == null ) {\r\n\r\n\t\t\t\t// Try to find the camelCased property\r\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tret = thisCache;\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\r\n\t\tif ( !jQuery.acceptData( elem ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar thisCache, i, l,\r\n\r\n\t\t\t// Reference to internal data cache key\r\n\t\t\tinternalKey = jQuery.expando,\r\n\r\n\t\t\tisNode = elem.nodeType,\r\n\r\n\t\t\t// See jQuery.data for more information\r\n\t\t\tcache = isNode ? jQuery.cache : elem,\r\n\r\n\t\t\t// See jQuery.data for more information\r\n\t\t\tid = isNode ? elem[ internalKey ] : internalKey;\r\n\r\n\t\t// If there is already no cache entry for this object, there is no\r\n\t\t// purpose in continuing\r\n\t\tif ( !cache[ id ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( name ) {\r\n\r\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\r\n\r\n\t\t\tif ( thisCache ) {\r\n\r\n\t\t\t\t// Support array or space separated string names for data keys\r\n\t\t\t\tif ( !jQuery.isArray( name ) ) {\r\n\r\n\t\t\t\t\t// try the string as a key before any manipulation\r\n\t\t\t\t\tif ( name in thisCache ) {\r\n\t\t\t\t\t\tname = [ name ];\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\r\n\t\t\t\t\t\tname = jQuery.camelCase( name );\r\n\t\t\t\t\t\tif ( name in thisCache ) {\r\n\t\t\t\t\t\t\tname = [ name ];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tname = name.split( \" \" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\r\n\t\t\t\t\tdelete thisCache[ name[i] ];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If there is no data left in the cache, we want to continue\r\n\t\t\t\t// and let the cache object itself get destroyed\r\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// See jQuery.data for more information\r\n\t\tif ( !pvt ) {\r\n\t\t\tdelete cache[ id ].data;\r\n\r\n\t\t\t// Don't destroy the parent cache unless the internal data object\r\n\t\t\t// had been the only thing left in it\r\n\t\t\tif ( !isEmptyDataObject(cache[ id ]) ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Browsers that fail expando deletion also refuse to delete expandos on\r\n\t\t// the window, but it will allow it on all other JS objects; other browsers\r\n\t\t// don't care\r\n\t\t// Ensure that `cache` is not a window object #10080\r\n\t\tif ( jQuery.support.deleteExpando || !cache.setInterval ) {\r\n\t\t\tdelete cache[ id ];\r\n\t\t} else {\r\n\t\t\tcache[ id ] = null;\r\n\t\t}\r\n\r\n\t\t// We destroyed the cache and need to eliminate the expando on the node to avoid\r\n\t\t// false lookups in the cache for entries that no longer exist\r\n\t\tif ( isNode ) {\r\n\t\t\t// IE does not allow us to delete expando properties from nodes,\r\n\t\t\t// nor does it have a removeAttribute function on Document nodes;\r\n\t\t\t// we must handle all of these cases\r\n\t\t\tif ( jQuery.support.deleteExpando ) {\r\n\t\t\t\tdelete elem[ internalKey ];\r\n\t\t\t} else if ( elem.removeAttribute ) {\r\n\t\t\t\telem.removeAttribute( internalKey );\r\n\t\t\t} else {\r\n\t\t\t\telem[ internalKey ] = null;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// For internal use only.\r\n\t_data: function( elem, name, data ) {\r\n\t\treturn jQuery.data( elem, name, data, true );\r\n\t},\r\n\r\n\t// A method for determining if a DOM node can handle the data expando\r\n\tacceptData: function( elem ) {\r\n\t\tif ( elem.nodeName ) {\r\n\t\t\tvar match = jQuery.noData[ elem.nodeName.toLowerCase() ];\r\n\r\n\t\t\tif ( match ) {\r\n\t\t\t\treturn !(match === true || elem.getAttribute(\"classid\") !== match);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\tdata: function( key, value ) {\r\n\t\tvar parts, part, attr, name, l,\r\n\t\t\telem = this[0],\r\n\t\t\ti = 0,\r\n\t\t\tdata = null;\r\n\r\n\t\t// Gets all values\r\n\t\tif ( key === undefined ) {\r\n\t\t\tif ( this.length ) {\r\n\t\t\t\tdata = jQuery.data( elem );\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\r\n\t\t\t\t\tattr = elem.attributes;\r\n\t\t\t\t\tfor ( l = attr.length; i < l; i++ ) {\r\n\t\t\t\t\t\tname = attr[i].name;\r\n\r\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\r\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\r\n\r\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn data;\r\n\t\t}\r\n\r\n\t\t// Sets multiple values\r\n\t\tif ( typeof key === \"object\" ) {\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tjQuery.data( this, key );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tparts = key.split( \".\", 2 );\r\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\r\n\t\tpart = parts[1] + \"!\";\r\n\r\n\t\treturn jQuery.access( this, function( value ) {\r\n\r\n\t\t\tif ( value === undefined ) {\r\n\t\t\t\tdata = this.triggerHandler( \"getData\" + part, [ parts[0] ] );\r\n\r\n\t\t\t\t// Try to fetch any internally stored data first\r\n\t\t\t\tif ( data === undefined && elem ) {\r\n\t\t\t\t\tdata = jQuery.data( elem, key );\r\n\t\t\t\t\tdata = dataAttr( elem, key, data );\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn data === undefined && parts[1] ?\r\n\t\t\t\t\tthis.data( parts[0] ) :\r\n\t\t\t\t\tdata;\r\n\t\t\t}\r\n\r\n\t\t\tparts[1] = value;\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar self = jQuery( this );\r\n\r\n\t\t\t\tself.triggerHandler( \"setData\" + part, parts );\r\n\t\t\t\tjQuery.data( this, key, value );\r\n\t\t\t\tself.triggerHandler( \"changeData\" + part, parts );\r\n\t\t\t});\r\n\t\t}, null, value, arguments.length > 1, null, false );\r\n\t},\r\n\r\n\tremoveData: function( key ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.removeData( this, key );\r\n\t\t});\r\n\t}\r\n});\r\n\r\nfunction dataAttr( elem, key, data ) {\r\n\t// If nothing was found internally, try to fetch any\r\n\t// data from the HTML5 data-* attribute\r\n\tif ( data === undefined && elem.nodeType === 1 ) {\r\n\r\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\r\n\r\n\t\tdata = elem.getAttribute( name );\r\n\r\n\t\tif ( typeof data === \"string\" ) {\r\n\t\t\ttry {\r\n\t\t\t\tdata = data === \"true\" ? true :\r\n\t\t\t\tdata === \"false\" ? false :\r\n\t\t\t\tdata === \"null\" ? null :\r\n\t\t\t\tjQuery.isNumeric( data ) ? +data :\r\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\r\n\t\t\t\t\tdata;\r\n\t\t\t} catch( e ) {}\r\n\r\n\t\t\t// Make sure we set the data so it isn't changed later\r\n\t\t\tjQuery.data( elem, key, data );\r\n\r\n\t\t} else {\r\n\t\t\tdata = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\treturn data;\r\n}\r\n\r\n// checks a cache object for emptiness\r\nfunction isEmptyDataObject( obj ) {\r\n\tfor ( var name in obj ) {\r\n\r\n\t\t// if the public data object is empty, the private is still empty\r\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif ( name !== \"toJSON\" ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n\r\n\r\nfunction handleQueueMarkDefer( elem, type, src ) {\r\n\tvar deferDataKey = type + \"defer\",\r\n\t\tqueueDataKey = type + \"queue\",\r\n\t\tmarkDataKey = type + \"mark\",\r\n\t\tdefer = jQuery._data( elem, deferDataKey );\r\n\tif ( defer &&\r\n\t\t( src === \"queue\" || !jQuery._data(elem, queueDataKey) ) &&\r\n\t\t( src === \"mark\" || !jQuery._data(elem, markDataKey) ) ) {\r\n\t\t// Give room for hard-coded callbacks to fire first\r\n\t\t// and eventually mark/queue something else on the element\r\n\t\tsetTimeout( function() {\r\n\t\t\tif ( !jQuery._data( elem, queueDataKey ) &&\r\n\t\t\t\t!jQuery._data( elem, markDataKey ) ) {\r\n\t\t\t\tjQuery.removeData( elem, deferDataKey, true );\r\n\t\t\t\tdefer.fire();\r\n\t\t\t}\r\n\t\t}, 0 );\r\n\t}\r\n}\r\n\r\njQuery.extend({\r\n\r\n\t_mark: function( elem, type ) {\r\n\t\tif ( elem ) {\r\n\t\t\ttype = ( type || \"fx\" ) + \"mark\";\r\n\t\t\tjQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );\r\n\t\t}\r\n\t},\r\n\r\n\t_unmark: function( force, elem, type ) {\r\n\t\tif ( force !== true ) {\r\n\t\t\ttype = elem;\r\n\t\t\telem = force;\r\n\t\t\tforce = false;\r\n\t\t}\r\n\t\tif ( elem ) {\r\n\t\t\ttype = type || \"fx\";\r\n\t\t\tvar key = type + \"mark\",\r\n\t\t\t\tcount = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );\r\n\t\t\tif ( count ) {\r\n\t\t\t\tjQuery._data( elem, key, count );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery.removeData( elem, key, true );\r\n\t\t\t\thandleQueueMarkDefer( elem, type, \"mark\" );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tqueue: function( elem, type, data ) {\r\n\t\tvar q;\r\n\t\tif ( elem ) {\r\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\r\n\t\t\tq = jQuery._data( elem, type );\r\n\r\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\r\n\t\t\tif ( data ) {\r\n\t\t\t\tif ( !q || jQuery.isArray(data) ) {\r\n\t\t\t\t\tq = jQuery._data( elem, type, jQuery.makeArray(data) );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tq.push( data );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn q || [];\r\n\t\t}\r\n\t},\r\n\r\n\tdequeue: function( elem, type ) {\r\n\t\ttype = type || \"fx\";\r\n\r\n\t\tvar queue = jQuery.queue( elem, type ),\r\n\t\t\tfn = queue.shift(),\r\n\t\t\thooks = {};\r\n\r\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\r\n\t\tif ( fn === \"inprogress\" ) {\r\n\t\t\tfn = queue.shift();\r\n\t\t}\r\n\r\n\t\tif ( fn ) {\r\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\r\n\t\t\t// automatically dequeued\r\n\t\t\tif ( type === \"fx\" ) {\r\n\t\t\t\tqueue.unshift( \"inprogress\" );\r\n\t\t\t}\r\n\r\n\t\t\tjQuery._data( elem, type + \".run\", hooks );\r\n\t\t\tfn.call( elem, function() {\r\n\t\t\t\tjQuery.dequeue( elem, type );\r\n\t\t\t}, hooks );\r\n\t\t}\r\n\r\n\t\tif ( !queue.length ) {\r\n\t\t\tjQuery.removeData( elem, type + \"queue \" + type + \".run\", true );\r\n\t\t\thandleQueueMarkDefer( elem, type, \"queue\" );\r\n\t\t}\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\tqueue: function( type, data ) {\r\n\t\tvar setter = 2;\r\n\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tdata = type;\r\n\t\t\ttype = \"fx\";\r\n\t\t\tsetter--;\r\n\t\t}\r\n\r\n\t\tif ( arguments.length < setter ) {\r\n\t\t\treturn jQuery.queue( this[0], type );\r\n\t\t}\r\n\r\n\t\treturn data === undefined ?\r\n\t\t\tthis :\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\r\n\r\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\r\n\t\t\t\t\tjQuery.dequeue( this, type );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\tdequeue: function( type ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.dequeue( this, type );\r\n\t\t});\r\n\t},\r\n\t// Based off of the plugin by Clint Helfers, with permission.\r\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\r\n\tdelay: function( time, type ) {\r\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\r\n\t\ttype = type || \"fx\";\r\n\r\n\t\treturn this.queue( type, function( next, hooks ) {\r\n\t\t\tvar timeout = setTimeout( next, time );\r\n\t\t\thooks.stop = function() {\r\n\t\t\t\tclearTimeout( timeout );\r\n\t\t\t};\r\n\t\t});\r\n\t},\r\n\tclearQueue: function( type ) {\r\n\t\treturn this.queue( type || \"fx\", [] );\r\n\t},\r\n\t// Get a promise resolved when queues of a certain type\r\n\t// are emptied (fx is the type by default)\r\n\tpromise: function( type, object ) {\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tobject = type;\r\n\t\t\ttype = undefined;\r\n\t\t}\r\n\t\ttype = type || \"fx\";\r\n\t\tvar defer = jQuery.Deferred(),\r\n\t\t\telements = this,\r\n\t\t\ti = elements.length,\r\n\t\t\tcount = 1,\r\n\t\t\tdeferDataKey = type + \"defer\",\r\n\t\t\tqueueDataKey = type + \"queue\",\r\n\t\t\tmarkDataKey = type + \"mark\",\r\n\t\t\ttmp;\r\n\t\tfunction resolve() {\r\n\t\t\tif ( !( --count ) ) {\r\n\t\t\t\tdefer.resolveWith( elements, [ elements ] );\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile( i-- ) {\r\n\t\t\tif (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\r\n\t\t\t\t\t( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\r\n\t\t\t\t\t\tjQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\r\n\t\t\t\t\tjQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( \"once memory\" ), true ) )) {\r\n\t\t\t\tcount++;\r\n\t\t\t\ttmp.add( resolve );\r\n\t\t\t}\r\n\t\t}\r\n\t\tresolve();\r\n\t\treturn defer.promise( object );\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar rclass = /[\\n\\t\\r]/g,\r\n\trspace = /\\s+/,\r\n\trreturn = /\\r/g,\r\n\trtype = /^(?:button|input)$/i,\r\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\r\n\trclickable = /^a(?:rea)?$/i,\r\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\r\n\tgetSetAttribute = jQuery.support.getSetAttribute,\r\n\tnodeHook, boolHook, fixSpecified;\r\n\r\njQuery.fn.extend({\r\n\tattr: function( name, value ) {\r\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\r\n\t},\r\n\r\n\tremoveAttr: function( name ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.removeAttr( this, name );\r\n\t\t});\r\n\t},\r\n\r\n\tprop: function( name, value ) {\r\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\r\n\t},\r\n\r\n\tremoveProp: function( name ) {\r\n\t\tname = jQuery.propFix[ name ] || name;\r\n\t\treturn this.each(function() {\r\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\r\n\t\t\ttry {\r\n\t\t\t\tthis[ name ] = undefined;\r\n\t\t\t\tdelete this[ name ];\r\n\t\t\t} catch( e ) {}\r\n\t\t});\r\n\t},\r\n\r\n\taddClass: function( value ) {\r\n\t\tvar classNames, i, l, elem,\r\n\t\t\tsetClass, c, cl;\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( j ) {\r\n\t\t\t\tjQuery( this ).addClass( value.call(this, j, this.className) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( value && typeof value === \"string\" ) {\r\n\t\t\tclassNames = value.split( rspace );\r\n\r\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\r\n\t\t\t\t\t\telem.className = value;\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\r\n\r\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\r\n\t\t\t\t\t\t\tif ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\r\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveClass: function( value ) {\r\n\t\tvar classNames, i, l, elem, className, c, cl;\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( j ) {\r\n\t\t\t\tjQuery( this ).removeClass( value.call(this, j, this.className) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\r\n\t\t\tclassNames = ( value || \"\" ).split( rspace );\r\n\r\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\r\n\t\t\t\t\tif ( value ) {\r\n\t\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\r\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\r\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[ c ] + \" \", \" \");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telem.className = jQuery.trim( className );\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telem.className = \"\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\ttoggleClass: function( value, stateVal ) {\r\n\t\tvar type = typeof value,\r\n\t\t\tisBool = typeof stateVal === \"boolean\";\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( i ) {\r\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tif ( type === \"string\" ) {\r\n\t\t\t\t// toggle individual class names\r\n\t\t\t\tvar className,\r\n\t\t\t\t\ti = 0,\r\n\t\t\t\t\tself = jQuery( this ),\r\n\t\t\t\t\tstate = stateVal,\r\n\t\t\t\t\tclassNames = value.split( rspace );\r\n\r\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\r\n\t\t\t\t\t// check each className given, space seperated list\r\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\r\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\r\n\t\t\t\tif ( this.className ) {\r\n\t\t\t\t\t// store className if set\r\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// toggle whole className\r\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\thasClass: function( selector ) {\r\n\t\tvar className = \" \" + selector + \" \",\r\n\t\t\ti = 0,\r\n\t\t\tl = this.length;\r\n\t\tfor ( ; i < l; i++ ) {\r\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\tval: function( value ) {\r\n\t\tvar hooks, ret, isFunction,\r\n\t\t\telem = this[0];\r\n\r\n\t\tif ( !arguments.length ) {\r\n\t\t\tif ( elem ) {\r\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\r\n\r\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\r\n\t\t\t\t\treturn ret;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tret = elem.value;\r\n\r\n\t\t\t\treturn typeof ret === \"string\" ?\r\n\t\t\t\t\t// handle most common string cases\r\n\t\t\t\t\tret.replace(rreturn, \"\") :\r\n\t\t\t\t\t// handle cases where value is null/undef or number\r\n\t\t\t\t\tret == null ? \"\" : ret;\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tisFunction = jQuery.isFunction( value );\r\n\r\n\t\treturn this.each(function( i ) {\r\n\t\t\tvar self = jQuery(this), val;\r\n\r\n\t\t\tif ( this.nodeType !== 1 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif ( isFunction ) {\r\n\t\t\t\tval = value.call( this, i, self.val() );\r\n\t\t\t} else {\r\n\t\t\t\tval = value;\r\n\t\t\t}\r\n\r\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\r\n\t\t\tif ( val == null ) {\r\n\t\t\t\tval = \"\";\r\n\t\t\t} else if ( typeof val === \"number\" ) {\r\n\t\t\t\tval += \"\";\r\n\t\t\t} else if ( jQuery.isArray( val ) ) {\r\n\t\t\t\tval = jQuery.map(val, function ( value ) {\r\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\r\n\r\n\t\t\t// If set returns undefined, fall back to normal setting\r\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\r\n\t\t\t\tthis.value = val;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.extend({\r\n\tvalHooks: {\r\n\t\toption: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\r\n\t\t\t\t// uses .value. See #6932\r\n\t\t\t\tvar val = elem.attributes.value;\r\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\r\n\t\t\t}\r\n\t\t},\r\n\t\tselect: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\tvar value, i, max, option,\r\n\t\t\t\t\tindex = elem.selectedIndex,\r\n\t\t\t\t\tvalues = [],\r\n\t\t\t\t\toptions = elem.options,\r\n\t\t\t\t\tone = elem.type === \"select-one\";\r\n\r\n\t\t\t\t// Nothing was selected\r\n\t\t\t\tif ( index < 0 ) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Loop through all the selected options\r\n\t\t\t\ti = one ? index : 0;\r\n\t\t\t\tmax = one ? index + 1 : options.length;\r\n\t\t\t\tfor ( ; i < max; i++ ) {\r\n\t\t\t\t\toption = options[ i ];\r\n\r\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\r\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\r\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\r\n\r\n\t\t\t\t\t\t// Get the specific value for the option\r\n\t\t\t\t\t\tvalue = jQuery( option ).val();\r\n\r\n\t\t\t\t\t\t// We don't need an array for one selects\r\n\t\t\t\t\t\tif ( one ) {\r\n\t\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Multi-Selects return an array\r\n\t\t\t\t\t\tvalues.push( value );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\r\n\t\t\t\tif ( one && !values.length && options.length ) {\r\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn values;\r\n\t\t\t},\r\n\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tvar values = jQuery.makeArray( value );\r\n\r\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\r\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif ( !values.length ) {\r\n\t\t\t\t\telem.selectedIndex = -1;\r\n\t\t\t\t}\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tattrFn: {\r\n\t\tval: true,\r\n\t\tcss: true,\r\n\t\thtml: true,\r\n\t\ttext: true,\r\n\t\tdata: true,\r\n\t\twidth: true,\r\n\t\theight: true,\r\n\t\toffset: true\r\n\t},\r\n\r\n\tattr: function( elem, name, value, pass ) {\r\n\t\tvar ret, hooks, notxml,\r\n\t\t\tnType = elem.nodeType;\r\n\r\n\t\t// don't get/set attributes on text, comment and attribute nodes\r\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( pass && name in jQuery.attrFn ) {\r\n\t\t\treturn jQuery( elem )[ name ]( value );\r\n\t\t}\r\n\r\n\t\t// Fallback to prop when attributes are not supported\r\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\r\n\t\t\treturn jQuery.prop( elem, name, value );\r\n\t\t}\r\n\r\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\r\n\r\n\t\t// All attributes are lowercase\r\n\t\t// Grab necessary hook if one is defined\r\n\t\tif ( notxml ) {\r\n\t\t\tname = name.toLowerCase();\r\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\r\n\t\t}\r\n\r\n\t\tif ( value !== undefined ) {\r\n\r\n\t\t\tif ( value === null ) {\r\n\t\t\t\tjQuery.removeAttr( elem, name );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\r\n\t\t\t} else {\r\n\t\t\t\telem.setAttribute( name, \"\" + value );\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\r\n\t\t} else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\r\n\t\t\treturn ret;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tret = elem.getAttribute( name );\r\n\r\n\t\t\t// Non-existent attributes return null, we normalize to undefined\r\n\t\t\treturn ret === null ?\r\n\t\t\t\tundefined :\r\n\t\t\t\tret;\r\n\t\t}\r\n\t},\r\n\r\n\tremoveAttr: function( elem, value ) {\r\n\t\tvar propName, attrNames, name, l, isBool,\r\n\t\t\ti = 0;\r\n\r\n\t\tif ( value && elem.nodeType === 1 ) {\r\n\t\t\tattrNames = value.toLowerCase().split( rspace );\r\n\t\t\tl = attrNames.length;\r\n\r\n\t\t\tfor ( ; i < l; i++ ) {\r\n\t\t\t\tname = attrNames[ i ];\r\n\r\n\t\t\t\tif ( name ) {\r\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\r\n\t\t\t\t\tisBool = rboolean.test( name );\r\n\r\n\t\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\r\n\t\t\t\t\t// Do not do this for boolean attributes (see #10870)\r\n\t\t\t\t\tif ( !isBool ) {\r\n\t\t\t\t\t\tjQuery.attr( elem, name, \"\" );\r\n\t\t\t\t\t}\r\n\t\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\r\n\r\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\r\n\t\t\t\t\tif ( isBool && propName in elem ) {\r\n\t\t\t\t\t\telem[ propName ] = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tattrHooks: {\r\n\t\ttype: {\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\r\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\r\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\r\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\r\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\r\n\t\t\t\t\t// Reset value to it's default in case type is set after value\r\n\t\t\t\t\t// This is for element creation\r\n\t\t\t\t\tvar val = elem.value;\r\n\t\t\t\t\telem.setAttribute( \"type\", value );\r\n\t\t\t\t\tif ( val ) {\r\n\t\t\t\t\t\telem.value = val;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// Use the value property for back compat\r\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\r\n\t\tvalue: {\r\n\t\t\tget: function( elem, name ) {\r\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\r\n\t\t\t\t\treturn nodeHook.get( elem, name );\r\n\t\t\t\t}\r\n\t\t\t\treturn name in elem ?\r\n\t\t\t\t\telem.value :\r\n\t\t\t\t\tnull;\r\n\t\t\t},\r\n\t\t\tset: function( elem, value, name ) {\r\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\r\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\r\n\t\t\t\t}\r\n\t\t\t\t// Does not return so that setAttribute is also used\r\n\t\t\t\telem.value = value;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tpropFix: {\r\n\t\ttabindex: \"tabIndex\",\r\n\t\treadonly: \"readOnly\",\r\n\t\t\"for\": \"htmlFor\",\r\n\t\t\"class\": \"className\",\r\n\t\tmaxlength: \"maxLength\",\r\n\t\tcellspacing: \"cellSpacing\",\r\n\t\tcellpadding: \"cellPadding\",\r\n\t\trowspan: \"rowSpan\",\r\n\t\tcolspan: \"colSpan\",\r\n\t\tusemap: \"useMap\",\r\n\t\tframeborder: \"frameBorder\",\r\n\t\tcontenteditable: \"contentEditable\"\r\n\t},\r\n\r\n\tprop: function( elem, name, value ) {\r\n\t\tvar ret, hooks, notxml,\r\n\t\t\tnType = elem.nodeType;\r\n\r\n\t\t// don't get/set properties on text, comment and attribute nodes\r\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\r\n\r\n\t\tif ( notxml ) {\r\n\t\t\t// Fix name and attach hooks\r\n\t\t\tname = jQuery.propFix[ name ] || name;\r\n\t\t\thooks = jQuery.propHooks[ name ];\r\n\t\t}\r\n\r\n\t\tif ( value !== undefined ) {\r\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn ( elem[ name ] = value );\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\r\n\t\t\t\treturn ret;\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn elem[ name ];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tpropHooks: {\r\n\t\ttabIndex: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\r\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\r\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\r\n\r\n\t\t\t\treturn attributeNode && attributeNode.specified ?\r\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\r\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\r\n\t\t\t\t\t\t0 :\r\n\t\t\t\t\t\tundefined;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)\r\njQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;\r\n\r\n// Hook for boolean attributes\r\nboolHook = {\r\n\tget: function( elem, name ) {\r\n\t\t// Align boolean attributes with corresponding properties\r\n\t\t// Fall back to attribute presence where some booleans are not supported\r\n\t\tvar attrNode,\r\n\t\t\tproperty = jQuery.prop( elem, name );\r\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\r\n\t\t\tname.toLowerCase() :\r\n\t\t\tundefined;\r\n\t},\r\n\tset: function( elem, value, name ) {\r\n\t\tvar propName;\r\n\t\tif ( value === false ) {\r\n\t\t\t// Remove boolean attributes when set to false\r\n\t\t\tjQuery.removeAttr( elem, name );\r\n\t\t} else {\r\n\t\t\t// value is true since we know at this point it's type boolean and not false\r\n\t\t\t// Set boolean attributes to the same name and set the DOM property\r\n\t\t\tpropName = jQuery.propFix[ name ] || name;\r\n\t\t\tif ( propName in elem ) {\r\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\r\n\t\t\t\telem[ propName ] = true;\r\n\t\t\t}\r\n\r\n\t\t\telem.setAttribute( name, name.toLowerCase() );\r\n\t\t}\r\n\t\treturn name;\r\n\t}\r\n};\r\n\r\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\r\nif ( !getSetAttribute ) {\r\n\r\n\tfixSpecified = {\r\n\t\tname: true,\r\n\t\tid: true,\r\n\t\tcoords: true\r\n\t};\r\n\r\n\t// Use this for any attribute in IE6/7\r\n\t// This fixes almost every IE6/7 issue\r\n\tnodeHook = jQuery.valHooks.button = {\r\n\t\tget: function( elem, name ) {\r\n\t\t\tvar ret;\r\n\t\t\tret = elem.getAttributeNode( name );\r\n\t\t\treturn ret && ( fixSpecified[ name ] ? ret.nodeValue !== \"\" : ret.specified ) ?\r\n\t\t\t\tret.nodeValue :\r\n\t\t\t\tundefined;\r\n\t\t},\r\n\t\tset: function( elem, value, name ) {\r\n\t\t\t// Set the existing or create a new attribute node\r\n\t\t\tvar ret = elem.getAttributeNode( name );\r\n\t\t\tif ( !ret ) {\r\n\t\t\t\tret = document.createAttribute( name );\r\n\t\t\t\telem.setAttributeNode( ret );\r\n\t\t\t}\r\n\t\t\treturn ( ret.nodeValue = value + \"\" );\r\n\t\t}\r\n\t};\r\n\r\n\t// Apply the nodeHook to tabindex\r\n\tjQuery.attrHooks.tabindex.set = nodeHook.set;\r\n\r\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\r\n\t// This is for removals\r\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\r\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tif ( value === \"\" ) {\r\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\r\n\t// Set contenteditable to false on removals(#10429)\r\n\t// Setting to empty string throws an error as an invalid value\r\n\tjQuery.attrHooks.contenteditable = {\r\n\t\tget: nodeHook.get,\r\n\t\tset: function( elem, value, name ) {\r\n\t\t\tif ( value === \"\" ) {\r\n\t\t\t\tvalue = \"false\";\r\n\t\t\t}\r\n\t\t\tnodeHook.set( elem, value, name );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n\r\n// Some attributes require a special call on IE\r\nif ( !jQuery.support.hrefNormalized ) {\r\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\r\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\r\n\t\t\t\treturn ret === null ? undefined : ret;\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n}\r\n\r\nif ( !jQuery.support.style ) {\r\n\tjQuery.attrHooks.style = {\r\n\t\tget: function( elem ) {\r\n\t\t\t// Return undefined in the case of empty string\r\n\t\t\t// Normalize to lowercase since IE uppercases css property names\r\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\r\n\t\t},\r\n\t\tset: function( elem, value ) {\r\n\t\t\treturn ( elem.style.cssText = \"\" + value );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Safari mis-reports the default selected property of an option\r\n// Accessing the parent's selectedIndex property fixes it\r\nif ( !jQuery.support.optSelected ) {\r\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\r\n\t\tget: function( elem ) {\r\n\t\t\tvar parent = elem.parentNode;\r\n\r\n\t\t\tif ( parent ) {\r\n\t\t\t\tparent.selectedIndex;\r\n\r\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\r\n\t\t\t\tif ( parent.parentNode ) {\r\n\t\t\t\t\tparent.parentNode.selectedIndex;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t});\r\n}\r\n\r\n// IE6/7 call enctype encoding\r\nif ( !jQuery.support.enctype ) {\r\n\tjQuery.propFix.enctype = \"encoding\";\r\n}\r\n\r\n// Radios and checkboxes getter/setter\r\nif ( !jQuery.support.checkOn ) {\r\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\r\n\t\tjQuery.valHooks[ this ] = {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\r\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n}\r\njQuery.each([ \"radio\", \"checkbox\" ], function() {\r\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\r\n\t\tset: function( elem, value ) {\r\n\t\t\tif ( jQuery.isArray( value ) ) {\r\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n});\r\n\r\n\r\n\r\n\r\nvar rformElems = /^(?:textarea|input|select)$/i,\r\n\trtypenamespace = /^([^\\.]*)?(?:\\.(.+))?$/,\r\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+)?\\b/,\r\n\trkeyEvent = /^key/,\r\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\r\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\r\n\trquickIs = /^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,\r\n\tquickParse = function( selector ) {\r\n\t\tvar quick = rquickIs.exec( selector );\r\n\t\tif ( quick ) {\r\n\t\t\t//   0  1    2   3\r\n\t\t\t// [ _, tag, id, class ]\r\n\t\t\tquick[1] = ( quick[1] || \"\" ).toLowerCase();\r\n\t\t\tquick[3] = quick[3] && new RegExp( \"(?:^|\\\\s)\" + quick[3] + \"(?:\\\\s|$)\" );\r\n\t\t}\r\n\t\treturn quick;\r\n\t},\r\n\tquickIs = function( elem, m ) {\r\n\t\tvar attrs = elem.attributes || {};\r\n\t\treturn (\r\n\t\t\t(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&\r\n\t\t\t(!m[2] || (attrs.id || {}).value === m[2]) &&\r\n\t\t\t(!m[3] || m[3].test( (attrs[ \"class\" ] || {}).value ))\r\n\t\t);\r\n\t},\r\n\thoverHack = function( events ) {\r\n\t\treturn jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\r\n\t};\r\n\r\n/*\r\n * Helper functions for managing events -- not part of the public interface.\r\n * Props to Dean Edwards' addEvent library for many of the ideas.\r\n */\r\njQuery.event = {\r\n\r\n\tadd: function( elem, types, handler, data, selector ) {\r\n\r\n\t\tvar elemData, eventHandle, events,\r\n\t\t\tt, tns, type, namespaces, handleObj,\r\n\t\t\thandleObjIn, quick, handlers, special;\r\n\r\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\r\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Caller can pass in an object of custom data in lieu of the handler\r\n\t\tif ( handler.handler ) {\r\n\t\t\thandleObjIn = handler;\r\n\t\t\thandler = handleObjIn.handler;\r\n\t\t\tselector = handleObjIn.selector;\r\n\t\t}\r\n\r\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\r\n\t\tif ( !handler.guid ) {\r\n\t\t\thandler.guid = jQuery.guid++;\r\n\t\t}\r\n\r\n\t\t// Init the element's event structure and main handler, if this is the first\r\n\t\tevents = elemData.events;\r\n\t\tif ( !events ) {\r\n\t\t\telemData.events = events = {};\r\n\t\t}\r\n\t\teventHandle = elemData.handle;\r\n\t\tif ( !eventHandle ) {\r\n\t\t\telemData.handle = eventHandle = function( e ) {\r\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\r\n\t\t\t\t// when an event is called after a page has unloaded\r\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\r\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\r\n\t\t\t\t\tundefined;\r\n\t\t\t};\r\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\r\n\t\t\teventHandle.elem = elem;\r\n\t\t}\r\n\r\n\t\t// Handle multiple events separated by a space\r\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\r\n\t\ttypes = jQuery.trim( hoverHack(types) ).split( \" \" );\r\n\t\tfor ( t = 0; t < types.length; t++ ) {\r\n\r\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\r\n\t\t\ttype = tns[1];\r\n\t\t\tnamespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\r\n\r\n\t\t\t// If event changes its type, use the special event handlers for the changed type\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\r\n\t\t\t// If selector defined, determine special event api type, otherwise given type\r\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\r\n\r\n\t\t\t// Update special based on newly reset type\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\r\n\t\t\t// handleObj is passed to all event handlers\r\n\t\t\thandleObj = jQuery.extend({\r\n\t\t\t\ttype: type,\r\n\t\t\t\torigType: tns[1],\r\n\t\t\t\tdata: data,\r\n\t\t\t\thandler: handler,\r\n\t\t\t\tguid: handler.guid,\r\n\t\t\t\tselector: selector,\r\n\t\t\t\tquick: selector && quickParse( selector ),\r\n\t\t\t\tnamespace: namespaces.join(\".\")\r\n\t\t\t}, handleObjIn );\r\n\r\n\t\t\t// Init the event handler queue if we're the first\r\n\t\t\thandlers = events[ type ];\r\n\t\t\tif ( !handlers ) {\r\n\t\t\t\thandlers = events[ type ] = [];\r\n\t\t\t\thandlers.delegateCount = 0;\r\n\r\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\r\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\r\n\t\t\t\t\t// Bind the global event handler to the element\r\n\t\t\t\t\tif ( elem.addEventListener ) {\r\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\r\n\r\n\t\t\t\t\t} else if ( elem.attachEvent ) {\r\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( special.add ) {\r\n\t\t\t\tspecial.add.call( elem, handleObj );\r\n\r\n\t\t\t\tif ( !handleObj.handler.guid ) {\r\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Add to the element's handler list, delegates in front\r\n\t\t\tif ( selector ) {\r\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\r\n\t\t\t} else {\r\n\t\t\t\thandlers.push( handleObj );\r\n\t\t\t}\r\n\r\n\t\t\t// Keep track of which events have ever been used, for event optimization\r\n\t\t\tjQuery.event.global[ type ] = true;\r\n\t\t}\r\n\r\n\t\t// Nullify elem to prevent memory leaks in IE\r\n\t\telem = null;\r\n\t},\r\n\r\n\tglobal: {},\r\n\r\n\t// Detach an event or set of events from an element\r\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\r\n\r\n\t\tvar elemData = jQuery.hasData( elem ) && jQuery._data( elem ),\r\n\t\t\tt, tns, type, origType, namespaces, origCount,\r\n\t\t\tj, events, special, handle, eventType, handleObj;\r\n\r\n\t\tif ( !elemData || !(events = elemData.events) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Once for each type.namespace in types; type may be omitted\r\n\t\ttypes = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\r\n\t\tfor ( t = 0; t < types.length; t++ ) {\r\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\r\n\t\t\ttype = origType = tns[1];\r\n\t\t\tnamespaces = tns[2];\r\n\r\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\r\n\t\t\tif ( !type ) {\r\n\t\t\t\tfor ( type in events ) {\r\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\t\t\ttype = ( selector? special.delegateType : special.bindType ) || type;\r\n\t\t\teventType = events[ type ] || [];\r\n\t\t\torigCount = eventType.length;\r\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\r\n\r\n\t\t\t// Remove matching events\r\n\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\r\n\t\t\t\thandleObj = eventType[ j ];\r\n\r\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\r\n\t\t\t\t\t ( !handler || handler.guid === handleObj.guid ) &&\r\n\t\t\t\t\t ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\r\n\t\t\t\t\t ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\r\n\t\t\t\t\teventType.splice( j--, 1 );\r\n\r\n\t\t\t\t\tif ( handleObj.selector ) {\r\n\t\t\t\t\t\teventType.delegateCount--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( special.remove ) {\r\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\r\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\r\n\t\t\tif ( eventType.length === 0 && origCount !== eventType.length ) {\r\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\r\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete events[ type ];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Remove the expando if it's no longer used\r\n\t\tif ( jQuery.isEmptyObject( events ) ) {\r\n\t\t\thandle = elemData.handle;\r\n\t\t\tif ( handle ) {\r\n\t\t\t\thandle.elem = null;\r\n\t\t\t}\r\n\r\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\r\n\t\t\t// so use it instead of delete\r\n\t\t\tjQuery.removeData( elem, [ \"events\", \"handle\" ], true );\r\n\t\t}\r\n\t},\r\n\r\n\t// Events that are safe to short-circuit if no handlers are attached.\r\n\t// Native DOM events should not be added, they may have inline handlers.\r\n\tcustomEvent: {\r\n\t\t\"getData\": true,\r\n\t\t\"setData\": true,\r\n\t\t\"changeData\": true\r\n\t},\r\n\r\n\ttrigger: function( event, data, elem, onlyHandlers ) {\r\n\t\t// Don't do events on text and comment nodes\r\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Event object or event type\r\n\t\tvar type = event.type || event,\r\n\t\t\tnamespaces = [],\r\n\t\t\tcache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;\r\n\r\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\r\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( type.indexOf( \"!\" ) >= 0 ) {\r\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\r\n\t\t\ttype = type.slice(0, -1);\r\n\t\t\texclusive = true;\r\n\t\t}\r\n\r\n\t\tif ( type.indexOf( \".\" ) >= 0 ) {\r\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\r\n\t\t\tnamespaces = type.split(\".\");\r\n\t\t\ttype = namespaces.shift();\r\n\t\t\tnamespaces.sort();\r\n\t\t}\r\n\r\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\r\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Caller can pass in an Event, Object, or just an event type string\r\n\t\tevent = typeof event === \"object\" ?\r\n\t\t\t// jQuery.Event object\r\n\t\t\tevent[ jQuery.expando ] ? event :\r\n\t\t\t// Object literal\r\n\t\t\tnew jQuery.Event( type, event ) :\r\n\t\t\t// Just the event type (string)\r\n\t\t\tnew jQuery.Event( type );\r\n\r\n\t\tevent.type = type;\r\n\t\tevent.isTrigger = true;\r\n\t\tevent.exclusive = exclusive;\r\n\t\tevent.namespace = namespaces.join( \".\" );\r\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\r\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\r\n\r\n\t\t// Handle a global trigger\r\n\t\tif ( !elem ) {\r\n\r\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\r\n\t\t\tcache = jQuery.cache;\r\n\t\t\tfor ( i in cache ) {\r\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\r\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Clean up the event in case it is being reused\r\n\t\tevent.result = undefined;\r\n\t\tif ( !event.target ) {\r\n\t\t\tevent.target = elem;\r\n\t\t}\r\n\r\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\r\n\t\tdata = data != null ? jQuery.makeArray( data ) : [];\r\n\t\tdata.unshift( event );\r\n\r\n\t\t// Allow special events to draw outside the lines\r\n\t\tspecial = jQuery.event.special[ type ] || {};\r\n\t\tif ( special.trigger && special.trigger.apply( elem, data ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\r\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\r\n\t\teventPath = [[ elem, special.bindType || type ]];\r\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\r\n\r\n\t\t\tbubbleType = special.delegateType || type;\r\n\t\t\tcur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\r\n\t\t\told = null;\r\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\r\n\t\t\t\teventPath.push([ cur, bubbleType ]);\r\n\t\t\t\told = cur;\r\n\t\t\t}\r\n\r\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\r\n\t\t\tif ( old && old === elem.ownerDocument ) {\r\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fire handlers on the event path\r\n\t\tfor ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\r\n\r\n\t\t\tcur = eventPath[i][0];\r\n\t\t\tevent.type = eventPath[i][1];\r\n\r\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\r\n\t\t\tif ( handle ) {\r\n\t\t\t\thandle.apply( cur, data );\r\n\t\t\t}\r\n\t\t\t// Note that this is a bare JS function and not a jQuery handler\r\n\t\t\thandle = ontype && cur[ ontype ];\r\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\t\t}\r\n\t\tevent.type = type;\r\n\r\n\t\t// If nobody prevented the default action, do it now\r\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\r\n\r\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\r\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\r\n\r\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\r\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\r\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\r\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\r\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\r\n\r\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\r\n\t\t\t\t\told = elem[ ontype ];\r\n\r\n\t\t\t\t\tif ( old ) {\r\n\t\t\t\t\t\telem[ ontype ] = null;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\r\n\t\t\t\t\tjQuery.event.triggered = type;\r\n\t\t\t\t\telem[ type ]();\r\n\t\t\t\t\tjQuery.event.triggered = undefined;\r\n\r\n\t\t\t\t\tif ( old ) {\r\n\t\t\t\t\t\telem[ ontype ] = old;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn event.result;\r\n\t},\r\n\r\n\tdispatch: function( event ) {\r\n\r\n\t\t// Make a writable jQuery.Event from the native event object\r\n\t\tevent = jQuery.event.fix( event || window.event );\r\n\r\n\t\tvar handlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\r\n\t\t\tdelegateCount = handlers.delegateCount,\r\n\t\t\targs = [].slice.call( arguments, 0 ),\r\n\t\t\trun_all = !event.exclusive && !event.namespace,\r\n\t\t\tspecial = jQuery.event.special[ event.type ] || {},\r\n\t\t\thandlerQueue = [],\r\n\t\t\ti, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;\r\n\r\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\r\n\t\targs[0] = event;\r\n\t\tevent.delegateTarget = this;\r\n\r\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\r\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine handlers that should run if there are delegated events\r\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\r\n\t\tif ( delegateCount && !(event.button && event.type === \"click\") ) {\r\n\r\n\t\t\t// Pregenerate a single jQuery object for reuse with .is()\r\n\t\t\tjqcur = jQuery(this);\r\n\t\t\tjqcur.context = this.ownerDocument || this;\r\n\r\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\r\n\r\n\t\t\t\t// Don't process events on disabled elements (#6911, #8165)\r\n\t\t\t\tif ( cur.disabled !== true ) {\r\n\t\t\t\t\tselMatch = {};\r\n\t\t\t\t\tmatches = [];\r\n\t\t\t\t\tjqcur[0] = cur;\r\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\r\n\t\t\t\t\t\thandleObj = handlers[ i ];\r\n\t\t\t\t\t\tsel = handleObj.selector;\r\n\r\n\t\t\t\t\t\tif ( selMatch[ sel ] === undefined ) {\r\n\t\t\t\t\t\t\tselMatch[ sel ] = (\r\n\t\t\t\t\t\t\t\thandleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( selMatch[ sel ] ) {\r\n\t\t\t\t\t\t\tmatches.push( handleObj );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( matches.length ) {\r\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, matches: matches });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Add the remaining (directly-bound) handlers\r\n\t\tif ( handlers.length > delegateCount ) {\r\n\t\t\thandlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\r\n\t\t}\r\n\r\n\t\t// Run delegates first; they may want to stop propagation beneath us\r\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\r\n\t\t\tmatched = handlerQueue[ i ];\r\n\t\t\tevent.currentTarget = matched.elem;\r\n\r\n\t\t\tfor ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\r\n\t\t\t\thandleObj = matched.matches[ j ];\r\n\r\n\t\t\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\r\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\r\n\t\t\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\r\n\r\n\t\t\t\t\tevent.data = handleObj.data;\r\n\t\t\t\t\tevent.handleObj = handleObj;\r\n\r\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\r\n\t\t\t\t\t\t\t.apply( matched.elem, args );\r\n\r\n\t\t\t\t\tif ( ret !== undefined ) {\r\n\t\t\t\t\t\tevent.result = ret;\r\n\t\t\t\t\t\tif ( ret === false ) {\r\n\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Call the postDispatch hook for the mapped type\r\n\t\tif ( special.postDispatch ) {\r\n\t\t\tspecial.postDispatch.call( this, event );\r\n\t\t}\r\n\r\n\t\treturn event.result;\r\n\t},\r\n\r\n\t// Includes some event props shared by KeyEvent and MouseEvent\r\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\r\n\tprops: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\r\n\r\n\tfixHooks: {},\r\n\r\n\tkeyHooks: {\r\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\r\n\t\tfilter: function( event, original ) {\r\n\r\n\t\t\t// Add which for key events\r\n\t\t\tif ( event.which == null ) {\r\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\r\n\t\t\t}\r\n\r\n\t\t\treturn event;\r\n\t\t}\r\n\t},\r\n\r\n\tmouseHooks: {\r\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\r\n\t\tfilter: function( event, original ) {\r\n\t\t\tvar eventDoc, doc, body,\r\n\t\t\t\tbutton = original.button,\r\n\t\t\t\tfromElement = original.fromElement;\r\n\r\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\r\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\r\n\t\t\t\teventDoc = event.target.ownerDocument || document;\r\n\t\t\t\tdoc = eventDoc.documentElement;\r\n\t\t\t\tbody = eventDoc.body;\r\n\r\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\r\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\r\n\t\t\t}\r\n\r\n\t\t\t// Add relatedTarget, if necessary\r\n\t\t\tif ( !event.relatedTarget && fromElement ) {\r\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\r\n\t\t\t}\r\n\r\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\r\n\t\t\t// Note: button is not normalized, so don't use it\r\n\t\t\tif ( !event.which && button !== undefined ) {\r\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\r\n\t\t\t}\r\n\r\n\t\t\treturn event;\r\n\t\t}\r\n\t},\r\n\r\n\tfix: function( event ) {\r\n\t\tif ( event[ jQuery.expando ] ) {\r\n\t\t\treturn event;\r\n\t\t}\r\n\r\n\t\t// Create a writable copy of the event object and normalize some properties\r\n\t\tvar i, prop,\r\n\t\t\toriginalEvent = event,\r\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\r\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\r\n\r\n\t\tevent = jQuery.Event( originalEvent );\r\n\r\n\t\tfor ( i = copy.length; i; ) {\r\n\t\t\tprop = copy[ --i ];\r\n\t\t\tevent[ prop ] = originalEvent[ prop ];\r\n\t\t}\r\n\r\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\r\n\t\tif ( !event.target ) {\r\n\t\t\tevent.target = originalEvent.srcElement || document;\r\n\t\t}\r\n\r\n\t\t// Target should not be a text node (#504, Safari)\r\n\t\tif ( event.target.nodeType === 3 ) {\r\n\t\t\tevent.target = event.target.parentNode;\r\n\t\t}\r\n\r\n\t\t// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)\r\n\t\tif ( event.metaKey === undefined ) {\r\n\t\t\tevent.metaKey = event.ctrlKey;\r\n\t\t}\r\n\r\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\r\n\t},\r\n\r\n\tspecial: {\r\n\t\tready: {\r\n\t\t\t// Make sure the ready event is setup\r\n\t\t\tsetup: jQuery.bindReady\r\n\t\t},\r\n\r\n\t\tload: {\r\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\r\n\t\t\tnoBubble: true\r\n\t\t},\r\n\r\n\t\tfocus: {\r\n\t\t\tdelegateType: \"focusin\"\r\n\t\t},\r\n\t\tblur: {\r\n\t\t\tdelegateType: \"focusout\"\r\n\t\t},\r\n\r\n\t\tbeforeunload: {\r\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\r\n\t\t\t\t// We only want to do this special case on windows\r\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\r\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tteardown: function( namespaces, eventHandle ) {\r\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\r\n\t\t\t\t\tthis.onbeforeunload = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsimulate: function( type, elem, event, bubble ) {\r\n\t\t// Piggyback on a donor event to simulate a different one.\r\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\r\n\t\t// simulated event prevents default then we do the same on the donor.\r\n\t\tvar e = jQuery.extend(\r\n\t\t\tnew jQuery.Event(),\r\n\t\t\tevent,\r\n\t\t\t{ type: type,\r\n\t\t\t\tisSimulated: true,\r\n\t\t\t\toriginalEvent: {}\r\n\t\t\t}\r\n\t\t);\r\n\t\tif ( bubble ) {\r\n\t\t\tjQuery.event.trigger( e, null, elem );\r\n\t\t} else {\r\n\t\t\tjQuery.event.dispatch.call( elem, e );\r\n\t\t}\r\n\t\tif ( e.isDefaultPrevented() ) {\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// Some plugins are using, but it's undocumented/deprecated and will be removed.\r\n// The 1.7 special event interface should provide all the hooks needed now.\r\njQuery.event.handle = jQuery.event.dispatch;\r\n\r\njQuery.removeEvent = document.removeEventListener ?\r\n\tfunction( elem, type, handle ) {\r\n\t\tif ( elem.removeEventListener ) {\r\n\t\t\telem.removeEventListener( type, handle, false );\r\n\t\t}\r\n\t} :\r\n\tfunction( elem, type, handle ) {\r\n\t\tif ( elem.detachEvent ) {\r\n\t\t\telem.detachEvent( \"on\" + type, handle );\r\n\t\t}\r\n\t};\r\n\r\njQuery.Event = function( src, props ) {\r\n\t// Allow instantiation without the 'new' keyword\r\n\tif ( !(this instanceof jQuery.Event) ) {\r\n\t\treturn new jQuery.Event( src, props );\r\n\t}\r\n\r\n\t// Event object\r\n\tif ( src && src.type ) {\r\n\t\tthis.originalEvent = src;\r\n\t\tthis.type = src.type;\r\n\r\n\t\t// Events bubbling up the document may have been marked as prevented\r\n\t\t// by a handler lower down the tree; reflect the correct value.\r\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\r\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\r\n\r\n\t// Event type\r\n\t} else {\r\n\t\tthis.type = src;\r\n\t}\r\n\r\n\t// Put explicitly provided properties onto the event object\r\n\tif ( props ) {\r\n\t\tjQuery.extend( this, props );\r\n\t}\r\n\r\n\t// Create a timestamp if incoming event doesn't have one\r\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\r\n\r\n\t// Mark it as fixed\r\n\tthis[ jQuery.expando ] = true;\r\n};\r\n\r\nfunction returnFalse() {\r\n\treturn false;\r\n}\r\nfunction returnTrue() {\r\n\treturn true;\r\n}\r\n\r\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\r\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\r\njQuery.Event.prototype = {\r\n\tpreventDefault: function() {\r\n\t\tthis.isDefaultPrevented = returnTrue;\r\n\r\n\t\tvar e = this.originalEvent;\r\n\t\tif ( !e ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// if preventDefault exists run it on the original event\r\n\t\tif ( e.preventDefault ) {\r\n\t\t\te.preventDefault();\r\n\r\n\t\t// otherwise set the returnValue property of the original event to false (IE)\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t},\r\n\tstopPropagation: function() {\r\n\t\tthis.isPropagationStopped = returnTrue;\r\n\r\n\t\tvar e = this.originalEvent;\r\n\t\tif ( !e ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// if stopPropagation exists run it on the original event\r\n\t\tif ( e.stopPropagation ) {\r\n\t\t\te.stopPropagation();\r\n\t\t}\r\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\r\n\t\te.cancelBubble = true;\r\n\t},\r\n\tstopImmediatePropagation: function() {\r\n\t\tthis.isImmediatePropagationStopped = returnTrue;\r\n\t\tthis.stopPropagation();\r\n\t},\r\n\tisDefaultPrevented: returnFalse,\r\n\tisPropagationStopped: returnFalse,\r\n\tisImmediatePropagationStopped: returnFalse\r\n};\r\n\r\n// Create mouseenter/leave events using mouseover/out and event-time checks\r\njQuery.each({\r\n\tmouseenter: \"mouseover\",\r\n\tmouseleave: \"mouseout\"\r\n}, function( orig, fix ) {\r\n\tjQuery.event.special[ orig ] = {\r\n\t\tdelegateType: fix,\r\n\t\tbindType: fix,\r\n\r\n\t\thandle: function( event ) {\r\n\t\t\tvar target = this,\r\n\t\t\t\trelated = event.relatedTarget,\r\n\t\t\t\thandleObj = event.handleObj,\r\n\t\t\t\tselector = handleObj.selector,\r\n\t\t\t\tret;\r\n\r\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\r\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\r\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\r\n\t\t\t\tevent.type = handleObj.origType;\r\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\r\n\t\t\t\tevent.type = fix;\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t};\r\n});\r\n\r\n// IE submit delegation\r\nif ( !jQuery.support.submitBubbles ) {\r\n\r\n\tjQuery.event.special.submit = {\r\n\t\tsetup: function() {\r\n\t\t\t// Only need this for delegated form submit events\r\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\r\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\r\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\r\n\t\t\t\tvar elem = e.target,\r\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\r\n\t\t\t\tif ( form && !form._submit_attached ) {\r\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\r\n\t\t\t\t\t\tevent._submit_bubble = true;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tform._submit_attached = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t// return undefined since we don't need an event listener\r\n\t\t},\r\n\t\t\r\n\t\tpostDispatch: function( event ) {\r\n\t\t\t// If form was submitted by the user, bubble the event up the tree\r\n\t\t\tif ( event._submit_bubble ) {\r\n\t\t\t\tdelete event._submit_bubble;\r\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\r\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tteardown: function() {\r\n\t\t\t// Only need this for delegated form submit events\r\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\r\n\t\t\tjQuery.event.remove( this, \"._submit\" );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// IE change delegation and checkbox/radio fix\r\nif ( !jQuery.support.changeBubbles ) {\r\n\r\n\tjQuery.event.special.change = {\r\n\r\n\t\tsetup: function() {\r\n\r\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\r\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\r\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\r\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\r\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\r\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\r\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\r\n\t\t\t\t\t\t\tthis._just_changed = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\r\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\r\n\t\t\t\t\t\t\tthis._just_changed = false;\r\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\r\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\r\n\t\t\t\tvar elem = e.target;\r\n\r\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {\r\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\r\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\r\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\telem._change_attached = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\thandle: function( event ) {\r\n\t\t\tvar elem = event.target;\r\n\r\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\r\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\r\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tteardown: function() {\r\n\t\t\tjQuery.event.remove( this, \"._change\" );\r\n\r\n\t\t\treturn rformElems.test( this.nodeName );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Create \"bubbling\" focus and blur events\r\nif ( !jQuery.support.focusinBubbles ) {\r\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\r\n\r\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\r\n\t\tvar attaches = 0,\r\n\t\t\thandler = function( event ) {\r\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\r\n\t\t\t};\r\n\r\n\t\tjQuery.event.special[ fix ] = {\r\n\t\t\tsetup: function() {\r\n\t\t\t\tif ( attaches++ === 0 ) {\r\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tteardown: function() {\r\n\t\t\t\tif ( --attaches === 0 ) {\r\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n}\r\n\r\njQuery.fn.extend({\r\n\r\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\r\n\t\tvar origFn, type;\r\n\r\n\t\t// Types can be a map of types/handlers\r\n\t\tif ( typeof types === \"object\" ) {\r\n\t\t\t// ( types-Object, selector, data )\r\n\t\t\tif ( typeof selector !== \"string\" ) { // && selector != null\r\n\t\t\t\t// ( types-Object, data )\r\n\t\t\t\tdata = data || selector;\r\n\t\t\t\tselector = undefined;\r\n\t\t\t}\r\n\t\t\tfor ( type in types ) {\r\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ( data == null && fn == null ) {\r\n\t\t\t// ( types, fn )\r\n\t\t\tfn = selector;\r\n\t\t\tdata = selector = undefined;\r\n\t\t} else if ( fn == null ) {\r\n\t\t\tif ( typeof selector === \"string\" ) {\r\n\t\t\t\t// ( types, selector, fn )\r\n\t\t\t\tfn = data;\r\n\t\t\t\tdata = undefined;\r\n\t\t\t} else {\r\n\t\t\t\t// ( types, data, fn )\r\n\t\t\t\tfn = data;\r\n\t\t\t\tdata = selector;\r\n\t\t\t\tselector = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif ( fn === false ) {\r\n\t\t\tfn = returnFalse;\r\n\t\t} else if ( !fn ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ( one === 1 ) {\r\n\t\t\torigFn = fn;\r\n\t\t\tfn = function( event ) {\r\n\t\t\t\t// Can use an empty set, since event contains the info\r\n\t\t\t\tjQuery().off( event );\r\n\t\t\t\treturn origFn.apply( this, arguments );\r\n\t\t\t};\r\n\t\t\t// Use same guid so caller can remove using origFn\r\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\r\n\t\t}\r\n\t\treturn this.each( function() {\r\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\r\n\t\t});\r\n\t},\r\n\tone: function( types, selector, data, fn ) {\r\n\t\treturn this.on( types, selector, data, fn, 1 );\r\n\t},\r\n\toff: function( types, selector, fn ) {\r\n\t\tif ( types && types.preventDefault && types.handleObj ) {\r\n\t\t\t// ( event )  dispatched jQuery.Event\r\n\t\t\tvar handleObj = types.handleObj;\r\n\t\t\tjQuery( types.delegateTarget ).off(\r\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\r\n\t\t\t\thandleObj.selector,\r\n\t\t\t\thandleObj.handler\r\n\t\t\t);\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif ( typeof types === \"object\" ) {\r\n\t\t\t// ( types-object [, selector] )\r\n\t\t\tfor ( var type in types ) {\r\n\t\t\t\tthis.off( type, selector, types[ type ] );\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif ( selector === false || typeof selector === \"function\" ) {\r\n\t\t\t// ( types [, fn] )\r\n\t\t\tfn = selector;\r\n\t\t\tselector = undefined;\r\n\t\t}\r\n\t\tif ( fn === false ) {\r\n\t\t\tfn = returnFalse;\r\n\t\t}\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.event.remove( this, types, fn, selector );\r\n\t\t});\r\n\t},\r\n\r\n\tbind: function( types, data, fn ) {\r\n\t\treturn this.on( types, null, data, fn );\r\n\t},\r\n\tunbind: function( types, fn ) {\r\n\t\treturn this.off( types, null, fn );\r\n\t},\r\n\r\n\tlive: function( types, data, fn ) {\r\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\r\n\t\treturn this;\r\n\t},\r\n\tdie: function( types, fn ) {\r\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdelegate: function( selector, types, data, fn ) {\r\n\t\treturn this.on( types, selector, data, fn );\r\n\t},\r\n\tundelegate: function( selector, types, fn ) {\r\n\t\t// ( namespace ) or ( selector, types [, fn] )\r\n\t\treturn arguments.length == 1? this.off( selector, \"**\" ) : this.off( types, selector, fn );\r\n\t},\r\n\r\n\ttrigger: function( type, data ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.event.trigger( type, data, this );\r\n\t\t});\r\n\t},\r\n\ttriggerHandler: function( type, data ) {\r\n\t\tif ( this[0] ) {\r\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\r\n\t\t}\r\n\t},\r\n\r\n\ttoggle: function( fn ) {\r\n\t\t// Save reference to arguments for access in closure\r\n\t\tvar args = arguments,\r\n\t\t\tguid = fn.guid || jQuery.guid++,\r\n\t\t\ti = 0,\r\n\t\t\ttoggler = function( event ) {\r\n\t\t\t\t// Figure out which function to execute\r\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\r\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\r\n\r\n\t\t\t\t// Make sure that clicks stop\r\n\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t// and execute the function\r\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\r\n\t\t\t};\r\n\r\n\t\t// link all the functions, so any of them can unbind this click handler\r\n\t\ttoggler.guid = guid;\r\n\t\twhile ( i < args.length ) {\r\n\t\t\targs[ i++ ].guid = guid;\r\n\t\t}\r\n\r\n\t\treturn this.click( toggler );\r\n\t},\r\n\r\n\thover: function( fnOver, fnOut ) {\r\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\r\n\t}\r\n});\r\n\r\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\r\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\r\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\r\n\r\n\t// Handle event binding\r\n\tjQuery.fn[ name ] = function( data, fn ) {\r\n\t\tif ( fn == null ) {\r\n\t\t\tfn = data;\r\n\t\t\tdata = null;\r\n\t\t}\r\n\r\n\t\treturn arguments.length > 0 ?\r\n\t\t\tthis.on( name, null, data, fn ) :\r\n\t\t\tthis.trigger( name );\r\n\t};\r\n\r\n\tif ( jQuery.attrFn ) {\r\n\t\tjQuery.attrFn[ name ] = true;\r\n\t}\r\n\r\n\tif ( rkeyEvent.test( name ) ) {\r\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\r\n\t}\r\n\r\n\tif ( rmouseEvent.test( name ) ) {\r\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\r\n\t}\r\n});\r\n\r\n\r\n\r\n/*!\r\n * Sizzle CSS Selector Engine\r\n *  Copyright 2011, The Dojo Foundation\r\n *  Released under the MIT, BSD, and GPL Licenses.\r\n *  More information: http://sizzlejs.com/\r\n */\r\n(function(){\r\n\r\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\r\n\texpando = \"sizcache\" + (Math.random() + '').replace('.', ''),\r\n\tdone = 0,\r\n\ttoString = Object.prototype.toString,\r\n\thasDuplicate = false,\r\n\tbaseHasDuplicate = true,\r\n\trBackslash = /\\\\/g,\r\n\trReturn = /\\r\\n/g,\r\n\trNonWord = /\\W/;\r\n\r\n// Here we check if the JavaScript engine is using some sort of\r\n// optimization where it does not always call our comparision\r\n// function. If that is the case, discard the hasDuplicate value.\r\n//   Thus far that includes Google Chrome.\r\n[0, 0].sort(function() {\r\n\tbaseHasDuplicate = false;\r\n\treturn 0;\r\n});\r\n\r\nvar Sizzle = function( selector, context, results, seed ) {\r\n\tresults = results || [];\r\n\tcontext = context || document;\r\n\r\n\tvar origContext = context;\r\n\r\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tif ( !selector || typeof selector !== \"string\" ) {\r\n\t\treturn results;\r\n\t}\r\n\r\n\tvar m, set, checkSet, extra, ret, cur, pop, i,\r\n\t\tprune = true,\r\n\t\tcontextXML = Sizzle.isXML( context ),\r\n\t\tparts = [],\r\n\t\tsoFar = selector;\r\n\r\n\t// Reset the position of the chunker regexp (start from head)\r\n\tdo {\r\n\t\tchunker.exec( \"\" );\r\n\t\tm = chunker.exec( soFar );\r\n\r\n\t\tif ( m ) {\r\n\t\t\tsoFar = m[3];\r\n\r\n\t\t\tparts.push( m[1] );\r\n\r\n\t\t\tif ( m[2] ) {\r\n\t\t\t\textra = m[3];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t} while ( m );\r\n\r\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\r\n\r\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\r\n\t\t\tset = posProcess( parts[0] + parts[1], context, seed );\r\n\r\n\t\t} else {\r\n\t\t\tset = Expr.relative[ parts[0] ] ?\r\n\t\t\t\t[ context ] :\r\n\t\t\t\tSizzle( parts.shift(), context );\r\n\r\n\t\t\twhile ( parts.length ) {\r\n\t\t\t\tselector = parts.shift();\r\n\r\n\t\t\t\tif ( Expr.relative[ selector ] ) {\r\n\t\t\t\t\tselector += parts.shift();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tset = posProcess( selector, set, seed );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t} else {\r\n\t\t// Take a shortcut and set the context if the root selector is an ID\r\n\t\t// (but not if it'll be faster if the inner selector is an ID)\r\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\r\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\r\n\r\n\t\t\tret = Sizzle.find( parts.shift(), context, contextXML );\r\n\t\t\tcontext = ret.expr ?\r\n\t\t\t\tSizzle.filter( ret.expr, ret.set )[0] :\r\n\t\t\t\tret.set[0];\r\n\t\t}\r\n\r\n\t\tif ( context ) {\r\n\t\t\tret = seed ?\r\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\r\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\r\n\r\n\t\t\tset = ret.expr ?\r\n\t\t\t\tSizzle.filter( ret.expr, ret.set ) :\r\n\t\t\t\tret.set;\r\n\r\n\t\t\tif ( parts.length > 0 ) {\r\n\t\t\t\tcheckSet = makeArray( set );\r\n\r\n\t\t\t} else {\r\n\t\t\t\tprune = false;\r\n\t\t\t}\r\n\r\n\t\t\twhile ( parts.length ) {\r\n\t\t\t\tcur = parts.pop();\r\n\t\t\t\tpop = cur;\r\n\r\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\r\n\t\t\t\t\tcur = \"\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpop = parts.pop();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( pop == null ) {\r\n\t\t\t\t\tpop = context;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tcheckSet = parts = [];\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !checkSet ) {\r\n\t\tcheckSet = set;\r\n\t}\r\n\r\n\tif ( !checkSet ) {\r\n\t\tSizzle.error( cur || selector );\r\n\t}\r\n\r\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\r\n\t\tif ( !prune ) {\r\n\t\t\tresults.push.apply( results, checkSet );\r\n\r\n\t\t} else if ( context && context.nodeType === 1 ) {\r\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\r\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\r\n\t\t\t\t\tresults.push( set[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\r\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\r\n\t\t\t\t\tresults.push( set[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t} else {\r\n\t\tmakeArray( checkSet, results );\r\n\t}\r\n\r\n\tif ( extra ) {\r\n\t\tSizzle( extra, origContext, results, seed );\r\n\t\tSizzle.uniqueSort( results );\r\n\t}\r\n\r\n\treturn results;\r\n};\r\n\r\nSizzle.uniqueSort = function( results ) {\r\n\tif ( sortOrder ) {\r\n\t\thasDuplicate = baseHasDuplicate;\r\n\t\tresults.sort( sortOrder );\r\n\r\n\t\tif ( hasDuplicate ) {\r\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\r\n\t\t\t\tif ( results[i] === results[ i - 1 ] ) {\r\n\t\t\t\t\tresults.splice( i--, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn results;\r\n};\r\n\r\nSizzle.matches = function( expr, set ) {\r\n\treturn Sizzle( expr, null, null, set );\r\n};\r\n\r\nSizzle.matchesSelector = function( node, expr ) {\r\n\treturn Sizzle( expr, null, null, [node] ).length > 0;\r\n};\r\n\r\nSizzle.find = function( expr, context, isXML ) {\r\n\tvar set, i, len, match, type, left;\r\n\r\n\tif ( !expr ) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tfor ( i = 0, len = Expr.order.length; i < len; i++ ) {\r\n\t\ttype = Expr.order[i];\r\n\r\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\r\n\t\t\tleft = match[1];\r\n\t\t\tmatch.splice( 1, 1 );\r\n\r\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\r\n\t\t\t\tmatch[1] = (match[1] || \"\").replace( rBackslash, \"\" );\r\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\r\n\r\n\t\t\t\tif ( set != null ) {\r\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !set ) {\r\n\t\tset = typeof context.getElementsByTagName !== \"undefined\" ?\r\n\t\t\tcontext.getElementsByTagName( \"*\" ) :\r\n\t\t\t[];\r\n\t}\r\n\r\n\treturn { set: set, expr: expr };\r\n};\r\n\r\nSizzle.filter = function( expr, set, inplace, not ) {\r\n\tvar match, anyFound,\r\n\t\ttype, found, item, filter, left,\r\n\t\ti, pass,\r\n\t\told = expr,\r\n\t\tresult = [],\r\n\t\tcurLoop = set,\r\n\t\tisXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\r\n\r\n\twhile ( expr && set.length ) {\r\n\t\tfor ( type in Expr.filter ) {\r\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\r\n\t\t\t\tfilter = Expr.filter[ type ];\r\n\t\t\t\tleft = match[1];\r\n\r\n\t\t\t\tanyFound = false;\r\n\r\n\t\t\t\tmatch.splice(1,1);\r\n\r\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( curLoop === result ) {\r\n\t\t\t\t\tresult = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\r\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\r\n\r\n\t\t\t\t\tif ( !match ) {\r\n\t\t\t\t\t\tanyFound = found = true;\r\n\r\n\t\t\t\t\t} else if ( match === true ) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( match ) {\r\n\t\t\t\t\tfor ( i = 0; (item = curLoop[i]) != null; i++ ) {\r\n\t\t\t\t\t\tif ( item ) {\r\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\r\n\t\t\t\t\t\t\tpass = not ^ found;\r\n\r\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\r\n\t\t\t\t\t\t\t\tif ( pass ) {\r\n\t\t\t\t\t\t\t\t\tanyFound = true;\r\n\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t} else if ( pass ) {\r\n\t\t\t\t\t\t\t\tresult.push( item );\r\n\t\t\t\t\t\t\t\tanyFound = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( found !== undefined ) {\r\n\t\t\t\t\tif ( !inplace ) {\r\n\t\t\t\t\t\tcurLoop = result;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\r\n\r\n\t\t\t\t\tif ( !anyFound ) {\r\n\t\t\t\t\t\treturn [];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Improper expression\r\n\t\tif ( expr === old ) {\r\n\t\t\tif ( anyFound == null ) {\r\n\t\t\t\tSizzle.error( expr );\r\n\r\n\t\t\t} else {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\told = expr;\r\n\t}\r\n\r\n\treturn curLoop;\r\n};\r\n\r\nSizzle.error = function( msg ) {\r\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\r\n};\r\n\r\n/**\r\n * Utility function for retreiving the text value of an array of DOM nodes\r\n * @param {Array|Element} elem\r\n */\r\nvar getText = Sizzle.getText = function( elem ) {\r\n    var i, node,\r\n\t\tnodeType = elem.nodeType,\r\n\t\tret = \"\";\r\n\r\n\tif ( nodeType ) {\r\n\t\tif ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r\n\t\t\t// Use textContent || innerText for elements\r\n\t\t\tif ( typeof elem.textContent === 'string' ) {\r\n\t\t\t\treturn elem.textContent;\r\n\t\t\t} else if ( typeof elem.innerText === 'string' ) {\r\n\t\t\t\t// Replace IE's carriage returns\r\n\t\t\t\treturn elem.innerText.replace( rReturn, '' );\r\n\t\t\t} else {\r\n\t\t\t\t// Traverse it's children\r\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling) {\r\n\t\t\t\t\tret += getText( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\r\n\t\t\treturn elem.nodeValue;\r\n\t\t}\r\n\t} else {\r\n\r\n\t\t// If no nodeType, this is expected to be an array\r\n\t\tfor ( i = 0; (node = elem[i]); i++ ) {\r\n\t\t\t// Do not traverse comment nodes\r\n\t\t\tif ( node.nodeType !== 8 ) {\r\n\t\t\t\tret += getText( node );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn ret;\r\n};\r\n\r\nvar Expr = Sizzle.selectors = {\r\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\r\n\r\n\tmatch: {\r\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\r\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\r\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\r\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\r\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\r\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\r\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\r\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\r\n\t},\r\n\r\n\tleftMatch: {},\r\n\r\n\tattrMap: {\r\n\t\t\"class\": \"className\",\r\n\t\t\"for\": \"htmlFor\"\r\n\t},\r\n\r\n\tattrHandle: {\r\n\t\thref: function( elem ) {\r\n\t\t\treturn elem.getAttribute( \"href\" );\r\n\t\t},\r\n\t\ttype: function( elem ) {\r\n\t\t\treturn elem.getAttribute( \"type\" );\r\n\t\t}\r\n\t},\r\n\r\n\trelative: {\r\n\t\t\"+\": function(checkSet, part){\r\n\t\t\tvar isPartStr = typeof part === \"string\",\r\n\t\t\t\tisTag = isPartStr && !rNonWord.test( part ),\r\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\r\n\r\n\t\t\tif ( isTag ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\r\n\t\t\t\tif ( (elem = checkSet[i]) ) {\r\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\r\n\r\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\r\n\t\t\t\t\t\telem || false :\r\n\t\t\t\t\t\telem === part;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( isPartStrNotTag ) {\r\n\t\t\t\tSizzle.filter( part, checkSet, true );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t\">\": function( checkSet, part ) {\r\n\t\t\tvar elem,\r\n\t\t\t\tisPartStr = typeof part === \"string\",\r\n\t\t\t\ti = 0,\r\n\t\t\t\tl = checkSet.length;\r\n\r\n\t\t\tif ( isPartStr && !rNonWord.test( part ) ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\r\n\t\t\t\tfor ( ; i < l; i++ ) {\r\n\t\t\t\t\telem = checkSet[i];\r\n\r\n\t\t\t\t\tif ( elem ) {\r\n\t\t\t\t\t\tvar parent = elem.parentNode;\r\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; i < l; i++ ) {\r\n\t\t\t\t\telem = checkSet[i];\r\n\r\n\t\t\t\t\tif ( elem ) {\r\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\r\n\t\t\t\t\t\t\telem.parentNode :\r\n\t\t\t\t\t\t\telem.parentNode === part;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( isPartStr ) {\r\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t\"\": function(checkSet, part, isXML){\r\n\t\t\tvar nodeCheck,\r\n\t\t\t\tdoneName = done++,\r\n\t\t\t\tcheckFn = dirCheck;\r\n\r\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\t\t\t\tnodeCheck = part;\r\n\t\t\t\tcheckFn = dirNodeCheck;\r\n\t\t\t}\r\n\r\n\t\t\tcheckFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\r\n\t\t},\r\n\r\n\t\t\"~\": function( checkSet, part, isXML ) {\r\n\t\t\tvar nodeCheck,\r\n\t\t\t\tdoneName = done++,\r\n\t\t\t\tcheckFn = dirCheck;\r\n\r\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\t\t\t\tnodeCheck = part;\r\n\t\t\t\tcheckFn = dirNodeCheck;\r\n\t\t\t}\r\n\r\n\t\t\tcheckFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\r\n\t\t}\r\n\t},\r\n\r\n\tfind: {\r\n\t\tID: function( match, context, isXML ) {\r\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\r\n\t\t\t\tvar m = context.getElementById(match[1]);\r\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\treturn m && m.parentNode ? [m] : [];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tNAME: function( match, context ) {\r\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\r\n\t\t\t\tvar ret = [],\r\n\t\t\t\t\tresults = context.getElementsByName( match[1] );\r\n\r\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\r\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\r\n\t\t\t\t\t\tret.push( results[i] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn ret.length === 0 ? null : ret;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tTAG: function( match, context ) {\r\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\r\n\t\t\t\treturn context.getElementsByTagName( match[1] );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tpreFilter: {\r\n\t\tCLASS: function( match, curLoop, inplace, result, not, isXML ) {\r\n\t\t\tmatch = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\r\n\r\n\t\t\tif ( isXML ) {\r\n\t\t\t\treturn match;\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\r\n\t\t\t\tif ( elem ) {\r\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\r\n\t\t\t\t\t\tif ( !inplace ) {\r\n\t\t\t\t\t\t\tresult.push( elem );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( inplace ) {\r\n\t\t\t\t\t\tcurLoop[i] = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t},\r\n\r\n\t\tID: function( match ) {\r\n\t\t\treturn match[1].replace( rBackslash, \"\" );\r\n\t\t},\r\n\r\n\t\tTAG: function( match, curLoop ) {\r\n\t\t\treturn match[1].replace( rBackslash, \"\" ).toLowerCase();\r\n\t\t},\r\n\r\n\t\tCHILD: function( match ) {\r\n\t\t\tif ( match[1] === \"nth\" ) {\r\n\t\t\t\tif ( !match[2] ) {\r\n\t\t\t\t\tSizzle.error( match[0] );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmatch[2] = match[2].replace(/^\\+|\\s*/g, '');\r\n\r\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\r\n\t\t\t\tvar test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\r\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\r\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\r\n\r\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\r\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\r\n\t\t\t\tmatch[3] = test[3] - 0;\r\n\t\t\t}\r\n\t\t\telse if ( match[2] ) {\r\n\t\t\t\tSizzle.error( match[0] );\r\n\t\t\t}\r\n\r\n\t\t\t// TODO: Move to normal caching system\r\n\t\t\tmatch[0] = done++;\r\n\r\n\t\t\treturn match;\r\n\t\t},\r\n\r\n\t\tATTR: function( match, curLoop, inplace, result, not, isXML ) {\r\n\t\t\tvar name = match[1] = match[1].replace( rBackslash, \"\" );\r\n\r\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\r\n\t\t\t\tmatch[1] = Expr.attrMap[name];\r\n\t\t\t}\r\n\r\n\t\t\t// Handle if an un-quoted value was used\r\n\t\t\tmatch[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\r\n\r\n\t\t\tif ( match[2] === \"~=\" ) {\r\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\r\n\t\t\t}\r\n\r\n\t\t\treturn match;\r\n\t\t},\r\n\r\n\t\tPSEUDO: function( match, curLoop, inplace, result, not ) {\r\n\t\t\tif ( match[1] === \"not\" ) {\r\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\r\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\r\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\r\n\r\n\t\t\t\t\tif ( !inplace ) {\r\n\t\t\t\t\t\tresult.push.apply( result, ret );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\treturn match;\r\n\t\t},\r\n\r\n\t\tPOS: function( match ) {\r\n\t\t\tmatch.unshift( true );\r\n\r\n\t\t\treturn match;\r\n\t\t}\r\n\t},\r\n\r\n\tfilters: {\r\n\t\tenabled: function( elem ) {\r\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\r\n\t\t},\r\n\r\n\t\tdisabled: function( elem ) {\r\n\t\t\treturn elem.disabled === true;\r\n\t\t},\r\n\r\n\t\tchecked: function( elem ) {\r\n\t\t\treturn elem.checked === true;\r\n\t\t},\r\n\r\n\t\tselected: function( elem ) {\r\n\t\t\t// Accessing this property makes selected-by-default\r\n\t\t\t// options in Safari work properly\r\n\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\telem.parentNode.selectedIndex;\r\n\t\t\t}\r\n\r\n\t\t\treturn elem.selected === true;\r\n\t\t},\r\n\r\n\t\tparent: function( elem ) {\r\n\t\t\treturn !!elem.firstChild;\r\n\t\t},\r\n\r\n\t\tempty: function( elem ) {\r\n\t\t\treturn !elem.firstChild;\r\n\t\t},\r\n\r\n\t\thas: function( elem, i, match ) {\r\n\t\t\treturn !!Sizzle( match[3], elem ).length;\r\n\t\t},\r\n\r\n\t\theader: function( elem ) {\r\n\t\t\treturn (/h\\d/i).test( elem.nodeName );\r\n\t\t},\r\n\r\n\t\ttext: function( elem ) {\r\n\t\t\tvar attr = elem.getAttribute( \"type\" ), type = elem.type;\r\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r\n\t\t\t// use getAttribute instead to test this case\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\r\n\t\t},\r\n\r\n\t\tradio: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\r\n\t\t},\r\n\r\n\t\tcheckbox: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\r\n\t\t},\r\n\r\n\t\tfile: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\r\n\t\t},\r\n\r\n\t\tpassword: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\r\n\t\t},\r\n\r\n\t\tsubmit: function( elem ) {\r\n\t\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\t\treturn (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\r\n\t\t},\r\n\r\n\t\timage: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\r\n\t\t},\r\n\r\n\t\treset: function( elem ) {\r\n\t\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\t\treturn (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\r\n\t\t},\r\n\r\n\t\tbutton: function( elem ) {\r\n\t\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\t\treturn name === \"input\" && \"button\" === elem.type || name === \"button\";\r\n\t\t},\r\n\r\n\t\tinput: function( elem ) {\r\n\t\t\treturn (/input|select|textarea|button/i).test( elem.nodeName );\r\n\t\t},\r\n\r\n\t\tfocus: function( elem ) {\r\n\t\t\treturn elem === elem.ownerDocument.activeElement;\r\n\t\t}\r\n\t},\r\n\tsetFilters: {\r\n\t\tfirst: function( elem, i ) {\r\n\t\t\treturn i === 0;\r\n\t\t},\r\n\r\n\t\tlast: function( elem, i, match, array ) {\r\n\t\t\treturn i === array.length - 1;\r\n\t\t},\r\n\r\n\t\teven: function( elem, i ) {\r\n\t\t\treturn i % 2 === 0;\r\n\t\t},\r\n\r\n\t\todd: function( elem, i ) {\r\n\t\t\treturn i % 2 === 1;\r\n\t\t},\r\n\r\n\t\tlt: function( elem, i, match ) {\r\n\t\t\treturn i < match[3] - 0;\r\n\t\t},\r\n\r\n\t\tgt: function( elem, i, match ) {\r\n\t\t\treturn i > match[3] - 0;\r\n\t\t},\r\n\r\n\t\tnth: function( elem, i, match ) {\r\n\t\t\treturn match[3] - 0 === i;\r\n\t\t},\r\n\r\n\t\teq: function( elem, i, match ) {\r\n\t\t\treturn match[3] - 0 === i;\r\n\t\t}\r\n\t},\r\n\tfilter: {\r\n\t\tPSEUDO: function( elem, match, i, array ) {\r\n\t\t\tvar name = match[1],\r\n\t\t\t\tfilter = Expr.filters[ name ];\r\n\r\n\t\t\tif ( filter ) {\r\n\t\t\t\treturn filter( elem, i, match, array );\r\n\r\n\t\t\t} else if ( name === \"contains\" ) {\r\n\t\t\t\treturn (elem.textContent || elem.innerText || getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\r\n\r\n\t\t\t} else if ( name === \"not\" ) {\r\n\t\t\t\tvar not = match[3];\r\n\r\n\t\t\t\tfor ( var j = 0, l = not.length; j < l; j++ ) {\r\n\t\t\t\t\tif ( not[j] === elem ) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else {\r\n\t\t\t\tSizzle.error( name );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tCHILD: function( elem, match ) {\r\n\t\t\tvar first, last,\r\n\t\t\t\tdoneName, parent, cache,\r\n\t\t\t\tcount, diff,\r\n\t\t\t\ttype = match[1],\r\n\t\t\t\tnode = elem;\r\n\r\n\t\t\tswitch ( type ) {\r\n\t\t\t\tcase \"only\":\r\n\t\t\t\tcase \"first\":\r\n\t\t\t\t\twhile ( (node = node.previousSibling) ) {\r\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( type === \"first\" ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tnode = elem;\r\n\r\n\t\t\t\t\t/* falls through */\r\n\t\t\t\tcase \"last\":\r\n\t\t\t\t\twhile ( (node = node.nextSibling) ) {\r\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\tcase \"nth\":\r\n\t\t\t\t\tfirst = match[2];\r\n\t\t\t\t\tlast = match[3];\r\n\r\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdoneName = match[0];\r\n\t\t\t\t\tparent = elem.parentNode;\r\n\r\n\t\t\t\t\tif ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {\r\n\t\t\t\t\t\tcount = 0;\r\n\r\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\r\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\r\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tparent[ expando ] = doneName;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdiff = elem.nodeIndex - last;\r\n\r\n\t\t\t\t\tif ( first === 0 ) {\r\n\t\t\t\t\t\treturn diff === 0;\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\r\n\t\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tID: function( elem, match ) {\r\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\r\n\t\t},\r\n\r\n\t\tTAG: function( elem, match ) {\r\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;\r\n\t\t},\r\n\r\n\t\tCLASS: function( elem, match ) {\r\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\r\n\t\t\t\t.indexOf( match ) > -1;\r\n\t\t},\r\n\r\n\t\tATTR: function( elem, match ) {\r\n\t\t\tvar name = match[1],\r\n\t\t\t\tresult = Sizzle.attr ?\r\n\t\t\t\t\tSizzle.attr( elem, name ) :\r\n\t\t\t\t\tExpr.attrHandle[ name ] ?\r\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\r\n\t\t\t\t\telem[ name ] != null ?\r\n\t\t\t\t\t\telem[ name ] :\r\n\t\t\t\t\t\telem.getAttribute( name ),\r\n\t\t\t\tvalue = result + \"\",\r\n\t\t\t\ttype = match[2],\r\n\t\t\t\tcheck = match[4];\r\n\r\n\t\t\treturn result == null ?\r\n\t\t\t\ttype === \"!=\" :\r\n\t\t\t\t!type && Sizzle.attr ?\r\n\t\t\t\tresult != null :\r\n\t\t\t\ttype === \"=\" ?\r\n\t\t\t\tvalue === check :\r\n\t\t\t\ttype === \"*=\" ?\r\n\t\t\t\tvalue.indexOf(check) >= 0 :\r\n\t\t\t\ttype === \"~=\" ?\r\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\r\n\t\t\t\t!check ?\r\n\t\t\t\tvalue && result !== false :\r\n\t\t\t\ttype === \"!=\" ?\r\n\t\t\t\tvalue !== check :\r\n\t\t\t\ttype === \"^=\" ?\r\n\t\t\t\tvalue.indexOf(check) === 0 :\r\n\t\t\t\ttype === \"$=\" ?\r\n\t\t\t\tvalue.substr(value.length - check.length) === check :\r\n\t\t\t\ttype === \"|=\" ?\r\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\r\n\t\t\t\tfalse;\r\n\t\t},\r\n\r\n\t\tPOS: function( elem, match, i, array ) {\r\n\t\t\tvar name = match[2],\r\n\t\t\t\tfilter = Expr.setFilters[ name ];\r\n\r\n\t\t\tif ( filter ) {\r\n\t\t\t\treturn filter( elem, i, match, array );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nvar origPOS = Expr.match.POS,\r\n\tfescape = function(all, num){\r\n\t\treturn \"\\\\\" + (num - 0 + 1);\r\n\t};\r\n\r\nfor ( var type in Expr.match ) {\r\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\r\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\r\n}\r\n// Expose origPOS\r\n// \"global\" as in regardless of relation to brackets/parens\r\nExpr.match.globalPOS = origPOS;\r\n\r\nvar makeArray = function( array, results ) {\r\n\tarray = Array.prototype.slice.call( array, 0 );\r\n\r\n\tif ( results ) {\r\n\t\tresults.push.apply( results, array );\r\n\t\treturn results;\r\n\t}\r\n\r\n\treturn array;\r\n};\r\n\r\n// Perform a simple check to determine if the browser is capable of\r\n// converting a NodeList to an array using builtin methods.\r\n// Also verifies that the returned array holds DOM nodes\r\n// (which is not the case in the Blackberry browser)\r\ntry {\r\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\r\n\r\n// Provide a fallback method if it does not work\r\n} catch( e ) {\r\n\tmakeArray = function( array, results ) {\r\n\t\tvar i = 0,\r\n\t\t\tret = results || [];\r\n\r\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\r\n\t\t\tArray.prototype.push.apply( ret, array );\r\n\r\n\t\t} else {\r\n\t\t\tif ( typeof array.length === \"number\" ) {\r\n\t\t\t\tfor ( var l = array.length; i < l; i++ ) {\r\n\t\t\t\t\tret.push( array[i] );\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; array[i]; i++ ) {\r\n\t\t\t\t\tret.push( array[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t};\r\n}\r\n\r\nvar sortOrder, siblingCheck;\r\n\r\nif ( document.documentElement.compareDocumentPosition ) {\r\n\tsortOrder = function( a, b ) {\r\n\t\tif ( a === b ) {\r\n\t\t\thasDuplicate = true;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\r\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\r\n\t\t}\r\n\r\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : 1;\r\n\t};\r\n\r\n} else {\r\n\tsortOrder = function( a, b ) {\r\n\t\t// The nodes are identical, we can exit early\r\n\t\tif ( a === b ) {\r\n\t\t\thasDuplicate = true;\r\n\t\t\treturn 0;\r\n\r\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\r\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\r\n\t\t\treturn a.sourceIndex - b.sourceIndex;\r\n\t\t}\r\n\r\n\t\tvar al, bl,\r\n\t\t\tap = [],\r\n\t\t\tbp = [],\r\n\t\t\taup = a.parentNode,\r\n\t\t\tbup = b.parentNode,\r\n\t\t\tcur = aup;\r\n\r\n\t\t// If the nodes are siblings (or identical) we can do a quick check\r\n\t\tif ( aup === bup ) {\r\n\t\t\treturn siblingCheck( a, b );\r\n\r\n\t\t// If no parents were found then the nodes are disconnected\r\n\t\t} else if ( !aup ) {\r\n\t\t\treturn -1;\r\n\r\n\t\t} else if ( !bup ) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\t// Otherwise they're somewhere else in the tree so we need\r\n\t\t// to build up a full list of the parentNodes for comparison\r\n\t\twhile ( cur ) {\r\n\t\t\tap.unshift( cur );\r\n\t\t\tcur = cur.parentNode;\r\n\t\t}\r\n\r\n\t\tcur = bup;\r\n\r\n\t\twhile ( cur ) {\r\n\t\t\tbp.unshift( cur );\r\n\t\t\tcur = cur.parentNode;\r\n\t\t}\r\n\r\n\t\tal = ap.length;\r\n\t\tbl = bp.length;\r\n\r\n\t\t// Start walking down the tree looking for a discrepancy\r\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\r\n\t\t\tif ( ap[i] !== bp[i] ) {\r\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// We ended someplace up the tree so do a sibling check\r\n\t\treturn i === al ?\r\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\r\n\t\t\tsiblingCheck( ap[i], b, 1 );\r\n\t};\r\n\r\n\tsiblingCheck = function( a, b, ret ) {\r\n\t\tif ( a === b ) {\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\tvar cur = a.nextSibling;\r\n\r\n\t\twhile ( cur ) {\r\n\t\t\tif ( cur === b ) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\r\n\t\t\tcur = cur.nextSibling;\r\n\t\t}\r\n\r\n\t\treturn 1;\r\n\t};\r\n}\r\n\r\n// Check to see if the browser returns elements by name when\r\n// querying by getElementById (and provide a workaround)\r\n(function(){\r\n\t// We're going to inject a fake input element with a specified name\r\n\tvar form = document.createElement(\"div\"),\r\n\t\tid = \"script\" + (new Date()).getTime(),\r\n\t\troot = document.documentElement;\r\n\r\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\r\n\r\n\t// Inject it into the root element, check its status, and remove it quickly\r\n\troot.insertBefore( form, root.firstChild );\r\n\r\n\t// The workaround has to do additional checks after a getElementById\r\n\t// Which slows things down for other browsers (hence the branching)\r\n\tif ( document.getElementById( id ) ) {\r\n\t\tExpr.find.ID = function( match, context, isXML ) {\r\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\r\n\t\t\t\tvar m = context.getElementById(match[1]);\r\n\r\n\t\t\t\treturn m ?\r\n\t\t\t\t\tm.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\r\n\t\t\t\t\t\t[m] :\r\n\t\t\t\t\t\tundefined :\r\n\t\t\t\t\t[];\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tExpr.filter.ID = function( elem, match ) {\r\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\r\n\r\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\r\n\t\t};\r\n\t}\r\n\r\n\troot.removeChild( form );\r\n\r\n\t// release memory in IE\r\n\troot = form = null;\r\n})();\r\n\r\n(function(){\r\n\t// Check to see if the browser returns only elements\r\n\t// when doing getElementsByTagName(\"*\")\r\n\r\n\t// Create a fake element\r\n\tvar div = document.createElement(\"div\");\r\n\tdiv.appendChild( document.createComment(\"\") );\r\n\r\n\t// Make sure no comments are found\r\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\r\n\t\tExpr.find.TAG = function( match, context ) {\r\n\t\t\tvar results = context.getElementsByTagName( match[1] );\r\n\r\n\t\t\t// Filter out possible comments\r\n\t\t\tif ( match[1] === \"*\" ) {\r\n\t\t\t\tvar tmp = [];\r\n\r\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\r\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\r\n\t\t\t\t\t\ttmp.push( results[i] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresults = tmp;\r\n\t\t\t}\r\n\r\n\t\t\treturn results;\r\n\t\t};\r\n\t}\r\n\r\n\t// Check to see if an attribute returns normalized href attributes\r\n\tdiv.innerHTML = \"<a href='#'></a>\";\r\n\r\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\r\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\r\n\r\n\t\tExpr.attrHandle.href = function( elem ) {\r\n\t\t\treturn elem.getAttribute( \"href\", 2 );\r\n\t\t};\r\n\t}\r\n\r\n\t// release memory in IE\r\n\tdiv = null;\r\n})();\r\n\r\nif ( document.querySelectorAll ) {\r\n\t(function(){\r\n\t\tvar oldSizzle = Sizzle,\r\n\t\t\tdiv = document.createElement(\"div\"),\r\n\t\t\tid = \"__sizzle__\";\r\n\r\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\r\n\r\n\t\t// Safari can't handle uppercase or unicode characters when\r\n\t\t// in quirks mode.\r\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tSizzle = function( query, context, extra, seed ) {\r\n\t\t\tcontext = context || document;\r\n\r\n\t\t\t// Only use querySelectorAll on non-XML documents\r\n\t\t\t// (ID selectors don't work in non-HTML documents)\r\n\t\t\tif ( !seed && !Sizzle.isXML(context) ) {\r\n\t\t\t\t// See if we find a selector to speed up\r\n\t\t\t\tvar match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\r\n\r\n\t\t\t\tif ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\r\n\t\t\t\t\t// Speed-up: Sizzle(\"TAG\")\r\n\t\t\t\t\tif ( match[1] ) {\r\n\t\t\t\t\t\treturn makeArray( context.getElementsByTagName( query ), extra );\r\n\r\n\t\t\t\t\t// Speed-up: Sizzle(\".CLASS\")\r\n\t\t\t\t\t} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\r\n\t\t\t\t\t\treturn makeArray( context.getElementsByClassName( match[2] ), extra );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( context.nodeType === 9 ) {\r\n\t\t\t\t\t// Speed-up: Sizzle(\"body\")\r\n\t\t\t\t\t// The body element only exists once, optimize finding it\r\n\t\t\t\t\tif ( query === \"body\" && context.body ) {\r\n\t\t\t\t\t\treturn makeArray( [ context.body ], extra );\r\n\r\n\t\t\t\t\t// Speed-up: Sizzle(\"#ID\")\r\n\t\t\t\t\t} else if ( match && match[3] ) {\r\n\t\t\t\t\t\tvar elem = context.getElementById( match[3] );\r\n\r\n\t\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\t\t\tif ( elem && elem.parentNode ) {\r\n\t\t\t\t\t\t\t// Handle the case where IE and Opera return items\r\n\t\t\t\t\t\t\t// by name instead of ID\r\n\t\t\t\t\t\t\tif ( elem.id === match[3] ) {\r\n\t\t\t\t\t\t\t\treturn makeArray( [ elem ], extra );\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\treturn makeArray( [], extra );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\r\n\t\t\t\t\t} catch(qsaError) {}\r\n\r\n\t\t\t\t// qSA works strangely on Element-rooted queries\r\n\t\t\t\t// We can work around this by specifying an extra ID on the root\r\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\r\n\t\t\t\t// IE 8 doesn't work on object elements\r\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\r\n\t\t\t\t\tvar oldContext = context,\r\n\t\t\t\t\t\told = context.getAttribute( \"id\" ),\r\n\t\t\t\t\t\tnid = old || id,\r\n\t\t\t\t\t\thasParent = context.parentNode,\r\n\t\t\t\t\t\trelativeHierarchySelector = /^\\s*[+~]/.test( query );\r\n\r\n\t\t\t\t\tif ( !old ) {\r\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tnid = nid.replace( /'/g, \"\\\\$&\" );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( relativeHierarchySelector && hasParent ) {\r\n\t\t\t\t\t\tcontext = context.parentNode;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tif ( !relativeHierarchySelector || hasParent ) {\r\n\t\t\t\t\t\t\treturn makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} catch(pseudoError) {\r\n\t\t\t\t\t} finally {\r\n\t\t\t\t\t\tif ( !old ) {\r\n\t\t\t\t\t\t\toldContext.removeAttribute( \"id\" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn oldSizzle(query, context, extra, seed);\r\n\t\t};\r\n\r\n\t\tfor ( var prop in oldSizzle ) {\r\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\r\n\t\t}\r\n\r\n\t\t// release memory in IE\r\n\t\tdiv = null;\r\n\t})();\r\n}\r\n\r\n(function(){\r\n\tvar html = document.documentElement,\r\n\t\tmatches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\r\n\r\n\tif ( matches ) {\r\n\t\t// Check to see if it's possible to do matchesSelector\r\n\t\t// on a disconnected node (IE 9 fails this)\r\n\t\tvar disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\r\n\t\t\tpseudoWorks = false;\r\n\r\n\t\ttry {\r\n\t\t\t// This should fail with an exception\r\n\t\t\t// Gecko does not error, returns false instead\r\n\t\t\tmatches.call( document.documentElement, \"[test!='']:sizzle\" );\r\n\r\n\t\t} catch( pseudoError ) {\r\n\t\t\tpseudoWorks = true;\r\n\t\t}\r\n\r\n\t\tSizzle.matchesSelector = function( node, expr ) {\r\n\t\t\t// Make sure that attribute selectors are quoted\r\n\t\t\texpr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\r\n\r\n\t\t\tif ( !Sizzle.isXML( node ) ) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\r\n\t\t\t\t\t\tvar ret = matches.call( node, expr );\r\n\r\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\r\n\t\t\t\t\t\tif ( ret || !disconnectedMatch ||\r\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\r\n\t\t\t\t\t\t\t\t// fragment in IE 9, so check for that\r\n\t\t\t\t\t\t\t\tnode.document && node.document.nodeType !== 11 ) {\r\n\t\t\t\t\t\t\treturn ret;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t\treturn Sizzle(expr, null, null, [node]).length > 0;\r\n\t\t};\r\n\t}\r\n})();\r\n\r\n(function(){\r\n\tvar div = document.createElement(\"div\");\r\n\r\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\r\n\r\n\t// Opera can't find a second classname (in 9.6)\r\n\t// Also, make sure that getElementsByClassName actually exists\r\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\r\n\tdiv.lastChild.className = \"e\";\r\n\r\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tExpr.order.splice(1, 0, \"CLASS\");\r\n\tExpr.find.CLASS = function( match, context, isXML ) {\r\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\r\n\t\t\treturn context.getElementsByClassName(match[1]);\r\n\t\t}\r\n\t};\r\n\r\n\t// release memory in IE\r\n\tdiv = null;\r\n})();\r\n\r\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\r\n\t\tvar elem = checkSet[i];\r\n\r\n\t\tif ( elem ) {\r\n\t\t\tvar match = false;\r\n\r\n\t\t\telem = elem[dir];\r\n\r\n\t\t\twhile ( elem ) {\r\n\t\t\t\tif ( elem[ expando ] === doneName ) {\r\n\t\t\t\t\tmatch = checkSet[elem.sizset];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\r\n\t\t\t\t\telem[ expando ] = doneName;\r\n\t\t\t\t\telem.sizset = i;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\r\n\t\t\t\t\tmatch = elem;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telem = elem[dir];\r\n\t\t\t}\r\n\r\n\t\t\tcheckSet[i] = match;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\r\n\t\tvar elem = checkSet[i];\r\n\r\n\t\tif ( elem ) {\r\n\t\t\tvar match = false;\r\n\r\n\t\t\telem = elem[dir];\r\n\r\n\t\t\twhile ( elem ) {\r\n\t\t\t\tif ( elem[ expando ] === doneName ) {\r\n\t\t\t\t\tmatch = checkSet[elem.sizset];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\tif ( !isXML ) {\r\n\t\t\t\t\t\telem[ expando ] = doneName;\r\n\t\t\t\t\t\telem.sizset = i;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\r\n\t\t\t\t\t\tif ( elem === cur ) {\r\n\t\t\t\t\t\t\tmatch = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\r\n\t\t\t\t\t\tmatch = elem;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\telem = elem[dir];\r\n\t\t\t}\r\n\r\n\t\t\tcheckSet[i] = match;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nif ( document.documentElement.contains ) {\r\n\tSizzle.contains = function( a, b ) {\r\n\t\treturn a !== b && (a.contains ? a.contains(b) : true);\r\n\t};\r\n\r\n} else if ( document.documentElement.compareDocumentPosition ) {\r\n\tSizzle.contains = function( a, b ) {\r\n\t\treturn !!(a.compareDocumentPosition(b) & 16);\r\n\t};\r\n\r\n} else {\r\n\tSizzle.contains = function() {\r\n\t\treturn false;\r\n\t};\r\n}\r\n\r\nSizzle.isXML = function( elem ) {\r\n\t// documentElement is verified for cases where it doesn't yet exist\r\n\t// (such as loading iframes in IE - #4833)\r\n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\r\n\r\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\r\n};\r\n\r\nvar posProcess = function( selector, context, seed ) {\r\n\tvar match,\r\n\t\ttmpSet = [],\r\n\t\tlater = \"\",\r\n\t\troot = context.nodeType ? [context] : context;\r\n\r\n\t// Position selectors must be done after the filter\r\n\t// And so must :not(positional) so we move all PSEUDOs to the end\r\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\r\n\t\tlater += match[0];\r\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\r\n\t}\r\n\r\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\r\n\r\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\r\n\t\tSizzle( selector, root[i], tmpSet, seed );\r\n\t}\r\n\r\n\treturn Sizzle.filter( later, tmpSet );\r\n};\r\n\r\n// EXPOSE\r\n// Override sizzle attribute retrieval\r\nSizzle.attr = jQuery.attr;\r\nSizzle.selectors.attrMap = {};\r\njQuery.find = Sizzle;\r\njQuery.expr = Sizzle.selectors;\r\njQuery.expr[\":\"] = jQuery.expr.filters;\r\njQuery.unique = Sizzle.uniqueSort;\r\njQuery.text = Sizzle.getText;\r\njQuery.isXMLDoc = Sizzle.isXML;\r\njQuery.contains = Sizzle.contains;\r\n\r\n\r\n})();\r\n\r\n\r\nvar runtil = /Until$/,\r\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\r\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\r\n\trmultiselector = /,/,\r\n\tisSimple = /^.[^:#\\[\\.,]*$/,\r\n\tslice = Array.prototype.slice,\r\n\tPOS = jQuery.expr.match.globalPOS,\r\n\t// methods guaranteed to produce a unique set when starting from a unique set\r\n\tguaranteedUnique = {\r\n\t\tchildren: true,\r\n\t\tcontents: true,\r\n\t\tnext: true,\r\n\t\tprev: true\r\n\t};\r\n\r\njQuery.fn.extend({\r\n\tfind: function( selector ) {\r\n\t\tvar self = this,\r\n\t\t\ti, l;\r\n\r\n\t\tif ( typeof selector !== \"string\" ) {\r\n\t\t\treturn jQuery( selector ).filter(function() {\r\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\r\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar ret = this.pushStack( \"\", \"find\", selector ),\r\n\t\t\tlength, n, r;\r\n\r\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\tlength = ret.length;\r\n\t\t\tjQuery.find( selector, this[i], ret );\r\n\r\n\t\t\tif ( i > 0 ) {\r\n\t\t\t\t// Make sure that the results are unique\r\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\r\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\r\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\r\n\t\t\t\t\t\t\tret.splice(n--, 1);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\thas: function( target ) {\r\n\t\tvar targets = jQuery( target );\r\n\t\treturn this.filter(function() {\r\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\r\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tnot: function( selector ) {\r\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\r\n\t},\r\n\r\n\tfilter: function( selector ) {\r\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\r\n\t},\r\n\r\n\tis: function( selector ) {\r\n\t\treturn !!selector && (\r\n\t\t\ttypeof selector === \"string\" ?\r\n\t\t\t\t// If this is a positional selector, check membership in the returned set\r\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\r\n\t\t\t\tPOS.test( selector ) ?\r\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\r\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\r\n\t\t\t\tthis.filter( selector ).length > 0 );\r\n\t},\r\n\r\n\tclosest: function( selectors, context ) {\r\n\t\tvar ret = [], i, l, cur = this[0];\r\n\r\n\t\t// Array (deprecated as of jQuery 1.7)\r\n\t\tif ( jQuery.isArray( selectors ) ) {\r\n\t\t\tvar level = 1;\r\n\r\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\r\n\t\t\t\tfor ( i = 0; i < selectors.length; i++ ) {\r\n\r\n\t\t\t\t\tif ( jQuery( cur ).is( selectors[ i ] ) ) {\r\n\t\t\t\t\t\tret.push({ selector: selectors[ i ], elem: cur, level: level });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcur = cur.parentNode;\r\n\t\t\t\tlevel++;\r\n\t\t\t}\r\n\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\t// String\r\n\t\tvar pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\r\n\t\t\t\tjQuery( selectors, context || this.context ) :\r\n\t\t\t\t0;\r\n\r\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\tcur = this[i];\r\n\r\n\t\t\twhile ( cur ) {\r\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\r\n\t\t\t\t\tret.push( cur );\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcur = cur.parentNode;\r\n\t\t\t\t\tif ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\r\n\r\n\t\treturn this.pushStack( ret, \"closest\", selectors );\r\n\t},\r\n\r\n\t// Determine the position of an element within\r\n\t// the matched set of elements\r\n\tindex: function( elem ) {\r\n\r\n\t\t// No argument, return index in parent\r\n\t\tif ( !elem ) {\r\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\r\n\t\t}\r\n\r\n\t\t// index in selector\r\n\t\tif ( typeof elem === \"string\" ) {\r\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\r\n\t\t}\r\n\r\n\t\t// Locate the position of the desired element\r\n\t\treturn jQuery.inArray(\r\n\t\t\t// If it receives a jQuery object, the first element is used\r\n\t\t\telem.jquery ? elem[0] : elem, this );\r\n\t},\r\n\r\n\tadd: function( selector, context ) {\r\n\t\tvar set = typeof selector === \"string\" ?\r\n\t\t\t\tjQuery( selector, context ) :\r\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\r\n\t\t\tall = jQuery.merge( this.get(), set );\r\n\r\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\r\n\t\t\tall :\r\n\t\t\tjQuery.unique( all ) );\r\n\t},\r\n\r\n\tandSelf: function() {\r\n\t\treturn this.add( this.prevObject );\r\n\t}\r\n});\r\n\r\n// A painfully simple check to see if an element is disconnected\r\n// from a document (should be improved, where feasible).\r\nfunction isDisconnected( node ) {\r\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\r\n}\r\n\r\njQuery.each({\r\n\tparent: function( elem ) {\r\n\t\tvar parent = elem.parentNode;\r\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\r\n\t},\r\n\tparents: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"parentNode\" );\r\n\t},\r\n\tparentsUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\r\n\t},\r\n\tnext: function( elem ) {\r\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\r\n\t},\r\n\tprev: function( elem ) {\r\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\r\n\t},\r\n\tnextAll: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\r\n\t},\r\n\tprevAll: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\r\n\t},\r\n\tnextUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\r\n\t},\r\n\tprevUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\r\n\t},\r\n\tsiblings: function( elem ) {\r\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\r\n\t},\r\n\tchildren: function( elem ) {\r\n\t\treturn jQuery.sibling( elem.firstChild );\r\n\t},\r\n\tcontents: function( elem ) {\r\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\r\n\t\t\telem.contentDocument || elem.contentWindow.document :\r\n\t\t\tjQuery.makeArray( elem.childNodes );\r\n\t}\r\n}, function( name, fn ) {\r\n\tjQuery.fn[ name ] = function( until, selector ) {\r\n\t\tvar ret = jQuery.map( this, fn, until );\r\n\r\n\t\tif ( !runtil.test( name ) ) {\r\n\t\t\tselector = until;\r\n\t\t}\r\n\r\n\t\tif ( selector && typeof selector === \"string\" ) {\r\n\t\t\tret = jQuery.filter( selector, ret );\r\n\t\t}\r\n\r\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\r\n\r\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\r\n\t\t\tret = ret.reverse();\r\n\t\t}\r\n\r\n\t\treturn this.pushStack( ret, name, slice.call( arguments ).join(\",\") );\r\n\t};\r\n});\r\n\r\njQuery.extend({\r\n\tfilter: function( expr, elems, not ) {\r\n\t\tif ( not ) {\r\n\t\t\texpr = \":not(\" + expr + \")\";\r\n\t\t}\r\n\r\n\t\treturn elems.length === 1 ?\r\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\r\n\t\t\tjQuery.find.matches(expr, elems);\r\n\t},\r\n\r\n\tdir: function( elem, dir, until ) {\r\n\t\tvar matched = [],\r\n\t\t\tcur = elem[ dir ];\r\n\r\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\r\n\t\t\tif ( cur.nodeType === 1 ) {\r\n\t\t\t\tmatched.push( cur );\r\n\t\t\t}\r\n\t\t\tcur = cur[dir];\r\n\t\t}\r\n\t\treturn matched;\r\n\t},\r\n\r\n\tnth: function( cur, result, dir, elem ) {\r\n\t\tresult = result || 1;\r\n\t\tvar num = 0;\r\n\r\n\t\tfor ( ; cur; cur = cur[dir] ) {\r\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn cur;\r\n\t},\r\n\r\n\tsibling: function( n, elem ) {\r\n\t\tvar r = [];\r\n\r\n\t\tfor ( ; n; n = n.nextSibling ) {\r\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\r\n\t\t\t\tr.push( n );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn r;\r\n\t}\r\n});\r\n\r\n// Implement the identical functionality for filter and not\r\nfunction winnow( elements, qualifier, keep ) {\r\n\r\n\t// Can't pass null or undefined to indexOf in Firefox 4\r\n\t// Set to 0 to skip string check\r\n\tqualifier = qualifier || 0;\r\n\r\n\tif ( jQuery.isFunction( qualifier ) ) {\r\n\t\treturn jQuery.grep(elements, function( elem, i ) {\r\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\r\n\t\t\treturn retVal === keep;\r\n\t\t});\r\n\r\n\t} else if ( qualifier.nodeType ) {\r\n\t\treturn jQuery.grep(elements, function( elem, i ) {\r\n\t\t\treturn ( elem === qualifier ) === keep;\r\n\t\t});\r\n\r\n\t} else if ( typeof qualifier === \"string\" ) {\r\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\r\n\t\t\treturn elem.nodeType === 1;\r\n\t\t});\r\n\r\n\t\tif ( isSimple.test( qualifier ) ) {\r\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\r\n\t\t} else {\r\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\r\n\t\t}\r\n\t}\r\n\r\n\treturn jQuery.grep(elements, function( elem, i ) {\r\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\r\n\t});\r\n}\r\n\r\n\r\n\r\n\r\nfunction createSafeFragment( document ) {\r\n\tvar list = nodeNames.split( \"|\" ),\r\n\tsafeFrag = document.createDocumentFragment();\r\n\r\n\tif ( safeFrag.createElement ) {\r\n\t\twhile ( list.length ) {\r\n\t\t\tsafeFrag.createElement(\r\n\t\t\t\tlist.pop()\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\treturn safeFrag;\r\n}\r\n\r\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\r\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\r\n\trinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\r\n\trleadingWhitespace = /^\\s+/,\r\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\r\n\trtagName = /<([\\w:]+)/,\r\n\trtbody = /<tbody/i,\r\n\trhtml = /<|&#?\\w+;/,\r\n\trnoInnerhtml = /<(?:script|style)/i,\r\n\trnocache = /<(?:script|object|embed|option|style)/i,\r\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\r\n\t// checked=\"checked\" or checked\r\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\r\n\trscriptType = /\\/(java|ecma)script/i,\r\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\r\n\twrapMap = {\r\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\r\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\r\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\r\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\r\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\r\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\r\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\r\n\t\t_default: [ 0, \"\", \"\" ]\r\n\t},\r\n\tsafeFragment = createSafeFragment( document );\r\n\r\nwrapMap.optgroup = wrapMap.option;\r\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\r\nwrapMap.th = wrapMap.td;\r\n\r\n// IE can't serialize <link> and <script> tags normally\r\nif ( !jQuery.support.htmlSerialize ) {\r\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\r\n}\r\n\r\njQuery.fn.extend({\r\n\ttext: function( value ) {\r\n\t\treturn jQuery.access( this, function( value ) {\r\n\t\t\treturn value === undefined ?\r\n\t\t\t\tjQuery.text( this ) :\r\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\r\n\t\t}, null, value, arguments.length );\r\n\t},\r\n\r\n\twrapAll: function( html ) {\r\n\t\tif ( jQuery.isFunction( html ) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( this[0] ) {\r\n\t\t\t// The elements to wrap the target around\r\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\r\n\r\n\t\t\tif ( this[0].parentNode ) {\r\n\t\t\t\twrap.insertBefore( this[0] );\r\n\t\t\t}\r\n\r\n\t\t\twrap.map(function() {\r\n\t\t\t\tvar elem = this;\r\n\r\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\r\n\t\t\t\t\telem = elem.firstChild;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn elem;\r\n\t\t\t}).append( this );\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\twrapInner: function( html ) {\r\n\t\tif ( jQuery.isFunction( html ) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tvar self = jQuery( this ),\r\n\t\t\t\tcontents = self.contents();\r\n\r\n\t\t\tif ( contents.length ) {\r\n\t\t\t\tcontents.wrapAll( html );\r\n\r\n\t\t\t} else {\r\n\t\t\t\tself.append( html );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\twrap: function( html ) {\r\n\t\tvar isFunction = jQuery.isFunction( html );\r\n\r\n\t\treturn this.each(function(i) {\r\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\r\n\t\t});\r\n\t},\r\n\r\n\tunwrap: function() {\r\n\t\treturn this.parent().each(function() {\r\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\r\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\r\n\t\t\t}\r\n\t\t}).end();\r\n\t},\r\n\r\n\tappend: function() {\r\n\t\treturn this.domManip(arguments, true, function( elem ) {\r\n\t\t\tif ( this.nodeType === 1 ) {\r\n\t\t\t\tthis.appendChild( elem );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tprepend: function() {\r\n\t\treturn this.domManip(arguments, true, function( elem ) {\r\n\t\t\tif ( this.nodeType === 1 ) {\r\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tbefore: function() {\r\n\t\tif ( this[0] && this[0].parentNode ) {\r\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\r\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\r\n\t\t\t});\r\n\t\t} else if ( arguments.length ) {\r\n\t\t\tvar set = jQuery.clean( arguments );\r\n\t\t\tset.push.apply( set, this.toArray() );\r\n\t\t\treturn this.pushStack( set, \"before\", arguments );\r\n\t\t}\r\n\t},\r\n\r\n\tafter: function() {\r\n\t\tif ( this[0] && this[0].parentNode ) {\r\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\r\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\r\n\t\t\t});\r\n\t\t} else if ( arguments.length ) {\r\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\r\n\t\t\tset.push.apply( set, jQuery.clean(arguments) );\r\n\t\t\treturn set;\r\n\t\t}\r\n\t},\r\n\r\n\t// keepData is for internal use only--do not document\r\n\tremove: function( selector, keepData ) {\r\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\r\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\r\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\r\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\r\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\t\telem.parentNode.removeChild( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tempty: function() {\r\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\r\n\t\t\t// Remove element nodes and prevent memory leaks\r\n\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\r\n\t\t\t}\r\n\r\n\t\t\t// Remove any remaining nodes\r\n\t\t\twhile ( elem.firstChild ) {\r\n\t\t\t\telem.removeChild( elem.firstChild );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\r\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\r\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\r\n\r\n\t\treturn this.map( function () {\r\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\r\n\t\t});\r\n\t},\r\n\r\n\thtml: function( value ) {\r\n\t\treturn jQuery.access( this, function( value ) {\r\n\t\t\tvar elem = this[0] || {},\r\n\t\t\t\ti = 0,\r\n\t\t\t\tl = this.length;\r\n\r\n\t\t\tif ( value === undefined ) {\r\n\t\t\t\treturn elem.nodeType === 1 ?\r\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\r\n\t\t\t\t\tnull;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\r\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\r\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\r\n\r\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tfor (; i < l; i++ ) {\r\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\r\n\t\t\t\t\t\telem = this[i] || {};\r\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName( \"*\" ) );\r\n\t\t\t\t\t\t\telem.innerHTML = value;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telem = 0;\r\n\r\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t\tif ( elem ) {\r\n\t\t\t\tthis.empty().append( value );\r\n\t\t\t}\r\n\t\t}, null, value, arguments.length );\r\n\t},\r\n\r\n\treplaceWith: function( value ) {\r\n\t\tif ( this[0] && this[0].parentNode ) {\r\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\r\n\t\t\t// this can help fix replacing a parent with child elements\r\n\t\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\t\treturn this.each(function(i) {\r\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\r\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif ( typeof value !== \"string\" ) {\r\n\t\t\t\tvalue = jQuery( value ).detach();\r\n\t\t\t}\r\n\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tvar next = this.nextSibling,\r\n\t\t\t\t\tparent = this.parentNode;\r\n\r\n\t\t\t\tjQuery( this ).remove();\r\n\r\n\t\t\t\tif ( next ) {\r\n\t\t\t\t\tjQuery(next).before( value );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tjQuery(parent).append( value );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\treturn this.length ?\r\n\t\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\r\n\t\t\t\tthis;\r\n\t\t}\r\n\t},\r\n\r\n\tdetach: function( selector ) {\r\n\t\treturn this.remove( selector, true );\r\n\t},\r\n\r\n\tdomManip: function( args, table, callback ) {\r\n\t\tvar results, first, fragment, parent,\r\n\t\t\tvalue = args[0],\r\n\t\t\tscripts = [];\r\n\r\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\r\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction(value) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tvar self = jQuery(this);\r\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\r\n\t\t\t\tself.domManip( args, table, callback );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( this[0] ) {\r\n\t\t\tparent = value && value.parentNode;\r\n\r\n\t\t\t// If we're in a fragment, just use that instead of building a new one\r\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\r\n\t\t\t\tresults = { fragment: parent };\r\n\r\n\t\t\t} else {\r\n\t\t\t\tresults = jQuery.buildFragment( args, this, scripts );\r\n\t\t\t}\r\n\r\n\t\t\tfragment = results.fragment;\r\n\r\n\t\t\tif ( fragment.childNodes.length === 1 ) {\r\n\t\t\t\tfirst = fragment = fragment.firstChild;\r\n\t\t\t} else {\r\n\t\t\t\tfirst = fragment.firstChild;\r\n\t\t\t}\r\n\r\n\t\t\tif ( first ) {\r\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\r\n\r\n\t\t\t\tfor ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\r\n\t\t\t\t\tcallback.call(\r\n\t\t\t\t\t\ttable ?\r\n\t\t\t\t\t\t\troot(this[i], first) :\r\n\t\t\t\t\t\t\tthis[i],\r\n\t\t\t\t\t\t// Make sure that we do not leak memory by inadvertently discarding\r\n\t\t\t\t\t\t// the original fragment (which might have attached data) instead of\r\n\t\t\t\t\t\t// using it; in addition, use the original fragment object for the last\r\n\t\t\t\t\t\t// item instead of first because it can end up being emptied incorrectly\r\n\t\t\t\t\t\t// in certain situations (Bug #8070).\r\n\t\t\t\t\t\t// Fragments from the fragment cache must always be cloned and never used\r\n\t\t\t\t\t\t// in place.\r\n\t\t\t\t\t\tresults.cacheable || ( l > 1 && i < lastIndex ) ?\r\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true ) :\r\n\t\t\t\t\t\t\tfragment\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( scripts.length ) {\r\n\t\t\t\tjQuery.each( scripts, function( i, elem ) {\r\n\t\t\t\t\tif ( elem.src ) {\r\n\t\t\t\t\t\tjQuery.ajax({\r\n\t\t\t\t\t\t\ttype: \"GET\",\r\n\t\t\t\t\t\t\tglobal: false,\r\n\t\t\t\t\t\t\turl: elem.src,\r\n\t\t\t\t\t\t\tasync: false,\r\n\t\t\t\t\t\t\tdataType: \"script\"\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\t\t\telem.parentNode.removeChild( elem );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nfunction root( elem, cur ) {\r\n\treturn jQuery.nodeName(elem, \"table\") ?\r\n\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\r\n\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\r\n\t\telem;\r\n}\r\n\r\nfunction cloneCopyEvent( src, dest ) {\r\n\r\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar type, i, l,\r\n\t\toldData = jQuery._data( src ),\r\n\t\tcurData = jQuery._data( dest, oldData ),\r\n\t\tevents = oldData.events;\r\n\r\n\tif ( events ) {\r\n\t\tdelete curData.handle;\r\n\t\tcurData.events = {};\r\n\r\n\t\tfor ( type in events ) {\r\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\r\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// make the cloned public data object a copy from the original\r\n\tif ( curData.data ) {\r\n\t\tcurData.data = jQuery.extend( {}, curData.data );\r\n\t}\r\n}\r\n\r\nfunction cloneFixAttributes( src, dest ) {\r\n\tvar nodeName;\r\n\r\n\t// We do not need to do anything for non-Elements\r\n\tif ( dest.nodeType !== 1 ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// clearAttributes removes the attributes, which we don't want,\r\n\t// but also removes the attachEvent events, which we *do* want\r\n\tif ( dest.clearAttributes ) {\r\n\t\tdest.clearAttributes();\r\n\t}\r\n\r\n\t// mergeAttributes, in contrast, only merges back on the\r\n\t// original attributes, not the events\r\n\tif ( dest.mergeAttributes ) {\r\n\t\tdest.mergeAttributes( src );\r\n\t}\r\n\r\n\tnodeName = dest.nodeName.toLowerCase();\r\n\r\n\t// IE6-8 fail to clone children inside object elements that use\r\n\t// the proprietary classid attribute value (rather than the type\r\n\t// attribute) to identify the type of content to display\r\n\tif ( nodeName === \"object\" ) {\r\n\t\tdest.outerHTML = src.outerHTML;\r\n\r\n\t} else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\r\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\r\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\r\n\t\t// a checked appearance if the defaultChecked value isn't also set\r\n\t\tif ( src.checked ) {\r\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\r\n\t\t}\r\n\r\n\t\t// IE6-7 get confused and end up setting the value of a cloned\r\n\t\t// checkbox/radio button to an empty string instead of \"on\"\r\n\t\tif ( dest.value !== src.value ) {\r\n\t\t\tdest.value = src.value;\r\n\t\t}\r\n\r\n\t// IE6-8 fails to return the selected option to the default selected\r\n\t// state when cloning options\r\n\t} else if ( nodeName === \"option\" ) {\r\n\t\tdest.selected = src.defaultSelected;\r\n\r\n\t// IE6-8 fails to set the defaultValue to the correct value when\r\n\t// cloning other types of input fields\r\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\r\n\t\tdest.defaultValue = src.defaultValue;\r\n\r\n\t// IE blanks contents when cloning scripts\r\n\t} else if ( nodeName === \"script\" && dest.text !== src.text ) {\r\n\t\tdest.text = src.text;\r\n\t}\r\n\r\n\t// Event data gets referenced instead of copied if the expando\r\n\t// gets copied too\r\n\tdest.removeAttribute( jQuery.expando );\r\n\r\n\t// Clear flags for bubbling special change/submit events, they must\r\n\t// be reattached when the newly cloned events are first activated\r\n\tdest.removeAttribute( \"_submit_attached\" );\r\n\tdest.removeAttribute( \"_change_attached\" );\r\n}\r\n\r\njQuery.buildFragment = function( args, nodes, scripts ) {\r\n\tvar fragment, cacheable, cacheresults, doc,\r\n\tfirst = args[ 0 ];\r\n\r\n\t// nodes may contain either an explicit document object,\r\n\t// a jQuery collection or context object.\r\n\t// If nodes[0] contains a valid object to assign to doc\r\n\tif ( nodes && nodes[0] ) {\r\n\t\tdoc = nodes[0].ownerDocument || nodes[0];\r\n\t}\r\n\r\n\t// Ensure that an attr object doesn't incorrectly stand in as a document object\r\n\t// Chrome and Firefox seem to allow this to occur and will throw exception\r\n\t// Fixes #8950\r\n\tif ( !doc.createDocumentFragment ) {\r\n\t\tdoc = document;\r\n\t}\r\n\r\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\r\n\t// Cloning options loses the selected state, so don't cache them\r\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\r\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\r\n\t// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\r\n\tif ( args.length === 1 && typeof first === \"string\" && first.length < 512 && doc === document &&\r\n\t\tfirst.charAt(0) === \"<\" && !rnocache.test( first ) &&\r\n\t\t(jQuery.support.checkClone || !rchecked.test( first )) &&\r\n\t\t(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\r\n\r\n\t\tcacheable = true;\r\n\r\n\t\tcacheresults = jQuery.fragments[ first ];\r\n\t\tif ( cacheresults && cacheresults !== 1 ) {\r\n\t\t\tfragment = cacheresults;\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !fragment ) {\r\n\t\tfragment = doc.createDocumentFragment();\r\n\t\tjQuery.clean( args, doc, fragment, scripts );\r\n\t}\r\n\r\n\tif ( cacheable ) {\r\n\t\tjQuery.fragments[ first ] = cacheresults ? fragment : 1;\r\n\t}\r\n\r\n\treturn { fragment: fragment, cacheable: cacheable };\r\n};\r\n\r\njQuery.fragments = {};\r\n\r\njQuery.each({\r\n\tappendTo: \"append\",\r\n\tprependTo: \"prepend\",\r\n\tinsertBefore: \"before\",\r\n\tinsertAfter: \"after\",\r\n\treplaceAll: \"replaceWith\"\r\n}, function( name, original ) {\r\n\tjQuery.fn[ name ] = function( selector ) {\r\n\t\tvar ret = [],\r\n\t\t\tinsert = jQuery( selector ),\r\n\t\t\tparent = this.length === 1 && this[0].parentNode;\r\n\r\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\r\n\t\t\tinsert[ original ]( this[0] );\r\n\t\t\treturn this;\r\n\r\n\t\t} else {\r\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\r\n\t\t\t\tvar elems = ( i > 0 ? this.clone(true) : this ).get();\r\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\r\n\t\t\t\tret = ret.concat( elems );\r\n\t\t\t}\r\n\r\n\t\t\treturn this.pushStack( ret, name, insert.selector );\r\n\t\t}\r\n\t};\r\n});\r\n\r\nfunction getAll( elem ) {\r\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\r\n\t\treturn elem.getElementsByTagName( \"*\" );\r\n\r\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\r\n\t\treturn elem.querySelectorAll( \"*\" );\r\n\r\n\t} else {\r\n\t\treturn [];\r\n\t}\r\n}\r\n\r\n// Used in clean, fixes the defaultChecked property\r\nfunction fixDefaultChecked( elem ) {\r\n\tif ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\r\n\t\telem.defaultChecked = elem.checked;\r\n\t}\r\n}\r\n// Finds all inputs and passes them to fixDefaultChecked\r\nfunction findInputs( elem ) {\r\n\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\r\n\tif ( nodeName === \"input\" ) {\r\n\t\tfixDefaultChecked( elem );\r\n\t// Skip scripts, get other children\r\n\t} else if ( nodeName !== \"script\" && typeof elem.getElementsByTagName !== \"undefined\" ) {\r\n\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\r\n\t}\r\n}\r\n\r\n// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js\r\nfunction shimCloneNode( elem ) {\r\n\tvar div = document.createElement( \"div\" );\r\n\tsafeFragment.appendChild( div );\r\n\r\n\tdiv.innerHTML = elem.outerHTML;\r\n\treturn div.firstChild;\r\n}\r\n\r\njQuery.extend({\r\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\r\n\t\tvar srcElements,\r\n\t\t\tdestElements,\r\n\t\t\ti,\r\n\t\t\t// IE<=8 does not properly clone detached, unknown element nodes\r\n\t\t\tclone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ?\r\n\t\t\t\telem.cloneNode( true ) :\r\n\t\t\t\tshimCloneNode( elem );\r\n\r\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\r\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\r\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\r\n\t\t\t// Calling detachEvent on the clone will also remove the events\r\n\t\t\t// from the original. In order to get around this, we use some\r\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\r\n\t\t\t// guys for this hotness.\r\n\r\n\t\t\tcloneFixAttributes( elem, clone );\r\n\r\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName instead\r\n\t\t\tsrcElements = getAll( elem );\r\n\t\t\tdestElements = getAll( clone );\r\n\r\n\t\t\t// Weird iteration because IE will replace the length property\r\n\t\t\t// with an element if you are cloning the body and one of the\r\n\t\t\t// elements on the page has a name or id of \"length\"\r\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\r\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\r\n\t\t\t\tif ( destElements[i] ) {\r\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Copy the events from the original to the clone\r\n\t\tif ( dataAndEvents ) {\r\n\t\t\tcloneCopyEvent( elem, clone );\r\n\r\n\t\t\tif ( deepDataAndEvents ) {\r\n\t\t\t\tsrcElements = getAll( elem );\r\n\t\t\t\tdestElements = getAll( clone );\r\n\r\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\r\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsrcElements = destElements = null;\r\n\r\n\t\t// Return the cloned set\r\n\t\treturn clone;\r\n\t},\r\n\r\n\tclean: function( elems, context, fragment, scripts ) {\r\n\t\tvar checkScriptType, script, j,\r\n\t\t\t\tret = [];\r\n\r\n\t\tcontext = context || document;\r\n\r\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\r\n\t\tif ( typeof context.createElement === \"undefined\" ) {\r\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\r\n\t\t\tif ( typeof elem === \"number\" ) {\r\n\t\t\t\telem += \"\";\r\n\t\t\t}\r\n\r\n\t\t\tif ( !elem ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Convert html string into DOM nodes\r\n\t\t\tif ( typeof elem === \"string\" ) {\r\n\t\t\t\tif ( !rhtml.test( elem ) ) {\r\n\t\t\t\t\telem = context.createTextNode( elem );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\r\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\r\n\r\n\t\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\r\n\t\t\t\t\tvar tag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase(),\r\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\r\n\t\t\t\t\t\tdepth = wrap[0],\r\n\t\t\t\t\t\tdiv = context.createElement(\"div\"),\r\n\t\t\t\t\t\tsafeChildNodes = safeFragment.childNodes,\r\n\t\t\t\t\t\tremove;\r\n\r\n\t\t\t\t\t// Append wrapper element to unknown element safe doc fragment\r\n\t\t\t\t\tif ( context === document ) {\r\n\t\t\t\t\t\t// Use the fragment we've already created for this document\r\n\t\t\t\t\t\tsafeFragment.appendChild( div );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// Use a fragment created with the owner document\r\n\t\t\t\t\t\tcreateSafeFragment( context ).appendChild( div );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\r\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\r\n\r\n\t\t\t\t\t// Move to the right depth\r\n\t\t\t\t\twhile ( depth-- ) {\r\n\t\t\t\t\t\tdiv = div.lastChild;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\r\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\r\n\r\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\r\n\t\t\t\t\t\tvar hasBody = rtbody.test(elem),\r\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\r\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\r\n\r\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\r\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\r\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\r\n\t\t\t\t\t\t\t\t\t[];\r\n\r\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\r\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\r\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\r\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\r\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telem = div.childNodes;\r\n\r\n\t\t\t\t\t// Clear elements from DocumentFragment (safeFragment or otherwise)\r\n\t\t\t\t\t// to avoid hoarding elements. Fixes #11356\r\n\t\t\t\t\tif ( div ) {\r\n\t\t\t\t\t\tdiv.parentNode.removeChild( div );\r\n\r\n\t\t\t\t\t\t// Guard against -1 index exceptions in FF3.6\r\n\t\t\t\t\t\tif ( safeChildNodes.length > 0 ) {\r\n\t\t\t\t\t\t\tremove = safeChildNodes[ safeChildNodes.length - 1 ];\r\n\r\n\t\t\t\t\t\t\tif ( remove && remove.parentNode ) {\r\n\t\t\t\t\t\t\t\tremove.parentNode.removeChild( remove );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Resets defaultChecked for any radios and checkboxes\r\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\r\n\t\t\tvar len;\r\n\t\t\tif ( !jQuery.support.appendChecked ) {\r\n\t\t\t\tif ( elem[0] && typeof (len = elem.length) === \"number\" ) {\r\n\t\t\t\t\tfor ( j = 0; j < len; j++ ) {\r\n\t\t\t\t\t\tfindInputs( elem[j] );\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfindInputs( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( elem.nodeType ) {\r\n\t\t\t\tret.push( elem );\r\n\t\t\t} else {\r\n\t\t\t\tret = jQuery.merge( ret, elem );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( fragment ) {\r\n\t\t\tcheckScriptType = function( elem ) {\r\n\t\t\t\treturn !elem.type || rscriptType.test( elem.type );\r\n\t\t\t};\r\n\t\t\tfor ( i = 0; ret[i]; i++ ) {\r\n\t\t\t\tscript = ret[i];\r\n\t\t\t\tif ( scripts && jQuery.nodeName( script, \"script\" ) && (!script.type || rscriptType.test( script.type )) ) {\r\n\t\t\t\t\tscripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif ( script.nodeType === 1 ) {\r\n\t\t\t\t\t\tvar jsTags = jQuery.grep( script.getElementsByTagName( \"script\" ), checkScriptType );\r\n\r\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfragment.appendChild( script );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\tcleanData: function( elems ) {\r\n\t\tvar data, id,\r\n\t\t\tcache = jQuery.cache,\r\n\t\t\tspecial = jQuery.event.special,\r\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\r\n\r\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\r\n\t\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tid = elem[ jQuery.expando ];\r\n\r\n\t\t\tif ( id ) {\r\n\t\t\t\tdata = cache[ id ];\r\n\r\n\t\t\t\tif ( data && data.events ) {\r\n\t\t\t\t\tfor ( var type in data.events ) {\r\n\t\t\t\t\t\tif ( special[ type ] ) {\r\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\r\n\r\n\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Null the DOM reference to avoid IE6/7/8 leak (#7054)\r\n\t\t\t\t\tif ( data.handle ) {\r\n\t\t\t\t\t\tdata.handle.elem = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( deleteExpando ) {\r\n\t\t\t\t\tdelete elem[ jQuery.expando ];\r\n\r\n\t\t\t\t} else if ( elem.removeAttribute ) {\r\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete cache[ id ];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar ralpha = /alpha\\([^)]*\\)/i,\r\n\tropacity = /opacity=([^)]*)/,\r\n\t// fixed for IE9, see #8346\r\n\trupper = /([A-Z]|^ms)/g,\r\n\trnum = /^[\\-+]?(?:\\d*\\.)?\\d+$/i,\r\n\trnumnonpx = /^-?(?:\\d*\\.)?\\d+(?!px)[^\\d\\s]+$/i,\r\n\trrelNum = /^([\\-+])=([\\-+.\\de]+)/,\r\n\trmargin = /^margin/,\r\n\r\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\r\n\r\n\t// order is important!\r\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\r\n\r\n\tcurCSS,\r\n\r\n\tgetComputedStyle,\r\n\tcurrentStyle;\r\n\r\njQuery.fn.css = function( name, value ) {\r\n\treturn jQuery.access( this, function( elem, name, value ) {\r\n\t\treturn value !== undefined ?\r\n\t\t\tjQuery.style( elem, name, value ) :\r\n\t\t\tjQuery.css( elem, name );\r\n\t}, name, value, arguments.length > 1 );\r\n};\r\n\r\njQuery.extend({\r\n\t// Add in style property hooks for overriding the default\r\n\t// behavior of getting and setting a style property\r\n\tcssHooks: {\r\n\t\topacity: {\r\n\t\t\tget: function( elem, computed ) {\r\n\t\t\t\tif ( computed ) {\r\n\t\t\t\t\t// We should always get a number back from opacity\r\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\r\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn elem.style.opacity;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// Exclude the following css properties to add px\r\n\tcssNumber: {\r\n\t\t\"fillOpacity\": true,\r\n\t\t\"fontWeight\": true,\r\n\t\t\"lineHeight\": true,\r\n\t\t\"opacity\": true,\r\n\t\t\"orphans\": true,\r\n\t\t\"widows\": true,\r\n\t\t\"zIndex\": true,\r\n\t\t\"zoom\": true\r\n\t},\r\n\r\n\t// Add in properties whose names you wish to fix before\r\n\t// setting or getting the value\r\n\tcssProps: {\r\n\t\t// normalize float css property\r\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\r\n\t},\r\n\r\n\t// Get and set the style property on a DOM Node\r\n\tstyle: function( elem, name, value, extra ) {\r\n\t\t// Don't set styles on text and comment nodes\r\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Make sure that we're working with the right name\r\n\t\tvar ret, type, origName = jQuery.camelCase( name ),\r\n\t\t\tstyle = elem.style, hooks = jQuery.cssHooks[ origName ];\r\n\r\n\t\tname = jQuery.cssProps[ origName ] || origName;\r\n\r\n\t\t// Check if we're setting a value\r\n\t\tif ( value !== undefined ) {\r\n\t\t\ttype = typeof value;\r\n\r\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\r\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\r\n\t\t\t\tvalue = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );\r\n\t\t\t\t// Fixes bug #9237\r\n\t\t\t\ttype = \"number\";\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\r\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\r\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\r\n\t\t\t\tvalue += \"px\";\r\n\t\t\t}\r\n\r\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\r\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\r\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\r\n\t\t\t\t// Fixes bug #5509\r\n\t\t\t\ttry {\r\n\t\t\t\t\tstyle[ name ] = value;\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// If a hook was provided get the non-computed value from there\r\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\r\n\t\t\t// Otherwise just get the value from the style object\r\n\t\t\treturn style[ name ];\r\n\t\t}\r\n\t},\r\n\r\n\tcss: function( elem, name, extra ) {\r\n\t\tvar ret, hooks;\r\n\r\n\t\t// Make sure that we're working with the right name\r\n\t\tname = jQuery.camelCase( name );\r\n\t\thooks = jQuery.cssHooks[ name ];\r\n\t\tname = jQuery.cssProps[ name ] || name;\r\n\r\n\t\t// cssFloat needs a special treatment\r\n\t\tif ( name === \"cssFloat\" ) {\r\n\t\t\tname = \"float\";\r\n\t\t}\r\n\r\n\t\t// If a hook was provided get the computed value from there\r\n\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\r\n\t\t\treturn ret;\r\n\r\n\t\t// Otherwise, if a way to get the computed value exists, use that\r\n\t\t} else if ( curCSS ) {\r\n\t\t\treturn curCSS( elem, name );\r\n\t\t}\r\n\t},\r\n\r\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\r\n\tswap: function( elem, options, callback ) {\r\n\t\tvar old = {},\r\n\t\t\tret, name;\r\n\r\n\t\t// Remember the old values, and insert the new ones\r\n\t\tfor ( name in options ) {\r\n\t\t\told[ name ] = elem.style[ name ];\r\n\t\t\telem.style[ name ] = options[ name ];\r\n\t\t}\r\n\r\n\t\tret = callback.call( elem );\r\n\r\n\t\t// Revert the old values\r\n\t\tfor ( name in options ) {\r\n\t\t\telem.style[ name ] = old[ name ];\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t}\r\n});\r\n\r\n// DEPRECATED in 1.3, Use jQuery.css() instead\r\njQuery.curCSS = jQuery.css;\r\n\r\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\r\n\tgetComputedStyle = function( elem, name ) {\r\n\t\tvar ret, defaultView, computedStyle, width,\r\n\t\t\tstyle = elem.style;\r\n\r\n\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\r\n\r\n\t\tif ( (defaultView = elem.ownerDocument.defaultView) &&\r\n\t\t\t\t(computedStyle = defaultView.getComputedStyle( elem, null )) ) {\r\n\r\n\t\t\tret = computedStyle.getPropertyValue( name );\r\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\r\n\t\t\t\tret = jQuery.style( elem, name );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\r\n\t\t// WebKit uses \"computed value (percentage if specified)\" instead of \"used value\" for margins\r\n\t\t// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\r\n\t\tif ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {\r\n\t\t\twidth = style.width;\r\n\t\t\tstyle.width = ret;\r\n\t\t\tret = computedStyle.width;\r\n\t\t\tstyle.width = width;\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t};\r\n}\r\n\r\nif ( document.documentElement.currentStyle ) {\r\n\tcurrentStyle = function( elem, name ) {\r\n\t\tvar left, rsLeft, uncomputed,\r\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\r\n\t\t\tstyle = elem.style;\r\n\r\n\t\t// Avoid setting ret to empty string here\r\n\t\t// so we don't default to auto\r\n\t\tif ( ret == null && style && (uncomputed = style[ name ]) ) {\r\n\t\t\tret = uncomputed;\r\n\t\t}\r\n\r\n\t\t// From the awesome hack by Dean Edwards\r\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\r\n\r\n\t\t// If we're not dealing with a regular pixel number\r\n\t\t// but a number that has a weird ending, we need to convert it to pixels\r\n\t\tif ( rnumnonpx.test( ret ) ) {\r\n\r\n\t\t\t// Remember the original values\r\n\t\t\tleft = style.left;\r\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\r\n\r\n\t\t\t// Put in the new values to get a computed value out\r\n\t\t\tif ( rsLeft ) {\r\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\r\n\t\t\t}\r\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\r\n\t\t\tret = style.pixelLeft + \"px\";\r\n\r\n\t\t\t// Revert the changed values\r\n\t\t\tstyle.left = left;\r\n\t\t\tif ( rsLeft ) {\r\n\t\t\t\telem.runtimeStyle.left = rsLeft;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret === \"\" ? \"auto\" : ret;\r\n\t};\r\n}\r\n\r\ncurCSS = getComputedStyle || currentStyle;\r\n\r\nfunction getWidthOrHeight( elem, name, extra ) {\r\n\r\n\t// Start with offset property\r\n\tvar val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\r\n\t\ti = name === \"width\" ? 1 : 0,\r\n\t\tlen = 4;\r\n\r\n\tif ( val > 0 ) {\r\n\t\tif ( extra !== \"border\" ) {\r\n\t\t\tfor ( ; i < len; i += 2 ) {\r\n\t\t\t\tif ( !extra ) {\r\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\r\n\t\t\t\t}\r\n\t\t\t\tif ( extra === \"margin\" ) {\r\n\t\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn val + \"px\";\r\n\t}\r\n\r\n\t// Fall back to computed then uncomputed css if necessary\r\n\tval = curCSS( elem, name );\r\n\tif ( val < 0 || val == null ) {\r\n\t\tval = elem.style[ name ];\r\n\t}\r\n\r\n\t// Computed unit is not pixels. Stop here and return.\r\n\tif ( rnumnonpx.test(val) ) {\r\n\t\treturn val;\r\n\t}\r\n\r\n\t// Normalize \"\", auto, and prepare for extra\r\n\tval = parseFloat( val ) || 0;\r\n\r\n\t// Add padding, border, margin\r\n\tif ( extra ) {\r\n\t\tfor ( ; i < len; i += 2 ) {\r\n\t\t\tval += parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\r\n\t\t\tif ( extra !== \"padding\" ) {\r\n\t\t\t\tval += parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\r\n\t\t\t}\r\n\t\t\tif ( extra === \"margin\" ) {\r\n\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn val + \"px\";\r\n}\r\n\r\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\r\n\tjQuery.cssHooks[ name ] = {\r\n\t\tget: function( elem, computed, extra ) {\r\n\t\t\tif ( computed ) {\r\n\t\t\t\tif ( elem.offsetWidth !== 0 ) {\r\n\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn jQuery.swap( elem, cssShow, function() {\r\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tset: function( elem, value ) {\r\n\t\t\treturn rnum.test( value ) ?\r\n\t\t\t\tvalue + \"px\" :\r\n\t\t\t\tvalue;\r\n\t\t}\r\n\t};\r\n});\r\n\r\nif ( !jQuery.support.opacity ) {\r\n\tjQuery.cssHooks.opacity = {\r\n\t\tget: function( elem, computed ) {\r\n\t\t\t// IE uses filters for opacity\r\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\r\n\t\t\t\t( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\r\n\t\t\t\tcomputed ? \"1\" : \"\";\r\n\t\t},\r\n\r\n\t\tset: function( elem, value ) {\r\n\t\t\tvar style = elem.style,\r\n\t\t\t\tcurrentStyle = elem.currentStyle,\r\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\r\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\r\n\r\n\t\t\t// IE has trouble with opacity if it does not have layout\r\n\t\t\t// Force it by setting the zoom level\r\n\t\t\tstyle.zoom = 1;\r\n\r\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\r\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" ) {\r\n\r\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\r\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\r\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\r\n\t\t\t\tstyle.removeAttribute( \"filter\" );\r\n\r\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\r\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// otherwise, set new filter values\r\n\t\t\tstyle.filter = ralpha.test( filter ) ?\r\n\t\t\t\tfilter.replace( ralpha, opacity ) :\r\n\t\t\t\tfilter + \" \" + opacity;\r\n\t\t}\r\n\t};\r\n}\r\n\r\njQuery(function() {\r\n\t// This hook cannot be added until DOM ready because the support test\r\n\t// for it is not run until after DOM ready\r\n\tif ( !jQuery.support.reliableMarginRight ) {\r\n\t\tjQuery.cssHooks.marginRight = {\r\n\t\t\tget: function( elem, computed ) {\r\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\r\n\t\t\t\t// Work around by temporarily setting element display to inline-block\r\n\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\r\n\t\t\t\t\tif ( computed ) {\r\n\t\t\t\t\t\treturn curCSS( elem, \"margin-right\" );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn elem.style.marginRight;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n});\r\n\r\nif ( jQuery.expr && jQuery.expr.filters ) {\r\n\tjQuery.expr.filters.hidden = function( elem ) {\r\n\t\tvar width = elem.offsetWidth,\r\n\t\t\theight = elem.offsetHeight;\r\n\r\n\t\treturn ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\r\n\t};\r\n\r\n\tjQuery.expr.filters.visible = function( elem ) {\r\n\t\treturn !jQuery.expr.filters.hidden( elem );\r\n\t};\r\n}\r\n\r\n// These hooks are used by animate to expand properties\r\njQuery.each({\r\n\tmargin: \"\",\r\n\tpadding: \"\",\r\n\tborder: \"Width\"\r\n}, function( prefix, suffix ) {\r\n\r\n\tjQuery.cssHooks[ prefix + suffix ] = {\r\n\t\texpand: function( value ) {\r\n\t\t\tvar i,\r\n\r\n\t\t\t\t// assumes a single number if not a string\r\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ],\r\n\t\t\t\texpanded = {};\r\n\r\n\t\t\tfor ( i = 0; i < 4; i++ ) {\r\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\r\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\r\n\t\t\t}\r\n\r\n\t\t\treturn expanded;\r\n\t\t}\r\n\t};\r\n});\r\n\r\n\r\n\r\n\r\nvar r20 = /%20/g,\r\n\trbracket = /\\[\\]$/,\r\n\trCRLF = /\\r?\\n/g,\r\n\trhash = /#.*$/,\r\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\r\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\r\n\t// #7653, #8125, #8152: local protocol detection\r\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\r\n\trnoContent = /^(?:GET|HEAD)$/,\r\n\trprotocol = /^\\/\\//,\r\n\trquery = /\\?/,\r\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\r\n\trselectTextarea = /^(?:select|textarea)/i,\r\n\trspacesAjax = /\\s+/,\r\n\trts = /([?&])_=[^&]*/,\r\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\r\n\r\n\t// Keep a copy of the old load method\r\n\t_load = jQuery.fn.load,\r\n\r\n\t/* Prefilters\r\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\r\n\t * 2) These are called:\r\n\t *    - BEFORE asking for a transport\r\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\r\n\t * 3) key is the dataType\r\n\t * 4) the catchall symbol \"*\" can be used\r\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\r\n\t */\r\n\tprefilters = {},\r\n\r\n\t/* Transports bindings\r\n\t * 1) key is the dataType\r\n\t * 2) the catchall symbol \"*\" can be used\r\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\r\n\t */\r\n\ttransports = {},\r\n\r\n\t// Document location\r\n\tajaxLocation,\r\n\r\n\t// Document location segments\r\n\tajaxLocParts,\r\n\r\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\r\n\tallTypes = [\"*/\"] + [\"*\"];\r\n\r\n// #8138, IE may throw an exception when accessing\r\n// a field from window.location if document.domain has been set\r\ntry {\r\n\tajaxLocation = location.href;\r\n} catch( e ) {\r\n\t// Use the href attribute of an A element\r\n\t// since IE will modify it given document.location\r\n\tajaxLocation = document.createElement( \"a\" );\r\n\tajaxLocation.href = \"\";\r\n\tajaxLocation = ajaxLocation.href;\r\n}\r\n\r\n// Segment location into parts\r\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\r\n\r\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\r\nfunction addToPrefiltersOrTransports( structure ) {\r\n\r\n\t// dataTypeExpression is optional and defaults to \"*\"\r\n\treturn function( dataTypeExpression, func ) {\r\n\r\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\r\n\t\t\tfunc = dataTypeExpression;\r\n\t\t\tdataTypeExpression = \"*\";\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction( func ) ) {\r\n\t\t\tvar dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\r\n\t\t\t\ti = 0,\r\n\t\t\t\tlength = dataTypes.length,\r\n\t\t\t\tdataType,\r\n\t\t\t\tlist,\r\n\t\t\t\tplaceBefore;\r\n\r\n\t\t\t// For each dataType in the dataTypeExpression\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tdataType = dataTypes[ i ];\r\n\t\t\t\t// We control if we're asked to add before\r\n\t\t\t\t// any existing element\r\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\r\n\t\t\t\tif ( placeBefore ) {\r\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\r\n\t\t\t\t}\r\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\r\n\t\t\t\t// then we add to the structure accordingly\r\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Base inspection function for prefilters and transports\r\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\r\n\t\tdataType /* internal */, inspected /* internal */ ) {\r\n\r\n\tdataType = dataType || options.dataTypes[ 0 ];\r\n\tinspected = inspected || {};\r\n\r\n\tinspected[ dataType ] = true;\r\n\r\n\tvar list = structure[ dataType ],\r\n\t\ti = 0,\r\n\t\tlength = list ? list.length : 0,\r\n\t\texecuteOnly = ( structure === prefilters ),\r\n\t\tselection;\r\n\r\n\tfor ( ; i < length && ( executeOnly || !selection ); i++ ) {\r\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\r\n\t\t// If we got redirected to another dataType\r\n\t\t// we try there if executing only and not done already\r\n\t\tif ( typeof selection === \"string\" ) {\r\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\r\n\t\t\t\tselection = undefined;\r\n\t\t\t} else {\r\n\t\t\t\toptions.dataTypes.unshift( selection );\r\n\t\t\t\tselection = inspectPrefiltersOrTransports(\r\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// If we're only executing or nothing was selected\r\n\t// we try the catchall dataType if not done already\r\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\r\n\t\tselection = inspectPrefiltersOrTransports(\r\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\r\n\t}\r\n\t// unnecessary when only executing (prefilters)\r\n\t// but it'll be ignored by the caller in that case\r\n\treturn selection;\r\n}\r\n\r\n// A special extend for ajax options\r\n// that takes \"flat\" options (not to be deep extended)\r\n// Fixes #9887\r\nfunction ajaxExtend( target, src ) {\r\n\tvar key, deep,\r\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\r\n\tfor ( key in src ) {\r\n\t\tif ( src[ key ] !== undefined ) {\r\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\r\n\t\t}\r\n\t}\r\n\tif ( deep ) {\r\n\t\tjQuery.extend( true, target, deep );\r\n\t}\r\n}\r\n\r\njQuery.fn.extend({\r\n\tload: function( url, params, callback ) {\r\n\t\tif ( typeof url !== \"string\" && _load ) {\r\n\t\t\treturn _load.apply( this, arguments );\r\n\r\n\t\t// Don't do a request if no elements are being requested\r\n\t\t} else if ( !this.length ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar off = url.indexOf( \" \" );\r\n\t\tif ( off >= 0 ) {\r\n\t\t\tvar selector = url.slice( off, url.length );\r\n\t\t\turl = url.slice( 0, off );\r\n\t\t}\r\n\r\n\t\t// Default to a GET request\r\n\t\tvar type = \"GET\";\r\n\r\n\t\t// If the second parameter was provided\r\n\t\tif ( params ) {\r\n\t\t\t// If it's a function\r\n\t\t\tif ( jQuery.isFunction( params ) ) {\r\n\t\t\t\t// We assume that it's the callback\r\n\t\t\t\tcallback = params;\r\n\t\t\t\tparams = undefined;\r\n\r\n\t\t\t// Otherwise, build a param string\r\n\t\t\t} else if ( typeof params === \"object\" ) {\r\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\r\n\t\t\t\ttype = \"POST\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar self = this;\r\n\r\n\t\t// Request the remote document\r\n\t\tjQuery.ajax({\r\n\t\t\turl: url,\r\n\t\t\ttype: type,\r\n\t\t\tdataType: \"html\",\r\n\t\t\tdata: params,\r\n\t\t\t// Complete callback (responseText is used internally)\r\n\t\t\tcomplete: function( jqXHR, status, responseText ) {\r\n\t\t\t\t// Store the response as specified by the jqXHR object\r\n\t\t\t\tresponseText = jqXHR.responseText;\r\n\t\t\t\t// If successful, inject the HTML into all the matched elements\r\n\t\t\t\tif ( jqXHR.isResolved() ) {\r\n\t\t\t\t\t// #4825: Get the actual response in case\r\n\t\t\t\t\t// a dataFilter is present in ajaxSettings\r\n\t\t\t\t\tjqXHR.done(function( r ) {\r\n\t\t\t\t\t\tresponseText = r;\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// See if a selector was specified\r\n\t\t\t\t\tself.html( selector ?\r\n\t\t\t\t\t\t// Create a dummy div to hold the results\r\n\t\t\t\t\t\tjQuery(\"<div>\")\r\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\r\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\r\n\t\t\t\t\t\t\t.append(responseText.replace(rscript, \"\"))\r\n\r\n\t\t\t\t\t\t\t// Locate the specified elements\r\n\t\t\t\t\t\t\t.find(selector) :\r\n\r\n\t\t\t\t\t\t// If not, just inject the full result\r\n\t\t\t\t\t\tresponseText );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( callback ) {\r\n\t\t\t\t\tself.each( callback, [ responseText, status, jqXHR ] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tserialize: function() {\r\n\t\treturn jQuery.param( this.serializeArray() );\r\n\t},\r\n\r\n\tserializeArray: function() {\r\n\t\treturn this.map(function(){\r\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\r\n\t\t})\r\n\t\t.filter(function(){\r\n\t\t\treturn this.name && !this.disabled &&\r\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\r\n\t\t\t\t\trinput.test( this.type ) );\r\n\t\t})\r\n\t\t.map(function( i, elem ){\r\n\t\t\tvar val = jQuery( this ).val();\r\n\r\n\t\t\treturn val == null ?\r\n\t\t\t\tnull :\r\n\t\t\t\tjQuery.isArray( val ) ?\r\n\t\t\t\t\tjQuery.map( val, function( val, i ){\r\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\r\n\t\t\t\t\t}) :\r\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\r\n\t\t}).get();\r\n\t}\r\n});\r\n\r\n// Attach a bunch of functions for handling common AJAX events\r\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\r\n\tjQuery.fn[ o ] = function( f ){\r\n\t\treturn this.on( o, f );\r\n\t};\r\n});\r\n\r\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\r\n\tjQuery[ method ] = function( url, data, callback, type ) {\r\n\t\t// shift arguments if data argument was omitted\r\n\t\tif ( jQuery.isFunction( data ) ) {\r\n\t\t\ttype = type || callback;\r\n\t\t\tcallback = data;\r\n\t\t\tdata = undefined;\r\n\t\t}\r\n\r\n\t\treturn jQuery.ajax({\r\n\t\t\ttype: method,\r\n\t\t\turl: url,\r\n\t\t\tdata: data,\r\n\t\t\tsuccess: callback,\r\n\t\t\tdataType: type\r\n\t\t});\r\n\t};\r\n});\r\n\r\njQuery.extend({\r\n\r\n\tgetScript: function( url, callback ) {\r\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\r\n\t},\r\n\r\n\tgetJSON: function( url, data, callback ) {\r\n\t\treturn jQuery.get( url, data, callback, \"json\" );\r\n\t},\r\n\r\n\t// Creates a full fledged settings object into target\r\n\t// with both ajaxSettings and settings fields.\r\n\t// If target is omitted, writes into ajaxSettings.\r\n\tajaxSetup: function( target, settings ) {\r\n\t\tif ( settings ) {\r\n\t\t\t// Building a settings object\r\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\r\n\t\t} else {\r\n\t\t\t// Extending ajaxSettings\r\n\t\t\tsettings = target;\r\n\t\t\ttarget = jQuery.ajaxSettings;\r\n\t\t}\r\n\t\tajaxExtend( target, settings );\r\n\t\treturn target;\r\n\t},\r\n\r\n\tajaxSettings: {\r\n\t\turl: ajaxLocation,\r\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\r\n\t\tglobal: true,\r\n\t\ttype: \"GET\",\r\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\r\n\t\tprocessData: true,\r\n\t\tasync: true,\r\n\t\t/*\r\n\t\ttimeout: 0,\r\n\t\tdata: null,\r\n\t\tdataType: null,\r\n\t\tusername: null,\r\n\t\tpassword: null,\r\n\t\tcache: null,\r\n\t\ttraditional: false,\r\n\t\theaders: {},\r\n\t\t*/\r\n\r\n\t\taccepts: {\r\n\t\t\txml: \"application/xml, text/xml\",\r\n\t\t\thtml: \"text/html\",\r\n\t\t\ttext: \"text/plain\",\r\n\t\t\tjson: \"application/json, text/javascript\",\r\n\t\t\t\"*\": allTypes\r\n\t\t},\r\n\r\n\t\tcontents: {\r\n\t\t\txml: /xml/,\r\n\t\t\thtml: /html/,\r\n\t\t\tjson: /json/\r\n\t\t},\r\n\r\n\t\tresponseFields: {\r\n\t\t\txml: \"responseXML\",\r\n\t\t\ttext: \"responseText\"\r\n\t\t},\r\n\r\n\t\t// List of data converters\r\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\r\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\r\n\t\tconverters: {\r\n\r\n\t\t\t// Convert anything to text\r\n\t\t\t\"* text\": window.String,\r\n\r\n\t\t\t// Text to html (true = no transformation)\r\n\t\t\t\"text html\": true,\r\n\r\n\t\t\t// Evaluate text as a json expression\r\n\t\t\t\"text json\": jQuery.parseJSON,\r\n\r\n\t\t\t// Parse text as xml\r\n\t\t\t\"text xml\": jQuery.parseXML\r\n\t\t},\r\n\r\n\t\t// For options that shouldn't be deep extended:\r\n\t\t// you can add your own custom options here if\r\n\t\t// and when you create one that shouldn't be\r\n\t\t// deep extended (see ajaxExtend)\r\n\t\tflatOptions: {\r\n\t\t\tcontext: true,\r\n\t\t\turl: true\r\n\t\t}\r\n\t},\r\n\r\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\r\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\r\n\r\n\t// Main method\r\n\tajax: function( url, options ) {\r\n\r\n\t\t// If url is an object, simulate pre-1.5 signature\r\n\t\tif ( typeof url === \"object\" ) {\r\n\t\t\toptions = url;\r\n\t\t\turl = undefined;\r\n\t\t}\r\n\r\n\t\t// Force options to be an object\r\n\t\toptions = options || {};\r\n\r\n\t\tvar // Create the final options object\r\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\r\n\t\t\t// Callbacks context\r\n\t\t\tcallbackContext = s.context || s,\r\n\t\t\t// Context for global events\r\n\t\t\t// It's the callbackContext if one was provided in the options\r\n\t\t\t// and if it's a DOM node or a jQuery collection\r\n\t\t\tglobalEventContext = callbackContext !== s &&\r\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\r\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\r\n\t\t\t// Deferreds\r\n\t\t\tdeferred = jQuery.Deferred(),\r\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\r\n\t\t\t// Status-dependent callbacks\r\n\t\t\tstatusCode = s.statusCode || {},\r\n\t\t\t// ifModified key\r\n\t\t\tifModifiedKey,\r\n\t\t\t// Headers (they are sent all at once)\r\n\t\t\trequestHeaders = {},\r\n\t\t\trequestHeadersNames = {},\r\n\t\t\t// Response headers\r\n\t\t\tresponseHeadersString,\r\n\t\t\tresponseHeaders,\r\n\t\t\t// transport\r\n\t\t\ttransport,\r\n\t\t\t// timeout handle\r\n\t\t\ttimeoutTimer,\r\n\t\t\t// Cross-domain detection vars\r\n\t\t\tparts,\r\n\t\t\t// The jqXHR state\r\n\t\t\tstate = 0,\r\n\t\t\t// To know if global events are to be dispatched\r\n\t\t\tfireGlobals,\r\n\t\t\t// Loop variable\r\n\t\t\ti,\r\n\t\t\t// Fake xhr\r\n\t\t\tjqXHR = {\r\n\r\n\t\t\t\treadyState: 0,\r\n\r\n\t\t\t\t// Caches the header\r\n\t\t\t\tsetRequestHeader: function( name, value ) {\r\n\t\t\t\t\tif ( !state ) {\r\n\t\t\t\t\t\tvar lname = name.toLowerCase();\r\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\r\n\t\t\t\t\t\trequestHeaders[ name ] = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Raw string\r\n\t\t\t\tgetAllResponseHeaders: function() {\r\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Builds headers hashtable if needed\r\n\t\t\t\tgetResponseHeader: function( key ) {\r\n\t\t\t\t\tvar match;\r\n\t\t\t\t\tif ( state === 2 ) {\r\n\t\t\t\t\t\tif ( !responseHeaders ) {\r\n\t\t\t\t\t\t\tresponseHeaders = {};\r\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\r\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn match === undefined ? null : match;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Overrides response content-type header\r\n\t\t\t\toverrideMimeType: function( type ) {\r\n\t\t\t\t\tif ( !state ) {\r\n\t\t\t\t\t\ts.mimeType = type;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Cancel the request\r\n\t\t\t\tabort: function( statusText ) {\r\n\t\t\t\t\tstatusText = statusText || \"abort\";\r\n\t\t\t\t\tif ( transport ) {\r\n\t\t\t\t\t\ttransport.abort( statusText );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdone( 0, statusText );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t// Callback for when everything is done\r\n\t\t// It is defined here because jslint complains if it is declared\r\n\t\t// at the end of the function (which would be more logical and readable)\r\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\r\n\r\n\t\t\t// Called once\r\n\t\t\tif ( state === 2 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// State is \"done\" now\r\n\t\t\tstate = 2;\r\n\r\n\t\t\t// Clear timeout if it exists\r\n\t\t\tif ( timeoutTimer ) {\r\n\t\t\t\tclearTimeout( timeoutTimer );\r\n\t\t\t}\r\n\r\n\t\t\t// Dereference transport for early garbage collection\r\n\t\t\t// (no matter how long the jqXHR object will be used)\r\n\t\t\ttransport = undefined;\r\n\r\n\t\t\t// Cache response headers\r\n\t\t\tresponseHeadersString = headers || \"\";\r\n\r\n\t\t\t// Set readyState\r\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\r\n\r\n\t\t\tvar isSuccess,\r\n\t\t\t\tsuccess,\r\n\t\t\t\terror,\r\n\t\t\t\tstatusText = nativeStatusText,\r\n\t\t\t\tresponse = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\r\n\t\t\t\tlastModified,\r\n\t\t\t\tetag;\r\n\r\n\t\t\t// If successful, handle type chaining\r\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\r\n\r\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\r\n\t\t\t\tif ( s.ifModified ) {\r\n\r\n\t\t\t\t\tif ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\r\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = lastModified;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\r\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = etag;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If not modified\r\n\t\t\t\tif ( status === 304 ) {\r\n\r\n\t\t\t\t\tstatusText = \"notmodified\";\r\n\t\t\t\t\tisSuccess = true;\r\n\r\n\t\t\t\t// If we have data\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsuccess = ajaxConvert( s, response );\r\n\t\t\t\t\t\tstatusText = \"success\";\r\n\t\t\t\t\t\tisSuccess = true;\r\n\t\t\t\t\t} catch(e) {\r\n\t\t\t\t\t\t// We have a parsererror\r\n\t\t\t\t\t\tstatusText = \"parsererror\";\r\n\t\t\t\t\t\terror = e;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// We extract error from statusText\r\n\t\t\t\t// then normalize statusText and status for non-aborts\r\n\t\t\t\terror = statusText;\r\n\t\t\t\tif ( !statusText || status ) {\r\n\t\t\t\t\tstatusText = \"error\";\r\n\t\t\t\t\tif ( status < 0 ) {\r\n\t\t\t\t\t\tstatus = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set data for the fake xhr object\r\n\t\t\tjqXHR.status = status;\r\n\t\t\tjqXHR.statusText = \"\" + ( nativeStatusText || statusText );\r\n\r\n\t\t\t// Success/Error\r\n\t\t\tif ( isSuccess ) {\r\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\r\n\t\t\t} else {\r\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\r\n\t\t\t}\r\n\r\n\t\t\t// Status-dependent callbacks\r\n\t\t\tjqXHR.statusCode( statusCode );\r\n\t\t\tstatusCode = undefined;\r\n\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\r\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\r\n\t\t\t}\r\n\r\n\t\t\t// Complete\r\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\r\n\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\r\n\t\t\t\t// Handle the global AJAX counter\r\n\t\t\t\tif ( !( --jQuery.active ) ) {\r\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Attach deferreds\r\n\t\tdeferred.promise( jqXHR );\r\n\t\tjqXHR.success = jqXHR.done;\r\n\t\tjqXHR.error = jqXHR.fail;\r\n\t\tjqXHR.complete = completeDeferred.add;\r\n\r\n\t\t// Status-dependent callbacks\r\n\t\tjqXHR.statusCode = function( map ) {\r\n\t\t\tif ( map ) {\r\n\t\t\t\tvar tmp;\r\n\t\t\t\tif ( state < 2 ) {\r\n\t\t\t\t\tfor ( tmp in map ) {\r\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttmp = map[ jqXHR.status ];\r\n\t\t\t\t\tjqXHR.then( tmp, tmp );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\t// Remove hash character (#7531: and string promotion)\r\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\r\n\t\t// We also use the url parameter if available\r\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\r\n\r\n\t\t// Extract dataTypes list\r\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\r\n\r\n\t\t// Determine if a cross-domain request is in order\r\n\t\tif ( s.crossDomain == null ) {\r\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\r\n\t\t\ts.crossDomain = !!( parts &&\r\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\r\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\r\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Convert data if not already a string\r\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\r\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\r\n\t\t}\r\n\r\n\t\t// Apply prefilters\r\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\r\n\r\n\t\t// If request was aborted inside a prefilter, stop there\r\n\t\tif ( state === 2 ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// We can fire global events as of now if asked to\r\n\t\tfireGlobals = s.global;\r\n\r\n\t\t// Uppercase the type\r\n\t\ts.type = s.type.toUpperCase();\r\n\r\n\t\t// Determine if request has content\r\n\t\ts.hasContent = !rnoContent.test( s.type );\r\n\r\n\t\t// Watch for a new set of requests\r\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\r\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\r\n\t\t}\r\n\r\n\t\t// More options handling for requests with no content\r\n\t\tif ( !s.hasContent ) {\r\n\r\n\t\t\t// If data is available, append data to url\r\n\t\t\tif ( s.data ) {\r\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\r\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\r\n\t\t\t\tdelete s.data;\r\n\t\t\t}\r\n\r\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\r\n\t\t\tifModifiedKey = s.url;\r\n\r\n\t\t\t// Add anti-cache in url if needed\r\n\t\t\tif ( s.cache === false ) {\r\n\r\n\t\t\t\tvar ts = jQuery.now(),\r\n\t\t\t\t\t// try replacing _= if it is there\r\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\r\n\r\n\t\t\t\t// if nothing was replaced, add timestamp to the end\r\n\t\t\t\ts.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set the correct header, if data is being sent\r\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\r\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\r\n\t\t}\r\n\r\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\r\n\t\tif ( s.ifModified ) {\r\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\r\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\r\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\r\n\t\t\t}\r\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\r\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set the Accepts header for the server, depending on the dataType\r\n\t\tjqXHR.setRequestHeader(\r\n\t\t\t\"Accept\",\r\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\r\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\r\n\t\t\t\ts.accepts[ \"*\" ]\r\n\t\t);\r\n\r\n\t\t// Check for headers option\r\n\t\tfor ( i in s.headers ) {\r\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\r\n\t\t}\r\n\r\n\t\t// Allow custom headers/mimetypes and early abort\r\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\r\n\t\t\t\t// Abort if not done already\r\n\t\t\t\tjqXHR.abort();\r\n\t\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\t// Install callbacks on deferreds\r\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\r\n\t\t\tjqXHR[ i ]( s[ i ] );\r\n\t\t}\r\n\r\n\t\t// Get transport\r\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\r\n\r\n\t\t// If no transport, we auto-abort\r\n\t\tif ( !transport ) {\r\n\t\t\tdone( -1, \"No Transport\" );\r\n\t\t} else {\r\n\t\t\tjqXHR.readyState = 1;\r\n\t\t\t// Send global event\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\r\n\t\t\t}\r\n\t\t\t// Timeout\r\n\t\t\tif ( s.async && s.timeout > 0 ) {\r\n\t\t\t\ttimeoutTimer = setTimeout( function(){\r\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\r\n\t\t\t\t}, s.timeout );\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tstate = 1;\r\n\t\t\t\ttransport.send( requestHeaders, done );\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// Propagate exception as error if not done\r\n\t\t\t\tif ( state < 2 ) {\r\n\t\t\t\t\tdone( -1, e );\r\n\t\t\t\t// Simply rethrow otherwise\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow e;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn jqXHR;\r\n\t},\r\n\r\n\t// Serialize an array of form elements or a set of\r\n\t// key/values into a query string\r\n\tparam: function( a, traditional ) {\r\n\t\tvar s = [],\r\n\t\t\tadd = function( key, value ) {\r\n\t\t\t\t// If value is a function, invoke it and return its value\r\n\t\t\t\tvalue = jQuery.isFunction( value ) ? value() : value;\r\n\t\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\r\n\t\t\t};\r\n\r\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\r\n\t\tif ( traditional === undefined ) {\r\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\r\n\t\t}\r\n\r\n\t\t// If an array was passed in, assume that it is an array of form elements.\r\n\t\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\r\n\t\t\t// Serialize the form elements\r\n\t\t\tjQuery.each( a, function() {\r\n\t\t\t\tadd( this.name, this.value );\r\n\t\t\t});\r\n\r\n\t\t} else {\r\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\r\n\t\t\t// did it), otherwise encode params recursively.\r\n\t\t\tfor ( var prefix in a ) {\r\n\t\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Return the resulting serialization\r\n\t\treturn s.join( \"&\" ).replace( r20, \"+\" );\r\n\t}\r\n});\r\n\r\nfunction buildParams( prefix, obj, traditional, add ) {\r\n\tif ( jQuery.isArray( obj ) ) {\r\n\t\t// Serialize array item.\r\n\t\tjQuery.each( obj, function( i, v ) {\r\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\r\n\t\t\t\t// Treat each array item as a scalar.\r\n\t\t\t\tadd( prefix, v );\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// If array item is non-scalar (array or object), encode its\r\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\r\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\r\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\r\n\t\t\t\t// a server error. Possible fixes are to modify rack's\r\n\t\t\t\t// deserialization algorithm or to provide an option or flag\r\n\t\t\t\t// to force array serialization to be shallow.\r\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\r\n\t\t// Serialize object item.\r\n\t\tfor ( var name in obj ) {\r\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\r\n\t\t}\r\n\r\n\t} else {\r\n\t\t// Serialize scalar item.\r\n\t\tadd( prefix, obj );\r\n\t}\r\n}\r\n\r\n// This is still on the jQuery object... for now\r\n// Want to move this to jQuery.ajax some day\r\njQuery.extend({\r\n\r\n\t// Counter for holding the number of active queries\r\n\tactive: 0,\r\n\r\n\t// Last-Modified header cache for next request\r\n\tlastModified: {},\r\n\tetag: {}\r\n\r\n});\r\n\r\n/* Handles responses to an ajax request:\r\n * - sets all responseXXX fields accordingly\r\n * - finds the right dataType (mediates between content-type and expected dataType)\r\n * - returns the corresponding response\r\n */\r\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\r\n\r\n\tvar contents = s.contents,\r\n\t\tdataTypes = s.dataTypes,\r\n\t\tresponseFields = s.responseFields,\r\n\t\tct,\r\n\t\ttype,\r\n\t\tfinalDataType,\r\n\t\tfirstDataType;\r\n\r\n\t// Fill responseXXX fields\r\n\tfor ( type in responseFields ) {\r\n\t\tif ( type in responses ) {\r\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\r\n\t\t}\r\n\t}\r\n\r\n\t// Remove auto dataType and get content-type in the process\r\n\twhile( dataTypes[ 0 ] === \"*\" ) {\r\n\t\tdataTypes.shift();\r\n\t\tif ( ct === undefined ) {\r\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\r\n\t\t}\r\n\t}\r\n\r\n\t// Check if we're dealing with a known content-type\r\n\tif ( ct ) {\r\n\t\tfor ( type in contents ) {\r\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\r\n\t\t\t\tdataTypes.unshift( type );\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Check to see if we have a response for the expected dataType\r\n\tif ( dataTypes[ 0 ] in responses ) {\r\n\t\tfinalDataType = dataTypes[ 0 ];\r\n\t} else {\r\n\t\t// Try convertible dataTypes\r\n\t\tfor ( type in responses ) {\r\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\r\n\t\t\t\tfinalDataType = type;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif ( !firstDataType ) {\r\n\t\t\t\tfirstDataType = type;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Or just use first one\r\n\t\tfinalDataType = finalDataType || firstDataType;\r\n\t}\r\n\r\n\t// If we found a dataType\r\n\t// We add the dataType to the list if needed\r\n\t// and return the corresponding response\r\n\tif ( finalDataType ) {\r\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\r\n\t\t\tdataTypes.unshift( finalDataType );\r\n\t\t}\r\n\t\treturn responses[ finalDataType ];\r\n\t}\r\n}\r\n\r\n// Chain conversions given the request and the original response\r\nfunction ajaxConvert( s, response ) {\r\n\r\n\t// Apply the dataFilter if provided\r\n\tif ( s.dataFilter ) {\r\n\t\tresponse = s.dataFilter( response, s.dataType );\r\n\t}\r\n\r\n\tvar dataTypes = s.dataTypes,\r\n\t\tconverters = {},\r\n\t\ti,\r\n\t\tkey,\r\n\t\tlength = dataTypes.length,\r\n\t\ttmp,\r\n\t\t// Current and previous dataTypes\r\n\t\tcurrent = dataTypes[ 0 ],\r\n\t\tprev,\r\n\t\t// Conversion expression\r\n\t\tconversion,\r\n\t\t// Conversion function\r\n\t\tconv,\r\n\t\t// Conversion functions (transitive conversion)\r\n\t\tconv1,\r\n\t\tconv2;\r\n\r\n\t// For each dataType in the chain\r\n\tfor ( i = 1; i < length; i++ ) {\r\n\r\n\t\t// Create converters map\r\n\t\t// with lowercased keys\r\n\t\tif ( i === 1 ) {\r\n\t\t\tfor ( key in s.converters ) {\r\n\t\t\t\tif ( typeof key === \"string\" ) {\r\n\t\t\t\t\tconverters[ key.toLowerCase() ] = s.converters[ key ];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Get the dataTypes\r\n\t\tprev = current;\r\n\t\tcurrent = dataTypes[ i ];\r\n\r\n\t\t// If current is auto dataType, update it to prev\r\n\t\tif ( current === \"*\" ) {\r\n\t\t\tcurrent = prev;\r\n\t\t// If no auto and dataTypes are actually different\r\n\t\t} else if ( prev !== \"*\" && prev !== current ) {\r\n\r\n\t\t\t// Get the converter\r\n\t\t\tconversion = prev + \" \" + current;\r\n\t\t\tconv = converters[ conversion ] || converters[ \"* \" + current ];\r\n\r\n\t\t\t// If there is no direct converter, search transitively\r\n\t\t\tif ( !conv ) {\r\n\t\t\t\tconv2 = undefined;\r\n\t\t\t\tfor ( conv1 in converters ) {\r\n\t\t\t\t\ttmp = conv1.split( \" \" );\r\n\t\t\t\t\tif ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\r\n\t\t\t\t\t\tconv2 = converters[ tmp[1] + \" \" + current ];\r\n\t\t\t\t\t\tif ( conv2 ) {\r\n\t\t\t\t\t\t\tconv1 = converters[ conv1 ];\r\n\t\t\t\t\t\t\tif ( conv1 === true ) {\r\n\t\t\t\t\t\t\t\tconv = conv2;\r\n\t\t\t\t\t\t\t} else if ( conv2 === true ) {\r\n\t\t\t\t\t\t\t\tconv = conv1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// If we found no converter, dispatch an error\r\n\t\t\tif ( !( conv || conv2 ) ) {\r\n\t\t\t\tjQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\r\n\t\t\t}\r\n\t\t\t// If found converter is not an equivalence\r\n\t\t\tif ( conv !== true ) {\r\n\t\t\t\t// Convert with 1 or 2 converters accordingly\r\n\t\t\t\tresponse = conv ? conv( response ) : conv2( conv1(response) );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn response;\r\n}\r\n\r\n\r\n\r\n\r\nvar jsc = jQuery.now(),\r\n\tjsre = /(\\=)\\?(&|$)|\\?\\?/i;\r\n\r\n// Default jsonp settings\r\njQuery.ajaxSetup({\r\n\tjsonp: \"callback\",\r\n\tjsonpCallback: function() {\r\n\t\treturn jQuery.expando + \"_\" + ( jsc++ );\r\n\t}\r\n});\r\n\r\n// Detect, normalize options and install callbacks for jsonp requests\r\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\r\n\r\n\tvar inspectData = ( typeof s.data === \"string\" ) && /^application\\/x\\-www\\-form\\-urlencoded/.test( s.contentType );\r\n\r\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" ||\r\n\t\ts.jsonp !== false && ( jsre.test( s.url ) ||\r\n\t\t\t\tinspectData && jsre.test( s.data ) ) ) {\r\n\r\n\t\tvar responseContainer,\r\n\t\t\tjsonpCallback = s.jsonpCallback =\r\n\t\t\t\tjQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\r\n\t\t\tprevious = window[ jsonpCallback ],\r\n\t\t\turl = s.url,\r\n\t\t\tdata = s.data,\r\n\t\t\treplace = \"$1\" + jsonpCallback + \"$2\";\r\n\r\n\t\tif ( s.jsonp !== false ) {\r\n\t\t\turl = url.replace( jsre, replace );\r\n\t\t\tif ( s.url === url ) {\r\n\t\t\t\tif ( inspectData ) {\r\n\t\t\t\t\tdata = data.replace( jsre, replace );\r\n\t\t\t\t}\r\n\t\t\t\tif ( s.data === data ) {\r\n\t\t\t\t\t// Add callback manually\r\n\t\t\t\t\turl += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\ts.url = url;\r\n\t\ts.data = data;\r\n\r\n\t\t// Install callback\r\n\t\twindow[ jsonpCallback ] = function( response ) {\r\n\t\t\tresponseContainer = [ response ];\r\n\t\t};\r\n\r\n\t\t// Clean-up function\r\n\t\tjqXHR.always(function() {\r\n\t\t\t// Set callback back to previous value\r\n\t\t\twindow[ jsonpCallback ] = previous;\r\n\t\t\t// Call if it was a function and we have a response\r\n\t\t\tif ( responseContainer && jQuery.isFunction( previous ) ) {\r\n\t\t\t\twindow[ jsonpCallback ]( responseContainer[ 0 ] );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Use data converter to retrieve json after script execution\r\n\t\ts.converters[\"script json\"] = function() {\r\n\t\t\tif ( !responseContainer ) {\r\n\t\t\t\tjQuery.error( jsonpCallback + \" was not called\" );\r\n\t\t\t}\r\n\t\t\treturn responseContainer[ 0 ];\r\n\t\t};\r\n\r\n\t\t// force json dataType\r\n\t\ts.dataTypes[ 0 ] = \"json\";\r\n\r\n\t\t// Delegate to script\r\n\t\treturn \"script\";\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\n// Install script dataType\r\njQuery.ajaxSetup({\r\n\taccepts: {\r\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\r\n\t},\r\n\tcontents: {\r\n\t\tscript: /javascript|ecmascript/\r\n\t},\r\n\tconverters: {\r\n\t\t\"text script\": function( text ) {\r\n\t\t\tjQuery.globalEval( text );\r\n\t\t\treturn text;\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Handle cache's special case and global\r\njQuery.ajaxPrefilter( \"script\", function( s ) {\r\n\tif ( s.cache === undefined ) {\r\n\t\ts.cache = false;\r\n\t}\r\n\tif ( s.crossDomain ) {\r\n\t\ts.type = \"GET\";\r\n\t\ts.global = false;\r\n\t}\r\n});\r\n\r\n// Bind script tag hack transport\r\njQuery.ajaxTransport( \"script\", function(s) {\r\n\r\n\t// This transport only deals with cross domain requests\r\n\tif ( s.crossDomain ) {\r\n\r\n\t\tvar script,\r\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\r\n\r\n\t\treturn {\r\n\r\n\t\t\tsend: function( _, callback ) {\r\n\r\n\t\t\t\tscript = document.createElement( \"script\" );\r\n\r\n\t\t\t\tscript.async = \"async\";\r\n\r\n\t\t\t\tif ( s.scriptCharset ) {\r\n\t\t\t\t\tscript.charset = s.scriptCharset;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tscript.src = s.url;\r\n\r\n\t\t\t\t// Attach handlers for all browsers\r\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\r\n\r\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\r\n\r\n\t\t\t\t\t\t// Handle memory leak in IE\r\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\r\n\r\n\t\t\t\t\t\t// Remove the script\r\n\t\t\t\t\t\tif ( head && script.parentNode ) {\r\n\t\t\t\t\t\t\thead.removeChild( script );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Dereference the script\r\n\t\t\t\t\t\tscript = undefined;\r\n\r\n\t\t\t\t\t\t// Callback if not abort\r\n\t\t\t\t\t\tif ( !isAbort ) {\r\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\r\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\r\n\t\t\t\thead.insertBefore( script, head.firstChild );\r\n\t\t\t},\r\n\r\n\t\t\tabort: function() {\r\n\t\t\t\tif ( script ) {\r\n\t\t\t\t\tscript.onload( 0, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\r\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\r\n\t\t// Abort all pending requests\r\n\t\tfor ( var key in xhrCallbacks ) {\r\n\t\t\txhrCallbacks[ key ]( 0, 1 );\r\n\t\t}\r\n\t} : false,\r\n\txhrId = 0,\r\n\txhrCallbacks;\r\n\r\n// Functions to create xhrs\r\nfunction createStandardXHR() {\r\n\ttry {\r\n\t\treturn new window.XMLHttpRequest();\r\n\t} catch( e ) {}\r\n}\r\n\r\nfunction createActiveXHR() {\r\n\ttry {\r\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\r\n\t} catch( e ) {}\r\n}\r\n\r\n// Create the request object\r\n// (This is still attached to ajaxSettings for backward compatibility)\r\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\r\n\t/* Microsoft failed to properly\r\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\r\n\t * so we use the ActiveXObject when it is available\r\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\r\n\t * we need a fallback.\r\n\t */\r\n\tfunction() {\r\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\r\n\t} :\r\n\t// For all other browsers, use the standard XMLHttpRequest object\r\n\tcreateStandardXHR;\r\n\r\n// Determine support properties\r\n(function( xhr ) {\r\n\tjQuery.extend( jQuery.support, {\r\n\t\tajax: !!xhr,\r\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\r\n\t});\r\n})( jQuery.ajaxSettings.xhr() );\r\n\r\n// Create transport if the browser can provide an xhr\r\nif ( jQuery.support.ajax ) {\r\n\r\n\tjQuery.ajaxTransport(function( s ) {\r\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\r\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\r\n\r\n\t\t\tvar callback;\r\n\r\n\t\t\treturn {\r\n\t\t\t\tsend: function( headers, complete ) {\r\n\r\n\t\t\t\t\t// Get a new xhr\r\n\t\t\t\t\tvar xhr = s.xhr(),\r\n\t\t\t\t\t\thandle,\r\n\t\t\t\t\t\ti;\r\n\r\n\t\t\t\t\t// Open the socket\r\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\r\n\t\t\t\t\tif ( s.username ) {\r\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Apply custom fields if provided\r\n\t\t\t\t\tif ( s.xhrFields ) {\r\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\r\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Override mime type if needed\r\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\r\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// X-Requested-With header\r\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\r\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\r\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\r\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\r\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\r\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tfor ( i in headers ) {\r\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} catch( _ ) {}\r\n\r\n\t\t\t\t\t// Do send the request\r\n\t\t\t\t\t// This may raise an exception which is actually\r\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\r\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\r\n\r\n\t\t\t\t\t// Listener\r\n\t\t\t\t\tcallback = function( _, isAbort ) {\r\n\r\n\t\t\t\t\t\tvar status,\r\n\t\t\t\t\t\t\tstatusText,\r\n\t\t\t\t\t\t\tresponseHeaders,\r\n\t\t\t\t\t\t\tresponses,\r\n\t\t\t\t\t\t\txml;\r\n\r\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\r\n\t\t\t\t\t\t// of an xhr when a network error occured\r\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\r\n\t\t\t\t\t\ttry {\r\n\r\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\r\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\r\n\r\n\t\t\t\t\t\t\t\t// Only called once\r\n\t\t\t\t\t\t\t\tcallback = undefined;\r\n\r\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\r\n\t\t\t\t\t\t\t\tif ( handle ) {\r\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\r\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\r\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// If it's an abort\r\n\t\t\t\t\t\t\t\tif ( isAbort ) {\r\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\r\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\r\n\t\t\t\t\t\t\t\t\t\txhr.abort();\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\r\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\r\n\t\t\t\t\t\t\t\t\tresponses = {};\r\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\r\n\r\n\t\t\t\t\t\t\t\t\t// Construct response list\r\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\r\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\r\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\r\n\t\t\t\t\t\t\t\t\t} catch( _ ) {\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\r\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\r\n\t\t\t\t\t\t\t\t\t} catch( e ) {\r\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\r\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\r\n\r\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\r\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\r\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\r\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\r\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\r\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\r\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\r\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\r\n\t\t\t\t\t\t\tif ( !isAbort ) {\r\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Call complete if needed\r\n\t\t\t\t\t\tif ( responses ) {\r\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// if we're in sync mode or it's in cache\r\n\t\t\t\t\t// and has been retrieved directly (IE6 & IE7)\r\n\t\t\t\t\t// we need to manually fire the callback\r\n\t\t\t\t\tif ( !s.async || xhr.readyState === 4 ) {\r\n\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\thandle = ++xhrId;\r\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\r\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\r\n\t\t\t\t\t\t\t// and attach the unload handler\r\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\r\n\t\t\t\t\t\t\t\txhrCallbacks = {};\r\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\r\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\txhr.onreadystatechange = callback;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\tabort: function() {\r\n\t\t\t\t\tif ( callback ) {\r\n\t\t\t\t\t\tcallback(0,1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n}\r\n\r\n\r\n\r\n\r\nvar elemdisplay = {},\r\n\tiframe, iframeDoc,\r\n\trfxtypes = /^(?:toggle|show|hide)$/,\r\n\trfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\r\n\ttimerId,\r\n\tfxAttrs = [\r\n\t\t// height animations\r\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\r\n\t\t// width animations\r\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\r\n\t\t// opacity animations\r\n\t\t[ \"opacity\" ]\r\n\t],\r\n\tfxNow;\r\n\r\njQuery.fn.extend({\r\n\tshow: function( speed, easing, callback ) {\r\n\t\tvar elem, display;\r\n\r\n\t\tif ( speed || speed === 0 ) {\r\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, easing, callback );\r\n\r\n\t\t} else {\r\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.style ) {\r\n\t\t\t\t\tdisplay = elem.style.display;\r\n\r\n\t\t\t\t\t// Reset the inline display of this element to learn if it is\r\n\t\t\t\t\t// being hidden by cascaded rules or not\r\n\t\t\t\t\tif ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\r\n\t\t\t\t\t\tdisplay = elem.style.display = \"\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Set elements which have been overridden with display: none\r\n\t\t\t\t\t// in a stylesheet to whatever the default browser style is\r\n\t\t\t\t\t// for such an element\r\n\t\t\t\t\tif ( (display === \"\" && jQuery.css(elem, \"display\") === \"none\") ||\r\n\t\t\t\t\t\t!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\r\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set the display of most of the elements in a second loop\r\n\t\t\t// to avoid the constant reflow\r\n\t\t\tfor ( i = 0; i < j; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.style ) {\r\n\t\t\t\t\tdisplay = elem.style.display;\r\n\r\n\t\t\t\t\tif ( display === \"\" || display === \"none\" ) {\r\n\t\t\t\t\t\telem.style.display = jQuery._data( elem, \"olddisplay\" ) || \"\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\t},\r\n\r\n\thide: function( speed, easing, callback ) {\r\n\t\tif ( speed || speed === 0 ) {\r\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, easing, callback);\r\n\r\n\t\t} else {\r\n\t\t\tvar elem, display,\r\n\t\t\t\ti = 0,\r\n\t\t\t\tj = this.length;\r\n\r\n\t\t\tfor ( ; i < j; i++ ) {\r\n\t\t\t\telem = this[i];\r\n\t\t\t\tif ( elem.style ) {\r\n\t\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\r\n\r\n\t\t\t\t\tif ( display !== \"none\" && !jQuery._data( elem, \"olddisplay\" ) ) {\r\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", display );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set the display of the elements in a second loop\r\n\t\t\t// to avoid the constant reflow\r\n\t\t\tfor ( i = 0; i < j; i++ ) {\r\n\t\t\t\tif ( this[i].style ) {\r\n\t\t\t\t\tthis[i].style.display = \"none\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\t},\r\n\r\n\t// Save the old toggle function\r\n\t_toggle: jQuery.fn.toggle,\r\n\r\n\ttoggle: function( fn, fn2, callback ) {\r\n\t\tvar bool = typeof fn === \"boolean\";\r\n\r\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\r\n\t\t\tthis._toggle.apply( this, arguments );\r\n\r\n\t\t} else if ( fn == null || bool ) {\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\r\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\r\n\t\t\t});\r\n\r\n\t\t} else {\r\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2, callback);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfadeTo: function( speed, to, easing, callback ) {\r\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\r\n\t\t\t\t\t.animate({opacity: to}, speed, easing, callback);\r\n\t},\r\n\r\n\tanimate: function( prop, speed, easing, callback ) {\r\n\t\tvar optall = jQuery.speed( speed, easing, callback );\r\n\r\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\r\n\t\t\treturn this.each( optall.complete, [ false ] );\r\n\t\t}\r\n\r\n\t\t// Do not change referenced properties as per-property easing will be lost\r\n\t\tprop = jQuery.extend( {}, prop );\r\n\r\n\t\tfunction doAnimation() {\r\n\t\t\t// XXX 'this' does not always have a nodeName when running the\r\n\t\t\t// test suite\r\n\r\n\t\t\tif ( optall.queue === false ) {\r\n\t\t\t\tjQuery._mark( this );\r\n\t\t\t}\r\n\r\n\t\t\tvar opt = jQuery.extend( {}, optall ),\r\n\t\t\t\tisElement = this.nodeType === 1,\r\n\t\t\t\thidden = isElement && jQuery(this).is(\":hidden\"),\r\n\t\t\t\tname, val, p, e, hooks, replace,\r\n\t\t\t\tparts, start, end, unit,\r\n\t\t\t\tmethod;\r\n\r\n\t\t\t// will store per property easing and be used to determine when an animation is complete\r\n\t\t\topt.animatedProperties = {};\r\n\r\n\t\t\t// first pass over propertys to expand / normalize\r\n\t\t\tfor ( p in prop ) {\r\n\t\t\t\tname = jQuery.camelCase( p );\r\n\t\t\t\tif ( p !== name ) {\r\n\t\t\t\t\tprop[ name ] = prop[ p ];\r\n\t\t\t\t\tdelete prop[ p ];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( ( hooks = jQuery.cssHooks[ name ] ) && \"expand\" in hooks ) {\r\n\t\t\t\t\treplace = hooks.expand( prop[ name ] );\r\n\t\t\t\t\tdelete prop[ name ];\r\n\r\n\t\t\t\t\t// not quite $.extend, this wont overwrite keys already present.\r\n\t\t\t\t\t// also - reusing 'p' from above because we have the correct \"name\"\r\n\t\t\t\t\tfor ( p in replace ) {\r\n\t\t\t\t\t\tif ( ! ( p in prop ) ) {\r\n\t\t\t\t\t\t\tprop[ p ] = replace[ p ];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor ( name in prop ) {\r\n\t\t\t\tval = prop[ name ];\r\n\t\t\t\t// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\r\n\t\t\t\tif ( jQuery.isArray( val ) ) {\r\n\t\t\t\t\topt.animatedProperties[ name ] = val[ 1 ];\r\n\t\t\t\t\tval = prop[ name ] = val[ 0 ];\r\n\t\t\t\t} else {\r\n\t\t\t\t\topt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\r\n\t\t\t\t\treturn opt.complete.call( this );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( isElement && ( name === \"height\" || name === \"width\" ) ) {\r\n\t\t\t\t\t// Make sure that nothing sneaks out\r\n\t\t\t\t\t// Record all 3 overflow attributes because IE does not\r\n\t\t\t\t\t// change the overflow attribute when overflowX and\r\n\t\t\t\t\t// overflowY are set to the same value\r\n\t\t\t\t\topt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\r\n\r\n\t\t\t\t\t// Set display property to inline-block for height/width\r\n\t\t\t\t\t// animations on inline elements that are having width/height animated\r\n\t\t\t\t\tif ( jQuery.css( this, \"display\" ) === \"inline\" &&\r\n\t\t\t\t\t\t\tjQuery.css( this, \"float\" ) === \"none\" ) {\r\n\r\n\t\t\t\t\t\t// inline-level elements accept inline-block;\r\n\t\t\t\t\t\t// block-level elements need to be inline with layout\r\n\t\t\t\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === \"inline\" ) {\r\n\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.style.zoom = 1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( opt.overflow != null ) {\r\n\t\t\t\tthis.style.overflow = \"hidden\";\r\n\t\t\t}\r\n\r\n\t\t\tfor ( p in prop ) {\r\n\t\t\t\te = new jQuery.fx( this, opt, p );\r\n\t\t\t\tval = prop[ p ];\r\n\r\n\t\t\t\tif ( rfxtypes.test( val ) ) {\r\n\r\n\t\t\t\t\t// Tracks whether to show or hide based on private\r\n\t\t\t\t\t// data attached to the element\r\n\t\t\t\t\tmethod = jQuery._data( this, \"toggle\" + p ) || ( val === \"toggle\" ? hidden ? \"show\" : \"hide\" : 0 );\r\n\t\t\t\t\tif ( method ) {\r\n\t\t\t\t\t\tjQuery._data( this, \"toggle\" + p, method === \"show\" ? \"hide\" : \"show\" );\r\n\t\t\t\t\t\te[ method ]();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\te[ val ]();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tparts = rfxnum.exec( val );\r\n\t\t\t\t\tstart = e.cur();\r\n\r\n\t\t\t\t\tif ( parts ) {\r\n\t\t\t\t\t\tend = parseFloat( parts[2] );\r\n\t\t\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\r\n\r\n\t\t\t\t\t\t// We need to compute starting value\r\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\r\n\t\t\t\t\t\t\tjQuery.style( this, p, (end || 1) + unit);\r\n\t\t\t\t\t\t\tstart = ( (end || 1) / e.cur() ) * start;\r\n\t\t\t\t\t\t\tjQuery.style( this, p, start + unit);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\r\n\t\t\t\t\t\tif ( parts[1] ) {\r\n\t\t\t\t\t\t\tend = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\te.custom( start, end, unit );\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\te.custom( start, val, \"\" );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// For JS strict compliance\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn optall.queue === false ?\r\n\t\t\tthis.each( doAnimation ) :\r\n\t\t\tthis.queue( optall.queue, doAnimation );\r\n\t},\r\n\r\n\tstop: function( type, clearQueue, gotoEnd ) {\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tgotoEnd = clearQueue;\r\n\t\t\tclearQueue = type;\r\n\t\t\ttype = undefined;\r\n\t\t}\r\n\t\tif ( clearQueue && type !== false ) {\r\n\t\t\tthis.queue( type || \"fx\", [] );\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tvar index,\r\n\t\t\t\thadTimers = false,\r\n\t\t\t\ttimers = jQuery.timers,\r\n\t\t\t\tdata = jQuery._data( this );\r\n\r\n\t\t\t// clear marker counters if we know they won't be\r\n\t\t\tif ( !gotoEnd ) {\r\n\t\t\t\tjQuery._unmark( true, this );\r\n\t\t\t}\r\n\r\n\t\t\tfunction stopQueue( elem, data, index ) {\r\n\t\t\t\tvar hooks = data[ index ];\r\n\t\t\t\tjQuery.removeData( elem, index, true );\r\n\t\t\t\thooks.stop( gotoEnd );\r\n\t\t\t}\r\n\r\n\t\t\tif ( type == null ) {\r\n\t\t\t\tfor ( index in data ) {\r\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && index.indexOf(\".run\") === index.length - 4 ) {\r\n\t\t\t\t\t\tstopQueue( this, data, index );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if ( data[ index = type + \".run\" ] && data[ index ].stop ){\r\n\t\t\t\tstopQueue( this, data, index );\r\n\t\t\t}\r\n\r\n\t\t\tfor ( index = timers.length; index--; ) {\r\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\r\n\t\t\t\t\tif ( gotoEnd ) {\r\n\r\n\t\t\t\t\t\t// force the next step to be the last\r\n\t\t\t\t\t\ttimers[ index ]( true );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttimers[ index ].saveState();\r\n\t\t\t\t\t}\r\n\t\t\t\t\thadTimers = true;\r\n\t\t\t\t\ttimers.splice( index, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// start the next in the queue if the last step wasn't forced\r\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\r\n\t\t\t// but only if they were gotoEnd\r\n\t\t\tif ( !( gotoEnd && hadTimers ) ) {\r\n\t\t\t\tjQuery.dequeue( this, type );\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n});\r\n\r\n// Animations created synchronously will run synchronously\r\nfunction createFxNow() {\r\n\tsetTimeout( clearFxNow, 0 );\r\n\treturn ( fxNow = jQuery.now() );\r\n}\r\n\r\nfunction clearFxNow() {\r\n\tfxNow = undefined;\r\n}\r\n\r\n// Generate parameters to create a standard animation\r\nfunction genFx( type, num ) {\r\n\tvar obj = {};\r\n\r\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {\r\n\t\tobj[ this ] = type;\r\n\t});\r\n\r\n\treturn obj;\r\n}\r\n\r\n// Generate shortcuts for custom animations\r\njQuery.each({\r\n\tslideDown: genFx( \"show\", 1 ),\r\n\tslideUp: genFx( \"hide\", 1 ),\r\n\tslideToggle: genFx( \"toggle\", 1 ),\r\n\tfadeIn: { opacity: \"show\" },\r\n\tfadeOut: { opacity: \"hide\" },\r\n\tfadeToggle: { opacity: \"toggle\" }\r\n}, function( name, props ) {\r\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\r\n\t\treturn this.animate( props, speed, easing, callback );\r\n\t};\r\n});\r\n\r\njQuery.extend({\r\n\tspeed: function( speed, easing, fn ) {\r\n\t\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\r\n\t\t\tcomplete: fn || !fn && easing ||\r\n\t\t\t\tjQuery.isFunction( speed ) && speed,\r\n\t\t\tduration: speed,\r\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\r\n\t\t};\r\n\r\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\r\n\t\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\r\n\r\n\t\t// normalize opt.queue - true/undefined/null -> \"fx\"\r\n\t\tif ( opt.queue == null || opt.queue === true ) {\r\n\t\t\topt.queue = \"fx\";\r\n\t\t}\r\n\r\n\t\t// Queueing\r\n\t\topt.old = opt.complete;\r\n\r\n\t\topt.complete = function( noUnmark ) {\r\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\r\n\t\t\t\topt.old.call( this );\r\n\t\t\t}\r\n\r\n\t\t\tif ( opt.queue ) {\r\n\t\t\t\tjQuery.dequeue( this, opt.queue );\r\n\t\t\t} else if ( noUnmark !== false ) {\r\n\t\t\t\tjQuery._unmark( this );\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn opt;\r\n\t},\r\n\r\n\teasing: {\r\n\t\tlinear: function( p ) {\r\n\t\t\treturn p;\r\n\t\t},\r\n\t\tswing: function( p ) {\r\n\t\t\treturn ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;\r\n\t\t}\r\n\t},\r\n\r\n\ttimers: [],\r\n\r\n\tfx: function( elem, options, prop ) {\r\n\t\tthis.options = options;\r\n\t\tthis.elem = elem;\r\n\t\tthis.prop = prop;\r\n\r\n\t\toptions.orig = options.orig || {};\r\n\t}\r\n\r\n});\r\n\r\njQuery.fx.prototype = {\r\n\t// Simple function for setting a style value\r\n\tupdate: function() {\r\n\t\tif ( this.options.step ) {\r\n\t\t\tthis.options.step.call( this.elem, this.now, this );\r\n\t\t}\r\n\r\n\t\t( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );\r\n\t},\r\n\r\n\t// Get the current size\r\n\tcur: function() {\r\n\t\tif ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {\r\n\t\t\treturn this.elem[ this.prop ];\r\n\t\t}\r\n\r\n\t\tvar parsed,\r\n\t\t\tr = jQuery.css( this.elem, this.prop );\r\n\t\t// Empty strings, null, undefined and \"auto\" are converted to 0,\r\n\t\t// complex values such as \"rotate(1rad)\" are returned as is,\r\n\t\t// simple values such as \"10px\" are parsed to Float.\r\n\t\treturn isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\r\n\t},\r\n\r\n\t// Start an animation from one number to another\r\n\tcustom: function( from, to, unit ) {\r\n\t\tvar self = this,\r\n\t\t\tfx = jQuery.fx;\r\n\r\n\t\tthis.startTime = fxNow || createFxNow();\r\n\t\tthis.end = to;\r\n\t\tthis.now = this.start = from;\r\n\t\tthis.pos = this.state = 0;\r\n\t\tthis.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\r\n\r\n\t\tfunction t( gotoEnd ) {\r\n\t\t\treturn self.step( gotoEnd );\r\n\t\t}\r\n\r\n\t\tt.queue = this.options.queue;\r\n\t\tt.elem = this.elem;\r\n\t\tt.saveState = function() {\r\n\t\t\tif ( jQuery._data( self.elem, \"fxshow\" + self.prop ) === undefined ) {\r\n\t\t\t\tif ( self.options.hide ) {\r\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.start );\r\n\t\t\t\t} else if ( self.options.show ) {\r\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.end );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\r\n\t\t\ttimerId = setInterval( fx.tick, fx.interval );\r\n\t\t}\r\n\t},\r\n\r\n\t// Simple 'show' function\r\n\tshow: function() {\r\n\t\tvar dataShow = jQuery._data( this.elem, \"fxshow\" + this.prop );\r\n\r\n\t\t// Remember where we started, so that we can go back to it later\r\n\t\tthis.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );\r\n\t\tthis.options.show = true;\r\n\r\n\t\t// Begin the animation\r\n\t\t// Make sure that we start at a small width/height to avoid any flash of content\r\n\t\tif ( dataShow !== undefined ) {\r\n\t\t\t// This show is picking up where a previous hide or show left off\r\n\t\t\tthis.custom( this.cur(), dataShow );\r\n\t\t} else {\r\n\t\t\tthis.custom( this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur() );\r\n\t\t}\r\n\r\n\t\t// Start by showing the element\r\n\t\tjQuery( this.elem ).show();\r\n\t},\r\n\r\n\t// Simple 'hide' function\r\n\thide: function() {\r\n\t\t// Remember where we started, so that we can go back to it later\r\n\t\tthis.options.orig[ this.prop ] = jQuery._data( this.elem, \"fxshow\" + this.prop ) || jQuery.style( this.elem, this.prop );\r\n\t\tthis.options.hide = true;\r\n\r\n\t\t// Begin the animation\r\n\t\tthis.custom( this.cur(), 0 );\r\n\t},\r\n\r\n\t// Each step of an animation\r\n\tstep: function( gotoEnd ) {\r\n\t\tvar p, n, complete,\r\n\t\t\tt = fxNow || createFxNow(),\r\n\t\t\tdone = true,\r\n\t\t\telem = this.elem,\r\n\t\t\toptions = this.options;\r\n\r\n\t\tif ( gotoEnd || t >= options.duration + this.startTime ) {\r\n\t\t\tthis.now = this.end;\r\n\t\t\tthis.pos = this.state = 1;\r\n\t\t\tthis.update();\r\n\r\n\t\t\toptions.animatedProperties[ this.prop ] = true;\r\n\r\n\t\t\tfor ( p in options.animatedProperties ) {\r\n\t\t\t\tif ( options.animatedProperties[ p ] !== true ) {\r\n\t\t\t\t\tdone = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( done ) {\r\n\t\t\t\t// Reset the overflow\r\n\t\t\t\tif ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\r\n\r\n\t\t\t\t\tjQuery.each( [ \"\", \"X\", \"Y\" ], function( index, value ) {\r\n\t\t\t\t\t\telem.style[ \"overflow\" + value ] = options.overflow[ index ];\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Hide the element if the \"hide\" operation was done\r\n\t\t\t\tif ( options.hide ) {\r\n\t\t\t\t\tjQuery( elem ).hide();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\r\n\t\t\t\tif ( options.hide || options.show ) {\r\n\t\t\t\t\tfor ( p in options.animatedProperties ) {\r\n\t\t\t\t\t\tjQuery.style( elem, p, options.orig[ p ] );\r\n\t\t\t\t\t\tjQuery.removeData( elem, \"fxshow\" + p, true );\r\n\t\t\t\t\t\t// Toggle data is no longer needed\r\n\t\t\t\t\t\tjQuery.removeData( elem, \"toggle\" + p, true );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Execute the complete function\r\n\t\t\t\t// in the event that the complete function throws an exception\r\n\t\t\t\t// we must ensure it won't be called twice. #5684\r\n\r\n\t\t\t\tcomplete = options.complete;\r\n\t\t\t\tif ( complete ) {\r\n\r\n\t\t\t\t\toptions.complete = false;\r\n\t\t\t\t\tcomplete.call( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t} else {\r\n\t\t\t// classical easing cannot be used with an Infinity duration\r\n\t\t\tif ( options.duration == Infinity ) {\r\n\t\t\t\tthis.now = t;\r\n\t\t\t} else {\r\n\t\t\t\tn = t - this.startTime;\r\n\t\t\t\tthis.state = n / options.duration;\r\n\r\n\t\t\t\t// Perform the easing function, defaults to swing\r\n\t\t\t\tthis.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );\r\n\t\t\t\tthis.now = this.start + ( (this.end - this.start) * this.pos );\r\n\t\t\t}\r\n\t\t\t// Perform the next step of the animation\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\njQuery.extend( jQuery.fx, {\r\n\ttick: function() {\r\n\t\tvar timer,\r\n\t\t\ttimers = jQuery.timers,\r\n\t\t\ti = 0;\r\n\r\n\t\tfor ( ; i < timers.length; i++ ) {\r\n\t\t\ttimer = timers[ i ];\r\n\t\t\t// Checks the timer has not already been removed\r\n\t\t\tif ( !timer() && timers[ i ] === timer ) {\r\n\t\t\t\ttimers.splice( i--, 1 );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( !timers.length ) {\r\n\t\t\tjQuery.fx.stop();\r\n\t\t}\r\n\t},\r\n\r\n\tinterval: 13,\r\n\r\n\tstop: function() {\r\n\t\tclearInterval( timerId );\r\n\t\ttimerId = null;\r\n\t},\r\n\r\n\tspeeds: {\r\n\t\tslow: 600,\r\n\t\tfast: 200,\r\n\t\t// Default speed\r\n\t\t_default: 400\r\n\t},\r\n\r\n\tstep: {\r\n\t\topacity: function( fx ) {\r\n\t\t\tjQuery.style( fx.elem, \"opacity\", fx.now );\r\n\t\t},\r\n\r\n\t\t_default: function( fx ) {\r\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\r\n\t\t\t\tfx.elem.style[ fx.prop ] = fx.now + fx.unit;\r\n\t\t\t} else {\r\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Ensure props that can't be negative don't go there on undershoot easing\r\njQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {\r\n\t// exclude marginTop, marginLeft, marginBottom and marginRight from this list\r\n\tif ( prop.indexOf( \"margin\" ) ) {\r\n\t\tjQuery.fx.step[ prop ] = function( fx ) {\r\n\t\t\tjQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );\r\n\t\t};\r\n\t}\r\n});\r\n\r\nif ( jQuery.expr && jQuery.expr.filters ) {\r\n\tjQuery.expr.filters.animated = function( elem ) {\r\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\r\n\t\t\treturn elem === fn.elem;\r\n\t\t}).length;\r\n\t};\r\n}\r\n\r\n// Try to restore the default display value of an element\r\nfunction defaultDisplay( nodeName ) {\r\n\r\n\tif ( !elemdisplay[ nodeName ] ) {\r\n\r\n\t\tvar body = document.body,\r\n\t\t\telem = jQuery( \"<\" + nodeName + \">\" ).appendTo( body ),\r\n\t\t\tdisplay = elem.css( \"display\" );\r\n\t\telem.remove();\r\n\r\n\t\t// If the simple way fails,\r\n\t\t// get element's real default display by attaching it to a temp iframe\r\n\t\tif ( display === \"none\" || display === \"\" ) {\r\n\t\t\t// No iframe to use yet, so create it\r\n\t\t\tif ( !iframe ) {\r\n\t\t\t\tiframe = document.createElement( \"iframe\" );\r\n\t\t\t\tiframe.frameBorder = iframe.width = iframe.height = 0;\r\n\t\t\t}\r\n\r\n\t\t\tbody.appendChild( iframe );\r\n\r\n\t\t\t// Create a cacheable copy of the iframe document on first call.\r\n\t\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\r\n\t\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\r\n\t\t\tif ( !iframeDoc || !iframe.createElement ) {\r\n\t\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\r\n\t\t\t\tiframeDoc.write( ( jQuery.support.boxModel ? \"<!doctype html>\" : \"\" ) + \"<html><body>\" );\r\n\t\t\t\tiframeDoc.close();\r\n\t\t\t}\r\n\r\n\t\t\telem = iframeDoc.createElement( nodeName );\r\n\r\n\t\t\tiframeDoc.body.appendChild( elem );\r\n\r\n\t\t\tdisplay = jQuery.css( elem, \"display\" );\r\n\t\t\tbody.removeChild( iframe );\r\n\t\t}\r\n\r\n\t\t// Store the correct default display\r\n\t\telemdisplay[ nodeName ] = display;\r\n\t}\r\n\r\n\treturn elemdisplay[ nodeName ];\r\n}\r\n\r\n\r\n\r\n\r\nvar getOffset,\r\n\trtable = /^t(?:able|d|h)$/i,\r\n\trroot = /^(?:body|html)$/i;\r\n\r\nif ( \"getBoundingClientRect\" in document.documentElement ) {\r\n\tgetOffset = function( elem, doc, docElem, box ) {\r\n\t\ttry {\r\n\t\t\tbox = elem.getBoundingClientRect();\r\n\t\t} catch(e) {}\r\n\r\n\t\t// Make sure we're not dealing with a disconnected DOM node\r\n\t\tif ( !box || !jQuery.contains( docElem, elem ) ) {\r\n\t\t\treturn box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\r\n\t\t}\r\n\r\n\t\tvar body = doc.body,\r\n\t\t\twin = getWindow( doc ),\r\n\t\t\tclientTop  = docElem.clientTop  || body.clientTop  || 0,\r\n\t\t\tclientLeft = docElem.clientLeft || body.clientLeft || 0,\r\n\t\t\tscrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\r\n\t\t\tscrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\r\n\t\t\ttop  = box.top  + scrollTop  - clientTop,\r\n\t\t\tleft = box.left + scrollLeft - clientLeft;\r\n\r\n\t\treturn { top: top, left: left };\r\n\t};\r\n\r\n} else {\r\n\tgetOffset = function( elem, doc, docElem ) {\r\n\t\tvar computedStyle,\r\n\t\t\toffsetParent = elem.offsetParent,\r\n\t\t\tprevOffsetParent = elem,\r\n\t\t\tbody = doc.body,\r\n\t\t\tdefaultView = doc.defaultView,\r\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\r\n\t\t\ttop = elem.offsetTop,\r\n\t\t\tleft = elem.offsetLeft;\r\n\r\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\r\n\t\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\r\n\t\t\ttop  -= elem.scrollTop;\r\n\t\t\tleft -= elem.scrollLeft;\r\n\r\n\t\t\tif ( elem === offsetParent ) {\r\n\t\t\t\ttop  += elem.offsetTop;\r\n\t\t\t\tleft += elem.offsetLeft;\r\n\r\n\t\t\t\tif ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\r\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\r\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tprevOffsetParent = offsetParent;\r\n\t\t\t\toffsetParent = elem.offsetParent;\r\n\t\t\t}\r\n\r\n\t\t\tif ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\r\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\r\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\r\n\t\t\t}\r\n\r\n\t\t\tprevComputedStyle = computedStyle;\r\n\t\t}\r\n\r\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\r\n\t\t\ttop  += body.offsetTop;\r\n\t\t\tleft += body.offsetLeft;\r\n\t\t}\r\n\r\n\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\r\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\r\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\r\n\t\t}\r\n\r\n\t\treturn { top: top, left: left };\r\n\t};\r\n}\r\n\r\njQuery.fn.offset = function( options ) {\r\n\tif ( arguments.length ) {\r\n\t\treturn options === undefined ?\r\n\t\t\tthis :\r\n\t\t\tthis.each(function( i ) {\r\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\r\n\t\t\t});\r\n\t}\r\n\r\n\tvar elem = this[0],\r\n\t\tdoc = elem && elem.ownerDocument;\r\n\r\n\tif ( !doc ) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif ( elem === doc.body ) {\r\n\t\treturn jQuery.offset.bodyOffset( elem );\r\n\t}\r\n\r\n\treturn getOffset( elem, doc, doc.documentElement );\r\n};\r\n\r\njQuery.offset = {\r\n\r\n\tbodyOffset: function( body ) {\r\n\t\tvar top = body.offsetTop,\r\n\t\t\tleft = body.offsetLeft;\r\n\r\n\t\tif ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\r\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\r\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\r\n\t\t}\r\n\r\n\t\treturn { top: top, left: left };\r\n\t},\r\n\r\n\tsetOffset: function( elem, options, i ) {\r\n\t\tvar position = jQuery.css( elem, \"position\" );\r\n\r\n\t\t// set position first, in-case top/left are set even on static elem\r\n\t\tif ( position === \"static\" ) {\r\n\t\t\telem.style.position = \"relative\";\r\n\t\t}\r\n\r\n\t\tvar curElem = jQuery( elem ),\r\n\t\t\tcurOffset = curElem.offset(),\r\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\r\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\r\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\r\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\r\n\r\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\r\n\t\tif ( calculatePosition ) {\r\n\t\t\tcurPosition = curElem.position();\r\n\t\t\tcurTop = curPosition.top;\r\n\t\t\tcurLeft = curPosition.left;\r\n\t\t} else {\r\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\r\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction( options ) ) {\r\n\t\t\toptions = options.call( elem, i, curOffset );\r\n\t\t}\r\n\r\n\t\tif ( options.top != null ) {\r\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\r\n\t\t}\r\n\t\tif ( options.left != null ) {\r\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\r\n\t\t}\r\n\r\n\t\tif ( \"using\" in options ) {\r\n\t\t\toptions.using.call( elem, props );\r\n\t\t} else {\r\n\t\t\tcurElem.css( props );\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\njQuery.fn.extend({\r\n\r\n\tposition: function() {\r\n\t\tif ( !this[0] ) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar elem = this[0],\r\n\r\n\t\t// Get *real* offsetParent\r\n\t\toffsetParent = this.offsetParent(),\r\n\r\n\t\t// Get correct offsets\r\n\t\toffset       = this.offset(),\r\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\r\n\r\n\t\t// Subtract element margins\r\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\r\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\r\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\r\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\r\n\r\n\t\t// Add offsetParent borders\r\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\r\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\r\n\r\n\t\t// Subtract the two offsets\r\n\t\treturn {\r\n\t\t\ttop:  offset.top  - parentOffset.top,\r\n\t\t\tleft: offset.left - parentOffset.left\r\n\t\t};\r\n\t},\r\n\r\n\toffsetParent: function() {\r\n\t\treturn this.map(function() {\r\n\t\t\tvar offsetParent = this.offsetParent || document.body;\r\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\r\n\t\t\t\toffsetParent = offsetParent.offsetParent;\r\n\t\t\t}\r\n\t\t\treturn offsetParent;\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\r\n// Create scrollLeft and scrollTop methods\r\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\r\n\tvar top = /Y/.test( prop );\r\n\r\n\tjQuery.fn[ method ] = function( val ) {\r\n\t\treturn jQuery.access( this, function( elem, method, val ) {\r\n\t\t\tvar win = getWindow( elem );\r\n\r\n\t\t\tif ( val === undefined ) {\r\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\r\n\t\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\r\n\t\t\t\t\t\twin.document.body[ method ] :\r\n\t\t\t\t\telem[ method ];\r\n\t\t\t}\r\n\r\n\t\t\tif ( win ) {\r\n\t\t\t\twin.scrollTo(\r\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\r\n\t\t\t\t\t top ? val : jQuery( win ).scrollTop()\r\n\t\t\t\t);\r\n\r\n\t\t\t} else {\r\n\t\t\t\telem[ method ] = val;\r\n\t\t\t}\r\n\t\t}, method, val, arguments.length, null );\r\n\t};\r\n});\r\n\r\nfunction getWindow( elem ) {\r\n\treturn jQuery.isWindow( elem ) ?\r\n\t\telem :\r\n\t\telem.nodeType === 9 ?\r\n\t\t\telem.defaultView || elem.parentWindow :\r\n\t\t\tfalse;\r\n}\r\n\r\n\r\n\r\n\r\n// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods\r\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\r\n\tvar clientProp = \"client\" + name,\r\n\t\tscrollProp = \"scroll\" + name,\r\n\t\toffsetProp = \"offset\" + name;\r\n\r\n\t// innerHeight and innerWidth\r\n\tjQuery.fn[ \"inner\" + name ] = function() {\r\n\t\tvar elem = this[0];\r\n\t\treturn elem ?\r\n\t\t\telem.style ?\r\n\t\t\tparseFloat( jQuery.css( elem, type, \"padding\" ) ) :\r\n\t\t\tthis[ type ]() :\r\n\t\t\tnull;\r\n\t};\r\n\r\n\t// outerHeight and outerWidth\r\n\tjQuery.fn[ \"outer\" + name ] = function( margin ) {\r\n\t\tvar elem = this[0];\r\n\t\treturn elem ?\r\n\t\t\telem.style ?\r\n\t\t\tparseFloat( jQuery.css( elem, type, margin ? \"margin\" : \"border\" ) ) :\r\n\t\t\tthis[ type ]() :\r\n\t\t\tnull;\r\n\t};\r\n\r\n\tjQuery.fn[ type ] = function( value ) {\r\n\t\treturn jQuery.access( this, function( elem, type, value ) {\r\n\t\t\tvar doc, docElemProp, orig, ret;\r\n\r\n\t\t\tif ( jQuery.isWindow( elem ) ) {\r\n\t\t\t\t// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\r\n\t\t\t\tdoc = elem.document;\r\n\t\t\t\tdocElemProp = doc.documentElement[ clientProp ];\r\n\t\t\t\treturn jQuery.support.boxModel && docElemProp ||\r\n\t\t\t\t\tdoc.body && doc.body[ clientProp ] || docElemProp;\r\n\t\t\t}\r\n\r\n\t\t\t// Get document width or height\r\n\t\t\tif ( elem.nodeType === 9 ) {\r\n\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\r\n\t\t\t\tdoc = elem.documentElement;\r\n\r\n\t\t\t\t// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]\r\n\t\t\t\t// so we can't use max, as it'll choose the incorrect offset[Width/Height]\r\n\t\t\t\t// instead we use the correct client[Width/Height]\r\n\t\t\t\t// support:IE6\r\n\t\t\t\tif ( doc[ clientProp ] >= doc[ scrollProp ] ) {\r\n\t\t\t\t\treturn doc[ clientProp ];\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn Math.max(\r\n\t\t\t\t\telem.body[ scrollProp ], doc[ scrollProp ],\r\n\t\t\t\t\telem.body[ offsetProp ], doc[ offsetProp ]\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\t// Get width or height on the element\r\n\t\t\tif ( value === undefined ) {\r\n\t\t\t\torig = jQuery.css( elem, type );\r\n\t\t\t\tret = parseFloat( orig );\r\n\t\t\t\treturn jQuery.isNumeric( ret ) ? ret : orig;\r\n\t\t\t}\r\n\r\n\t\t\t// Set the width or height on the element\r\n\t\t\tjQuery( elem ).css( type, value );\r\n\t\t}, type, value, arguments.length, null );\r\n\t};\r\n});\r\n\r\n\r\n\r\n\r\n// Expose jQuery to the global object\r\nwindow.jQuery = window.$ = jQuery;\r\n\r\n// Expose jQuery as an AMD module, but only for AMD loaders that\r\n// understand the issues with loading multiple versions of jQuery\r\n// in a page that all might call define(). The loader will indicate\r\n// they have special allowances for multiple jQuery versions by\r\n// specifying define.amd.jQuery = true. Register as a named module,\r\n// since jQuery can be concatenated with other files that may use define,\r\n// but not use a proper concatenation script that understands anonymous\r\n// AMD modules. A named AMD is safest and most robust way to register.\r\n// Lowercase jquery is used because AMD module names are derived from\r\n// file names, and jQuery is normally delivered in a lowercase file name.\r\n// Do this after creating the global so that if an AMD module wants to call\r\n// noConflict to hide this version of jQuery, it will work.\r\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\r\n\tdefine( \"jquery\", [], function () { return jQuery; } );\r\n}\r\n\r\n\r\n\r\n})( window );"
  },
  {
    "path": "servers/embed/assets/js/vendor/overthrow.js",
    "content": "/*! Overthrow v.0.1.0. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\r\n(function( w, undefined ){\r\n  \r\n\tvar doc = w.document,\r\n\t\tdocElem = doc.documentElement,\r\n\t\tclasstext = \"overthrow-enabled\",\r\n\t\r\n\t\t// Touch events are used in the polyfill, and thus are a prerequisite\r\n\t\tcanBeFilledWithPoly = \"ontouchmove\" in doc,\r\n\t\t\r\n\t\t// The following attempts to determine whether the browser has native overflow support\r\n\t\t// so we can enable it but not polyfill\r\n\t\toverflowProbablyAlreadyWorks = \r\n\t\t\t// Features-first. iOS5 overflow scrolling property check - no UA needed here. thanks Apple :)\r\n\t\t\t\"WebkitOverflowScrolling\" in docElem.style ||\r\n\t\t\t// Touch events aren't supported and screen width is greater than X\r\n\t\t\t// ...basically, this is a loose \"desktop browser\" check. \r\n\t\t\t// It may wrongly opt-in very large tablets with no touch support.\r\n\t\t\t( !canBeFilledWithPoly && w.screen.width > 1200 ) ||\r\n\t\t\t// Hang on to your hats.\r\n\t\t\t// Whitelist some popular, overflow-supporting mobile browsers for now and the future\r\n\t\t\t// These browsers are known to get overlow support right, but give us no way of detecting it.\r\n\t\t\t(function(){\r\n\t\t\t\tvar ua = w.navigator.userAgent,\r\n\t\t\t\t\t// Webkit crosses platforms, and the browsers on our list run at least version 534\r\n\t\t\t\t\twebkit = ua.match( /AppleWebKit\\/([0-9]+)/ ),\r\n\t\t\t\t\twkversion = webkit && webkit[1],\r\n\t\t\t\t\twkLte534 = webkit && wkversion >= 534;\r\n\t\t\t\t\t\r\n\t\t\t\treturn (\r\n\t\t\t\t\t/* Android 3+ with webkit gte 534\r\n\t\t\t\t\t~: Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 */\r\n\t\t\t\t\tua.match( /Android ([0-9]+)/ ) && RegExp.$1 >= 3 && wkLte534 ||\r\n\t\t\t\t\t/* Blackberry 7+ with webkit gte 534\r\n\t\t\t\t\t~: Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0 Mobile Safari/534.11+ */\r\n\t\t\t\t\tua.match( / Version\\/([0-9]+)/ ) && RegExp.$1 >= 0 && w.blackberry && wkLte534 ||\r\n\t\t\t\t\t/* Blackberry Playbook with webkit gte 534\r\n\t\t\t\t\t~: Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+ */   \r\n\t\t\t\t\tua.indexOf( /PlayBook/ ) > -1 && RegExp.$1 >= 0 && wkLte534 ||\r\n\t\t\t\t\t/* Firefox Mobile (Fennec) 4 and up\r\n\t\t\t\t\t~: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:2.1.1) Gecko/ Firefox/4.0.2pre Fennec/4.0. */\r\n\t\t\t\t\tua.match( /Fennec\\/([0-9]+)/ ) && RegExp.$1 >= 4 ||\r\n\t\t\t\t\t/* WebOS 3 and up (TouchPad too)\r\n\t\t\t\t\t~: Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.48 Safari/534.6 TouchPad/1.0 */\r\n\t\t\t\t\tua.match( /wOSBrowser\\/([0-9]+)/ ) && RegExp.$1 >= 233 && wkLte534 ||\r\n\t\t\t\t\t/* Nokia Browser N8\r\n\t\t\t\t\t~: Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/012.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.0 Mobile Safari/533.4 3gpp-gba \r\n\t\t\t\t\t~: Note: the N9 doesn't have native overflow with one-finger touch. wtf */\r\n\t\t\t\t\tua.match( /NokiaBrowser\\/([0-9\\.]+)/ ) && parseFloat(RegExp.$1) === 7.3 && webkit && wkversion >= 533\r\n\t\t\t\t);\r\n\t\t\t})(),\r\n\t\t\t\r\n\t\t// Easing can use any of Robert Penner's equations (http://www.robertpenner.com/easing_terms_of_use.html). By default, overthrow includes ease-out-cubic\r\n\t\t// arguments: t = current iteration, b = initial value, c = end value, d = total iterations\r\n\t\t// use w.overthrow.easing to provide a custom function externally, or pass an easing function as a callback to the toss method\r\n\t\tdefaultEasing = function (t, b, c, d) {\r\n\t\t\treturn c*((t=t/d-1)*t*t + 1) + b;\r\n\t\t},\t\r\n\t\t\t\r\n\t\tenabled = false,\r\n\t\t\r\n\t\t// Keeper of intervals\r\n\t\ttimeKeeper,\r\n\t\t\t\t\r\n\t\t/* toss scrolls and element with easing\r\n\t\t\r\n\t\t// elem is the element to scroll\r\n\t\t// options hash:\r\n\t\t\t* left is the desired horizontal scroll. Default is \"+0\". For relative distances, pass a string with \"+\" or \"-\" in front.\r\n\t\t\t* top is the desired vertical scroll. Default is \"+0\". For relative distances, pass a string with \"+\" or \"-\" in front.\r\n\t\t\t* duration is the number of milliseconds the throw will take. Default is 100.\r\n\t\t\t* easing is an optional custom easing function. Default is w.overthrow.easing. Must follow the easing function signature \r\n\t\t*/\r\n\t\ttoss = function( elem, options ){\r\n\t\t\tvar i = 0,\r\n\t\t\t\tsLeft = elem.scrollLeft,\r\n\t\t\t\tsTop = elem.scrollTop,\r\n\t\t\t\t// Toss defaults\r\n\t\t\t\to = {\r\n\t\t\t\t\ttop: \"+0\",\r\n\t\t\t\t\tleft: \"+0\",\r\n\t\t\t\t\tduration: 100,\r\n\t\t\t\t\teasing: w.overthrow.easing\r\n\t\t\t\t},\r\n\t\t\t\tendLeft, endTop;\r\n\t\t\t\r\n\t\t\t// Mixin based on predefined defaults\r\n\t\t\tif( options ){\r\n\t\t\t\tfor( var j in o ){\r\n\t\t\t\t\tif( options[ j ] !== undefined ){\r\n\t\t\t\t\t\to[ j ] = options[ j ];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Convert relative values to ints\r\n\t\t\t// First the left val\r\n\t\t\tif( typeof o.left === \"string\" ){\r\n\t\t\t\to.left = parseFloat( o.left );\r\n\t\t\t\tendLeft = o.left + sLeft;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tendLeft = o.left;\r\n\t\t\t\to.left = o.left - sLeft;\r\n\t\t\t}\r\n\t\t\t// Then the top val\r\n\t\t\tif( typeof o.top === \"string\" ){\r\n\t\t\t\to.top = parseFloat( o.top );\r\n\t\t\t\tendTop = o.top + sTop;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tendTop = o.top;\r\n\t\t\t\to.top = o.top - sTop;\r\n\t\t\t}\r\n\r\n\t\t\ttimeKeeper = setInterval(function(){\t\t\t\t\t\r\n\t\t\t\tif( i++ < o.duration ){\r\n\t\t\t\t\telem.scrollLeft = o.easing( i, sLeft, o.left, o.duration );\r\n\t\t\t\t\telem.scrollTop = o.easing( i, sTop, o.top, o.duration );\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\tif( endLeft !== elem.scrollLeft ){\r\n\t\t\t\t\t\telem.scrollLeft = endLeft;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif( endTop !== elem.scrollTop ){\r\n\t\t\t\t\t\telem.scrollTop = endTop;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tintercept();\r\n\t\t\t\t}\r\n\t\t\t}, 1 );\r\n\t\t\t\r\n\t\t\t// Return the values, post-mixin, with end values specified\r\n\t\t\treturn { top: endTop, left: endLeft, duration: o.duration, easing: o.easing };\r\n\t\t},\r\n\t\t\r\n\t\t// find closest overthrow (elem or a parent)\r\n\t\tclosest = function( target, ascend ){\r\n\t\t\treturn !ascend && target.className && target.className.indexOf( \"overthrow\" ) > -1 && target || closest( target.parentNode );\r\n\t\t},\r\n\t\t\t\t\r\n\t\t// Intercept any throw in progress\r\n\t\tintercept = function(){\r\n\t\t\tclearInterval( timeKeeper );\r\n\t\t},\r\n\t\t\t\r\n\t\t// Enable and potentially polyfill overflow\r\n\t\tenable = function(){\r\n\t\t\t\t\r\n\t\t\t// If it's on, \r\n\t\t\tif( enabled ){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// It's on.\r\n\t\t\tenabled = true;\r\n\t\t\t\t\r\n\t\t\t// If overflowProbablyAlreadyWorks or at least the element canBeFilledWithPoly, add a class to cue CSS that assumes overflow scrolling will work (setting height on elements and such)\r\n\t\t\tif( overflowProbablyAlreadyWorks || canBeFilledWithPoly ){\r\n\t\t\t\tdocElem.className += \" \" + classtext;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\t// Destroy everything later. If you want to.\r\n\t\t\tw.overthrow.forget = function(){\r\n\t\t\t\t// Strip the class name from docElem\r\n\t\t\t\tdocElem.className = docElem.className.replace( classtext, \"\" );\r\n\t\t\t\t// Remove touch binding (check for method support since this part isn't qualified by touch support like the rest)\r\n\t\t\t\tif( doc.removeEventListener ){\r\n\t\t\t\t\tdoc.removeEventListener( \"touchstart\", start, false );\r\n\t\t\t\t}\r\n\t\t\t\t// reset easing to default\r\n\t\t\t\tw.overthrow.easing = defaultEasing;\r\n\t\t\t\t\r\n\t\t\t\t// Let 'em know\r\n\t\t\t\tenabled = false;\r\n\t\t\t};\r\n\t\r\n\t\t\t// If overflowProbablyAlreadyWorks or it doesn't look like the browser canBeFilledWithPoly, our job is done here. Exit viewport left.\r\n\t\t\tif( overflowProbablyAlreadyWorks || !canBeFilledWithPoly ){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Fill 'er up!\r\n\t\t\t// From here down, all logic is associated with touch scroll handling\r\n\t\t\t\t// elem references the overthrow element in use\r\n\t\t\tvar elem,\r\n\t\t\t\t\r\n\t\t\t\t// The last several Y values are kept here\r\n\t\t\t\tlastTops = [],\r\n\t\t\r\n\t\t\t\t// The last several X values are kept here\r\n\t\t\t\tlastLefts = [],\r\n\t\t\t\t\r\n\t\t\t\t// lastDown will be true if the last scroll direction was down, false if it was up\r\n\t\t\t\tlastDown,\r\n\t\t\t\t\r\n\t\t\t\t// lastRight will be true if the last scroll direction was right, false if it was left\r\n\t\t\t\tlastRight,\r\n\t\t\t\t\r\n\t\t\t\t// For a new gesture, or change in direction, reset the values from last scroll\r\n\t\t\t\tresetVertTracking = function(){\r\n\t\t\t\t\tlastTops = [];\r\n\t\t\t\t\tlastDown = null;\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\tresetHorTracking = function(){\r\n\t\t\t\t\tlastLefts = [];\r\n\t\t\t\t\tlastRight = null;\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t// After releasing touchend, throw the overthrow element, depending on momentum\r\n\t\t\t\tfinishScroll = function(){\r\n\t\t\t\t\t// Come up with a distance and duration based on how \r\n\t\t\t\t\t// Multipliers are tweaked to a comfortable balance across platforms\r\n\t\t\t\t\tvar top = ( lastTops[ 0 ] - lastTops[ lastTops.length -1 ] ) * 8,\r\n\t\t\t\t\t\tleft = ( lastLefts[ 0 ] - lastLefts[ lastLefts.length -1 ] ) * 8,\r\n\t\t\t\t\t\tduration = Math.max( Math.abs( left ), Math.abs( top ) ) / 8;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Make top and left relative-style strings (positive vals need \"+\" prefix)\r\n\t\t\t\t\ttop = ( top > 0 ? \"+\" : \"\" ) + top;\r\n\t\t\t\t\tleft = ( left > 0 ? \"+\" : \"\" ) + left;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Make sure there's a significant amount of throw involved, otherwise, just stay still\r\n\t\t\t\t\tif( !isNaN( duration ) && duration > 0 && ( Math.abs( left ) > 80 || Math.abs( top ) > 80 ) ){\r\n\t\t\t\t\t\ttoss( elem, { left: left, top: top, duration: duration } );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\r\n\t\t\t\t// On webkit, touch events hardly trickle through textareas and inputs\r\n\t\t\t\t// Disabling CSS pointer events makes sure they do, but it also makes the controls innaccessible\r\n\t\t\t\t// Toggling pointer events at the right moments seems to do the trick\r\n\t\t\t\t// Thanks Thomas Bachem http://stackoverflow.com/a/5798681 for the following\r\n\t\t\t\tinputs,\r\n\t\t\t\tsetPointers = function( val ){\r\n\t\t\t\t\tinputs = elem.querySelectorAll( \"textarea, input\" );\r\n\t\t\t\t\tfor( var i = 0, il = inputs.length; i < il; i++ ) {\r\n\t\t\t\t\t\tinputs[ i ].style.pointerEvents = val;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t// For nested overthrows, changeScrollTarget restarts a touch event cycle on a parent or child overthrow\r\n\t\t\t\tchangeScrollTarget = function( startEvent, ascend ){\r\n\t\t\t\t\tif( doc.createEvent ){\r\n\t\t\t\t\t\tvar newTarget = ( !ascend || ascend === undefined ) && elem.parentNode || elem.touchchild || elem,\r\n\t\t\t\t\t\t\ttEnd;\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\tif( newTarget !== elem ){\r\n\t\t\t\t\t\t\ttEnd = doc.createEvent( \"HTMLEvents\" );\r\n\t\t\t\t\t\t\ttEnd.initEvent( \"touchend\", true, true );\r\n\t\t\t\t\t\t\telem.dispatchEvent( tEnd );\r\n\t\t\t\t\t\t\tnewTarget.touchchild = elem;\r\n\t\t\t\t\t\t\telem = newTarget;\r\n\t\t\t\t\t\t\tnewTarget.dispatchEvent( startEvent );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t// Touchstart handler\r\n\t\t\t\t// On touchstart, touchmove and touchend are freshly bound, and all three share a bunch of vars set by touchstart\r\n\t\t\t\t// Touchend unbinds them again, until next time\r\n\t\t\t\tstart = function( e ){\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Stop any throw in progress\r\n\t\t\t\t\tintercept();\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Reset the distance and direction tracking\r\n\t\t\t\t\tresetVertTracking();\r\n\t\t\t\t\tresetHorTracking();\r\n\t\t\t\t\t\t\r\n\t\t\t\t\telem = closest( e.target );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tif( !elem || elem === docElem || e.touches.length > 1 ){\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\t\t\t\r\n\r\n\t\t\t\t\tsetPointers( \"none\" );\r\n\t\t\t\t\tvar touchStartE = e,\r\n\t\t\t\t\t\tscrollT = elem.scrollTop,\r\n\t\t\t\t\t\tscrollL = elem.scrollLeft,\r\n\t\t\t\t\t\theight = elem.offsetHeight,\r\n\t\t\t\t\t\twidth = elem.offsetWidth,\r\n\t\t\t\t\t\tstartY = e.touches[ 0 ].pageY,\r\n\t\t\t\t\t\tstartX = e.touches[ 0 ].pageX,\r\n\t\t\t\t\t\tscrollHeight = elem.scrollHeight,\r\n\t\t\t\t\t\tscrollWidth = elem.scrollWidth,\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t// Touchmove handler\r\n\t\t\t\t\t\tmove = function( e ){\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tvar ty = scrollT + startY - e.touches[ 0 ].pageY,\r\n\t\t\t\t\t\t\t\ttx = scrollL + startX - e.touches[ 0 ].pageX,\r\n\t\t\t\t\t\t\t\tdown = ty >= ( lastTops.length ? lastTops[ 0 ] : 0 ),\r\n\t\t\t\t\t\t\t\tright = tx >= ( lastLefts.length ? lastLefts[ 0 ] : 0 );\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// If there's room to scroll the current container, prevent the default window scroll\r\n\t\t\t\t\t\t\tif( ( ty > 0 && ty < scrollHeight - height ) || ( tx > 0 && tx < scrollWidth - width ) ){\r\n\t\t\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// This bubbling is dumb. Needs a rethink.\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tchangeScrollTarget( touchStartE );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// If down and lastDown are inequal, the y scroll has changed direction. Reset tracking.\r\n\t\t\t\t\t\t\tif( lastDown && down !== lastDown ){\r\n\t\t\t\t\t\t\t\tresetVertTracking();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// If right and lastRight are inequal, the x scroll has changed direction. Reset tracking.\r\n\t\t\t\t\t\t\tif( lastRight && right !== lastRight ){\r\n\t\t\t\t\t\t\t\tresetHorTracking();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// remember the last direction in which we were headed\r\n\t\t\t\t\t\t\tlastDown = down;\r\n\t\t\t\t\t\t\tlastRight = right;\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// set the container's scroll\r\n\t\t\t\t\t\t\telem.scrollTop = ty;\r\n\t\t\t\t\t\t\telem.scrollLeft = tx;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tlastTops.unshift( ty );\r\n\t\t\t\t\t\t\tlastLefts.unshift( tx );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tif( lastTops.length > 3 ){\r\n\t\t\t\t\t\t\t\tlastTops.pop();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif( lastLefts.length > 3 ){\r\n\t\t\t\t\t\t\t\tlastLefts.pop();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t// Touchend handler\r\n\t\t\t\t\t\tend = function( e ){\r\n\t\t\t\t\t\t\t// Apply momentum based easing for a graceful finish\r\n\t\t\t\t\t\t\tfinishScroll();\t\r\n\t\t\t\t\t\t\t// Bring the pointers back\r\n\t\t\t\t\t\t\tsetPointers( \"auto\" );\r\n\t\t\t\t\t\t\tsetTimeout( function(){\r\n\t\t\t\t\t\t\t\tsetPointers( \"none\" );\r\n\t\t\t\t\t\t\t}, 450 );\r\n\t\t\t\t\t\t\telem.removeEventListener( \"touchmove\", move, false );\r\n\t\t\t\t\t\t\telem.removeEventListener( \"touchend\", end, false );\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\r\n\t\t\t\t\telem.addEventListener( \"touchmove\", move, false );\r\n\t\t\t\t\telem.addEventListener( \"touchend\", end, false );\r\n\t\t\t\t};\r\n\t\t\t\t\r\n\t\t\t// Bind to touch, handle move and end within\r\n\t\t\tdoc.addEventListener( \"touchstart\", start, false );\r\n\t\t};\r\n\t\t\r\n\t// Expose overthrow API\r\n\tw.overthrow = {\r\n\t\tset: enable,\r\n\t\tforget: function(){},\r\n\t\teasing: defaultEasing,\r\n\t\ttoss: toss,\r\n\t\tintercept: intercept,\r\n\t\tclosest: closest,\r\n\t\tsupport: overflowProbablyAlreadyWorks ? \"native\" : canBeFilledWithPoly && \"polyfilled\" || \"none\"\r\n\t};\r\n\t\r\n\t// Auto-init\r\n\tenable();\r\n\t\t\r\n})( this );"
  },
  {
    "path": "servers/embed/assets/js/vendor/prettify.js",
    "content": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\r\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:\"0\"<=b&&b<=\"7\"?parseInt(a.substring(1),8):b===\"u\"||b===\"x\"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?\"\\\\x0\":\"\\\\x\")+a.toString(16);a=String.fromCharCode(a);if(a===\"\\\\\"||a===\"-\"||a===\"[\"||a===\"]\")a=\"\\\\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\S\\s]|[^\\\\]/g),a=\r\n[],b=[],o=f[0]===\"^\",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&\"-\"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=[\"[\"];o&&b.push(\"^\");b.push.apply(b,a);for(c=0;c<\r\nf.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push(\"-\"),b.push(e(i[1])));b.push(\"]\");return b.join(\"\")}function y(a){for(var f=a.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j===\"(\"?++i:\"\\\\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j===\"(\"?(++i,d[i]===void 0&&(f[c]=\"(?:\")):\"\\\\\"===j.charAt(0)&&\r\n(j=+j.substring(1))&&j<=i&&(f[c]=\"\\\\\"+d[i]);for(i=c=0;c<b;++c)\"^\"===f[c]&&\"^\"!==f[c+1]&&(f[c]=\"\");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a===\"[\"?f[c]=h(j):a!==\"\\\\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return f.join(\"\")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\\\u[\\da-f]{4}|\\\\x[\\da-f]{2}|\\\\[^UXux]/gi,\"\"))){s=!0;l=!1;break}}for(var r=\r\n{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(\"\"+g);n.push(\"(?:\"+y(g)+\")\")}return RegExp(n.join(\"|\"),l?\"gi\":\"g\")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if(\"BR\"===g||\"LI\"===g)h[s]=\"\\n\",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\\r\\n?/g,\"\\n\"):g.replace(/[\\t\\n\\r ]+/g,\" \"),h[s]=g,t[s<<1]=y,y+=g.length,\r\nt[s++<<1|1]=a)}}var e=/(?:^|\\s)nocode(?:\\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);m(a);return{a:h.join(\"\").replace(/\\n$/,\"\"),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,\"pln\"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===\r\n\"string\")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b=\"pln\")}if((c=b.length>=5&&\"lang-\"===b.substring(0,5))&&!(o&&typeof o[1]===\"string\"))c=!1,b=\"src\";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),\r\nl=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=\"\"+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\\S\\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push([\"str\",/^(?:'''(?:[^'\\\\]|\\\\[\\S\\s]|''?(?=[^']))*(?:'''|$)|\"\"\"(?:[^\"\\\\]|\\\\[\\S\\s]|\"\"?(?=[^\"]))*(?:\"\"\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$))/,q,\"'\\\"\"]):a.multiLineStrings?m.push([\"str\",/^(?:'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,\r\nq,\"'\\\"`\"]):m.push([\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*(?:'|$)|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,q,\"\\\"'\"]);a.verbatimStrings&&e.push([\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,\"#\"]):m.push([\"com\",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,q,\"#\"]),e.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,q])):m.push([\"com\",/^#[^\\n\\r]*/,\r\nq,\"#\"]));a.cStyleComments&&(e.push([\"com\",/^\\/\\/[^\\n\\r]*/,q]),e.push([\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,q]));a.regexLiterals&&e.push([\"lang-regex\",/^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)/]);(h=a.types)&&e.push([\"typ\",h]);a=(\"\"+a.keywords).replace(/^ | $/g,\r\n\"\");a.length&&e.push([\"kwd\",RegExp(\"^(?:\"+a.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),q]);m.push([\"pln\",/^\\s+/,q,\" \\r\\n\\t\\xa0\"]);e.push([\"lit\",/^@[$_a-z][\\w$@]*/i,q],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,q],[\"pln\",/^[$_a-z][\\w$@]*/i,q],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,q,\"0123456789\"],[\"pln\",/^\\\\[\\S\\s]?/,q],[\"pun\",/^.[^\\s\\w\"-$'./@\\\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if(\"BR\"===a.nodeName)h(a),\r\na.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}\r\nfor(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\\s)nocode(?:\\s|$)/,t=/\\r\\n?|\\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);for(l=s.createElement(\"LI\");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute(\"value\",\r\nm);var r=s.createElement(\"OL\");r.className=\"linenums\";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className=\"L\"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode(\"\\xa0\")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn(\"cannot override language handler %s\",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\\s*</.test(m)?\"default-markup\":\"default-code\";return A[a]}function E(a){var m=\r\na.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\\bMSIE\\b/.test(navigator.userAgent),m=/\\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,\"\\r\"));i.nodeValue=\r\nj;var u=i.ownerDocument,v=u.createElement(\"SPAN\");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){\"console\"in window&&console.log(w&&w.stack?w.stack:w)}}var v=[\"break,continue,do,else,for,if,return,while\"],w=[[v,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\r\n\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],F=[w,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],G=[w,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"],\r\nH=[G,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"],w=[w,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"],I=[v,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],\r\nJ=[v,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],v=[v,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/,N=/\\S/,O=u({keywords:[F,H,w,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\"+\r\nI,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,[\"default-code\"]);k(x([],[[\"pln\",/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],[\"lang-\",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\S\\s]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),\r\n[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);k(x([[\"pln\",/^\\s+/,q,\" \\t\\r\\n\"],[\"atv\",/^(?:\"[^\"]*\"?|'[^']*'?)/,q,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^\\s\"'>]*(?:[^\\s\"'/>]|\\/(?=\\s)))/],[\"pun\",/^[/<->]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\"([^\"]+)\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*'([^']+)'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\s\"'>]+)/i],[\"lang-css\",/^style\\s*=\\s*\"([^\"]+)\"/i],[\"lang-css\",/^style\\s*=\\s*'([^']+)'/i],[\"lang-css\",\r\n/^style\\s*=\\s*([^\\s\"'>]+)/i]]),[\"in.tag\"]);k(x([],[[\"atv\",/^[\\S\\s]+/]]),[\"uq.val\"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);k(u({keywords:\"null,true,false\"}),[\"json\"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),[\"cs\"]);k(u({keywords:G,cStyleComments:!0}),[\"java\"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),[\"bsh\",\"csh\",\"sh\"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),\r\n[\"cv\",\"py\"]);k(u({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"perl\",\"pl\",\"pm\"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),[\"js\"]);k(u({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\",\r\nhashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]);k(x([],[[\"str\",/^[\\S\\s]+/]]),[\"regex\"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement(\"PRE\");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf(\"prettyprint\")>=0){var k=k.match(g),f,b;if(b=\r\n!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&\"CODE\"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName===\"pre\"||o.tagName===\"code\"||o.tagName===\"xmp\")&&o.className&&o.className.indexOf(\"prettyprint\")>=0){b=!0;break}b||((b=(b=n.className.match(/\\blinenums\\b(?::(\\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,\r\n250):a&&a()}for(var e=[document.getElementsByTagName(\"pre\"),document.getElementsByTagName(\"code\"),document.getElementsByTagName(\"xmp\")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",\r\nPR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\"}})();"
  },
  {
    "path": "servers/embed/assets/js/vendor/showdown.js",
    "content": "//\r\n// showdown.js -- A javascript port of Markdown.\r\n//\r\n// Copyright (c) 2007 John Fraser.\r\n//\r\n// Original Markdown Copyright (c) 2004-2005 John Gruber\r\n//   <http://daringfireball.net/projects/markdown/>\r\n//\r\n// Redistributable under a BSD-style open source license.\r\n// See license.txt for more information.\r\n//\r\n// The full source distribution is at:\r\n//\r\n//  \t\t\tA A L\r\n//\t\t\t\tT C A\r\n//\t\t\t\tT K B\r\n//\r\n//   <http://www.attacklab.net/>\r\n//\r\n\r\n//\r\n// Wherever possible, Showdown is a straight, line-by-line port\r\n// of the Perl version of Markdown.\r\n//\r\n// This is not a normal parser design; it's basically just a\r\n// series of string substitutions.  It's hard to read and\r\n// maintain this way,  but keeping Showdown close to the original\r\n// design makes it easier to port new features.\r\n//\r\n// More importantly, Showdown behaves like markdown.pl in most\r\n// edge cases.  So web applications can do client-side preview\r\n// in Javascript, and then build identical HTML on the server.\r\n//\r\n// This port needs the new RegExp functionality of ECMA 262,\r\n// 3rd Edition (i.e. Javascript 1.5).  Most modern web browsers\r\n// should do fine.  Even with the new regular expression features,\r\n// We do a lot of work to emulate Perl's regex functionality.\r\n// The tricky changes in this file mostly have the \"attacklab:\"\r\n// label.  Major or self-explanatory changes don't.\r\n//\r\n// Smart diff tools like Araxis Merge will be able to match up\r\n// this file with markdown.pl in a useful way.  A little tweaking\r\n// helps: in a copy of markdown.pl, replace \"#\" with \"//\" and\r\n// replace \"$text\" with \"text\".  Be sure to ignore whitespace\r\n// and line endings.\r\n//\r\n\r\n\r\n//\r\n// Showdown usage:\r\n//\r\n//   var text = \"Markdown *rocks*.\";\r\n//\r\n//   var converter = new Showdown.converter();\r\n//   var html = converter.makeHtml(text);\r\n//\r\n//   alert(html);\r\n//\r\n// Note: move the sample code to the bottom of this\r\n// file before uncommenting it.\r\n//\r\n\r\n\r\n//\r\n// Showdown namespace\r\n//\r\nvar Showdown = {};\r\n\r\n//\r\n// converter\r\n//\r\n// Wraps all \"globals\" so that the only thing\r\n// exposed is makeHtml().\r\n//\r\nShowdown.converter = function() {\r\n\r\n//\r\n// Globals:\r\n//\r\n\r\n// Global hashes, used by various utility routines\r\nvar g_urls;\r\nvar g_titles;\r\nvar g_html_blocks;\r\n\r\n// Used to track when we're inside an ordered or unordered list\r\n// (see _ProcessListItems() for details):\r\nvar g_list_level = 0;\r\n\r\n\r\nthis.makeHtml = function(text) {\r\n//\r\n// Main function. The order in which other subs are called here is\r\n// essential. Link and image substitutions need to happen before\r\n// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>\r\n// and <img> tags get encoded.\r\n//\r\n\r\n\t// Clear the global hashes. If we don't clear these, you get conflicts\r\n\t// from other articles when generating a page which contains more than\r\n\t// one article (e.g. an index page that shows the N most recent\r\n\t// articles):\r\n\tg_urls = new Array();\r\n\tg_titles = new Array();\r\n\tg_html_blocks = new Array();\r\n\r\n\t// attacklab: Replace ~ with ~T\r\n\t// This lets us use tilde as an escape char to avoid md5 hashes\r\n\t// The choice of character is arbitray; anything that isn't\r\n    // magic in Markdown will work.\r\n\ttext = text.replace(/~/g,\"~T\");\r\n\r\n\t// attacklab: Replace $ with ~D\r\n\t// RegExp interprets $ as a special character\r\n\t// when it's in a replacement string\r\n\ttext = text.replace(/\\$/g,\"~D\");\r\n\r\n\t// Standardize line endings\r\n\ttext = text.replace(/\\r\\n/g,\"\\n\"); // DOS to Unix\r\n\ttext = text.replace(/\\r/g,\"\\n\"); // Mac to Unix\r\n\r\n\t// Make sure text begins and ends with a couple of newlines:\r\n\ttext = \"\\n\\n\" + text + \"\\n\\n\";\r\n\r\n\t// Convert all tabs to spaces.\r\n\ttext = _Detab(text);\r\n\r\n\t// Strip any lines consisting only of spaces and tabs.\r\n\t// This makes subsequent regexen easier to write, because we can\r\n\t// match consecutive blank lines with /\\n+/ instead of something\r\n\t// contorted like /[ \\t]*\\n+/ .\r\n\ttext = text.replace(/^[ \\t]+$/mg,\"\");\r\n\r\n\t// Handle github codeblocks prior to running HashHTML so that\r\n\t// HTML contained within the codeblock gets escaped propertly\r\n\ttext = _DoGithubCodeBlocks(text);\r\n\r\n\t// Turn block-level HTML blocks into hash entries\r\n\ttext = _HashHTMLBlocks(text);\r\n\r\n\t// Strip link definitions, store in hashes.\r\n\ttext = _StripLinkDefinitions(text);\r\n\r\n\ttext = _RunBlockGamut(text);\r\n\r\n\ttext = _UnescapeSpecialChars(text);\r\n\r\n\t// attacklab: Restore dollar signs\r\n\ttext = text.replace(/~D/g,\"$$\");\r\n\r\n\t// attacklab: Restore tildes\r\n\ttext = text.replace(/~T/g,\"~\");\r\n\r\n\treturn text;\r\n};\r\n\r\n\r\nvar _StripLinkDefinitions = function(text) {\r\n//\r\n// Strips link definitions from text, stores the URLs and titles in\r\n// hash references.\r\n//\r\n\r\n\t// Link defs are in the form: ^[id]: url \"optional title\"\r\n\r\n\t/*\r\n\t\tvar text = text.replace(/\r\n\t\t\t\t^[ ]{0,3}\\[(.+)\\]:  // id = $1  attacklab: g_tab_width - 1\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t  \\n?\t\t\t\t// maybe *one* newline\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t<?(\\S+?)>?\t\t\t// url = $2\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t  \\n?\t\t\t\t// maybe one newline\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t(?:\r\n\t\t\t\t  (\\n*)\t\t\t\t// any lines skipped = $3 attacklab: lookbehind removed\r\n\t\t\t\t  [\"(]\r\n\t\t\t\t  (.+?)\t\t\t\t// title = $4\r\n\t\t\t\t  [\")]\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t)?\t\t\t\t\t// title is optional\r\n\t\t\t\t(?:\\n+|$)\r\n\t\t\t  /gm,\r\n\t\t\t  function(){...});\r\n\t*/\r\n\tvar text = text.replace(/^[ ]{0,3}\\[(.+)\\]:[ \\t]*\\n?[ \\t]*<?(\\S+?)>?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"(](.+?)[\")][ \\t]*)?(?:\\n+|\\Z)/gm,\r\n\t\tfunction (wholeMatch,m1,m2,m3,m4) {\r\n\t\t\tm1 = m1.toLowerCase();\r\n\t\t\tg_urls[m1] = _EncodeAmpsAndAngles(m2);  // Link IDs are case-insensitive\r\n\t\t\tif (m3) {\r\n\t\t\t\t// Oops, found blank lines, so it's not a title.\r\n\t\t\t\t// Put back the parenthetical statement we stole.\r\n\t\t\t\treturn m3+m4;\r\n\t\t\t} else if (m4) {\r\n\t\t\t\tg_titles[m1] = m4.replace(/\"/g,\"&quot;\");\r\n\t\t\t}\r\n\r\n\t\t\t// Completely remove the definition from the text\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t);\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _HashHTMLBlocks = function(text) {\r\n\t// attacklab: Double up blank lines to reduce lookaround\r\n\ttext = text.replace(/\\n/g,\"\\n\\n\");\r\n\r\n\t// Hashify HTML blocks:\r\n\t// We only want to do this for block-level HTML tags, such as headers,\r\n\t// lists, and tables. That's because we still want to wrap <p>s around\r\n\t// \"paragraphs\" that are wrapped in non-block-level tags, such as anchors,\r\n\t// phrase emphasis, and spans. The list of tags we're looking for is\r\n\t// hard-coded:\r\n\tvar block_tags_a = \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside\";\r\n\tvar block_tags_b = \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside\";\r\n\r\n\t// First, look for nested blocks, e.g.:\r\n\t//   <div>\r\n\t//     <div>\r\n\t//     tags for inner block must be indented.\r\n\t//     </div>\r\n\t//   </div>\r\n\t//\r\n\t// The outermost tags must start at the left margin for this to match, and\r\n\t// the inner nested divs must be indented.\r\n\t// We need to do this before the next, more liberal match, because the next\r\n\t// match will start at the first `<div>` and stop at the first `</div>`.\r\n\r\n\t// attacklab: This regex can be expensive when it fails.\r\n\t/*\r\n\t\tvar text = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t^\t\t\t\t\t// start of line  (with /m)\r\n\t\t\t<($block_tags_a)\t// start tag = $2\r\n\t\t\t\\b\t\t\t\t\t// word break\r\n\t\t\t\t\t\t\t\t// attacklab: hack around khtml/pcre bug...\r\n\t\t\t[^\\r]*?\\n\t\t\t// any number of lines, minimally matching\r\n\t\t\t</\\2>\t\t\t\t// the matching end tag\r\n\t\t\t[ \\t]*\t\t\t\t// trailing spaces/tabs\r\n\t\t\t(?=\\n+)\t\t\t\t// followed by a newline\r\n\t\t)\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\r\n\t\t/gm,function(){...}};\r\n\t*/\r\n\ttext = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\\b[^\\r]*?\\n<\\/\\2>[ \\t]*(?=\\n+))/gm,hashElement);\r\n\r\n\t//\r\n\t// Now match more liberally, simply from `\\n<tag>` to `</tag>\\n`\r\n\t//\r\n\r\n\t/*\r\n\t\tvar text = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t^\t\t\t\t\t// start of line  (with /m)\r\n\t\t\t<($block_tags_b)\t// start tag = $2\r\n\t\t\t\\b\t\t\t\t\t// word break\r\n\t\t\t\t\t\t\t\t// attacklab: hack around khtml/pcre bug...\r\n\t\t\t[^\\r]*?\t\t\t\t// any number of lines, minimally matching\r\n\t\t\t.*</\\2>\t\t\t\t// the matching end tag\r\n\t\t\t[ \\t]*\t\t\t\t// trailing spaces/tabs\r\n\t\t\t(?=\\n+)\t\t\t\t// followed by a newline\r\n\t\t)\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\r\n\t\t/gm,function(){...}};\r\n\t*/\r\n\ttext = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\\b[^\\r]*?.*<\\/\\2>[ \\t]*(?=\\n+)\\n)/gm,hashElement);\r\n\r\n\t// Special case just for <hr />. It was easier to make a special case than\r\n\t// to make the other regex more complicated.\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t\\n\\n\t\t\t\t// Starting after a blank line\r\n\t\t\t[ ]{0,3}\r\n\t\t\t(<(hr)\t\t\t\t// start tag = $2\r\n\t\t\t\\b\t\t\t\t\t// word break\r\n\t\t\t([^<>])*?\t\t\t//\r\n\t\t\t\\/?>)\t\t\t\t// the matching end tag\r\n\t\t\t[ \\t]*\r\n\t\t\t(?=\\n{2,})\t\t\t// followed by a blank line\r\n\t\t)\r\n\t\t/g,hashElement);\r\n\t*/\r\n\ttext = text.replace(/(\\n[ ]{0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,hashElement);\r\n\r\n\t// Special case for standalone HTML comments:\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t\\n\\n\t\t\t\t// Starting after a blank line\r\n\t\t\t[ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\r\n\t\t\t<!\r\n\t\t\t(--[^\\r]*?--\\s*)+\r\n\t\t\t>\r\n\t\t\t[ \\t]*\r\n\t\t\t(?=\\n{2,})\t\t\t// followed by a blank line\r\n\t\t)\r\n\t\t/g,hashElement);\r\n\t*/\r\n\ttext = text.replace(/(\\n\\n[ ]{0,3}<!(--[^\\r]*?--\\s*)+>[ \\t]*(?=\\n{2,}))/g,hashElement);\r\n\r\n\t// PHP and ASP-style processor instructions (<?...?> and <%...%>)\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(?:\r\n\t\t\t\\n\\n\t\t\t\t// Starting after a blank line\r\n\t\t)\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t[ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\r\n\t\t\t(?:\r\n\t\t\t\t<([?%])\t\t\t// $2\r\n\t\t\t\t[^\\r]*?\r\n\t\t\t\t\\2>\r\n\t\t\t)\r\n\t\t\t[ \\t]*\r\n\t\t\t(?=\\n{2,})\t\t\t// followed by a blank line\r\n\t\t)\r\n\t\t/g,hashElement);\r\n\t*/\r\n\ttext = text.replace(/(?:\\n\\n)([ ]{0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,hashElement);\r\n\r\n\t// attacklab: Undo double lines (see comment at top of this function)\r\n\ttext = text.replace(/\\n\\n/g,\"\\n\");\r\n\treturn text;\r\n}\r\n\r\nvar hashElement = function(wholeMatch,m1) {\r\n\tvar blockText = m1;\r\n\r\n\t// Undo double lines\r\n\tblockText = blockText.replace(/\\n\\n/g,\"\\n\");\r\n\tblockText = blockText.replace(/^\\n/,\"\");\r\n\r\n\t// strip trailing blank lines\r\n\tblockText = blockText.replace(/\\n+$/g,\"\");\r\n\r\n\t// Replace the element text with a marker (\"~KxK\" where x is its key)\r\n\tblockText = \"\\n\\n~K\" + (g_html_blocks.push(blockText)-1) + \"K\\n\\n\";\r\n\r\n\treturn blockText;\r\n};\r\n\r\nvar _RunBlockGamut = function(text) {\r\n//\r\n// These are all the transformations that form block-level\r\n// tags like paragraphs, headers, and list items.\r\n//\r\n\ttext = _DoHeaders(text);\r\n\r\n\t// Do Horizontal Rules:\r\n\tvar key = hashBlock(\"<hr />\");\r\n\ttext = text.replace(/^[ ]{0,2}([ ]?\\*[ ]?){3,}[ \\t]*$/gm,key);\r\n\ttext = text.replace(/^[ ]{0,2}([ ]?\\-[ ]?){3,}[ \\t]*$/gm,key);\r\n\ttext = text.replace(/^[ ]{0,2}([ ]?\\_[ ]?){3,}[ \\t]*$/gm,key);\r\n\r\n\ttext = _DoLists(text);\r\n\ttext = _DoCodeBlocks(text);\r\n\ttext = _DoBlockQuotes(text);\r\n\r\n\t// We already ran _HashHTMLBlocks() before, in Markdown(), but that\r\n\t// was to escape raw HTML in the original Markdown source. This time,\r\n\t// we're escaping the markup we've just created, so that we don't wrap\r\n\t// <p> tags around block-level tags.\r\n\ttext = _HashHTMLBlocks(text);\r\n\ttext = _FormParagraphs(text);\r\n\r\n\treturn text;\r\n};\r\n\r\n\r\nvar _RunSpanGamut = function(text) {\r\n//\r\n// These are all the transformations that occur *within* block-level\r\n// tags like paragraphs, headers, and list items.\r\n//\r\n\r\n\ttext = _DoCodeSpans(text);\r\n\ttext = _EscapeSpecialCharsWithinTagAttributes(text);\r\n\ttext = _EncodeBackslashEscapes(text);\r\n\r\n\t// Process anchor and image tags. Images must come first,\r\n\t// because ![foo][f] looks like an anchor.\r\n\ttext = _DoImages(text);\r\n\ttext = _DoAnchors(text);\r\n\r\n\t// Make links out of things like `<http://example.com/>`\r\n\t// Must come after _DoAnchors(), because you can use < and >\r\n\t// delimiters in inline links like [this](<url>).\r\n\ttext = _DoAutoLinks(text);\r\n\ttext = _EncodeAmpsAndAngles(text);\r\n\ttext = _DoItalicsAndBold(text);\r\n\r\n\t// Do hard breaks:\r\n\ttext = text.replace(/  +\\n/g,\" <br />\\n\");\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _EscapeSpecialCharsWithinTagAttributes = function(text) {\r\n//\r\n// Within tags -- meaning between < and > -- encode [\\ ` * _] so they\r\n// don't conflict with their use in Markdown for code, italics and strong.\r\n//\r\n\r\n\t// Build a regex to find HTML tags and comments.  See Friedl's\r\n\t// \"Mastering Regular Expressions\", 2nd Ed., pp. 200-201.\r\n\tvar regex = /(<[a-z\\/!$](\"[^\"]*\"|'[^']*'|[^'\">])*>|<!(--.*?--\\s*)+>)/gi;\r\n\r\n\ttext = text.replace(regex, function(wholeMatch) {\r\n\t\tvar tag = wholeMatch.replace(/(.)<\\/?code>(?=.)/g,\"$1`\");\r\n\t\ttag = escapeCharacters(tag,\"\\\\`*_\");\r\n\t\treturn tag;\r\n\t});\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _DoAnchors = function(text) {\r\n//\r\n// Turn Markdown link shortcuts into XHTML <a> tags.\r\n//\r\n\t//\r\n\t// First, handle reference-style links: [link text] [id]\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t\\[\r\n\t\t\t(\r\n\t\t\t\t(?:\r\n\t\t\t\t\t\\[[^\\]]*\\]\t\t// allow brackets nested one level\r\n\t\t\t\t\t|\r\n\t\t\t\t\t[^\\[]\t\t\t// or anything else\r\n\t\t\t\t)*\r\n\t\t\t)\r\n\t\t\t\\]\r\n\r\n\t\t\t[ ]?\t\t\t\t\t// one optional space\r\n\t\t\t(?:\\n[ ]*)?\t\t\t\t// one optional newline followed by spaces\r\n\r\n\t\t\t\\[\r\n\t\t\t(.*?)\t\t\t\t\t// id = $3\r\n\t\t\t\\]\r\n\t\t)()()()()\t\t\t\t\t// pad remaining backreferences\r\n\t\t/g,_DoAnchors_callback);\r\n\t*/\r\n\ttext = text.replace(/(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,writeAnchorTag);\r\n\r\n\t//\r\n\t// Next, inline-style links: [link text](url \"optional title\")\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t(\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t\t\\[\r\n\t\t\t\t(\r\n\t\t\t\t\t(?:\r\n\t\t\t\t\t\t\\[[^\\]]*\\]\t// allow brackets nested one level\r\n\t\t\t\t\t|\r\n\t\t\t\t\t[^\\[\\]]\t\t\t// or anything else\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t\t\\]\r\n\t\t\t\\(\t\t\t\t\t\t// literal paren\r\n\t\t\t[ \\t]*\r\n\t\t\t()\t\t\t\t\t\t// no id, so leave $3 empty\r\n\t\t\t<?(.*?)>?\t\t\t\t// href = $4\r\n\t\t\t[ \\t]*\r\n\t\t\t(\t\t\t\t\t\t// $5\r\n\t\t\t\t(['\"])\t\t\t\t// quote char = $6\r\n\t\t\t\t(.*?)\t\t\t\t// Title = $7\r\n\t\t\t\t\\6\t\t\t\t\t// matching quote\r\n\t\t\t\t[ \\t]*\t\t\t\t// ignore any spaces/tabs between closing quote and )\r\n\t\t\t)?\t\t\t\t\t\t// title is optional\r\n\t\t\t\\)\r\n\t\t)\r\n\t\t/g,writeAnchorTag);\r\n\t*/\r\n\ttext = text.replace(/(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]\\([ \\t]*()<?(.*?)>?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,writeAnchorTag);\r\n\r\n\t//\r\n\t// Last, handle reference-style shortcuts: [link text]\r\n\t// These must come last in case you've also got [link test][1]\r\n\t// or [link test](/foo)\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t \t\t\t\t\t// wrap whole match in $1\r\n\t\t\t\\[\r\n\t\t\t([^\\[\\]]+)\t\t\t\t// link text = $2; can't contain '[' or ']'\r\n\t\t\t\\]\r\n\t\t)()()()()()\t\t\t\t\t// pad rest of backreferences\r\n\t\t/g, writeAnchorTag);\r\n\t*/\r\n\ttext = text.replace(/(\\[([^\\[\\]]+)\\])()()()()()/g, writeAnchorTag);\r\n\r\n\treturn text;\r\n}\r\n\r\nvar writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {\r\n\tif (m7 == undefined) m7 = \"\";\r\n\tvar whole_match = m1;\r\n\tvar link_text   = m2;\r\n\tvar link_id\t = m3.toLowerCase();\r\n\tvar url\t\t= m4;\r\n\tvar title\t= m7;\r\n\r\n\tif (url == \"\") {\r\n\t\tif (link_id == \"\") {\r\n\t\t\t// lower-case and turn embedded newlines into spaces\r\n\t\t\tlink_id = link_text.toLowerCase().replace(/ ?\\n/g,\" \");\r\n\t\t}\r\n\t\turl = \"#\"+link_id;\r\n\r\n\t\tif (g_urls[link_id] != undefined) {\r\n\t\t\turl = g_urls[link_id];\r\n\t\t\tif (g_titles[link_id] != undefined) {\r\n\t\t\t\ttitle = g_titles[link_id];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (whole_match.search(/\\(\\s*\\)$/m)>-1) {\r\n\t\t\t\t// Special case for explicit empty url\r\n\t\t\t\turl = \"\";\r\n\t\t\t} else {\r\n\t\t\t\treturn whole_match;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\turl = escapeCharacters(url,\"*_\");\r\n\tvar result = \"<a href=\\\"\" + url + \"\\\"\";\r\n\r\n\tif (title != \"\") {\r\n\t\ttitle = title.replace(/\"/g,\"&quot;\");\r\n\t\ttitle = escapeCharacters(title,\"*_\");\r\n\t\tresult +=  \" title=\\\"\" + title + \"\\\"\";\r\n\t}\r\n\r\n\tresult += \">\" + link_text + \"</a>\";\r\n\r\n\treturn result;\r\n}\r\n\r\n\r\nvar _DoImages = function(text) {\r\n//\r\n// Turn Markdown image shortcuts into <img> tags.\r\n//\r\n\r\n\t//\r\n\t// First, handle reference-style labeled images: ![alt text][id]\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t!\\[\r\n\t\t\t(.*?)\t\t\t\t// alt text = $2\r\n\t\t\t\\]\r\n\r\n\t\t\t[ ]?\t\t\t\t// one optional space\r\n\t\t\t(?:\\n[ ]*)?\t\t\t// one optional newline followed by spaces\r\n\r\n\t\t\t\\[\r\n\t\t\t(.*?)\t\t\t\t// id = $3\r\n\t\t\t\\]\r\n\t\t)()()()()\t\t\t\t// pad rest of backreferences\r\n\t\t/g,writeImageTag);\r\n\t*/\r\n\ttext = text.replace(/(!\\[(.*?)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,writeImageTag);\r\n\r\n\t//\r\n\t// Next, handle inline images:  ![alt text](url \"optional title\")\r\n\t// Don't forget: encode * and _\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t!\\[\r\n\t\t\t(.*?)\t\t\t\t// alt text = $2\r\n\t\t\t\\]\r\n\t\t\t\\s?\t\t\t\t\t// One optional whitespace character\r\n\t\t\t\\(\t\t\t\t\t// literal paren\r\n\t\t\t[ \\t]*\r\n\t\t\t()\t\t\t\t\t// no id, so leave $3 empty\r\n\t\t\t<?(\\S+?)>?\t\t\t// src url = $4\r\n\t\t\t[ \\t]*\r\n\t\t\t(\t\t\t\t\t// $5\r\n\t\t\t\t(['\"])\t\t\t// quote char = $6\r\n\t\t\t\t(.*?)\t\t\t// title = $7\r\n\t\t\t\t\\6\t\t\t\t// matching quote\r\n\t\t\t\t[ \\t]*\r\n\t\t\t)?\t\t\t\t\t// title is optional\r\n\t\t\\)\r\n\t\t)\r\n\t\t/g,writeImageTag);\r\n\t*/\r\n\ttext = text.replace(/(!\\[(.*?)\\]\\s?\\([ \\t]*()<?(\\S+?)>?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,writeImageTag);\r\n\r\n\treturn text;\r\n}\r\n\r\nvar writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {\r\n\tvar whole_match = m1;\r\n\tvar alt_text   = m2;\r\n\tvar link_id\t = m3.toLowerCase();\r\n\tvar url\t\t= m4;\r\n\tvar title\t= m7;\r\n\r\n\tif (!title) title = \"\";\r\n\r\n\tif (url == \"\") {\r\n\t\tif (link_id == \"\") {\r\n\t\t\t// lower-case and turn embedded newlines into spaces\r\n\t\t\tlink_id = alt_text.toLowerCase().replace(/ ?\\n/g,\" \");\r\n\t\t}\r\n\t\turl = \"#\"+link_id;\r\n\r\n\t\tif (g_urls[link_id] != undefined) {\r\n\t\t\turl = g_urls[link_id];\r\n\t\t\tif (g_titles[link_id] != undefined) {\r\n\t\t\t\ttitle = g_titles[link_id];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn whole_match;\r\n\t\t}\r\n\t}\r\n\r\n\talt_text = alt_text.replace(/\"/g,\"&quot;\");\r\n\turl = escapeCharacters(url,\"*_\");\r\n\tvar result = \"<img src=\\\"\" + url + \"\\\" alt=\\\"\" + alt_text + \"\\\"\";\r\n\r\n\t// attacklab: Markdown.pl adds empty title attributes to images.\r\n\t// Replicate this bug.\r\n\r\n\t//if (title != \"\") {\r\n\t\ttitle = title.replace(/\"/g,\"&quot;\");\r\n\t\ttitle = escapeCharacters(title,\"*_\");\r\n\t\tresult +=  \" title=\\\"\" + title + \"\\\"\";\r\n\t//}\r\n\r\n\tresult += \" />\";\r\n\r\n\treturn result;\r\n}\r\n\r\n\r\nvar _DoHeaders = function(text) {\r\n\r\n\t// Setext-style headers:\r\n\t//\tHeader 1\r\n\t//\t========\r\n\t//\r\n\t//\tHeader 2\r\n\t//\t--------\r\n\t//\r\n\ttext = text.replace(/^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\r\n\t\tfunction(wholeMatch,m1){return hashBlock('<h1 id=\"' + headerId(m1) + '\">' + _RunSpanGamut(m1) + \"</h1>\");});\r\n\r\n\ttext = text.replace(/^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm,\r\n\t\tfunction(matchFound,m1){return hashBlock('<h2 id=\"' + headerId(m1) + '\">' + _RunSpanGamut(m1) + \"</h2>\");});\r\n\r\n\t// atx-style headers:\r\n\t//  # Header 1\r\n\t//  ## Header 2\r\n\t//  ## Header 2 with closing hashes ##\r\n\t//  ...\r\n\t//  ###### Header 6\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t^(\\#{1,6})\t\t\t\t// $1 = string of #'s\r\n\t\t\t[ \\t]*\r\n\t\t\t(.+?)\t\t\t\t\t// $2 = Header text\r\n\t\t\t[ \\t]*\r\n\t\t\t\\#*\t\t\t\t\t\t// optional closing #'s (not counted)\r\n\t\t\t\\n+\r\n\t\t/gm, function() {...});\r\n\t*/\r\n\r\n\ttext = text.replace(/^(\\#{1,6})[ \\t]*(.+?)[ \\t]*\\#*\\n+/gm,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar h_level = m1.length;\r\n\t\t\treturn hashBlock(\"<h\" + h_level + ' id=\"' + headerId(m2) + '\">' + _RunSpanGamut(m2) + \"</h\" + h_level + \">\");\r\n\t\t});\r\n\r\n\tfunction headerId(m) {\r\n\t\treturn m.replace(/[^\\w]/g, '').toLowerCase();\r\n\t}\r\n\treturn text;\r\n}\r\n\r\n// This declaration keeps Dojo compressor from outputting garbage:\r\nvar _ProcessListItems;\r\n\r\nvar _DoLists = function(text) {\r\n//\r\n// Form HTML ordered (numbered) and unordered (bulleted) lists.\r\n//\r\n\r\n\t// attacklab: add sentinel to hack around khtml/safari bug:\r\n\t// http://bugs.webkit.org/show_bug.cgi?id=11231\r\n\ttext += \"~0\";\r\n\r\n\t// Re-usable pattern to match any entirel ul or ol list:\r\n\r\n\t/*\r\n\t\tvar whole_list = /\r\n\t\t(\t\t\t\t\t\t\t\t\t// $1 = whole list\r\n\t\t\t(\t\t\t\t\t\t\t\t// $2\r\n\t\t\t\t[ ]{0,3}\t\t\t\t\t// attacklab: g_tab_width - 1\r\n\t\t\t\t([*+-]|\\d+[.])\t\t\t\t// $3 = first list item marker\r\n\t\t\t\t[ \\t]+\r\n\t\t\t)\r\n\t\t\t[^\\r]+?\r\n\t\t\t(\t\t\t\t\t\t\t\t// $4\r\n\t\t\t\t~0\t\t\t\t\t\t\t// sentinel for workaround; should be $\r\n\t\t\t|\r\n\t\t\t\t\\n{2,}\r\n\t\t\t\t(?=\\S)\r\n\t\t\t\t(?!\t\t\t\t\t\t\t// Negative lookahead for another list item marker\r\n\t\t\t\t\t[ \\t]*\r\n\t\t\t\t\t(?:[*+-]|\\d+[.])[ \\t]+\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t)/g\r\n\t*/\r\n\tvar whole_list = /^(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\r\n\r\n\tif (g_list_level) {\r\n\t\ttext = text.replace(whole_list,function(wholeMatch,m1,m2) {\r\n\t\t\tvar list = m1;\r\n\t\t\tvar list_type = (m2.search(/[*+-]/g)>-1) ? \"ul\" : \"ol\";\r\n\r\n\t\t\t// Turn double returns into triple returns, so that we can make a\r\n\t\t\t// paragraph for the last item in a list, if necessary:\r\n\t\t\tlist = list.replace(/\\n{2,}/g,\"\\n\\n\\n\");;\r\n\t\t\tvar result = _ProcessListItems(list);\r\n\r\n\t\t\t// Trim any trailing whitespace, to put the closing `</$list_type>`\r\n\t\t\t// up on the preceding line, to get it past the current stupid\r\n\t\t\t// HTML block parser. This is a hack to work around the terrible\r\n\t\t\t// hack that is the HTML block parser.\r\n\t\t\tresult = result.replace(/\\s+$/,\"\");\r\n\t\t\tresult = \"<\"+list_type+\">\" + result + \"</\"+list_type+\">\\n\";\r\n\t\t\treturn result;\r\n\t\t});\r\n\t} else {\r\n\t\twhole_list = /(\\n\\n|^\\n?)(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/g;\r\n\t\ttext = text.replace(whole_list,function(wholeMatch,m1,m2,m3) {\r\n\t\t\tvar runup = m1;\r\n\t\t\tvar list = m2;\r\n\r\n\t\t\tvar list_type = (m3.search(/[*+-]/g)>-1) ? \"ul\" : \"ol\";\r\n\t\t\t// Turn double returns into triple returns, so that we can make a\r\n\t\t\t// paragraph for the last item in a list, if necessary:\r\n\t\t\tvar list = list.replace(/\\n{2,}/g,\"\\n\\n\\n\");;\r\n\t\t\tvar result = _ProcessListItems(list);\r\n\t\t\tresult = runup + \"<\"+list_type+\">\\n\" + result + \"</\"+list_type+\">\\n\";\r\n\t\t\treturn result;\r\n\t\t});\r\n\t}\r\n\r\n\t// attacklab: strip sentinel\r\n\ttext = text.replace(/~0/,\"\");\r\n\r\n\treturn text;\r\n}\r\n\r\n_ProcessListItems = function(list_str) {\r\n//\r\n//  Process the contents of a single ordered or unordered list, splitting it\r\n//  into individual list items.\r\n//\r\n\t// The $g_list_level global keeps track of when we're inside a list.\r\n\t// Each time we enter a list, we increment it; when we leave a list,\r\n\t// we decrement. If it's zero, we're not in a list anymore.\r\n\t//\r\n\t// We do this because when we're not inside a list, we want to treat\r\n\t// something like this:\r\n\t//\r\n\t//    I recommend upgrading to version\r\n\t//    8. Oops, now this line is treated\r\n\t//    as a sub-list.\r\n\t//\r\n\t// As a single paragraph, despite the fact that the second line starts\r\n\t// with a digit-period-space sequence.\r\n\t//\r\n\t// Whereas when we're inside a list (or sub-list), that line will be\r\n\t// treated as the start of a sub-list. What a kludge, huh? This is\r\n\t// an aspect of Markdown's syntax that's hard to parse perfectly\r\n\t// without resorting to mind-reading. Perhaps the solution is to\r\n\t// change the syntax rules such that sub-lists must start with a\r\n\t// starting cardinal number; e.g. \"1.\" or \"a.\".\r\n\r\n\tg_list_level++;\r\n\r\n\t// trim trailing blank lines:\r\n\tlist_str = list_str.replace(/\\n{2,}$/,\"\\n\");\r\n\r\n\t// attacklab: add sentinel to emulate \\z\r\n\tlist_str += \"~0\";\r\n\r\n\t/*\r\n\t\tlist_str = list_str.replace(/\r\n\t\t\t(\\n)?\t\t\t\t\t\t\t// leading line = $1\r\n\t\t\t(^[ \\t]*)\t\t\t\t\t\t// leading whitespace = $2\r\n\t\t\t([*+-]|\\d+[.]) [ \\t]+\t\t\t// list marker = $3\r\n\t\t\t([^\\r]+?\t\t\t\t\t\t// list item text   = $4\r\n\t\t\t(\\n{1,2}))\r\n\t\t\t(?= \\n* (~0 | \\2 ([*+-]|\\d+[.]) [ \\t]+))\r\n\t\t/gm, function(){...});\r\n\t*/\r\n\tlist_str = list_str.replace(/(\\n)?(^[ \\t]*)([*+-]|\\d+[.])[ \\t]+([^\\r]+?(\\n{1,2}))(?=\\n*(~0|\\2([*+-]|\\d+[.])[ \\t]+))/gm,\r\n\t\tfunction(wholeMatch,m1,m2,m3,m4){\r\n\t\t\tvar item = m4;\r\n\t\t\tvar leading_line = m1;\r\n\t\t\tvar leading_space = m2;\r\n\r\n\t\t\tif (leading_line || (item.search(/\\n{2,}/)>-1)) {\r\n\t\t\t\titem = _RunBlockGamut(_Outdent(item));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Recursion for sub-lists:\r\n\t\t\t\titem = _DoLists(_Outdent(item));\r\n\t\t\t\titem = item.replace(/\\n$/,\"\"); // chomp(item)\r\n\t\t\t\titem = _RunSpanGamut(item);\r\n\t\t\t}\r\n\r\n\t\t\treturn  \"<li>\" + item + \"</li>\\n\";\r\n\t\t}\r\n\t);\r\n\r\n\t// attacklab: strip sentinel\r\n\tlist_str = list_str.replace(/~0/g,\"\");\r\n\r\n\tg_list_level--;\r\n\treturn list_str;\r\n}\r\n\r\n\r\nvar _DoCodeBlocks = function(text) {\r\n//\r\n//  Process Markdown `<pre><code>` blocks.\r\n//\r\n\r\n\t/*\r\n\t\ttext = text.replace(text,\r\n\t\t\t/(?:\\n\\n|^)\r\n\t\t\t(\t\t\t\t\t\t\t\t// $1 = the code block -- one or more lines, starting with a space/tab\r\n\t\t\t\t(?:\r\n\t\t\t\t\t(?:[ ]{4}|\\t)\t\t\t// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width\r\n\t\t\t\t\t.*\\n+\r\n\t\t\t\t)+\r\n\t\t\t)\r\n\t\t\t(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))\t// attacklab: g_tab_width\r\n\t\t/g,function(){...});\r\n\t*/\r\n\r\n\t// attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\r\n\ttext += \"~0\";\r\n\r\n\ttext = text.replace(/(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))/g,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar codeblock = m1;\r\n\t\t\tvar nextChar = m2;\r\n\r\n\t\t\tcodeblock = _EncodeCode( _Outdent(codeblock));\r\n\t\t\tcodeblock = _Detab(codeblock);\r\n\t\t\tcodeblock = codeblock.replace(/^\\n+/g,\"\"); // trim leading newlines\r\n\t\t\tcodeblock = codeblock.replace(/\\n+$/g,\"\"); // trim trailing whitespace\r\n\r\n\t\t\tcodeblock = \"<pre><code>\" + codeblock + \"\\n</code></pre>\";\r\n\r\n\t\t\treturn hashBlock(codeblock) + nextChar;\r\n\t\t}\r\n\t);\r\n\r\n\t// attacklab: strip sentinel\r\n\ttext = text.replace(/~0/,\"\");\r\n\r\n\treturn text;\r\n};\r\n\r\nvar _DoGithubCodeBlocks = function(text) {\r\n//\r\n//  Process Github-style code blocks\r\n//  Example:\r\n//  ```ruby\r\n//  def hello_world(x)\r\n//    puts \"Hello, #{x}\"\r\n//  end\r\n//  ```\r\n//\r\n\r\n\r\n\t// attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\r\n\ttext += \"~0\";\r\n\r\n\ttext = text.replace(/(?:^|\\n)```(.*)\\n([\\s\\S]*?)\\n```/g,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar language = m1;\r\n\t\t\tvar codeblock = m2;\r\n\r\n\t\t\tcodeblock = _EncodeCode(codeblock);\r\n\t\t\tcodeblock = _Detab(codeblock);\r\n\t\t\tcodeblock = codeblock.replace(/^\\n+/g,\"\"); // trim leading newlines\r\n\t\t\tcodeblock = codeblock.replace(/\\n+$/g,\"\"); // trim trailing whitespace\r\n\r\n\t\t\tcodeblock = \"<pre class=\\\"prettyprint\" + (language ? \" lang-\" + language : \"\") + \"\\\">\" + codeblock + \"\\n</pre>\";\r\n\r\n\t\t\treturn hashBlock(codeblock);\r\n\t\t}\r\n\t);\r\n\r\n\t// attacklab: strip sentinel\r\n\ttext = text.replace(/~0/,\"\");\r\n\r\n\treturn text;\r\n}\r\n\r\nvar hashBlock = function(text) {\r\n\ttext = text.replace(/(^\\n+|\\n+$)/g,\"\");\r\n\treturn \"\\n\\n~K\" + (g_html_blocks.push(text)-1) + \"K\\n\\n\";\r\n}\r\n\r\nvar _DoCodeSpans = function(text) {\r\n//\r\n//   *  Backtick quotes are used for <code></code> spans.\r\n//\r\n//   *  You can use multiple backticks as the delimiters if you want to\r\n//\t include literal backticks in the code span. So, this input:\r\n//\r\n//\t\t Just type ``foo `bar` baz`` at the prompt.\r\n//\r\n//\t   Will translate to:\r\n//\r\n//\t\t <p>Just type <code>foo `bar` baz</code> at the prompt.</p>\r\n//\r\n//\tThere's no arbitrary limit to the number of backticks you\r\n//\tcan use as delimters. If you need three consecutive backticks\r\n//\tin your code, use four for delimiters, etc.\r\n//\r\n//  *  You can use spaces to get literal backticks at the edges:\r\n//\r\n//\t\t ... type `` `bar` `` ...\r\n//\r\n//\t   Turns to:\r\n//\r\n//\t\t ... type <code>`bar`</code> ...\r\n//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t(^|[^\\\\])\t\t\t\t\t// Character before opening ` can't be a backslash\r\n\t\t\t(`+)\t\t\t\t\t\t// $2 = Opening run of `\r\n\t\t\t(\t\t\t\t\t\t\t// $3 = The code block\r\n\t\t\t\t[^\\r]*?\r\n\t\t\t\t[^`]\t\t\t\t\t// attacklab: work around lack of lookbehind\r\n\t\t\t)\r\n\t\t\t\\2\t\t\t\t\t\t\t// Matching closer\r\n\t\t\t(?!`)\r\n\t\t/gm, function(){...});\r\n\t*/\r\n\r\n\ttext = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\r\n\t\tfunction(wholeMatch,m1,m2,m3,m4) {\r\n\t\t\tvar c = m3;\r\n\t\t\tc = c.replace(/^([ \\t]*)/g,\"\");\t// leading whitespace\r\n\t\t\tc = c.replace(/[ \\t]*$/g,\"\");\t// trailing whitespace\r\n\t\t\tc = _EncodeCode(c);\r\n\t\t\treturn m1+\"<code>\"+c+\"</code>\";\r\n\t\t});\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _EncodeCode = function(text) {\r\n//\r\n// Encode/escape certain characters inside Markdown code runs.\r\n// The point is that in code, these characters are literals,\r\n// and lose their special Markdown meanings.\r\n//\r\n\t// Encode all ampersands; HTML entities are not\r\n\t// entities within a Markdown code span.\r\n\ttext = text.replace(/&/g,\"&amp;\");\r\n\r\n\t// Do the angle bracket song and dance:\r\n\ttext = text.replace(/</g,\"&lt;\");\r\n\ttext = text.replace(/>/g,\"&gt;\");\r\n\r\n\t// Now, escape characters that are magic in Markdown:\r\n\ttext = escapeCharacters(text,\"\\*_{}[]\\\\\",false);\r\n\r\n// jj the line above breaks this:\r\n//---\r\n\r\n//* Item\r\n\r\n//   1. Subitem\r\n\r\n//            special char: *\r\n//---\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _DoItalicsAndBold = function(text) {\r\n\r\n\t// <strong> must go first:\r\n\ttext = text.replace(/(\\*\\*|__)(?=\\S)([^\\r]*?\\S[*_]*)\\1/g,\r\n\t\t\"<strong>$2</strong>\");\r\n\r\n\ttext = text.replace(/(\\*|_)(?=\\S)([^\\r]*?\\S)\\1/g,\r\n\t\t\"<em>$2</em>\");\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _DoBlockQuotes = function(text) {\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t\t\t// Wrap whole match in $1\r\n\t\t\t(\r\n\t\t\t\t^[ \\t]*>[ \\t]?\t\t\t// '>' at the start of a line\r\n\t\t\t\t.+\\n\t\t\t\t\t// rest of the first line\r\n\t\t\t\t(.+\\n)*\t\t\t\t\t// subsequent consecutive lines\r\n\t\t\t\t\\n*\t\t\t\t\t\t// blanks\r\n\t\t\t)+\r\n\t\t)\r\n\t\t/gm, function(){...});\r\n\t*/\r\n\r\n\ttext = text.replace(/((^[ \\t]*>[ \\t]?.+\\n(.+\\n)*\\n*)+)/gm,\r\n\t\tfunction(wholeMatch,m1) {\r\n\t\t\tvar bq = m1;\r\n\r\n\t\t\t// attacklab: hack around Konqueror 3.5.4 bug:\r\n\t\t\t// \"----------bug\".replace(/^-/g,\"\") == \"bug\"\r\n\r\n\t\t\tbq = bq.replace(/^[ \\t]*>[ \\t]?/gm,\"~0\");\t// trim one level of quoting\r\n\r\n\t\t\t// attacklab: clean up hack\r\n\t\t\tbq = bq.replace(/~0/g,\"\");\r\n\r\n\t\t\tbq = bq.replace(/^[ \\t]+$/gm,\"\");\t\t// trim whitespace-only lines\r\n\t\t\tbq = _RunBlockGamut(bq);\t\t\t\t// recurse\r\n\r\n\t\t\tbq = bq.replace(/(^|\\n)/g,\"$1  \");\r\n\t\t\t// These leading spaces screw with <pre> content, so we need to fix that:\r\n\t\t\tbq = bq.replace(\r\n\t\t\t\t\t/(\\s*<pre>[^\\r]+?<\\/pre>)/gm,\r\n\t\t\t\tfunction(wholeMatch,m1) {\r\n\t\t\t\t\tvar pre = m1;\r\n\t\t\t\t\t// attacklab: hack around Konqueror 3.5.4 bug:\r\n\t\t\t\t\tpre = pre.replace(/^  /mg,\"~0\");\r\n\t\t\t\t\tpre = pre.replace(/~0/g,\"\");\r\n\t\t\t\t\treturn pre;\r\n\t\t\t\t});\r\n\r\n\t\t\treturn hashBlock(\"<blockquote>\\n\" + bq + \"\\n</blockquote>\");\r\n\t\t});\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _FormParagraphs = function(text) {\r\n//\r\n//  Params:\r\n//    $text - string to process with html <p> tags\r\n//\r\n\r\n\t// Strip leading and trailing lines:\r\n\ttext = text.replace(/^\\n+/g,\"\");\r\n\ttext = text.replace(/\\n+$/g,\"\");\r\n\r\n\tvar grafs = text.split(/\\n{2,}/g);\r\n\tvar grafsOut = new Array();\r\n\r\n\t//\r\n\t// Wrap <p> tags.\r\n\t//\r\n\tvar end = grafs.length;\r\n\tfor (var i=0; i<end; i++) {\r\n\t\tvar str = grafs[i];\r\n\r\n\t\t// if this is an HTML marker, copy it\r\n\t\tif (str.search(/~K(\\d+)K/g) >= 0) {\r\n\t\t\tgrafsOut.push(str);\r\n\t\t}\r\n\t\telse if (str.search(/\\S/) >= 0) {\r\n\t\t\tstr = _RunSpanGamut(str);\r\n\t\t\tstr = str.replace(/^([ \\t]*)/g,\"<p>\");\r\n\t\t\tstr += \"</p>\"\r\n\t\t\tgrafsOut.push(str);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t//\r\n\t// Unhashify HTML blocks\r\n\t//\r\n\tend = grafsOut.length;\r\n\tfor (var i=0; i<end; i++) {\r\n\t\t// if this is a marker for an html block...\r\n\t\twhile (grafsOut[i].search(/~K(\\d+)K/) >= 0) {\r\n\t\t\tvar blockText = g_html_blocks[RegExp.$1];\r\n\t\t\tblockText = blockText.replace(/\\$/g,\"$$$$\"); // Escape any dollar signs\r\n\t\t\tgrafsOut[i] = grafsOut[i].replace(/~K\\d+K/,blockText);\r\n\t\t}\r\n\t}\r\n\r\n\treturn grafsOut.join(\"\\n\\n\");\r\n}\r\n\r\n\r\nvar _EncodeAmpsAndAngles = function(text) {\r\n// Smart processing for ampersands and angle brackets that need to be encoded.\r\n\r\n\t// Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\r\n\t//   http://bumppo.net/projects/amputator/\r\n\ttext = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g,\"&amp;\");\r\n\r\n\t// Encode naked <'s\r\n\ttext = text.replace(/<(?![a-z\\/?\\$!])/gi,\"&lt;\");\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _EncodeBackslashEscapes = function(text) {\r\n//\r\n//   Parameter:  String.\r\n//   Returns:\tThe string, with after processing the following backslash\r\n//\t\t\t   escape sequences.\r\n//\r\n\r\n\t// attacklab: The polite way to do this is with the new\r\n\t// escapeCharacters() function:\r\n\t//\r\n\t// \ttext = escapeCharacters(text,\"\\\\\",true);\r\n\t// \ttext = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\r\n\t//\r\n\t// ...but we're sidestepping its use of the (slow) RegExp constructor\r\n\t// as an optimization for Firefox.  This function gets called a LOT.\r\n\r\n\ttext = text.replace(/\\\\(\\\\)/g,escapeCharacters_callback);\r\n\ttext = text.replace(/\\\\([`*_{}\\[\\]()>#+-.!])/g,escapeCharacters_callback);\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _DoAutoLinks = function(text) {\r\n\r\n\ttext = text.replace(/<((https?|ftp|dict):[^'\">\\s]+)>/gi,\"<a href=\\\"$1\\\">$1</a>\");\r\n\r\n\t// Email addresses: <address@domain.foo>\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t<\r\n\t\t\t(?:mailto:)?\r\n\t\t\t(\r\n\t\t\t\t[-.\\w]+\r\n\t\t\t\t\\@\r\n\t\t\t\t[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+\r\n\t\t\t)\r\n\t\t\t>\r\n\t\t/gi, _DoAutoLinks_callback());\r\n\t*/\r\n\ttext = text.replace(/<(?:mailto:)?([-.\\w]+\\@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\r\n\t\tfunction(wholeMatch,m1) {\r\n\t\t\treturn _EncodeEmailAddress( _UnescapeSpecialChars(m1) );\r\n\t\t}\r\n\t);\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _EncodeEmailAddress = function(addr) {\r\n//\r\n//  Input: an email address, e.g. \"foo@example.com\"\r\n//\r\n//  Output: the email address as a mailto link, with each character\r\n//\tof the address encoded as either a decimal or hex entity, in\r\n//\tthe hopes of foiling most address harvesting spam bots. E.g.:\r\n//\r\n//\t<a href=\"&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;\r\n//\t   x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;\">&#102;&#111;&#111;\r\n//\t   &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>\r\n//\r\n//  Based on a filter by Matthew Wickline, posted to the BBEdit-Talk\r\n//  mailing list: <http://tinyurl.com/yu7ue>\r\n//\r\n\r\n\t// attacklab: why can't javascript speak hex?\r\n\tfunction char2hex(ch) {\r\n\t\tvar hexDigits = '0123456789ABCDEF';\r\n\t\tvar dec = ch.charCodeAt(0);\r\n\t\treturn(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15));\r\n\t}\r\n\r\n\tvar encode = [\r\n\t\tfunction(ch){return \"&#\"+ch.charCodeAt(0)+\";\";},\r\n\t\tfunction(ch){return \"&#x\"+char2hex(ch)+\";\";},\r\n\t\tfunction(ch){return ch;}\r\n\t];\r\n\r\n\taddr = \"mailto:\" + addr;\r\n\r\n\taddr = addr.replace(/./g, function(ch) {\r\n\t\tif (ch == \"@\") {\r\n\t\t   \t// this *must* be encoded. I insist.\r\n\t\t\tch = encode[Math.floor(Math.random()*2)](ch);\r\n\t\t} else if (ch !=\":\") {\r\n\t\t\t// leave ':' alone (to spot mailto: later)\r\n\t\t\tvar r = Math.random();\r\n\t\t\t// roughly 10% raw, 45% hex, 45% dec\r\n\t\t\tch =  (\r\n\t\t\t\t\tr > .9  ?\tencode[2](ch)   :\r\n\t\t\t\t\tr > .45 ?\tencode[1](ch)   :\r\n\t\t\t\t\t\t\t\tencode[0](ch)\r\n\t\t\t\t);\r\n\t\t}\r\n\t\treturn ch;\r\n\t});\r\n\r\n\taddr = \"<a href=\\\"\" + addr + \"\\\">\" + addr + \"</a>\";\r\n\taddr = addr.replace(/\">.+:/g,\"\\\">\"); // strip the mailto: from the visible part\r\n\r\n\treturn addr;\r\n}\r\n\r\n\r\nvar _UnescapeSpecialChars = function(text) {\r\n//\r\n// Swap back in all the special characters we've hidden.\r\n//\r\n\ttext = text.replace(/~E(\\d+)E/g,\r\n\t\tfunction(wholeMatch,m1) {\r\n\t\t\tvar charCodeToReplace = parseInt(m1);\r\n\t\t\treturn String.fromCharCode(charCodeToReplace);\r\n\t\t}\r\n\t);\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _Outdent = function(text) {\r\n//\r\n// Remove one level of line-leading tabs or spaces\r\n//\r\n\r\n\t// attacklab: hack around Konqueror 3.5.4 bug:\r\n\t// \"----------bug\".replace(/^-/g,\"\") == \"bug\"\r\n\r\n\ttext = text.replace(/^(\\t|[ ]{1,4})/gm,\"~0\"); // attacklab: g_tab_width\r\n\r\n\t// attacklab: clean up hack\r\n\ttext = text.replace(/~0/g,\"\")\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _Detab = function(text) {\r\n// attacklab: Detab's completely rewritten for speed.\r\n// In perl we could fix it by anchoring the regexp with \\G.\r\n// In javascript we're less fortunate.\r\n\r\n\t// expand first n-1 tabs\r\n\ttext = text.replace(/\\t(?=\\t)/g,\"    \"); // attacklab: g_tab_width\r\n\r\n\t// replace the nth with two sentinels\r\n\ttext = text.replace(/\\t/g,\"~A~B\");\r\n\r\n\t// use the sentinel to anchor our regex so it doesn't explode\r\n\ttext = text.replace(/~B(.+?)~A/g,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar leadingText = m1;\r\n\t\t\tvar numSpaces = 4 - leadingText.length % 4;  // attacklab: g_tab_width\r\n\r\n\t\t\t// there *must* be a better way to do this:\r\n\t\t\tfor (var i=0; i<numSpaces; i++) leadingText+=\" \";\r\n\r\n\t\t\treturn leadingText;\r\n\t\t}\r\n\t);\r\n\r\n\t// clean up sentinels\r\n\ttext = text.replace(/~A/g,\"    \");  // attacklab: g_tab_width\r\n\ttext = text.replace(/~B/g,\"\");\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\n//\r\n//  attacklab: Utility functions\r\n//\r\n\r\n\r\nvar escapeCharacters = function(text, charsToEscape, afterBackslash) {\r\n\t// First we have to escape the escape characters so that\r\n\t// we can build a character class out of them\r\n\tvar regexString = \"([\" + charsToEscape.replace(/([\\[\\]\\\\])/g,\"\\\\$1\") + \"])\";\r\n\r\n\tif (afterBackslash) {\r\n\t\tregexString = \"\\\\\\\\\" + regexString;\r\n\t}\r\n\r\n\tvar regex = new RegExp(regexString,\"g\");\r\n\ttext = text.replace(regex,escapeCharacters_callback);\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar escapeCharacters_callback = function(wholeMatch,m1) {\r\n\tvar charCodeToEscape = m1.charCodeAt(0);\r\n\treturn \"~E\"+charCodeToEscape+\"E\";\r\n}\r\n\r\n} // end of Showdown.converter\r\n\r\n// export\r\nif (typeof module !== 'undefined') module.exports = Showdown;"
  },
  {
    "path": "servers/embed/index.coffee",
    "content": "coffee = require(\"coffee-script\")\r\nless = require(\"less\")\r\njade = require(\"jade\")\r\nexpress = require(\"express\")\r\ngzippo = require(\"gzippo\")\r\nassets = require(\"connect-assets\")\r\nnconf = require(\"nconf\")\r\nrequest = require(\"request\")\r\n\r\nmodule.exports = app = express()\r\n\r\napiUrl = nconf.get(\"url:api\")\r\n\r\n\r\n###s\r\n# Configure the server\r\n###\r\n\r\napp.use assets(src: \"#{__dirname}/assets\", minifyBuilds: true)\r\napp.use express.static(\"#{__dirname}/assets\")\r\napp.use require(\"./middleware/expose\").middleware\r\n  \"url\": nconf.get(\"url\")\r\n  \"package\": require(\"./package\")\r\napp.use express.bodyParser()\r\n\r\napp.use app.router\r\n\r\napp.use express.logger()\r\n\r\n\r\n\r\napp.set \"views\", \"#{__dirname}/views\"\r\napp.set \"view engine\", \"jade\"\r\napp.set \"view options\", layout: false\r\n\r\n  \r\napp.post \"/\", (req, res, next) ->\r\n  res.set \"X-XSS-Protection\", 0\r\n  \r\n  if req.body.files\r\n    for filename, file of req.body.files\r\n      if typeof file is \"string\"\r\n        req.body.files[filename] =\r\n          filename: filename\r\n          content: file\r\n      req.body.files[filename].filename ||= filename\r\n  \r\n  res.locals.plunk = req.body\r\n  res.render \"embed\"\r\n\r\napp.get \"/:id\", (req, res, next) ->\r\n  res.locals.plunk = \"\"\r\n  res.render \"embed\"\r\n"
  },
  {
    "path": "servers/embed/middleware/expose.coffee",
    "content": "module.exports.middleware = (options = {}) ->\n  (req, res, next) ->\n    res.locals[key] = value for key, value of options\n    next()"
  },
  {
    "path": "servers/embed/package.json",
    "content": "{\n  \"name\": \"plunker-embed\",\n  \"subdomain\": \"plunker-embed\",\n  \"domains\": [\n    \"embed.plnkr.co\"\n  ],\n  \"scripts\": {\n    \"start\": \"server.js\"\n  },\n  \"engines\": {\n    \"node\": \"0.6.x\"\n  },\n  \"version\": \"0.3.16-2\",\n  \"private\": true,\n  \"dependencies\": {\n    \"coffee-script\": \"1.3.x\",\n    \"express\": \"3.0.x\",\n    \"gzippo\": \"0.1.x\",\n    \"jade\": \"0.25.x\",\n    \"less\": \"1.3.x\",\n    \"connect-assets\": \"2.2.x\",\n    \"nconf\": \"0.5.x\",\n    \"request\": \"2.9.x\"\n  }\n}"
  },
  {
    "path": "servers/embed/server.js",
    "content": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\nvar nconf = require(\"nconf\").use(\"memory\")\r\n  .argv()\r\n  .env()\r\n  .file({file: \"config.json\"})\r\n  .defaults({\r\n    \"PORT\": 8080\r\n  });\r\n\r\nif (!nconf.get(\"host\")) {\r\n  console.error(\"The host option is required for Plunker to start\");\r\n} else {\r\n  \r\n  //process.env.NODE_ENV = \"development\";\r\n\r\n  var host = nconf.get(\"host\");\r\n\r\n  // Configure global paths\r\n  if (nconf.get(\"nosubdomains\")) {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://\" + host + \"/raw\");\r\n    nconf.set(\"url:run\", \"http://\" + host + \"/run\");\r\n    nconf.set(\"url:api\", \"http://\" + host + \"/api\");\r\n    nconf.set(\"url:embed\", \"http://\" + host + \"/embed\");\r\n  } else {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://raw.\" + host);\r\n    nconf.set(\"url:run\", \"http://run.\" + host);\r\n    nconf.set(\"url:api\", \"http://api.\" + host);\r\n    nconf.set(\"url:embed\", \"http://embed.\" + host);\r\n  }\r\n  \r\n  // Create and start the parent server\r\n  require(\"./index\").listen(nconf.get(\"PORT\"));\r\n  \r\n  console.log(\"Started plunker-embed in\", nconf.get(\"NODE_ENV\") || \"development\", \"at\", nconf.get(\"host\"), \"on port\", nconf.get(\"PORT\"), \"using subdomains:\", !nconf.get(\"nosubdomains\"));\r\n}\r\n"
  },
  {
    "path": "servers/embed/views/embed.jade",
    "content": "!!! 5\r\nhtml(ng-app=\"plunker.embed\")\r\n  head\r\n    meta(charset=\"utf-8\")\r\n    meta(name=\"viewport\",content=\"width=device-width, initial-scale=1.0\")\r\n    title Plunker - Embedded\r\n    != css(\"pages/embed\")\r\n    // if lt IE 9\r\n      script(src=\"http://html5shim.googlecode.com/svn/trunk/html5.js\")\r\n    script\r\n      var _plunker = {\r\n        \"url\": !{JSON.stringify(url).replace(/<\\//g,\"<\\\\/\")},\r\n        \"plunk\": !{JSON.stringify(plunk).replace(/<\\//g,\"<\\\\/\")}\r\n      };\r\n    script(src=\"//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js\")\r\n    script(src=\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/js/bootstrap.min.js\")\r\n    script(src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js\")\r\n    script(src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular-sanitize.min.js\")\r\n    != js(\"pages/embed\")\r\n    script\r\n      /* Analytics */\r\n      var _gaq = _gaq || [];\r\n      _gaq.push(['_setAccount', 'UA-28928507-2']);\r\n      _gaq.push(['_setDomainName', 'embed.plnkr.co']);\r\n      _gaq.push(['_trackPageview']);\r\n    \r\n      (function() {\r\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\r\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\r\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\r\n      })();\r\n\r\n  body(ng-controller=\"embed\")\r\n    nav.navbar.navbar-fixed-top\r\n      div.navbar-inner\r\n        a.brand(href=\"{{url.www}}\", target=\"_blank\", title=\"Launch Plunker in a new window.\")\r\n        \r\n        ul.nav.pull-right\r\n          li(ng-show=\"plunk.files['README.md']\", ng-class=\"{active:tab=='readme'}\", title=\"Show the plunk's README.\")\r\n            a(href=\"javascript:void(0)\", ng-click=\"tab='readme'\")\r\n              i.icon-info-sign\r\n          li.divider-vertical\r\n          li(ng-class=\"{active:tab=='run'}\", title=\"Run or re-run this plunk.\")\r\n            a(href=\"javascript:void(0)\", ng-click=\"refreshPreview()\")\r\n              i.icon-play\r\n          li.divider-vertical\r\n          li(ng-switch, on=\"!!plunk.id\")\r\n            span(ng-switch-when=\"false\", ng-click=\"launchEditor()\", title=\"Launch the editor for this plunk in a new window.\")\r\n              i.icon-edit\r\n            a(ng-switch-when=\"true\", ng-href=\"{{url.www}}/edit/{{plunk.id}}\", target=\"_blank\", title=\"Launch the editor for this plunk in a new window.\")\r\n              i.icon-edit\r\n        ul.nav\r\n          li.divider-vertical\r\n          li.dropdown(ng-class=\"{active:tab=='code'}\", title=\"View the source code for this plunk.\")\r\n            a.dropdown-toggle(href=\"javascript:void(0)\", data-toggle=\"dropdown\")\r\n              i.icon-file\r\n              span(ng-bind=\"currentFile.filename\")\r\n              b.caret\r\n            ul.dropdown-menu\r\n              li(ng-repeat=\"(filename,file) in plunk.files\", ng-class=\"{active:file==currentFile}\")\r\n                a(href=\"#\", ng-click=\"activateFile(file)\") {{file.filename}}\r\n\r\n    div#embed(ng-class=\"{loading:loading}\", ng-switch, on=\"tab\")\r\n      div.overlay\r\n        div.message(ng-bind=\"loading\") Initializing...\r\n      div#code.overthrow(ng-switch-when=\"code\")\r\n        pre.prettyprint.linenums(ng-bind=\"currentFile.content\")\r\n      div#readme.overthrow.container-fluid(ng-switch-when=\"readme\")\r\n        div.row-fluid\r\n          div.span12(ng-bind-html=\"plunk.files['README.md'].content | markdown\")\r\n      div#run(ng-switch-when=\"run\")\r\n        iframe.overthrow(frameborder=\"0\",width=\"100%\",height=\"100%\",scrolling=\"auto\")\r\n"
  },
  {
    "path": "servers/raw/.gitignore",
    "content": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r\n.c9revisions\r\n\r\nbuiltAssets"
  },
  {
    "path": "servers/raw/index.coffee",
    "content": "express = require(\"express\")\r\nrequest = require(\"request\")\r\nnconf = require(\"nconf\")\r\nurl = require(\"url\")\r\n\r\nmodule.exports = app = express.createServer()\r\n\r\napp.configure ->\r\n  app.set \"views\", \"#{__dirname}/views\"\r\n  app.set \"view engine\", \"jade\"\r\n  app.set \"view options\", layout: false\r\n\r\n\r\napiUrl = nconf.get(\"url:api\")\r\n\r\napp.get \"/:id/*\", (req, res, next) ->\r\n  req_url = url.parse(req.url)\r\n  unless req.params[0] or /\\/$/.test(req_url.pathname)\r\n    req_url.pathname += \"/\"\r\n    return res.redirect(url.format(req_url), 301)\r\n  \r\n  request.get \"#{apiUrl}/plunks/#{req.params.id}\", (err, response, body) ->\r\n    return res.send(500) if err\r\n    return res.send(response.statusCode) if response.statusCode >= 400\r\n    \r\n    try\r\n      plunk = JSON.parse(body)\r\n    catch e\r\n      return res.send(500)\r\n    \r\n    unless plunk then res.send(404) # TODO: Better error page\r\n    else\r\n      # TODO: Determine if a special plunk 'landing' page should be served and serve it\r\n      filename = req.params[0] or \"index.html\"\r\n      file = plunk.files[filename]\r\n      \r\n      if file then res.send(file.content, {\"Content-Type\": if req.accepts(file.mime) then file.mime else \"text/plain\"})\r\n      else\r\n        res.local \"plunk\", plunk\r\n        res.render \"directory\"\r\n\r\napp.get \"/:id\", (req, res) -> res.redirect(\"/#{req.params.id}/\", 301)\r\n\r\napp.get \"*\", (req, res) ->\r\n  res.send(\"Whoever gave you this link has sent you to the wrong place.\", 404)"
  },
  {
    "path": "servers/raw/package.json",
    "content": "{\n  \"name\": \"plunker-raw\",\n  \"subdomain\": \"plunker-raw\",\n  \"domains\": [\n    \"raw.plnkr.co\"\n  ],\n  \"scripts\": {\n    \"start\": \"server.js\"\n  },\n  \"engines\": {\n    \"node\": \"0.6.x\"\n  },\n  \"version\": \"0.3.14-1\",\n  \"private\": true,\n  \"dependencies\": {\n    \"coffee-script\": \"1.3.x\",\n    \"express\": \"2.5.x\",\n    \"jade\": \"0.25.x\",\n    \"nconf\": \"0.5.x\",\n    \"request\": \"2.9.x\"\n  }\n}"
  },
  {
    "path": "servers/raw/server.js",
    "content": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\nvar nconf = require(\"nconf\").use(\"memory\")\r\n  .argv()\r\n  .env()\r\n  .file({file: \"config.json\"})\r\n  .defaults({\r\n    \"PORT\": 8080\r\n  });\r\n\r\nif (!nconf.get(\"host\")) {\r\n  console.error(\"The host option is required for Plunker to start\");\r\n} else {\r\n  \r\n  //process.env.NODE_ENV = \"production\";\r\n\r\n  var host = nconf.get(\"host\");\r\n\r\n  // Configure global paths\r\n  if (nconf.get(\"nosubdomains\")) {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://\" + host + \"/raw\");\r\n    nconf.set(\"url:run\", \"http://\" + host + \"/run\");\r\n    nconf.set(\"url:api\", \"http://\" + host + \"/api\");\r\n    nconf.set(\"url:embed\", \"http://\" + host + \"/embed\");\r\n  } else {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://raw.\" + host);\r\n    nconf.set(\"url:run\", \"http://run.\" + host);\r\n    nconf.set(\"url:api\", \"http://api.\" + host);\r\n    nconf.set(\"url:embed\", \"http://embed.\" + host);  }\r\n  \r\n  // Create and start the parent server\r\n  require(\"./index\").listen(nconf.get(\"PORT\"));\r\n  \r\n  console.log(\"Started plunker-raw in\", nconf.get(\"NODE_ENV\") || \"development\", \"at\", nconf.get(\"host\"), \"on port\", nconf.get(\"PORT\"), \"using subdomains:\", !nconf.get(\"nosubdomains\"));\r\n}\r\n"
  },
  {
    "path": "servers/raw/views/directory.jade",
    "content": "!!! 5\r\nhtml\r\n  head\r\n    title #{plunk.description}\r\n    link(href=\"http://twitter.github.com/bootstrap/assets/css/bootstrap.css\",rel=\"stylesheet\")\r\n    link(href=\"http://twitter.github.com/bootstrap/assets/css/bootstrap-responsive.css\",rel=\"stylesheet\")\r\n\r\n  body\r\n    div.container\r\n      section\r\n        div.page-header\r\n          h1 Plunk:#{plunk.id}\r\n            if plunk.description\r\n              | &nbsp;\r\n              small=plunk.description\r\n        div.row\r\n          div.span3\r\n            h2 Files\r\n            div.well(style=\"padding: 8px 0;\")\r\n              ul.files.nav.nav-list\r\n                li.nav-header Files\r\n                each file, filename in plunk.files\r\n                  li.file\r\n                    a(href=\"#{file.raw_url}\") #{file.filename}\r\n          div.span9\r\n            h2 Directory listing\r\n            p.\r\n              The plunk that you've accessed does not have an index.html file.\r\n              Instead of showing a useless blank page or trying to guess which\r\n              file you really wanted to see, Plunker shows this default page\r\n              that lets you skip to each file.\r\n"
  },
  {
    "path": "servers/run/.gitignore",
    "content": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r\n.c9revisions\r\n\r\nbuiltAssets"
  },
  {
    "path": "servers/run/index.coffee",
    "content": "express = require(\"express\")\r\nnconf = require(\"nconf\")\r\n_ = require(\"underscore\")._\r\nvalidator = require(\"json-schema\")\r\nmime = require(\"mime\")\r\nurl = require(\"url\")\r\nrequest = require(\"request\")\r\npath = require(\"path\")\r\n\r\nmodule.exports = app = express.createServer()\r\n\r\nrunUrl = nconf.get(\"url:run\")\r\n\r\ngenid = (len = 16, prefix = \"\", keyspace = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") ->\r\n  prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0\r\n  prefix\r\n\r\n\r\napp.configure ->\r\n  app.use require(\"./middleware/cors\").middleware()\r\n  app.use require(\"./middleware/json\").middleware()\r\n  \r\n  app.set \"views\", \"#{__dirname}/views\"\r\n  app.set \"view engine\", \"jade\"\r\n  app.set \"view options\", layout: false\r\n\r\nLRU = require(\"lru-cache\")\r\npreviews = LRU(512)\r\napiUrl = nconf.get(\"url:api\")\r\n\r\ncoffee = require(\"coffee-script\")\r\nlivescript = require(\"LiveScript\")\r\niced = require(\"iced-coffee-script\")\r\nless = require(\"less\")\r\nsass = require(\"sass\")\r\njade = require(\"jade\")\r\nmarkdown = require(\"marked\")\r\nstylus = require(\"stylus\")\r\nnib = require(\"nib\")\r\n\r\ncompilers = \r\n  sass:\r\n    match: /\\.css$/\r\n    ext: ['sass']\r\n    compile: (str, fn) ->\r\n      try\r\n        fn(null, sass.render(str))\r\n      catch err\r\n        fn(err)\r\n\r\n  less: \r\n    match: /\\.css$/\r\n    ext: ['less']\r\n    compile: (str, fn) ->\r\n      try\r\n        less.render(str, fn)\r\n      catch err\r\n        fn(err)\r\n\r\n  stylus: \r\n    match: /\\.css/\r\n    ext: ['styl']\r\n    compile: (str, fn) ->\r\n      try\r\n        stylus(str)\r\n          .use(nib())\r\n          .import(\"nib\")\r\n          .render(fn)\r\n      catch err\r\n        fn(err)      \r\n  coffeescript: \r\n    match: /\\.js$/\r\n    ext: ['coffee']\r\n    compile: (str, fn) ->\r\n      try\r\n        fn(null, coffee.compile(str, bare: true))\r\n      catch err\r\n        fn(err)\r\n      \r\n  livescript: \r\n    match: /\\.js$/\r\n    ext: ['ls']\r\n    compile: (str, fn) ->\r\n      try\r\n        fn(null, livescript.compile(str))\r\n      catch err\r\n        fn(err)      \r\n      \r\n  icedcoffee: \r\n    match: /\\.js$/\r\n    ext: ['iced']\r\n    compile: (str, fn) ->\r\n      try\r\n        fn(null, iced.compile(str, runtime: \"inline\"))\r\n      catch err\r\n        fn(err)\r\n\r\n  jade: \r\n    match: /\\.html$/\r\n    ext: ['jade']\r\n    compile: (str, fn) ->\r\n      render = jade.compile(str, pretty: true)\r\n      try\r\n        fn(null, render({}))\r\n      catch err\r\n        fn(err)\r\n      \r\n  markdown: \r\n    match: /\\.html$/\r\n    ext: ['md',\"markdown\"]\r\n    compile: (str, fn) ->\r\n      try\r\n        fn(null, markdown(str))\r\n      catch err\r\n        fn(err)\r\n\r\nrenderPlunkFile = (req, res, next) ->\r\n  # TODO: Determine if a special plunk 'landing' page should be served and serve it\r\n  plunk = req.plunk\r\n  filename = req.params[0] or \"index.html\"\r\n  file = plunk.files[filename]\r\n  \r\n  res.header \"Cache-Control\", \"no-cache\"\r\n  res.header \"Expires\", 0\r\n  \r\n  if file then res.send(file.content, {\"Content-Type\": if req.accepts(file.mime) then file.mime else \"text/plain\"})\r\n  else if filename\r\n    base = path.basename(filename, path.extname(filename))\r\n    type = mime.lookup(filename) or \"text/plain\"\r\n    \r\n    for name, compiler of compilers when filename.match(compiler.match)\r\n      for ext in compiler.ext\r\n        if found = plunk.files[\"#{base}.#{ext}\"]\r\n          compiler.compile found.content, (err, compiled) ->\r\n            if err then next(err)\r\n            else res.send(compiled, {\"Content-Type\": if req.accepts(type) then type else \"text/plain\"})\r\n          break\r\n    \r\n    res.send(404) unless found\r\n    \r\n  else\r\n    res.local \"plunk\", plunk\r\n    res.render \"directory\"\r\n    \r\n\r\napp.get \"/plunks/:id/*\", (req, res, next) ->\r\n  req_url = url.parse(req.url)\r\n  unless req.params[0] or /\\/$/.test(req_url.pathname)\r\n    req_url.pathname += \"/\"\r\n    return res.redirect(url.format(req_url), 301)\r\n  \r\n  request.get \"#{apiUrl}/plunks/#{req.params.id}\", (err, response, body) ->\r\n    return res.send(500) if err\r\n    return res.send(response.statusCode) if response.statusCode >= 400\r\n    \r\n    try\r\n      req.plunk = JSON.parse(body)\r\n    catch e\r\n      return res.send(500)\r\n    \r\n    unless req.plunk then res.send(404) # TODO: Better error page\r\n    else renderPlunkFile(req, res, next)\r\n\r\napp.get \"/plunks/:id\", (req, res) -> res.redirect(\"/#{req.params.id}/\", 301)\r\n\r\napp.post \"/:id?\", (req, res, next) ->\r\n  json = req.body\r\n  schema = require(\"./schema/previews/create\")\r\n  {valid, errors} = validator.validate(json, schema)\r\n  \r\n  # Despite its awesomeness, validator does not support disallow or additionalProperties; we need to check plunk.files size\r\n  if json.files and _.isEmpty(json.files)\r\n    valid = false\r\n    errors.push\r\n      attribute: \"minProperties\"\r\n      property: \"files\"\r\n      message: \"A minimum of one file is required\"\r\n  \r\n  unless valid then next(new Error(\"Invalid json: #{errors}\"))\r\n  else\r\n    id = req.params.id or genid() # Don't care about id clashes. They are disposable anyway\r\n    json.id = id\r\n    json.run_url = \"#{runUrl}/#{id}/\"\r\n\r\n    _.each json.files, (file, filename) ->\r\n      json.files[filename] =\r\n        filename: filename\r\n        content: file.content\r\n        mime: mime.lookup(filename, \"text/plain\")\r\n        run_url: json.run_url + filename\r\n\r\n    \r\n    previews.set(id, json)\r\n    \r\n    status = if req.params.id then 200 else 201\r\n    \r\n    res.json(json, status)\r\n\r\n\r\n\r\napp.get \"/:id/*\", (req, res, next) ->\r\n  unless req.plunk = previews.get(req.params.id) then res.send(404) # TODO: Better error page\r\n  else\r\n    req_url = url.parse(req.url)\r\n    \r\n    unless req.params[0] or /\\/$/.test(req_url.pathname)\r\n      req_url.pathname += \"/\"\r\n      return res.redirect(url.format(req_url), 301)\r\n    \r\n    renderPlunkFile(req, res, next)\r\n\r\napp.get \"*\", (req, res) ->\r\n  res.send(\"Preview does not exist or has expired.\", 404)"
  },
  {
    "path": "servers/run/middleware/cors.coffee",
    "content": "module.exports.middleware = (config = {}) ->\n  (req, res, next) ->\n    # Just send the headers all the time. That way we won't miss the right request ;-)\n    # Other CORS middleware just wouldn't work for me\n    # TODO: Minimize these headers to only those needed at the right time\n\n    res.header(\"Access-Control-Allow-Origin\", req.headers.origin or \"*\")\n    res.header(\"Access-Control-Allow-Methods\", \"OPTIONS,GET,PUT,POST,DELETE\")\n    res.header(\"Access-Control-Allow-Headers\", \"Authorization, User-Agent, Referer, X-Requested-With, Proxy-Authorization, Proxy-Connection, Accept-Language, Accept-Encoding, Accept-Charset, Connection, Content-Length, Host, Origin, Pragma, Accept-Charset, Cache-Control, Accept, Content-Type\")\n    res.header(\"Access-Control-Expose-Headers\", \"Link\")\n    res.header(\"Access-Control-Max-Age\", \"60\")\n\n    if \"OPTIONS\" == req.method then res.send(200)\n    else next()"
  },
  {
    "path": "servers/run/middleware/json.coffee",
    "content": "module.exports.middleware = (config = {}) ->\r\n  (req, res, next) ->\r\n    if \"GET\" == req.method or \"HEAD\" == req.method then return next()\r\n    \r\n    req.body ||= {}\r\n    \r\n    buf = '';\r\n    \r\n    req.setEncoding('utf8');\r\n    req.on \"data\", (chunk) -> buf += chunk\r\n    req.on \"end\", ->\r\n      return next() unless buf\r\n      try\r\n        req.body = JSON.parse(buf)\r\n        next()\r\n      catch err\r\n        next(err)"
  },
  {
    "path": "servers/run/package.json",
    "content": "{\n  \"name\": \"plunker-run\",\n  \"subdomain\": \"plunker-run\",\n  \"domains\": [\n    \"run.plnkr.co\"\n  ],\n  \"scripts\": {\n    \"start\": \"server.js\"\n  },\n  \"engines\": {\n    \"node\": \"0.8.x\"\n  },\n  \"version\": \"0.3.14-9\",\n  \"private\": true,\n  \"dependencies\": {\n    \"coffee-script\": \"1.x\",\n    \"express\": \"2.5.x\",\n    \"gzippo\": \"0.1.x\",\n    \"mime\": \"*\",\n    \"underscore\": \"1.3.x\",\n    \"nconf\": \"0.5.x\",\n    \"json-schema\": \"https://github.com/kriszyp/json-schema/tarball/master\",\n    \"lru-cache\": \"1.1.x\",\n    \"request\": \"2.12.0\",\n    \"sass\": \"*\",\n    \"less\": \"*\",\n    \"jade\": \"*\",\n    \"marked\": \"*\",\n    \"LiveScript\": \"*\",\n    \"iced-coffee-script\": \"*\",\n    \"stylus\": \"*\",\n    \"nib\": \"*\"\n  },\n  \"bundledDependencies\": [\n    \"json-schema\"\n  ]\n}"
  },
  {
    "path": "servers/run/schema/previews/create.json",
    "content": "{\r\n  \"type\": \"object\",\r\n  \"additionalProperties\": false,\r\n  \"properties\": {\r\n    \"files\": {\r\n      \"required\": true,\r\n      \"type\": \"object\",\r\n      \"additionalProperties\": false,\r\n      \"patternProperties\": {\r\n        \"^[a-zA-z0-9_-]+(\\\\.[a-zA-Z0-9]+)?$\": {\r\n          \"type\": \"object\",\r\n          \"additionalProperties\": false,\r\n          \"properties\": {\r\n            \"content\": {\r\n              \"type\": \"string\",\r\n              \"required\": true\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}"
  },
  {
    "path": "servers/run/server.js",
    "content": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\nvar nconf = require(\"nconf\").use(\"memory\")\r\n  .argv()\r\n  .env()\r\n  .file({file: \"config.json\"})\r\n  .defaults({\r\n    \"PORT\": 8080\r\n  });\r\n\r\nif (!nconf.get(\"host\")) {\r\n  console.error(\"The host option is required for Plunker to start\");\r\n} else {\r\n  \r\n  //process.env.NODE_ENV = \"production\";\r\n\r\n  var host = nconf.get(\"host\");\r\n\r\n  // Configure global paths\r\n  if (nconf.get(\"nosubdomains\")) {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://\" + host + \"/raw\");\r\n    nconf.set(\"url:run\", \"http://\" + host + \"/run\");\r\n    nconf.set(\"url:api\", \"http://\" + host + \"/api\");\r\n    nconf.set(\"url:embed\", \"http://\" + host + \"/embed\");\r\n  } else {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://raw.\" + host);\r\n    nconf.set(\"url:run\", \"http://run.\" + host);\r\n    nconf.set(\"url:api\", \"http://api.\" + host);\r\n    nconf.set(\"url:embed\", \"http://embed.\" + host);  }\r\n  \r\n  // Create and start the parent server\r\n  require(\"./index\").listen(nconf.get(\"PORT\"));\r\n  \r\n  console.log(\"Started plunker-www in\", nconf.get(\"NODE_ENV\") || \"development\", \"at\", nconf.get(\"host\"), \"on port\", nconf.get(\"PORT\"), \"using subdomains:\", !nconf.get(\"nosubdomains\"));\r\n}\r\n"
  },
  {
    "path": "servers/run/views/directory.jade",
    "content": "!!! 5\r\nhtml\r\n  head\r\n    title Plunker - Preview\r\n    link(href=\"http://twitter.github.com/bootstrap/assets/css/bootstrap.css\",rel=\"stylesheet\")\r\n    link(href=\"http://twitter.github.com/bootstrap/assets/css/bootstrap-responsive.css\",rel=\"stylesheet\")\r\n\r\n  body\r\n    div.container\r\n      section\r\n        div.page-header\r\n          h1 Preview:#{plunk.id}\r\n        div.row\r\n          div.span3\r\n            h2 Files\r\n            div.well(style=\"padding: 8px 0;\")\r\n              ul.files.nav.nav-list\r\n                li.nav-header Files\r\n                each file, filename in plunk.files\r\n                  li.file\r\n                    a(href=\"#{file.run_url}\") #{file.filename}\r\n          div.span9\r\n            h2 Directory listing\r\n            p.\r\n              The plunk that you've accessed does not have an index.html file.\r\n              Instead of showing a useless blank page or trying to guess which\r\n              file you really wanted to see, Plunker shows this default page\r\n              that lets you skip to each file.\r\n"
  },
  {
    "path": "servers/www/.gitignore",
    "content": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r\n.c9revisions\r\n\r\nbuiltAssets"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-affix.js",
    "content": "/* ==========================================================\n * bootstrap-affix.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#affix\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* AFFIX CLASS DEFINITION\n  * ====================== */\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n      'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n      'top'    : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n\n /* AFFIX PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n\n /* AFFIX DATA-API\n  * ============== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-alert.js",
    "content": "/* ==========================================================\n * bootstrap-alert.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#alerts\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* ALERT CLASS DEFINITION\n  * ====================== */\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n    , Alert = function (el) {\n        $(el).on('click', dismiss, this.close)\n      }\n\n  Alert.prototype.close = function (e) {\n    var $this = $(this)\n      , selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n\n    e && e.preventDefault()\n\n    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())\n\n    $parent.trigger(e = $.Event('close'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent\n        .trigger('closed')\n        .remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent.on($.support.transition.end, removeElement) :\n      removeElement()\n  }\n\n\n /* ALERT PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('alert')\n      if (!data) $this.data('alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n /* ALERT DATA-API\n  * ============== */\n\n  $(function () {\n    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-all.js",
    "content": "//= require bootstrap-transition\r\n//= require bootstrap-alert\r\n//= require bootstrap-button\r\n//= require bootstrap-carousel\r\n//= require bootstrap-collapse\r\n//= require bootstrap-dropdown\r\n//= require bootstrap-modal\r\n//= require bootstrap-tooltip\r\n//= require bootstrap-popover\r\n//= require bootstrap-scrollspy\r\n//= require bootstrap-tab\r\n//= require bootstrap-typeahead.js"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-button.js",
    "content": "/* ============================================================\n * bootstrap-button.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#buttons\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* BUTTON PUBLIC CLASS DEFINITION\n  * ============================== */\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.button.defaults, options)\n  }\n\n  Button.prototype.setState = function (state) {\n    var d = 'disabled'\n      , $el = this.$element\n      , data = $el.data()\n      , val = $el.is('input') ? 'val' : 'html'\n\n    state = state + 'Text'\n    data.resetText || $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d)\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.parent('[data-toggle=\"buttons-radio\"]')\n\n    $parent && $parent\n      .find('.active')\n      .removeClass('active')\n\n    this.$element.toggleClass('active')\n  }\n\n\n /* BUTTON PLUGIN DEFINITION\n  * ======================== */\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('button')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('button', (data = new Button(this, options)))\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.defaults = {\n    loadingText: 'loading...'\n  }\n\n  $.fn.button.Constructor = Button\n\n\n /* BUTTON DATA-API\n  * =============== */\n\n  $(function () {\n    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      $btn.button('toggle')\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-carousel.js",
    "content": "/* ==========================================================\n * bootstrap-carousel.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#carousel\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* CAROUSEL CLASS DEFINITION\n  * ========================= */\n\n  var Carousel = function (element, options) {\n    this.$element = $(element)\n    this.options = options\n    this.options.slide && this.slide(this.options.slide)\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.prototype = {\n\n    cycle: function (e) {\n      if (!e) this.paused = false\n      this.options.interval\n        && !this.paused\n        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n      return this\n    }\n\n  , to: function (pos) {\n      var $active = this.$element.find('.item.active')\n        , children = $active.parent().children()\n        , activePos = children.index($active)\n        , that = this\n\n      if (pos > (children.length - 1) || pos < 0) return\n\n      if (this.sliding) {\n        return this.$element.one('slid', function () {\n          that.to(pos)\n        })\n      }\n\n      if (activePos == pos) {\n        return this.pause().cycle()\n      }\n\n      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))\n    }\n\n  , pause: function (e) {\n      if (!e) this.paused = true\n      if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n        this.$element.trigger($.support.transition.end)\n        this.cycle()\n      }\n      clearInterval(this.interval)\n      this.interval = null\n      return this\n    }\n\n  , next: function () {\n      if (this.sliding) return\n      return this.slide('next')\n    }\n\n  , prev: function () {\n      if (this.sliding) return\n      return this.slide('prev')\n    }\n\n  , slide: function (type, next) {\n      var $active = this.$element.find('.item.active')\n        , $next = next || $active[type]()\n        , isCycling = this.interval\n        , direction = type == 'next' ? 'left' : 'right'\n        , fallback  = type == 'next' ? 'first' : 'last'\n        , that = this\n        , e = $.Event('slide', {\n            relatedTarget: $next[0]\n          })\n\n      this.sliding = true\n\n      isCycling && this.pause()\n\n      $next = $next.length ? $next : this.$element.find('.item')[fallback]()\n\n      if ($next.hasClass('active')) return\n\n      if ($.support.transition && this.$element.hasClass('slide')) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $next.addClass(type)\n        $next[0].offsetWidth // force reflow\n        $active.addClass(direction)\n        $next.addClass(direction)\n        this.$element.one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n      } else {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $active.removeClass('active')\n        $next.addClass('active')\n        this.sliding = false\n        this.$element.trigger('slid')\n      }\n\n      isCycling && this.cycle()\n\n      return this\n    }\n\n  }\n\n\n /* CAROUSEL PLUGIN DEFINITION\n  * ========================== */\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('carousel')\n        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)\n        , action = typeof option == 'string' ? option : options.slide\n      if (!data) $this.data('carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.cycle()\n    })\n  }\n\n  $.fn.carousel.defaults = {\n    interval: 5000\n  , pause: 'hover'\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n /* CAROUSEL DATA-API\n  * ================= */\n\n  $(function () {\n    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {\n      var $this = $(this), href\n        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())\n      $target.carousel(options)\n      e.preventDefault()\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-collapse.js",
    "content": "/* =============================================================\n * bootstrap-collapse.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#collapse\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* COLLAPSE PUBLIC CLASS DEFINITION\n  * ================================ */\n\n  var Collapse = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.collapse.defaults, options)\n\n    if (this.options.parent) {\n      this.$parent = $(this.options.parent)\n    }\n\n    this.options.toggle && this.toggle()\n  }\n\n  Collapse.prototype = {\n\n    constructor: Collapse\n\n  , dimension: function () {\n      var hasWidth = this.$element.hasClass('width')\n      return hasWidth ? 'width' : 'height'\n    }\n\n  , show: function () {\n      var dimension\n        , scroll\n        , actives\n        , hasData\n\n      if (this.transitioning) return\n\n      dimension = this.dimension()\n      scroll = $.camelCase(['scroll', dimension].join('-'))\n      actives = this.$parent && this.$parent.find('> .accordion-group > .in')\n\n      if (actives && actives.length) {\n        hasData = actives.data('collapse')\n        if (hasData && hasData.transitioning) return\n        actives.collapse('hide')\n        hasData || actives.data('collapse', null)\n      }\n\n      this.$element[dimension](0)\n      this.transition('addClass', $.Event('show'), 'shown')\n      $.support.transition && this.$element[dimension](this.$element[0][scroll])\n    }\n\n  , hide: function () {\n      var dimension\n      if (this.transitioning) return\n      dimension = this.dimension()\n      this.reset(this.$element[dimension]())\n      this.transition('removeClass', $.Event('hide'), 'hidden')\n      this.$element[dimension](0)\n    }\n\n  , reset: function (size) {\n      var dimension = this.dimension()\n\n      this.$element\n        .removeClass('collapse')\n        [dimension](size || 'auto')\n        [0].offsetWidth\n\n      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')\n\n      return this\n    }\n\n  , transition: function (method, startEvent, completeEvent) {\n      var that = this\n        , complete = function () {\n            if (startEvent.type == 'show') that.reset()\n            that.transitioning = 0\n            that.$element.trigger(completeEvent)\n          }\n\n      this.$element.trigger(startEvent)\n\n      if (startEvent.isDefaultPrevented()) return\n\n      this.transitioning = 1\n\n      this.$element[method]('in')\n\n      $.support.transition && this.$element.hasClass('collapse') ?\n        this.$element.one($.support.transition.end, complete) :\n        complete()\n    }\n\n  , toggle: function () {\n      this[this.$element.hasClass('in') ? 'hide' : 'show']()\n    }\n\n  }\n\n\n /* COLLAPSIBLE PLUGIN DEFINITION\n  * ============================== */\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('collapse')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.defaults = {\n    toggle: true\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n /* COLLAPSIBLE DATA-API\n  * ==================== */\n\n  $(function () {\n    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {\n      var $this = $(this), href\n        , target = $this.attr('data-target')\n          || e.preventDefault()\n          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n        , option = $(target).data('collapse') ? 'toggle' : $this.data()\n      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n      $(target).collapse(option)\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-dropdown.js",
    "content": "/* ============================================================\n * bootstrap-dropdown.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#dropdowns\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        $parent.toggleClass('open')\n        $this.focus()\n      }\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()\n\n      $items = $('[role=menu] li:not(.divider) a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    getParent($(toggle))\n      .removeClass('open')\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n    $parent.length || ($parent = $this.parent())\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(function () {\n    $('html')\n      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)\n    $('body')\n      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown', function (e) { e.stopPropagation() })\n      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-modal.js",
    "content": "/* =========================================================\n * bootstrap-modal.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#modals\n * =========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        $('body').addClass('modal-open')\n\n        this.isShown = true\n\n        this.escape()\n\n        this.backdrop(function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element\n            .show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element\n            .addClass('in')\n            .attr('aria-hidden', false)\n            .focus()\n\n          that.enforceFocus()\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :\n            that.$element.trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        $('body').removeClass('modal-open')\n\n        this.escape()\n\n        $(document).off('focusin.modal')\n\n        this.$element\n          .removeClass('in')\n          .attr('aria-hidden', true)\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.hideWithTransition() :\n          this.hideModal()\n      }\n\n    , enforceFocus: function () {\n        var that = this\n        $(document).on('focusin.modal', function (e) {\n          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n            that.$element.focus()\n          }\n        })\n      }\n\n    , escape: function () {\n        var that = this\n        if (this.isShown && this.options.keyboard) {\n          this.$element.on('keyup.dismiss.modal', function ( e ) {\n            e.which == 27 && that.hide()\n          })\n        } else if (!this.isShown) {\n          this.$element.off('keyup.dismiss.modal')\n        }\n      }\n\n    , hideWithTransition: function () {\n        var that = this\n          , timeout = setTimeout(function () {\n              that.$element.off($.support.transition.end)\n              that.hideModal()\n            }, 500)\n\n        this.$element.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          that.hideModal()\n        })\n      }\n\n    , hideModal: function (that) {\n        this.$element\n          .hide()\n          .trigger('hidden')\n\n        this.backdrop()\n      }\n\n    , removeBackdrop: function () {\n        this.$backdrop.remove()\n        this.$backdrop = null\n      }\n\n    , backdrop: function (callback) {\n        var that = this\n          , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n        if (this.isShown && this.options.backdrop) {\n          var doAnimate = $.support.transition && animate\n\n          this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n            .appendTo(document.body)\n\n          if (this.options.backdrop != 'static') {\n            this.$backdrop.click($.proxy(this.hide, this))\n          }\n\n          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n          this.$backdrop.addClass('in')\n\n          doAnimate ?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (!this.isShown && this.$backdrop) {\n          this.$backdrop.removeClass('in')\n\n          $.support.transition && this.$element.hasClass('fade')?\n            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :\n            this.removeBackdrop()\n\n        } else if (callback) {\n          callback()\n        }\n      }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(function () {\n    $('body').on('click.modal.data-api', '[data-toggle=\"modal\"]', function ( e ) {\n      var $this = $(this)\n        , href = $this.attr('href')\n        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n      e.preventDefault()\n\n      $target\n        .modal(option)\n        .one('hide', function () {\n          $this.focus()\n        })\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-popover.js",
    "content": "/* ===========================================================\n * bootstrap-popover.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#popovers\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* POPOVER PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n\n  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js\n     ========================================== */\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {\n\n    constructor: Popover\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n        , content = this.getContent()\n\n      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)\n\n      $tip.removeClass('fade top bottom left right in')\n    }\n\n  , hasContent: function () {\n      return this.getTitle() || this.getContent()\n    }\n\n  , getContent: function () {\n      var content\n        , $e = this.$element\n        , o = this.options\n\n      content = $e.attr('data-content')\n        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)\n\n      return content\n    }\n\n  , tip: function () {\n      if (!this.$tip) {\n        this.$tip = $(this.options.template)\n      }\n      return this.$tip\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  })\n\n\n /* POPOVER PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('popover')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><div class=\"popover-inner\"><h3 class=\"popover-title\"></h3><div class=\"popover-content\"><p></p></div></div></div>'\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-scrollspy.js",
    "content": "/* =============================================================\n * bootstrap-scrollspy.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#scrollspy\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* SCROLLSPY CLASS DEFINITION\n  * ========================== */\n\n  function ScrollSpy(element, options) {\n    var process = $.proxy(this.process, this)\n      , $element = $(element).is('body') ? $(window) : $(element)\n      , href\n    this.options = $.extend({}, $.fn.scrollspy.defaults, options)\n    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)\n    this.selector = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.$body = $('body')\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.prototype = {\n\n      constructor: ScrollSpy\n\n    , refresh: function () {\n        var self = this\n          , $targets\n\n        this.offsets = $([])\n        this.targets = $([])\n\n        $targets = this.$body\n          .find(this.selector)\n          .map(function () {\n            var $el = $(this)\n              , href = $el.data('target') || $el.attr('href')\n              , $href = /^#\\w/.test(href) && $(href)\n            return ( $href\n              && $href.length\n              && [[ $href.position().top, href ]] ) || null\n          })\n          .sort(function (a, b) { return a[0] - b[0] })\n          .each(function () {\n            self.offsets.push(this[0])\n            self.targets.push(this[1])\n          })\n      }\n\n    , process: function () {\n        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset\n          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n          , maxScroll = scrollHeight - this.$scrollElement.height()\n          , offsets = this.offsets\n          , targets = this.targets\n          , activeTarget = this.activeTarget\n          , i\n\n        if (scrollTop >= maxScroll) {\n          return activeTarget != (i = targets.last()[0])\n            && this.activate ( i )\n        }\n\n        for (i = offsets.length; i--;) {\n          activeTarget != targets[i]\n            && scrollTop >= offsets[i]\n            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n            && this.activate( targets[i] )\n        }\n      }\n\n    , activate: function (target) {\n        var active\n          , selector\n\n        this.activeTarget = target\n\n        $(this.selector)\n          .parent('.active')\n          .removeClass('active')\n\n        selector = this.selector\n          + '[data-target=\"' + target + '\"],'\n          + this.selector + '[href=\"' + target + '\"]'\n\n        active = $(selector)\n          .parent('li')\n          .addClass('active')\n\n        if (active.parent('.dropdown-menu').length)  {\n          active = active.closest('li.dropdown').addClass('active')\n        }\n\n        active.trigger('activate')\n      }\n\n  }\n\n\n /* SCROLLSPY PLUGIN DEFINITION\n  * =========================== */\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('scrollspy')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n  $.fn.scrollspy.defaults = {\n    offset: 10\n  }\n\n\n /* SCROLLSPY DATA-API\n  * ================== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-tab.js",
    "content": "/* ========================================================\n * bootstrap-tab.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#tabs\n * ========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TAB CLASS DEFINITION\n  * ==================== */\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n  , show: function () {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ( $this.parent('li').hasClass('active') ) return\n\n      previous = $ul.find('.active a').last()[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function () {\n        $this.trigger({\n          type: 'shown'\n        , relatedTarget: previous\n        })\n      })\n    }\n\n  , activate: function ( element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n            && $.support.transition\n            && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if ( element.parent('.dropdown-menu') ) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n\n /* TAB PLUGIN DEFINITION\n  * ===================== */\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n /* TAB DATA-API\n  * ============ */\n\n  $(function () {\n    $('body').on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n      e.preventDefault()\n      $(this).tab('show')\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-tooltip.js",
    "content": "/* ===========================================================\n * bootstrap-tooltip.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TOOLTIP PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Tooltip = function (element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n  , init: function (type, element, options) {\n      var eventIn\n        , eventOut\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      if (this.options.trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (this.options.trigger != 'manual') {\n        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'\n        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'\n        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n  , getOptions: function (options) {\n      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n        , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n  , enter: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n  , leave: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n  , show: function () {\n      var $tip\n        , inside\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n\n      if (this.hasContent() && this.enabled) {\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        inside = /in/.test(placement)\n\n        $tip\n          .remove()\n          .css({ top: 0, left: 0, display: 'block' })\n          .appendTo(inside ? this.$element : document.body)\n\n        pos = this.getPosition(inside)\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (inside ? placement.split(' ')[1] : placement) {\n          case 'bottom':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'top':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'left':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}\n            break\n          case 'right':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}\n            break\n        }\n\n        $tip\n          .css(tp)\n          .addClass(placement)\n          .addClass('in')\n      }\n    }\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n  , hide: function () {\n      var that = this\n        , $tip = this.tip()\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function () {\n          $tip.off($.support.transition.end).remove()\n        }, 500)\n\n        $tip.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          $tip.remove()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.remove()\n\n      return this\n    }\n\n  , fixTitle: function () {\n      var $e = this.$element\n      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')\n      }\n    }\n\n  , hasContent: function () {\n      return this.getTitle()\n    }\n\n  , getPosition: function (inside) {\n      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {\n        width: this.$element[0].offsetWidth\n      , height: this.$element[0].offsetHeight\n      })\n    }\n\n  , getTitle: function () {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n      return title\n    }\n\n  , tip: function () {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n  , validate: function () {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n  , enable: function () {\n      this.enabled = true\n    }\n\n  , disable: function () {\n      this.enabled = false\n    }\n\n  , toggleEnabled: function () {\n      this.enabled = !this.enabled\n    }\n\n  , toggle: function () {\n      this[this.tip().hasClass('in') ? 'hide' : 'show']()\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n\n /* TOOLTIP PLUGIN DEFINITION\n  * ========================= */\n\n  $.fn.tooltip = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover'\n  , title: ''\n  , delay: 0\n  , html: true\n  }\n\n}(window.jQuery);\n"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-transition.js",
    "content": "/* ===================================================\n * bootstrap-transition.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#transitions\n * ===================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  $(function () {\n\n    \"use strict\"; // jshint ;_;\n\n\n    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n     * ======================================================= */\n\n    $.support.transition = (function () {\n\n      var transitionEnd = (function () {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n               'WebkitTransition' : 'webkitTransitionEnd'\n            ,  'MozTransition'    : 'transitionend'\n            ,  'OTransition'      : 'oTransitionEnd otransitionend'\n            ,  'transition'       : 'transitionend'\n            }\n          , name\n\n        for (name in transEndEventNames){\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "servers/www/assets/bootstrap/js/bootstrap-typeahead.js",
    "content": "/* =============================================================\n * bootstrap-typeahead.js v2.1.0\n * http://twitter.github.com/bootstrap/javascript.html#typeahead\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function($){\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TYPEAHEAD PUBLIC CLASS DEFINITION\n  * ================================= */\n\n  var Typeahead = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.$menu = $(this.options.menu).appendTo('body')\n    this.source = this.options.source\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n  , select: function () {\n      var val = this.$menu.find('.active').attr('data-value')\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n  , updater: function (item) {\n      return item\n    }\n\n  , show: function () {\n      var pos = $.extend({}, this.$element.offset(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu.css({\n        top: pos.top + pos.height\n      , left: pos.left\n      })\n\n      this.$menu.show()\n      this.shown = true\n      return this\n    }\n\n  , hide: function () {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n  , lookup: function (event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n  , process: function (items) {\n      var that = this\n\n      items = $.grep(items, function (item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n  , matcher: function (item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n  , sorter: function (items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n  , highlighter: function (item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {\n        return '<strong>' + match + '</strong>'\n      })\n    }\n\n  , render: function (items) {\n      var that = this\n\n      items = $(items).map(function (i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n  , next: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n  , prev: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n  , listen: function () {\n      this.$element\n        .on('blur',     $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup',    $.proxy(this.keyup, this))\n\n      if ($.browser.webkit || $.browser.msie) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n    }\n\n  , move: function (e) {\n      if (!this.shown) return\n\n      switch(e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n  , keydown: function (e) {\n      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])\n      this.move(e)\n    }\n\n  , keypress: function (e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n  , keyup: function (e) {\n      switch(e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup()\n      }\n\n      e.stopPropagation()\n      e.preventDefault()\n  }\n\n  , blur: function (e) {\n      var that = this\n      setTimeout(function () { that.hide() }, 150)\n    }\n\n  , click: function (e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n    }\n\n  , mouseenter: function (e) {\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n  }\n\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  $.fn.typeahead = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n  , items: 8\n  , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n  , item: '<li><a href=\"#\"></a></li>'\n  , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n\n /*   TYPEAHEAD DATA-API\n  * ================== */\n\n  $(function () {\n    $('body').on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function (e) {\n      var $this = $(this)\n      if ($this.data('typeahead')) return\n      e.preventDefault()\n      $this.typeahead($this.data())\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/accordion.less",
    "content": "//\n// Accordion\n// --------------------------------------------------\n\n\n// Parent container\n.accordion {\n  margin-bottom: @baseLineHeight;\n}\n\n// Group == heading + body\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  .border-radius(4px);\n}\n.accordion-heading {\n  border-bottom: 0;\n}\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n\n// General toggle styles\n.accordion-toggle {\n  cursor: pointer;\n}\n\n// Inner needs the styles because you can't animate properly with any styles on the element\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: @baseLineHeight;\n  text-shadow: 0 1px 0 rgba(255,255,255,.5);\n  background-color: @warningBackground;\n  border: 1px solid @warningBorder;\n  .border-radius(4px);\n  color: @warningText;\n}\n.alert h4 {\n  margin: 0;\n}\n\n// Adjust close link position\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: @baseLineHeight;\n}\n\n\n// Alternate styles\n// -------------------------\n\n.alert-success {\n  background-color: @successBackground;\n  border-color: @successBorder;\n  color: @successText;\n}\n.alert-danger,\n.alert-error {\n  background-color: @errorBackground;\n  border-color: @errorBorder;\n  color: @errorText;\n}\n.alert-info {\n  background-color: @infoBackground;\n  border-color: @infoBorder;\n  color: @infoText;\n}\n\n\n// Block alerts\n// -------------------------\n\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n.alert-block p + p {\n  margin-top: 5px;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/bootstrap.less",
    "content": "/*!\n * Bootstrap v2.1.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n// CSS Reset\n@import \"reset.less\";\n\n// Core variables and mixins\n@import \"variables.less\"; // Modify this for custom colors, font-sizes, etc\n@import \"mixins.less\";\n\n// Grid system and page structure\n@import \"scaffolding.less\";\n@import \"grid.less\";\n@import \"layouts.less\";\n\n// Base CSS\n@import \"type.less\";\n@import \"code.less\";\n@import \"forms.less\";\n@import \"tables.less\";\n\n// Components: common\n@import \"font-awesome.less\";\n@import \"dropdowns.less\";\n@import \"wells.less\";\n@import \"component-animations.less\";\n@import \"close.less\";\n\n// Components: Buttons & Alerts\n@import \"buttons.less\";\n@import \"button-groups.less\";\n@import \"alerts.less\"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less\n\n// Components: Nav\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n\n// Components: Popovers\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n\n// Components: Misc\n@import \"thumbnails.less\";\n@import \"labels-badges.less\";\n@import \"progress-bars.less\";\n@import \"accordion.less\";\n@import \"carousel.less\";\n@import \"hero-unit.less\";\n\n// Utility classes\n@import \"utilities.less\"; // Has to be last to override when necessary\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 @baseLineHeight;\n  list-style: none;\n  background-color: #f5f5f5;\n  .border-radius(4px);\n  li {\n    display: inline-block;\n    .ie7-inline-block();\n    text-shadow: 0 1px 0 @white;\n  }\n  .divider {\n    padding: 0 5px;\n    color: #ccc;\n  }\n  .active {\n    color: @grayLight;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n\n// Make the div behave like a button\n.btn-group {\n  position: relative;\n  font-size: 0; // remove as part 1 of font-size inline-block hack\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)\n  .ie7-restore-left-whitespace();\n}\n\n// Space out series of button groups\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  font-size: 0; // Hack to remove whitespace that results from using inline-block\n  margin-top: @baseLineHeight / 2;\n  margin-bottom: @baseLineHeight / 2;\n  .btn-group {\n    display: inline-block;\n    .ie7-inline-block();\n  }\n  .btn + .btn,\n  .btn-group + .btn,\n  .btn + .btn-group {\n    margin-left: 5px;\n  }\n}\n\n// Float them, remove border radius, then re-add to first and last elements\n.btn-group > .btn {\n  position: relative;\n  .border-radius(0);\n}\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n.btn-group > .btn,\n.btn-group > .dropdown-menu {\n  font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack\n}\n\n// Reset fonts for other sizes\n.btn-group > .btn-mini {\n  font-size: 11px;\n}\n.btn-group > .btn-small {\n  font-size: 12px;\n}\n.btn-group > .btn-large {\n  font-size: 16px;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n     -webkit-border-top-left-radius: 4px;\n         -moz-border-radius-topleft: 4px;\n             border-top-left-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n      -moz-border-radius-bottomleft: 4px;\n          border-bottom-left-radius: 4px;\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n     -webkit-border-top-right-radius: 4px;\n         -moz-border-radius-topright: 4px;\n             border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n      -moz-border-radius-bottomright: 4px;\n          border-bottom-right-radius: 4px;\n}\n// Reset corners for large buttons\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n     -webkit-border-top-left-radius: 6px;\n         -moz-border-radius-topleft: 6px;\n             border-top-left-radius: 6px;\n  -webkit-border-bottom-left-radius: 6px;\n      -moz-border-radius-bottomleft: 6px;\n          border-bottom-left-radius: 6px;\n}\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n     -webkit-border-top-right-radius: 6px;\n         -moz-border-radius-topright: 6px;\n             border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n      -moz-border-radius-bottomright: 6px;\n          border-bottom-right-radius: 6px;\n}\n\n// On hover/focus/active, bring the proper btn to front\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n  .box-shadow(inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05));\n  *padding-top: 5px;\n  *padding-bottom: 5px;\n}\n.btn-group > .btn-mini + .dropdown-toggle {\n  padding-left: 5px;\n  padding-right: 5px;\n  *padding-top: 2px;\n  *padding-bottom: 2px;\n}\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n.btn-group > .btn-large + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n\n.btn-group.open {\n\n  // The clickable button for toggling the menu\n  // Remove the gradient and set the same inset shadow as the :active state\n  .dropdown-toggle {\n    background-image: none;\n    .box-shadow(inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05));\n  }\n\n  // Keep the hover's background when dropdown is open\n  .btn.dropdown-toggle {\n    background-color: @btnBackgroundHighlight;\n  }\n  .btn-primary.dropdown-toggle {\n    background-color: @btnPrimaryBackgroundHighlight;\n  }\n  .btn-warning.dropdown-toggle {\n    background-color: @btnWarningBackgroundHighlight;\n  }\n  .btn-danger.dropdown-toggle {\n    background-color: @btnDangerBackgroundHighlight;\n  }\n  .btn-success.dropdown-toggle {\n    background-color: @btnSuccessBackgroundHighlight;\n  }\n  .btn-info.dropdown-toggle {\n    background-color: @btnInfoBackgroundHighlight;\n  }\n  .btn-inverse.dropdown-toggle {\n    background-color: @btnInverseBackgroundHighlight;\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-mini .caret,\n.btn-small .caret,\n.btn-large .caret {\n  margin-top: 6px;\n}\n.btn-large .caret {\n  border-left-width:  5px;\n  border-right-width: 5px;\n  border-top-width:   5px;\n}\n// Upside down carets for .dropup\n.dropup .btn-large .caret {\n  border-bottom: 5px solid @black;\n  border-top: 0;\n}\n\n\n\n// Account for other colors\n.btn-primary,\n.btn-warning,\n.btn-danger,\n.btn-info,\n.btn-success,\n.btn-inverse {\n  .caret {\n    border-top-color: @white;\n    border-bottom-color: @white;\n  }\n}\n\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  display: inline-block; // makes buttons only take up the width they need\n  .ie7-inline-block();\n}\n.btn-group-vertical .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  .border-radius(0);\n}\n.btn-group-vertical .btn + .btn {\n  margin-left: 0;\n  margin-top: -1px;\n}\n.btn-group-vertical .btn:first-child {\n  .border-radius(4px 4px 0 0);\n}\n.btn-group-vertical .btn:last-child {\n  .border-radius(0 0 4px 4px);\n}\n.btn-group-vertical .btn-large:first-child {\n  .border-radius(6px 6px 0 0);\n}\n.btn-group-vertical .btn-large:last-child {\n  .border-radius(0 0 6px 6px);\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n// Core\n.btn {\n  display: inline-block;\n  .ie7-inline-block();\n  padding: 4px 14px;\n  margin-bottom: 0; // For input.btn\n  font-size: @baseFontSize;\n  line-height: @baseLineHeight;\n  *line-height: @baseLineHeight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));\n  border: 1px solid @btnBorder;\n  *border: 0; // Remove the border to prevent IE7's black border on input:focus\n  border-bottom-color: darken(@btnBorder, 10%);\n  .border-radius(4px);\n  .ie7-restore-left-whitespace(); // Give IE7 some love\n  .box-shadow(inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05));\n\n  // Hover state\n  &:hover {\n    color: @grayDark;\n    text-decoration: none;\n    background-color: darken(@white, 10%);\n    *background-color: darken(@white, 15%); /* Buttons in IE7 don't get borders, so darken on hover */\n    background-position: 0 -15px;\n\n    // transition is only when going to hover, otherwise the background\n    // behind the gradient (there for IE<=9 fallback) gets mismatched\n    .transition(background-position .1s linear);\n  }\n\n  // Focus state for keyboard and accessibility\n  &:focus {\n    .tab-focus();\n  }\n\n  // Active state\n  &.active,\n  &:active {\n    background-color: darken(@white, 10%);\n    background-color: darken(@white, 15%) e(\"\\9\");\n    background-image: none;\n    outline: 0;\n    .box-shadow(inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05));\n  }\n\n  // Disabled state\n  &.disabled,\n  &[disabled] {\n    cursor: default;\n    background-color: darken(@white, 10%);\n    background-image: none;\n    .opacity(65);\n    .box-shadow(none);\n  }\n\n}\n\n\n\n// Button Sizes\n// --------------------------------------------------\n\n// Large\n.btn-large {\n  padding: 9px 14px;\n  font-size: @baseFontSize + 2px;\n  line-height: normal;\n  .border-radius(5px);\n}\n.btn-large [class^=\"icon-\"] {\n  margin-top: 2px;\n}\n\n// Small\n.btn-small {\n  padding: 3px 9px;\n  font-size: @baseFontSize - 2px;\n  line-height: @baseLineHeight - 2px;\n}\n.btn-small [class^=\"icon-\"] {\n  margin-top: 0;\n}\n\n// Mini\n.btn-mini {\n  padding: 2px 6px;\n  font-size: @baseFontSize - 3px;\n  line-height: @baseLineHeight - 3px;\n}\n\n\n// Block button\n// -------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n  .box-sizing(border-box);\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n// Provide *some* extra contrast for those who can get it\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255,255,255,.75);\n}\n\n// Set the backgrounds\n// -------------------------\n.btn {\n  // reset here as of 2.0.3 due to Recess property order\n  border-color: #c5c5c5;\n  border-color: rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25);\n}\n.btn-primary {\n  .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);\n}\n// Warning appears are orange\n.btn-warning {\n  .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);\n}\n// Danger and error appear as red\n.btn-danger {\n  .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);\n}\n// Success appears as green\n.btn-success {\n  .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);\n}\n// Info appears as a neutral blue\n.btn-info {\n  .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);\n}\n// Inverse appears as dark gray\n.btn-inverse {\n  .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);\n}\n\n\n// Cross-browser Jank\n// --------------------------------------------------\n\nbutton.btn,\ninput[type=\"submit\"].btn {\n\n  // Firefox 3.6 only I believe\n  &::-moz-focus-inner {\n    padding: 0;\n    border: 0;\n  }\n\n  // IE7 has some default padding on button controls\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n\n  &.btn-large {\n    *padding-top: 7px;\n    *padding-bottom: 7px;\n  }\n  &.btn-small {\n    *padding-top: 3px;\n    *padding-bottom: 3px;\n  }\n  &.btn-mini {\n    *padding-top: 1px;\n    *padding-bottom: 1px;\n  }\n}\n\n\n// Link buttons\n// --------------------------------------------------\n\n// Make a button look and behave like a link\n.btn-link,\n.btn-link:active,\n.btn-link[disabled] {\n  background-color: transparent;\n  background-image: none;\n  .box-shadow(none);\n}\n.btn-link {\n  border-color: transparent;\n  cursor: pointer;\n  color: @linkColor;\n  .border-radius(0);\n}\n.btn-link:hover {\n  color: @linkColorHover;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover {\n  color: @grayDark;\n  text-decoration: none;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n.carousel {\n  position: relative;\n  margin-bottom: @baseLineHeight;\n  line-height: 1;\n}\n\n.carousel-inner {\n  overflow: hidden;\n  width: 100%;\n  position: relative;\n}\n\n.carousel {\n\n  .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n  }\n\n  // Account for jankitude on images\n  .item > img {\n    display: block;\n    line-height: 1;\n  }\n\n  .active,\n  .next,\n  .prev { display: block; }\n\n  .active {\n    left: 0;\n  }\n\n  .next,\n  .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  .next {\n    left: 100%;\n  }\n  .prev {\n    left: -100%;\n  }\n  .next.left,\n  .prev.right {\n    left: 0;\n  }\n\n  .active.left {\n    left: -100%;\n  }\n  .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: @white;\n  text-align: center;\n  background: @grayDarker;\n  border: 3px solid @white;\n  .border-radius(23px);\n  .opacity(50);\n\n  // we can't have this transition here\n  // because webkit cancels the carousel\n  // animation if you trip this while\n  // in the middle of another animation\n  // ;_;\n  // .transition(opacity .2s linear);\n\n  // Reposition the right one\n  &.right {\n    left: auto;\n    right: 15px;\n  }\n\n  // Hover state\n  &:hover {\n    color: @white;\n    text-decoration: none;\n    .opacity(90);\n  }\n}\n\n\n// Caption for text below images\n// -----------------------------\n\n.carousel-caption {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 15px;\n  background: @grayDark;\n  background: rgba(0,0,0,.75);\n}\n.carousel-caption h4,\n.carousel-caption p {\n  color: @white;\n  line-height: @baseLineHeight;\n}\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n.carousel-caption p {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: @baseLineHeight;\n  color: @black;\n  text-shadow: 0 1px 0 rgba(255,255,255,1);\n  .opacity(20);\n  &:hover {\n    color: @black;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(40);\n  }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}"
  },
  {
    "path": "servers/www/assets/bootstrap/less/code.less",
    "content": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\npre {\n  padding: 0 3px 2px;\n  #font > #family > .monospace;\n  font-size: @baseFontSize - 2;\n  color: @grayDark;\n  .border-radius(3px);\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (@baseLineHeight - 1) / 2;\n  margin: 0 0 @baseLineHeight / 2;\n  font-size: @baseFontSize - 1; // 14px to 13px\n  line-height: @baseLineHeight;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc; // fallback for IE7-8\n  border: 1px solid rgba(0,0,0,.15);\n  .border-radius(4px);\n\n  // Make prettyprint styles more spaced out for readability\n  &.prettyprint {\n    margin-bottom: @baseLineHeight;\n  }\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    color: inherit;\n    background-color: transparent;\n    border: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}"
  },
  {
    "path": "servers/www/assets/bootstrap/less/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n  &.in {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle {\n  // The caret makes the toggle a bit too tall in IE7\n  *margin-bottom: -3px;\n}\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n\n// Dropdown arrow/caret\n// --------------------\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top:   4px solid @black;\n  border-right: 4px solid transparent;\n  border-left:  4px solid transparent;\n  content: \"\";\n}\n\n// Place the caret\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n\n// The dropdown menu (ul)\n// ----------------------\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindexDropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  background-color: @dropdownBackground;\n  border: 1px solid #ccc; // Fallback for IE7-8\n  border: 1px solid @dropdownBorder;\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  .border-radius(6px);\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdownDividerTop, @dropdownDividerBottom);\n  }\n\n  // Links within the dropdown menu\n  a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @baseLineHeight;\n    color: @dropdownLinkColor;\n    white-space: nowrap;\n  }\n}\n\n// Hover state\n// -----------\n.dropdown-menu li > a:hover,\n.dropdown-menu li > a:focus,\n.dropdown-submenu:hover > a {\n  text-decoration: none;\n  color: @dropdownLinkColorHover;\n  background-color: @dropdownLinkBackgroundHover;\n  #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));\n}\n\n// Active state\n// ------------\n.dropdown-menu .active > a,\n.dropdown-menu .active > a:hover {\n  color: @dropdownLinkColorHover;\n  text-decoration: none;\n  outline: 0;\n  background-color: @dropdownLinkBackgroundActive;\n  #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));\n}\n\n// Disabled state\n// --------------\n// Gray out text and ensure the hover state remains gray\n.dropdown-menu .disabled > a,\n.dropdown-menu .disabled > a:hover {\n  color: @grayLight;\n}\n// Nuke hover effects\n.dropdown-menu .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n\n// Open state for the dropdown\n// ---------------------------\n.open {\n  // IE7's z-index only goes to the nearest positioned ancestor, which would\n  // make the menu appear below buttons that appeared later on the page\n  *z-index: @zindexDropdown;\n\n  & > .dropdown-menu {\n    display: block;\n  }\n}\n\n// Right aligned dropdowns\n// ---------------------------\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// ------------------------------------------------------\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: 4px solid @black;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n// Sub menus\n// ---------------------------\n.dropdown-submenu {\n  position: relative;\n}\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n     -moz-border-radius: 0 6px 6px 6px;\n          border-radius: 0 6px 6px 6px;\n}\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n\n.dropdown-submenu > a:after {\n  display: block;\n  content: \" \";\n  float: right;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  border-left-color: darken(@dropdownBackground, 20%);\n  margin-top: 5px;\n  margin-right: -10px;\n}\n.dropdown-submenu:hover > a:after {\n  border-left-color: @dropdownLinkColorHover;\n}\n\n\n// Tweak nav headers\n// -----------------\n// Increase padding from 15px to 20px on sides\n.dropdown .dropdown-menu .nav-header {\n  padding-left: 20px;\n  padding-right: 20px;\n}\n\n// Typeahead\n// ---------\n.typeahead {\n  margin-top: 2px; // give it some space to breathe\n  .border-radius(4px);\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/font-awesome.less",
    "content": "/*  Font Awesome\n    the iconic font designed for use with Twitter Bootstrap\n    -------------------------------------------------------\n    The full suite of pictographic icons, examples, and documentation\n    can be found at: http://fortawesome.github.com/Font-Awesome/\n\n    License\n    -------------------------------------------------------\n    The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:\n    http://creativecommons.org/licenses/by/3.0/ A mention of\n    'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable\n    source code is considered acceptable attribution (most common on the web).\n    If human readable source code is not available to the end user, a mention in\n    an 'About' or 'Credits' screen is considered acceptable (most common in desktop\n    or mobile software).\n\n    Contact\n    -------------------------------------------------------\n    Email: dave@davegandy.com\n    Twitter: http://twitter.com/fortaweso_me\n    Work: Lead Product Designer @ http://kyruus.com\n\n    */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../../font/fontawesome-webfont.eot');\n  src: url('../../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),\n    url('../../font/fontawesome-webfont.woff') format('woff'),\n    url('../../font/fontawesome-webfont.ttf') format('truetype'),\n    url('../../font/fontawesome-webfont.svg#FontAwesome') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n\n/*  Font Awesome styles\n    ------------------------------------------------------- */\n[class^=\"icon-\"]:before,\n[class*=\" icon-\"]:before {\n  font-family: FontAwesome;\n  font-weight: normal;\n  font-style: normal;\n  display: inline-block;\n  text-decoration: inherit;\n}\n\na [class^=\"icon-\"],\na [class*=\" icon-\"] {\n  display: inline-block;\n  text-decoration: inherit;\n}\n\n/* makes the font 33% larger relative to the icon container */\n.icon-large:before {\n  vertical-align: middle;\n  font-size: 4/3em;\n}\n\n.btn, .nav-tabs {\n  [class^=\"icon-\"],\n  [class*=\" icon-\"] {\n  /* keeps button heights with and without icons the same */\n    line-height: .9em;\n  }\n}\n\nli {\n  [class^=\"icon-\"],\n  [class*=\" icon-\"] {\n    display: inline-block;\n    width: 1.25em;\n    text-align: center;\n  }\n  .icon-large:before,\n  .icon-large:before {\n    /* 1.5 increased font size for icon-large * 1.25 width */\n    width: 1.5*1.25em;\n  }\n}\n\nul.icons {\n  list-style-type: none;\n  margin-left: 2em;\n  text-indent: -.8em;\n\n  li {\n    [class^=\"icon-\"],\n    [class*=\" icon-\"] {\n      width: .8em;\n    }\n    .icon-large:before,\n    .icon-large:before {\n      /* 1.5 increased font size for icon-large * 1.25 width */\n      vertical-align: initial;\n//      width: 1.5*1.25em;\n    }\n  }\n}\n\n/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n    readers do not read off random characters that represent icons */\n.icon-glass:before                { content: \"\\f000\"; }\n.icon-music:before                { content: \"\\f001\"; }\n.icon-search:before               { content: \"\\f002\"; }\n.icon-envelope:before             { content: \"\\f003\"; }\n.icon-heart:before                { content: \"\\f004\"; }\n.icon-star:before                 { content: \"\\f005\"; }\n.icon-star-empty:before           { content: \"\\f006\"; }\n.icon-user:before                 { content: \"\\f007\"; }\n.icon-film:before                 { content: \"\\f008\"; }\n.icon-th-large:before             { content: \"\\f009\"; }\n.icon-th:before                   { content: \"\\f00a\"; }\n.icon-th-list:before              { content: \"\\f00b\"; }\n.icon-ok:before                   { content: \"\\f00c\"; }\n.icon-remove:before               { content: \"\\f00d\"; }\n.icon-zoom-in:before              { content: \"\\f00e\"; }\n\n.icon-zoom-out:before             { content: \"\\f010\"; }\n.icon-off:before                  { content: \"\\f011\"; }\n.icon-signal:before               { content: \"\\f012\"; }\n.icon-cog:before                  { content: \"\\f013\"; }\n.icon-trash:before                { content: \"\\f014\"; }\n.icon-home:before                 { content: \"\\f015\"; }\n.icon-file:before                 { content: \"\\f016\"; }\n.icon-time:before                 { content: \"\\f017\"; }\n.icon-road:before                 { content: \"\\f018\"; }\n.icon-download-alt:before         { content: \"\\f019\"; }\n.icon-download:before             { content: \"\\f01a\"; }\n.icon-upload:before               { content: \"\\f01b\"; }\n.icon-inbox:before                { content: \"\\f01c\"; }\n.icon-play-circle:before          { content: \"\\f01d\"; }\n.icon-repeat:before               { content: \"\\f01e\"; }\n\n/* \\f020 is not a valid unicode character. all shifted one down */\n.icon-refresh:before              { content: \"\\f021\"; }\n.icon-list-alt:before             { content: \"\\f022\"; }\n.icon-lock:before                 { content: \"\\f023\"; }\n.icon-flag:before                 { content: \"\\f024\"; }\n.icon-headphones:before           { content: \"\\f025\"; }\n.icon-volume-off:before           { content: \"\\f026\"; }\n.icon-volume-down:before          { content: \"\\f027\"; }\n.icon-volume-up:before            { content: \"\\f028\"; }\n.icon-qrcode:before               { content: \"\\f029\"; }\n.icon-barcode:before              { content: \"\\f02a\"; }\n.icon-tag:before                  { content: \"\\f02b\"; }\n.icon-tags:before                 { content: \"\\f02c\"; }\n.icon-book:before                 { content: \"\\f02d\"; }\n.icon-bookmark:before             { content: \"\\f02e\"; }\n.icon-print:before                { content: \"\\f02f\"; }\n\n.icon-camera:before               { content: \"\\f030\"; }\n.icon-font:before                 { content: \"\\f031\"; }\n.icon-bold:before                 { content: \"\\f032\"; }\n.icon-italic:before               { content: \"\\f033\"; }\n.icon-text-height:before          { content: \"\\f034\"; }\n.icon-text-width:before           { content: \"\\f035\"; }\n.icon-align-left:before           { content: \"\\f036\"; }\n.icon-align-center:before         { content: \"\\f037\"; }\n.icon-align-right:before          { content: \"\\f038\"; }\n.icon-align-justify:before        { content: \"\\f039\"; }\n.icon-list:before                 { content: \"\\f03a\"; }\n.icon-indent-left:before          { content: \"\\f03b\"; }\n.icon-indent-right:before         { content: \"\\f03c\"; }\n.icon-facetime-video:before       { content: \"\\f03d\"; }\n.icon-picture:before              { content: \"\\f03e\"; }\n\n.icon-pencil:before               { content: \"\\f040\"; }\n.icon-map-marker:before           { content: \"\\f041\"; }\n.icon-adjust:before               { content: \"\\f042\"; }\n.icon-tint:before                 { content: \"\\f043\"; }\n.icon-edit:before                 { content: \"\\f044\"; }\n.icon-share:before                { content: \"\\f045\"; }\n.icon-check:before                { content: \"\\f046\"; }\n.icon-move:before                 { content: \"\\f047\"; }\n.icon-step-backward:before        { content: \"\\f048\"; }\n.icon-fast-backward:before        { content: \"\\f049\"; }\n.icon-backward:before             { content: \"\\f04a\"; }\n.icon-play:before                 { content: \"\\f04b\"; }\n.icon-pause:before                { content: \"\\f04c\"; }\n.icon-stop:before                 { content: \"\\f04d\"; }\n.icon-forward:before              { content: \"\\f04e\"; }\n\n.icon-fast-forward:before         { content: \"\\f050\"; }\n.icon-step-forward:before         { content: \"\\f051\"; }\n.icon-eject:before                { content: \"\\f052\"; }\n.icon-chevron-left:before         { content: \"\\f053\"; }\n.icon-chevron-right:before        { content: \"\\f054\"; }\n.icon-plus-sign:before            { content: \"\\f055\"; }\n.icon-minus-sign:before           { content: \"\\f056\"; }\n.icon-remove-sign:before          { content: \"\\f057\"; }\n.icon-ok-sign:before              { content: \"\\f058\"; }\n.icon-question-sign:before        { content: \"\\f059\"; }\n.icon-info-sign:before            { content: \"\\f05a\"; }\n.icon-screenshot:before           { content: \"\\f05b\"; }\n.icon-remove-circle:before        { content: \"\\f05c\"; }\n.icon-ok-circle:before            { content: \"\\f05d\"; }\n.icon-ban-circle:before           { content: \"\\f05e\"; }\n\n.icon-arrow-left:before           { content: \"\\f060\"; }\n.icon-arrow-right:before          { content: \"\\f061\"; }\n.icon-arrow-up:before             { content: \"\\f062\"; }\n.icon-arrow-down:before           { content: \"\\f063\"; }\n.icon-share-alt:before            { content: \"\\f064\"; }\n.icon-resize-full:before          { content: \"\\f065\"; }\n.icon-resize-small:before         { content: \"\\f066\"; }\n.icon-plus:before                 { content: \"\\f067\"; }\n.icon-minus:before                { content: \"\\f068\"; }\n.icon-asterisk:before             { content: \"\\f069\"; }\n.icon-exclamation-sign:before     { content: \"\\f06a\"; }\n.icon-gift:before                 { content: \"\\f06b\"; }\n.icon-leaf:before                 { content: \"\\f06c\"; }\n.icon-fire:before                 { content: \"\\f06d\"; }\n.icon-eye-open:before             { content: \"\\f06e\"; }\n\n.icon-eye-close:before            { content: \"\\f070\"; }\n.icon-warning-sign:before         { content: \"\\f071\"; }\n.icon-plane:before                { content: \"\\f072\"; }\n.icon-calendar:before             { content: \"\\f073\"; }\n.icon-random:before               { content: \"\\f074\"; }\n.icon-comment:before              { content: \"\\f075\"; }\n.icon-magnet:before               { content: \"\\f076\"; }\n.icon-chevron-up:before           { content: \"\\f077\"; }\n.icon-chevron-down:before         { content: \"\\f078\"; }\n.icon-retweet:before              { content: \"\\f079\"; }\n.icon-shopping-cart:before        { content: \"\\f07a\"; }\n.icon-folder-close:before         { content: \"\\f07b\"; }\n.icon-folder-open:before          { content: \"\\f07c\"; }\n.icon-resize-vertical:before      { content: \"\\f07d\"; }\n.icon-resize-horizontal:before    { content: \"\\f07e\"; }\n\n.icon-bar-chart:before            { content: \"\\f080\"; }\n.icon-twitter-sign:before         { content: \"\\f081\"; }\n.icon-facebook-sign:before        { content: \"\\f082\"; }\n.icon-camera-retro:before         { content: \"\\f083\"; }\n.icon-key:before                  { content: \"\\f084\"; }\n.icon-cogs:before                 { content: \"\\f085\"; }\n.icon-comments:before             { content: \"\\f086\"; }\n.icon-thumbs-up:before            { content: \"\\f087\"; }\n.icon-thumbs-down:before          { content: \"\\f088\"; }\n.icon-star-half:before            { content: \"\\f089\"; }\n.icon-heart-empty:before          { content: \"\\f08a\"; }\n.icon-signout:before              { content: \"\\f08b\"; }\n.icon-linkedin-sign:before        { content: \"\\f08c\"; }\n.icon-pushpin:before              { content: \"\\f08d\"; }\n.icon-external-link:before        { content: \"\\f08e\"; }\n\n.icon-signin:before               { content: \"\\f090\"; }\n.icon-trophy:before               { content: \"\\f091\"; }\n.icon-github-sign:before          { content: \"\\f092\"; }\n.icon-upload-alt:before           { content: \"\\f093\"; }\n.icon-lemon:before                { content: \"\\f094\"; }\n.icon-phone:before                { content: \"\\f095\"; }\n.icon-check-empty:before          { content: \"\\f096\"; }\n.icon-bookmark-empty:before       { content: \"\\f097\"; }\n.icon-phone-sign:before           { content: \"\\f098\"; }\n.icon-twitter:before              { content: \"\\f099\"; }\n.icon-facebook:before             { content: \"\\f09a\"; }\n.icon-github:before               { content: \"\\f09b\"; }\n.icon-unlock:before               { content: \"\\f09c\"; }\n.icon-credit-card:before          { content: \"\\f09d\"; }\n.icon-rss:before                  { content: \"\\f09e\"; }\n\n.icon-hdd:before                  { content: \"\\f0a0\"; }\n.icon-bullhorn:before             { content: \"\\f0a1\"; }\n.icon-bell:before                 { content: \"\\f0a2\"; }\n.icon-certificate:before          { content: \"\\f0a3\"; }\n.icon-hand-right:before           { content: \"\\f0a4\"; }\n.icon-hand-left:before            { content: \"\\f0a5\"; }\n.icon-hand-up:before              { content: \"\\f0a6\"; }\n.icon-hand-down:before            { content: \"\\f0a7\"; }\n.icon-circle-arrow-left:before    { content: \"\\f0a8\"; }\n.icon-circle-arrow-right:before   { content: \"\\f0a9\"; }\n.icon-circle-arrow-up:before      { content: \"\\f0aa\"; }\n.icon-circle-arrow-down:before    { content: \"\\f0ab\"; }\n.icon-globe:before                { content: \"\\f0ac\"; }\n.icon-wrench:before               { content: \"\\f0ad\"; }\n.icon-tasks:before                { content: \"\\f0ae\"; }\n\n.icon-filter:before               { content: \"\\f0b0\"; }\n.icon-briefcase:before            { content: \"\\f0b1\"; }\n.icon-fullscreen:before           { content: \"\\f0b2\"; }\n\n.icon-group:before                { content: \"\\f0c0\"; }\n.icon-link:before                 { content: \"\\f0c1\"; }\n.icon-cloud:before                { content: \"\\f0c2\"; }\n.icon-beaker:before               { content: \"\\f0c3\"; }\n.icon-cut:before                  { content: \"\\f0c4\"; }\n.icon-copy:before                 { content: \"\\f0c5\"; }\n.icon-paper-clip:before           { content: \"\\f0c6\"; }\n.icon-save:before                 { content: \"\\f0c7\"; }\n.icon-sign-blank:before           { content: \"\\f0c8\"; }\n.icon-reorder:before              { content: \"\\f0c9\"; }\n.icon-list-ul:before              { content: \"\\f0ca\"; }\n.icon-list-ol:before              { content: \"\\f0cb\"; }\n.icon-strikethrough:before        { content: \"\\f0cc\"; }\n.icon-underline:before            { content: \"\\f0cd\"; }\n.icon-table:before                { content: \"\\f0ce\"; }\n.icon-table:before                { content: \"\\f0ce\"; }\n\n.icon-magic:before                { content: \"\\f0d0\"; }\n.icon-truck:before                { content: \"\\f0d1\"; }\n.icon-pinterest:before            { content: \"\\f0d2\"; }\n.icon-pinterest-sign:before       { content: \"\\f0d3\"; }\n.icon-google-plus-sign:before     { content: \"\\f0d4\"; }\n.icon-google-plus:before          { content: \"\\f0d5\"; }\n.icon-money:before                { content: \"\\f0d6\"; }\n.icon-caret-down:before           { content: \"\\f0d7\"; }\n.icon-caret-up:before             { content: \"\\f0d8\"; }\n.icon-caret-left:before           { content: \"\\f0d9\"; }\n.icon-caret-right:before          { content: \"\\f0da\"; }\n.icon-columns:before              { content: \"\\f0db\"; }\n.icon-sort:before                 { content: \"\\f0dc\"; }\n.icon-sort-down:before            { content: \"\\f0dd\"; }\n.icon-sort-up:before              { content: \"\\f0de\"; }\n\n.icon-envelope-alt:before         { content: \"\\f0e0\"; }\n.icon-linkedin:before             { content: \"\\f0e1\"; }\n.icon-undo:before                 { content: \"\\f0e2\"; }\n.icon-legal:before                { content: \"\\f0e3\"; }\n.icon-dashboard:before            { content: \"\\f0e4\"; }\n.icon-comment-alt:before          { content: \"\\f0e5\"; }\n.icon-comments-alt:before         { content: \"\\f0e6\"; }\n.icon-bolt:before                 { content: \"\\f0e7\"; }\n.icon-sitemap:before              { content: \"\\f0e8\"; }\n.icon-umbrella:before             { content: \"\\f0e9\"; }\n.icon-paste:before                { content: \"\\f0ea\"; }\n\n.icon-user-md:before              { content: \"\\f200\"; }\n\n.icon-apple-logo:before           { content: \"\\f500\"; }\n.icon-windows-8:before            { content: \"\\f501\"; }\n.icon-js-fiddle:before            { content: \"\\f502\"; }\n.icon-skype:before                { content: \"\\f503\"; }\n.icon-youtube-sign:before         { content: \"\\f504\"; }\n.icon-youtube:before              { content: \"\\f505\"; }\n.icon-vimeo-sign:before           { content: \"\\f506\"; }\n.icon-vimeo:before                { content: \"\\f507\"; }\n.icon-lastfm-sign:before          { content: \"\\f508\"; }\n.icon-lastfm:before               { content: \"\\f509\"; }\n.icon-rss-sign:before             { content: \"\\f50a\"; }\n.icon-reddit:before               { content: \"\\f50b\"; }\n.icon-delicious-sign:before       { content: \"\\f50c\"; }\n.icon-wordpress-sign:before       { content: \"\\f50d\"; }\n.icon-wordpress:before            { content: \"\\f50e\"; }\n.icon-git-fork:before             { content: \"\\f50f\"; }\n\n.icon-blogger-sign:before         { content: \"\\f510\"; }\n.icon-blogger:before              { content: \"\\f511\"; }\n.icon-tumblr-sign:before          { content: \"\\f512\"; }\n.icon-tumblr:before               { content: \"\\f513\"; }\n.icon-flickr-sign:before          { content: \"\\f514\"; }\n.icon-flickr:before               { content: \"\\f515\"; }\n.icon-picasa-sign:before          { content: \"\\f516\"; }\n.icon-picasa:before               { content: \"\\f517\"; }\n.icon-amazon-sign:before          { content: \"\\f518\"; }\n.icon-amazon:before               { content: \"\\f519\"; }\n.icon-yelp-sign:before            { content: \"\\f51a\"; }\n.icon-yelp:before                 { content: \"\\f51b\"; }\n.icon-soundcloud:before           { content: \"\\f51c\"; }\n.icon-spotify:before              { content: \"\\f51d\"; }\n\n.icon-yahoo-sign:before           { content: \"\\f520\"; }\n.icon-yahoo:before                { content: \"\\f521\"; }\n.icon-evernote-sign:before        { content: \"\\f522\"; }\n.icon-evernote:before             { content: \"\\f523\"; }\n.icon-google-sign:before          { content: \"\\f524\"; }\n.icon-google:before               { content: \"\\f525\"; }\n.icon-hacker-news:before          { content: \"\\f526\"; }\n.icon-map:before          \t\t\t\t{ content: \"\\f529\"; }\n.icon-bus-sign:before             { content: \"\\f52a\"; }\n.icon-bike-sign:before            { content: \"\\f52b\"; }\n.icon-car-sign:before             { content: \"\\f52c\"; }\n.icon-taxi-sign:before            { content: \"\\f52d\"; }\n.icon-truck-sign:before           { content: \"\\f52e\"; }\n.icon-handicap-sign:before        { content: \"\\f52f\"; }\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// GENERAL STYLES\n// --------------\n\n// Make all forms have space below them\nform {\n  margin: 0 0 @baseLineHeight;\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\n// Groups of fields with labels on top (legends)\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @baseLineHeight;\n  font-size: @baseFontSize * 1.5;\n  line-height: @baseLineHeight * 2;\n  color: @grayDark;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n\n  // Small\n  small {\n    font-size: @baseLineHeight * .75;\n    color: @grayLight;\n  }\n}\n\n// Set font for forms\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)\n}\n\n// Identify controls by their labels\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\n\n// Form controls\n// -------------------------\n\n// Shared size and type resets\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: @baseLineHeight;\n  padding: 4px 6px;\n  margin-bottom: 9px;\n  font-size: @baseFontSize;\n  line-height: @baseLineHeight;\n  color: @gray;\n  .border-radius(@inputBorderRadius);\n}\n\n// Reset appearance properties for textual inputs and textarea\n// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)\ninput,\ntextarea,\n.uneditable-input {\n  width: 206px; // plus 12px padding and 2px border\n}\n// Reset height since textareas have rows\ntextarea {\n  height: auto;\n}\n// Everything else\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: @inputBackground;\n  border: 1px solid @inputBorder;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border linear .2s, box-shadow linear .2s\");\n\n  // Focus state\n  &:focus {\n    border-color: rgba(82,168,236,.8);\n    outline: 0;\n    outline: thin dotted \\9; /* IE6-9 */\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6));\n  }\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  *margin-top: 0; /* IE7 */\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n  cursor: pointer;\n}\n\n// Reset width of input images, buttons, radios, checkboxes\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto; // Override of generic input selector\n}\n\n// Set the height of select and file controls to match text inputs\nselect,\ninput[type=\"file\"] {\n  height: 30px; /* In IE7, the height of the select element cannot be changed by height, only font-size */\n  *margin-top: 4px; /* For IE7, add top margin to align select with labels */\n  line-height: 30px;\n}\n\n// Make select elements obey height by applying a border\nselect {\n  width: 220px; // default input width + 10px of padding that doesn't get applied\n  border: 1px solid @inputBorder;\n  background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for select, file, radio, and checkbox\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n\n// Uneditable inputs\n// -------------------------\n\n// Make uneditable inputs look inactive\n.uneditable-input,\n.uneditable-textarea {\n  color: @grayLight;\n  background-color: darken(@inputBackground, 1%);\n  border-color: @inputBorder;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));\n  cursor: not-allowed;\n}\n\n// For text that needs to appear as an input but should not be an input\n.uneditable-input {\n  overflow: hidden; // prevent text from wrapping, but still cut it off like an input does\n  white-space: nowrap;\n}\n\n// Make uneditable textareas behave like a textarea\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\n\n\n// Placeholder\n// -------------------------\n\n// Placeholder text gets special styles because when browsers invalidate entire lines if it doesn’t understand a selector\ninput,\ntextarea {\n  .placeholder();\n}\n\n\n// CHECKBOXES & RADIOS\n// -------------------\n\n// Indent the labels to position radios/checkboxes as hanging\n.radio,\n.checkbox {\n  min-height: 18px; // clear the floating input if there is no label text\n  padding-left: 18px;\n}\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -18px;\n}\n\n// Move the options list down to align with labels\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px; // has to be padding because margin collaspes\n}\n\n// Radios and checkboxes on same line\n// TODO v3: Convert .inline to .control-inline\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n\n\n// INPUT SIZES\n// -----------\n\n// General classes for quick sizes\n.input-mini       { width: 60px; }\n.input-small      { width: 90px; }\n.input-medium     { width: 150px; }\n.input-large      { width: 210px; }\n.input-xlarge     { width: 270px; }\n.input-xxlarge    { width: 530px; }\n\n// Grid style input sizes\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n// Redeclare since the fluid row class is more specific\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n// Ensure input-prepend/append never wraps\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\n\n\n\n// GRID SIZING FOR INPUTS\n// ----------------------\n\n// Grid sizes\n#grid > .input(@gridColumnWidth, @gridGutterWidth);\n\n// Control row for multiple inputs per line\n.controls-row {\n  .clearfix(); // Clear the float from controls\n}\n.controls-row [class*=\"span\"] {\n  float: left; // Float to collapse white-space for proper grid alignment\n}\n\n\n\n\n// DISABLED STATE\n// --------------\n\n// Disabled and read-only inputs\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: @inputDisabledBackground;\n}\n// Explicitly reset the colors here\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n\n\n\n\n// FORM FIELD FEEDBACK STATES\n// --------------------------\n\n// Warning\n.control-group.warning {\n  .formFieldState(@warningText, @warningText, @warningBackground);\n}\n// Error\n.control-group.error {\n  .formFieldState(@errorText, @errorText, @errorBackground);\n}\n// Success\n.control-group.success {\n  .formFieldState(@successText, @successText, @successBackground);\n}\n// Success\n.control-group.info {\n  .formFieldState(@infoText, @infoText, @infoBackground);\n}\n\n// HTML5 invalid states\n// Shares styles with the .control-group.error above\ninput:focus:required:invalid,\ntextarea:focus:required:invalid,\nselect:focus:required:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n  &:focus {\n    border-color: darken(#ee5f5b, 10%);\n    .box-shadow(0 0 6px lighten(#ee5f5b, 20%));\n  }\n}\n\n\n\n// FORM ACTIONS\n// ------------\n\n.form-actions {\n  padding: (@baseLineHeight - 1) 20px @baseLineHeight;\n  margin-top: @baseLineHeight;\n  margin-bottom: @baseLineHeight;\n  background-color: @formActionsBackground;\n  border-top: 1px solid #e5e5e5;\n  .clearfix(); // Adding clearfix to allow for .pull-right button containers\n}\n\n\n\n// HELP TEXT\n// ---------\n\n.help-block,\n.help-inline {\n  color: lighten(@textColor, 15%); // lighten the text some for contrast\n}\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-bottom: @baseLineHeight / 2;\n}\n\n.help-inline {\n  display: inline-block;\n  .ie7-inline-block();\n  vertical-align: middle;\n  padding-left: 5px;\n}\n\n\n\n// INPUT GROUPS\n// ------------\n\n// Allow us to put symbols and text within the input field for a cleaner look\n.input-append,\n.input-prepend {\n  margin-bottom: 5px;\n  font-size: 0;\n  white-space: nowrap; // Prevent span and input from separating\n\n  input,\n  select,\n  .uneditable-input {\n    position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness\n    margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms\n    *margin-left: 0;\n    font-size: @baseFontSize;\n    vertical-align: top;\n    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);\n    // Make input on top when focused so blue border and shadow always show\n    &:focus {\n      z-index: 2;\n    }\n  }\n  .add-on {\n    display: inline-block;\n    width: auto;\n    height: @baseLineHeight;\n    min-width: 16px;\n    padding: 4px 5px;\n    font-size: @baseFontSize;\n    font-weight: normal;\n    line-height: @baseLineHeight;\n    text-align: center;\n    text-shadow: 0 1px 0 @white;\n    background-color: @grayLighter;\n    border: 1px solid #ccc;\n  }\n  .add-on,\n  .btn {\n    vertical-align: top;\n    .border-radius(0);\n  }\n  .active {\n    background-color: lighten(@green, 30);\n    border-color: @green;\n  }\n}\n.input-prepend {\n  .add-on,\n  .btn {\n    margin-right: -1px;\n  }\n  .add-on:first-child,\n  .btn:first-child {\n    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);\n  }\n}\n.input-append {\n  input,\n  select,\n  .uneditable-input {\n    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);\n  }\n  .add-on,\n  .btn {\n    margin-left: -1px;\n  }\n  .add-on:last-child,\n  .btn:last-child {\n    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);\n  }\n}\n// Remove all border-radius for inputs with both prepend and append\n.input-prepend.input-append {\n  input,\n  select,\n  .uneditable-input {\n    .border-radius(0);\n  }\n  .add-on:first-child,\n  .btn:first-child {\n    margin-right: -1px;\n    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);\n  }\n  .add-on:last-child,\n  .btn:last-child {\n    margin-left: -1px;\n    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);\n  }\n}\n\n\n\n// SEARCH FORM\n// -----------\n\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9; /* IE7-8 doesn't have border-radius, so don't indent the padding */\n  margin-bottom: 0; // Remove the default margin on all inputs\n  .border-radius(15px);\n}\n\n/* Allow for input prepend/append in search forms */\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  .border-radius(0); // Override due to specificity\n}\n.form-search .input-append .search-query {\n  .border-radius(14px 0 0 14px);\n}\n.form-search .input-append .btn {\n  .border-radius(0 14px 14px 0);\n}\n.form-search .input-prepend .search-query {\n  .border-radius(0 14px 14px 0);\n}\n.form-search .input-prepend .btn {\n  .border-radius(14px 0 0 14px);\n}\n\n\n\n\n// HORIZONTAL & VERTICAL FORMS\n// ---------------------------\n\n// Common properties\n// -----------------\n\n.form-search,\n.form-inline,\n.form-horizontal {\n  input,\n  textarea,\n  select,\n  .help-inline,\n  .uneditable-input,\n  .input-prepend,\n  .input-append {\n    display: inline-block;\n    .ie7-inline-block();\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  // Re-hide hidden elements due to specifity\n  .hide {\n    display: none;\n  }\n}\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n// Remove margin for input-prepend/-append\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n// Inline checkbox/radio labels (remove padding on left)\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n// Remove float and margin, set to inline-block\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n\n\n// Margin to space out fieldsets\n.control-group {\n  margin-bottom: @baseLineHeight / 2;\n}\n\n// Legend collapses margin, so next element is responsible for spacing\nlegend + .control-group {\n  margin-top: @baseLineHeight;\n  -webkit-margin-top-collapse: separate;\n}\n\n// Horizontal-specific styles\n// --------------------------\n\n.form-horizontal {\n  // Increase spacing between groups\n  .control-group {\n    margin-bottom: @baseLineHeight;\n    .clearfix();\n  }\n  // Float the labels left\n  .control-label {\n    float: left;\n    width: @horizontalComponentOffset - 20;\n    padding-top: 5px;\n    text-align: right;\n  }\n  // Move over all input controls and content\n  .controls {\n    // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend\n    // don't inherit the margin of the parent, in this case .controls\n    *display: inline-block;\n    *padding-left: 20px;\n    margin-left: @horizontalComponentOffset;\n    *margin-left: 0;\n    &:first-child {\n      *padding-left: @horizontalComponentOffset;\n    }\n  }\n  // Remove bottom margin on block level help text since that's accounted for on .control-group\n  .help-block {\n    margin-bottom: 0;\n  }\n  // And apply it only to .help-block instances that follow a form control\n  input,\n  select,\n  textarea {\n    + .help-block {\n      margin-top: @baseLineHeight / 2;\n    }\n  }\n  // Move over buttons in .form-actions to align with .controls\n  .form-actions {\n    padding-left: @horizontalComponentOffset;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Fixed (940px)\n#grid > .core(@gridColumnWidth, @gridGutterWidth);\n\n// Fluid (940px)\n#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);\n\n// Reset utility classes due to specificity\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/hero-unit.less",
    "content": "//\n// Hero unit\n// --------------------------------------------------\n\n\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  background-color: @heroUnitBackground;\n  .border-radius(6px);\n  h1 {\n    margin-bottom: 0;\n    font-size: 60px;\n    line-height: 1;\n    color: @heroUnitHeadingColor;\n    letter-spacing: -1px;\n  }\n  p {\n    font-size: 18px;\n    font-weight: 200;\n    line-height: @baseLineHeight * 1.5;\n    color: @heroUnitLeadColor;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/labels-badges.less",
    "content": "//\n// Labels and badges\n// --------------------------------------------------\n\n\n// Base classes\n.label,\n.badge {\n  font-size: @baseFontSize * .846;\n  font-weight: bold;\n  line-height: 14px; // ensure proper line-height if floated\n  color: @white;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  background-color: @grayLight;\n}\n// Set unique padding and border-radii\n.label {\n  padding: 1px 4px 2px;\n  .border-radius(3px);\n}\n.badge {\n  padding: 1px 9px 2px;\n  .border-radius(9px);\n}\n\n// Hover state, but only for links\na {\n  &.label:hover,\n  &.badge:hover {\n    color: @white;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)\n.label,\n.badge {\n  // Important (red)\n  &-important         { background-color: @errorText; }\n  &-important[href]   { background-color: darken(@errorText, 10%); }\n  // Warnings (orange)\n  &-warning           { background-color: @orange; }\n  &-warning[href]     { background-color: darken(@orange, 10%); }\n  // Success (green)\n  &-success           { background-color: @successText; }\n  &-success[href]     { background-color: darken(@successText, 10%); }\n  // Info (turquoise)\n  &-info              { background-color: @infoText; }\n  &-info[href]        { background-color: darken(@infoText, 10%); }\n  // Inverse (black)\n  &-inverse           { background-color: @grayDark; }\n  &-inverse[href]     { background-color: darken(@grayDark, 10%); }\n}\n\n// Quick fix for labels/badges in buttons\n.btn {\n  .label,\n  .badge {\n    position: relative;\n    top: -1px;\n  }\n}\n.btn-mini {\n  .label,\n  .badge {\n    top: 0;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/layouts.less",
    "content": "//\n// Layouts\n// --------------------------------------------------\n\n\n// Container (centered, fixed-width layouts)\n.container {\n  .container-fixed();\n}\n\n// Fluid layouts (left aligned, with sidebar, min- & max-width content)\n.container-fluid {\n  padding-right: @gridGutterWidth;\n  padding-left: @gridGutterWidth;\n  .clearfix();\n}"
  },
  {
    "path": "servers/www/assets/bootstrap/less/mixins.less",
    "content": "//\n// Mixins\n// --------------------------------------------------\n\n\n// UTILITY MIXINS\n// --------------------------------------------------\n\n// Clearfix\n// --------\n// For clearing floats like a boss h5bp.com/q\n.clearfix {\n  *zoom: 1;\n  &:before,\n  &:after {\n    display: table;\n    content: \"\";\n    // Fixes Opera/contenteditable bug:\n    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952\n    line-height: 0;\n  }\n  &:after {\n    clear: both;\n  }\n}\n\n// Webkit-style focus\n// ------------------\n.tab-focus() {\n  // Default\n  outline: thin dotted #333;\n  // Webkit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n// Center-align a block level element\n// ----------------------------------\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n// IE7 inline-block\n// ----------------\n.ie7-inline-block() {\n  *display: inline; /* IE7 inline-block hack */\n  *zoom: 1;\n}\n\n// IE7 likes to collapse whitespace on either side of the inline-block elements.\n// Ems because we're attempting to match the width of a space character. Left\n// version is for form buttons, which typically come after other elements, and\n// right version is for icons, which come before. Applying both is ok, but it will\n// mean that space between those elements will be .6em (~2 space characters) in IE7,\n// instead of the 1 space in other browsers.\n.ie7-restore-left-whitespace() {\n  *margin-left: .3em;\n\n  &:first-child {\n    *margin-left: 0;\n  }\n}\n\n.ie7-restore-right-whitespace() {\n  *margin-right: .3em;\n}\n\n// Sizing shortcuts\n// -------------------------\n.size(@height, @width) {\n  width: @width;\n  height: @height;\n}\n.square(@size) {\n  .size(@size, @size);\n}\n\n// Placeholder text\n// -------------------------\n.placeholder(@color: @placeholderText) {\n  &:-moz-placeholder {\n    color: @color;\n  }\n  &:-ms-input-placeholder {\n    color: @color;\n  }\n  &::-webkit-input-placeholder {\n    color: @color;\n  }\n}\n\n// Text overflow\n// -------------------------\n// Requires inline-block or block for proper styling\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n// CSS image replacement\n// -------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n\n// FONTS\n// --------------------------------------------------\n\n#font {\n  #family {\n    .serif() {\n      font-family: @serifFontFamily;\n    }\n    .sans-serif() {\n      font-family: @sansFontFamily;\n    }\n    .monospace() {\n      font-family: @monoFontFamily;\n    }\n  }\n  .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    font-size: @size;\n    font-weight: @weight;\n    line-height: @lineHeight;\n  }\n  .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    #font > #family > .serif;\n    #font > .shorthand(@size, @weight, @lineHeight);\n  }\n  .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    #font > #family > .sans-serif;\n    #font > .shorthand(@size, @weight, @lineHeight);\n  }\n  .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {\n    #font > #family > .monospace;\n    #font > .shorthand(@size, @weight, @lineHeight);\n  }\n}\n\n\n// FORMS\n// --------------------------------------------------\n\n// Block level inputs\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;        // Make inputs at least the height of their button counterpart\n  .box-sizing(border-box); // Makes inputs behave like true block-level elements\n}\n\n\n\n// Mixin for form field states\n.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {\n  // Set the text color\n  > label,\n  .help-block,\n  .help-inline {\n    color: @textColor;\n  }\n  // Style inputs accordingly\n  .checkbox,\n  .radio,\n  input,\n  select,\n  textarea {\n    color: @textColor;\n  }\n  input,\n  select,\n  textarea {\n    border-color: @borderColor;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@borderColor, 10%);\n      .box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%));\n    }\n  }\n  // Give a small background color for input-prepend/-append\n  .input-prepend .add-on,\n  .input-append .add-on {\n    color: @textColor;\n    background-color: @backgroundColor;\n    border-color: @textColor;\n  }\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Border Radius\n.border-radius(@radius) {\n  -webkit-border-radius: @radius;\n     -moz-border-radius: @radius;\n          border-radius: @radius;\n}\n\n// Single Corner Border Radius\n.border-top-left-radius(@radius) {\n  -webkit-border-top-left-radius: @radius;\n      -moz-border-radius-topleft: @radius;\n          border-top-left-radius: @radius;\n}\n.border-top-right-radius(@radius) {\n  -webkit-border-top-right-radius: @radius;\n      -moz-border-radius-topright: @radius;\n          border-top-right-radius: @radius;\n}\n.border-bottom-right-radius(@radius) {\n  -webkit-border-bottom-right-radius: @radius;\n      -moz-border-radius-bottomright: @radius;\n          border-bottom-right-radius: @radius;\n}\n.border-bottom-left-radius(@radius) {\n  -webkit-border-bottom-left-radius: @radius;\n      -moz-border-radius-bottomleft: @radius;\n          border-bottom-left-radius: @radius;\n}\n\n// Single Side Border Radius\n.border-top-radius(@radius) {\n  .border-top-right-radius(@radius);\n  .border-top-left-radius(@radius);\n}\n.border-right-radius(@radius) {\n  .border-top-right-radius(@radius);\n  .border-bottom-right-radius(@radius);\n}\n.border-bottom-radius(@radius) {\n  .border-bottom-right-radius(@radius);\n  .border-bottom-left-radius(@radius);\n}\n.border-left-radius(@radius) {\n  .border-top-left-radius(@radius);\n  .border-bottom-left-radius(@radius);\n}\n\n// Drop shadows\n.box-shadow(@shadowA, @shadowB:X, ...){\n  // Multiple shadow solution from http://toekneestuck.com/blog/2012/05/15/less-css-arguments-variable/\n  @props: ~`\"@{arguments}\".replace(/[\\[\\]]|\\,\\sX/g, '')`;\n  -webkit-box-shadow: @props;\n     -moz-box-shadow: @props;\n          box-shadow: @props;\n}\n\n// Transitions\n.transition(@transition) {\n  -webkit-transition: @transition;\n     -moz-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n     -moz-transition-delay: @transition-delay;\n       -o-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n\n// Transformations\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n     -moz-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n     -moz-transform: scale(@ratio);\n      -ms-transform: scale(@ratio);\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.translate(@x, @y) {\n  -webkit-transform: translate(@x, @y);\n     -moz-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y);\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.skew(@x, @y) {\n  -webkit-transform: skew(@x, @y);\n     -moz-transform: skew(@x, @y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twitter/bootstrap/issues/4885\n       -o-transform: skew(@x, @y);\n          transform: skew(@x, @y);\n}\n.translate3d(@x, @y, @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n     -moz-transform: translate3d(@x, @y, @z);\n       -o-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden\n// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples\n.backface-visibility(@visibility){\n\t-webkit-backface-visibility: @visibility;\n\t   -moz-backface-visibility: @visibility;\n\t        backface-visibility: @visibility;\n}\n\n// Background clipping\n// Heads up: FF 3.6 and under need \"padding\" instead of \"padding-box\"\n.background-clip(@clip) {\n  -webkit-background-clip: @clip;\n     -moz-background-clip: @clip;\n          background-clip: @clip;\n}\n\n// Background sizing\n.background-size(@size){\n  -webkit-background-size: @size;\n     -moz-background-size: @size;\n       -o-background-size: @size;\n          background-size: @size;\n}\n\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select;\n       -o-user-select: @select;\n          user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@columnCount, @columnGap: @gridGutterWidth) {\n  -webkit-column-count: @columnCount;\n     -moz-column-count: @columnCount;\n          column-count: @columnCount;\n  -webkit-column-gap: @columnGap;\n     -moz-column-gap: @columnGap;\n          column-gap: @columnGap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode;\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n  opacity: @opacity / 100;\n  filter: ~\"alpha(opacity=@{opacity})\";\n}\n\n\n\n// BACKGROUNDS\n// --------------------------------------------------\n\n// Add an alphatransparency value to any background or border color (via Elyse Holladay)\n#translucent {\n  .background(@color: @white, @alpha: 1) {\n    background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);\n  }\n  .border(@color: @white, @alpha: 1) {\n    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);\n    .background-clip(padding-box);\n  }\n}\n\n// Gradient Bar Colors for buttons and alerts\n.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {\n  color: @textColor;\n  text-shadow: @textShadow;\n  #gradient > .vertical(@primaryColor, @secondaryColor);\n  border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);\n  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);\n}\n\n// Gradients\n#gradient {\n  .horizontal(@startColor: #555, @endColor: #333) {\n    background-color: @endColor;\n    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+\n    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+\n    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+\n    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10\n    background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@startColor),argb(@endColor))); // IE9 and down\n  }\n  .vertical(@startColor: #555, @endColor: #333) {\n    background-color: mix(@startColor, @endColor, 60%);\n    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+\n    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+\n    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10\n    background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@startColor),argb(@endColor))); // IE9 and down\n  }\n  .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {\n    background-color: @endColor;\n    background-repeat: repeat-x;\n    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+\n    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10\n    background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10\n  }\n  .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {\n    background-color: mix(@midColor, @endColor, 80%);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));\n    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);\n    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);\n    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);\n    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@innerColor: #555, @outerColor: #333)  {\n    background-color: @outerColor;\n    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));\n    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);\n    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);\n    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: #555, @angle: 45deg) {\n    background-color: @color;\n    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));\n    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);\n  }\n}\n// Reset filters for IE\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@top: #e5e5e5, @bottom: @white) {\n  // IE7 needs a set width since we gave a height. Restricting just\n  // to IE7 to keep the 1px left/right space in other browsers.\n  // It is unclear where IE is getting the extra space that we need\n  // to negative-margin away, but so it goes.\n  *width: 100%;\n  height: 1px;\n  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: @top;\n  border-bottom: 1px solid @bottom;\n}\n\n// Button backgrounds\n// ------------------\n.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {\n  // gradientBar will set the background to a pleasing blend of these, to support IE<=9\n  .gradientBar(@startColor, @endColor, @textColor, @textShadow);\n  *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n  .reset-filter();\n\n  // in these cases the gradient won't cover the background, so we override\n  &:hover, &:active, &.active, &.disabled, &[disabled] {\n    color: @textColor;\n    background-color: @endColor;\n    *background-color: darken(@endColor, 5%);\n  }\n\n  // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves\n  &:active,\n  &.active {\n    background-color: darken(@endColor, 10%) e(\"\\9\");\n  }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.\n.navbarVerticalAlign(@elementHeight) {\n  margin-top: (@navbarHeight - @elementHeight) / 2;\n}\n\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n  margin-right: auto;\n  margin-left: auto;\n  .clearfix();\n}\n\n// Table columns\n.tableColumns(@columnSpan: 1) {\n  float: none; // undo default grid column styles\n  width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells\n  margin-left: 0; // undo default grid column styles\n}\n\n// Make a Grid\n// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior\n.makeRow() {\n  margin-left: @gridGutterWidth * -1;\n  .clearfix();\n}\n.makeColumn(@columns: 1, @offset: 0) {\n  float: left;\n  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);\n  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));\n}\n\n// The Grid\n#grid {\n\n  .core (@gridColumnWidth, @gridGutterWidth) {\n\n    .spanX (@index) when (@index > 0) {\n      (~\".span@{index}\") { .span(@index); }\n      .spanX(@index - 1);\n    }\n    .spanX (0) {}\n\n    .offsetX (@index) when (@index > 0) {\n      (~\".offset@{index}\") { .offset(@index); }\n      .offsetX(@index - 1);\n    }\n    .offsetX (0) {}\n\n    .offset (@columns) {\n      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));\n    }\n\n    .span (@columns) {\n      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));\n    }\n\n    .row {\n      margin-left: @gridGutterWidth * -1;\n      .clearfix();\n    }\n\n    [class*=\"span\"] {\n      float: left;\n      min-height: 1px; // prevent collapsing columns\n      margin-left: @gridGutterWidth;\n    }\n\n    // Set the container width, and override it for fixed navbars in media queries\n    .container,\n    .navbar-static-top .container,\n    .navbar-fixed-top .container,\n    .navbar-fixed-bottom .container { .span(@gridColumns); }\n\n    // generate .spanX and .offsetX\n    .spanX (@gridColumns);\n    .offsetX (@gridColumns);\n\n  }\n\n  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {\n\n    .spanX (@index) when (@index > 0) {\n      (~\".span@{index}\") { .span(@index); }\n      .spanX(@index - 1);\n    }\n    .spanX (0) {}\n\n    .offsetX (@index) when (@index > 0) {\n      (~'.offset@{index}') { .offset(@index); }\n      (~'.offset@{index}:first-child') { .offsetFirstChild(@index); }\n      .offsetX(@index - 1);\n    }\n    .offsetX (0) {}\n\n    .offset (@columns) {\n      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);\n  \t  *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);\n    }\n\n    .offsetFirstChild (@columns) {\n      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);\n      *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);\n    }\n\n    .span (@columns) {\n      width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));\n      *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);\n    }\n\n    .row-fluid {\n      width: 100%;\n      .clearfix();\n      [class*=\"span\"] {\n        .input-block-level();\n        float: left;\n        margin-left: @fluidGridGutterWidth;\n        *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);\n      }\n      [class*=\"span\"]:first-child {\n        margin-left: 0;\n      }\n\n      // generate .spanX and .offsetX\n      .spanX (@gridColumns);\n      .offsetX (@gridColumns);\n    }\n\n  }\n\n  .input(@gridColumnWidth, @gridGutterWidth) {\n\n    .spanX (@index) when (@index > 0) {\n      (~\"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}\") { .span(@index); }\n      .spanX(@index - 1);\n    }\n    .spanX (0) {}\n\n    .span(@columns) {\n      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;\n    }\n\n    input,\n    textarea,\n    .uneditable-input {\n      margin-left: 0; // override margin-left from core grid system\n    }\n\n    // Space grid-sized controls properly if multiple per line\n    .controls-row [class*=\"span\"] + [class*=\"span\"] {\n      margin-left: @gridGutterWidth;\n    }\n\n    // generate .spanX\n    .spanX (@gridColumns);\n\n  }\n\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n\n// Recalculate z-index where appropriate,\n// but only apply to elements within modal\n.modal-open .modal {\n  .dropdown-menu {  z-index: @zindexDropdown + @zindexModal; }\n  .dropdown.open { *z-index: @zindexDropdown + @zindexModal; }\n  .popover       {  z-index: @zindexPopover  + @zindexModal; }\n  .tooltip       {  z-index: @zindexTooltip  + @zindexModal; }\n}\n\n// Background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindexModalBackdrop;\n  background-color: @black;\n  // Fade for backdrop\n  &.fade { opacity: 0; }\n}\n\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  .opacity(80);\n}\n\n// Base modal\n.modal {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  z-index: @zindexModal;\n  overflow: auto;\n  width: 560px;\n  margin: -250px 0 0 -280px;\n  background-color: @white;\n  border: 1px solid #999;\n  border: 1px solid rgba(0,0,0,.3);\n  *border: 1px solid #999; /* IE6-7 */\n  .border-radius(6px);\n  .box-shadow(0 3px 7px rgba(0,0,0,0.3));\n  .background-clip(padding-box);\n  &.fade {\n    .transition(e('opacity .3s linear, top .3s ease-out'));\n    top: -25%;\n  }\n  &.fade.in { top: 50%; }\n}\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n  // Close icon\n  .close { margin-top: 2px; }\n  // Heading\n  h3 {\n    margin: 0;\n    line-height: 30px;\n  }\n}\n\n// Body (where all modal content resides)\n.modal-body {\n  overflow-y: auto;\n  max-height: 400px;\n  padding: 15px;\n}\n// Remove bottom margin if need be\n.modal-form {\n  margin-bottom: 0;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right; // right align buttons\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  .border-radius(0 0 6px 6px);\n  .box-shadow(inset 0 1px 0 @white);\n  .clearfix(); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/navbar.less",
    "content": "//\n// Navbars (Redux)\n// --------------------------------------------------\n\n\n// COMMON STYLES\n// -------------\n\n// Base class and wrapper\n.navbar {\n  overflow: visible;\n  margin-bottom: @baseLineHeight;\n  color: @navbarText;\n\n  // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar\n  *position: relative;\n  *z-index: 2;\n}\n\n// Inner for background effects\n// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present\n.navbar-inner {\n  min-height: @navbarHeight;\n  padding-left:  20px;\n  padding-right: 20px;\n  #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);\n  border: 1px solid @navbarBorder;\n  .border-radius(4px);\n  .box-shadow(0 1px 4px rgba(0,0,0,.065));\n\n  // Prevent floats from breaking the navbar\n  .clearfix();\n}\n\n// Set width to auto for default container\n// We then reset it for fixed navbars in the #gridSystem mixin\n.navbar .container {\n  width: auto;\n}\n\n// Override the default collapsed state\n.nav-collapse.collapse {\n  height: auto;\n}\n\n\n// Brand: website or project name\n// -------------------------\n.navbar .brand {\n  float: left;\n  display: block;\n  // Vertically center the text given @navbarHeight\n  padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);\n  margin-left: -20px; // negative indent to left-align the text down the page\n  font-size: 20px;\n  font-weight: 200;\n  color: @navbarBrandColor;\n  text-shadow: 0 1px 0 @navbarBackgroundHighlight;\n  &:hover {\n    text-decoration: none;\n  }\n}\n\n// Plain text in topbar\n// -------------------------\n.navbar-text {\n  margin-bottom: 0;\n  line-height: @navbarHeight;\n}\n\n// Janky solution for now to account for links outside the .nav\n// -------------------------\n.navbar-link {\n  color: @navbarLinkColor;\n  &:hover {\n    color: @navbarLinkColorHover;\n  }\n}\n\n// Dividers in navbar\n// -------------------------\n.navbar .divider-vertical {\n  height: @navbarHeight;\n  margin: 0 9px;\n  border-left: 1px solid @navbarBackground;\n  border-right: 1px solid @navbarBackgroundHighlight;\n}\n\n// Buttons in navbar\n// -------------------------\n.navbar .btn,\n.navbar .btn-group {\n  .navbarVerticalAlign(30px); // Vertically center in navbar\n}\n.navbar .btn-group .btn,\n.navbar .input-prepend .btn,\n.navbar .input-append .btn {\n  margin-top: 0; // then undo the margin here so we don't accidentally double it\n}\n\n// Navbar forms\n// -------------------------\n.navbar-form {\n  margin-bottom: 0; // remove default bottom margin\n  .clearfix();\n  input,\n  select,\n  .radio,\n  .checkbox {\n    .navbarVerticalAlign(30px); // Vertically center in navbar\n  }\n  input,\n  select,\n  .btn {\n    display: inline-block;\n    margin-bottom: 0;\n  }\n  input[type=\"image\"],\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    margin-top: 3px;\n  }\n  .input-append,\n  .input-prepend {\n    margin-top: 6px;\n    white-space: nowrap; // preven two  items from separating within a .navbar-form that has .pull-left\n    input {\n      margin-top: 0; // remove the margin on top since it's on the parent\n    }\n  }\n}\n\n// Navbar search\n// -------------------------\n.navbar-search {\n  position: relative;\n  float: left;\n  .navbarVerticalAlign(30px); // Vertically center in navbar\n  margin-bottom: 0;\n  .search-query {\n    margin-bottom: 0;\n    padding: 4px 14px;\n    #font > .sans-serif(13px, normal, 1);\n    .border-radius(15px); // redeclare because of specificity of the type attribute\n  }\n}\n\n\n\n// Static navbar\n// -------------------------\n\n.navbar-static-top {\n  position: static;\n  width: 100%;\n  margin-bottom: 0; // remove 18px margin for default navbar\n  .navbar-inner {\n    .border-radius(0);\n  }\n}\n\n\n\n// Fixed navbar\n// -------------------------\n\n// Shared (top/bottom) styles\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindexFixedNavbar;\n  margin-bottom: 0; // remove 18px margin for default navbar\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom .navbar-inner {\n  border-width: 1px 0 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-left:  0;\n  padding-right: 0;\n  .border-radius(0);\n}\n\n// Reset container width\n// Required here as we reset the width earlier on and the grid mixins don't override early enough\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  #grid > .core > .span(@gridColumns);\n}\n\n// Fixed to top\n.navbar-fixed-top {\n  top: 0;\n}\n.navbar-fixed-top,\n.navbar-static-top {\n  .navbar-inner {\n    .box-shadow(inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1));\n  }\n}\n\n// Fixed to bottom\n.navbar-fixed-bottom {\n  bottom: 0;\n  .navbar-inner {\n    .box-shadow(inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1));\n  }\n}\n\n\n\n// NAVIGATION\n// ----------\n\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n.navbar .nav.pull-right {\n  float: right; // redeclare due to specificity\n  margin-right: 0; // remove margin on float right nav\n}\n.navbar .nav > li {\n  float: left;\n}\n\n// Links\n.navbar .nav > li > a {\n  float: none;\n  // Vertically center the text given @navbarHeight\n  padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);\n  color: @navbarLinkColor;\n  text-decoration: none;\n  text-shadow: 0 1px 0 @navbarBackgroundHighlight;\n}\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n// Hover\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  background-color: @navbarLinkBackgroundHover; // \"transparent\" is default to differentiate :hover from .active\n  color: @navbarLinkColorHover;\n  text-decoration: none;\n}\n\n// Active nav items\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: @navbarLinkColorActive;\n  text-decoration: none;\n  background-color: @navbarLinkBackgroundActive;\n  .box-shadow(inset 0 3px 8px rgba(0,0,0,.125));\n}\n\n// Navbar button for toggling navbar items in responsive layouts\n// These definitions need to come after '.navbar .btn'\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-left: 5px;\n  margin-right: 5px;\n  .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));\n  .box-shadow(inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075));\n}\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  .border-radius(1px);\n  .box-shadow(0 1px 0 rgba(0,0,0,.25));\n}\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n\n\n\n// Dropdown menus\n// --------------\n\n// Menu position and menu carets\n.navbar .nav > li > .dropdown-menu {\n  &:before {\n    content: '';\n    display: inline-block;\n    border-left:   7px solid transparent;\n    border-right:  7px solid transparent;\n    border-bottom: 7px solid #ccc;\n    border-bottom-color: @dropdownBorder;\n    position: absolute;\n    top: -7px;\n    left: 9px;\n  }\n  &:after {\n    content: '';\n    display: inline-block;\n    border-left:   6px solid transparent;\n    border-right:  6px solid transparent;\n    border-bottom: 6px solid @dropdownBackground;\n    position: absolute;\n    top: -6px;\n    left: 10px;\n  }\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .nav > li > .dropdown-menu {\n  &:before {\n    border-top: 7px solid #ccc;\n    border-top-color: @dropdownBorder;\n    border-bottom: 0;\n    bottom: -7px;\n    top: auto;\n  }\n  &:after {\n    border-top: 6px solid @dropdownBackground;\n    border-bottom: 0;\n    bottom: -6px;\n    top: auto;\n  }\n}\n\n// Remove background color from open dropdown\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: @navbarLinkBackgroundActive;\n  color: @navbarLinkColorActive;\n}\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: @navbarLinkColor;\n  border-bottom-color: @navbarLinkColor;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: @navbarLinkColorActive;\n  border-bottom-color: @navbarLinkColorActive;\n}\n\n// Right aligned menus need alt position\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n  &:before {\n    left: auto;\n    right: 12px;\n  }\n  &:after {\n    left: auto;\n    right: 13px;\n  }\n  .dropdown-menu {\n    left: auto;\n    right: 100%;\n    margin-left: 0;\n    margin-right: -1px;\n    .border-radius(6px 0 6px 6px);\n  }\n}\n\n\n// Inverted navbar\n// -------------------------\n\n.navbar-inverse {\n  color: @navbarInverseText;\n\n  .navbar-inner {\n    #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);\n    border-color: @navbarInverseBorder;\n  }\n\n  .brand,\n  .nav > li > a {\n    color: @navbarInverseLinkColor;\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n    &:hover {\n      color: @navbarInverseLinkColorHover;\n    }\n  }\n\n  .nav > li > a:focus,\n  .nav > li > a:hover {\n    background-color: @navbarInverseLinkBackgroundHover;\n    color: @navbarInverseLinkColorHover;\n  }\n\n  .nav .active > a,\n  .nav .active > a:hover,\n  .nav .active > a:focus {\n    color: @navbarInverseLinkColorActive;\n    background-color: @navbarInverseLinkBackgroundActive;\n  }\n\n  // Inline text links\n  .navbar-link {\n    color: @navbarInverseLinkColor;\n    &:hover {\n      color: @navbarInverseLinkColorHover;\n    }\n  }\n\n  // Dividers in navbar\n  .divider-vertical {\n    border-left-color: @navbarInverseBackground;\n    border-right-color: @navbarInverseBackgroundHighlight;\n  }\n\n  // Dropdowns\n  .nav li.dropdown.open > .dropdown-toggle,\n  .nav li.dropdown.active > .dropdown-toggle,\n  .nav li.dropdown.open.active > .dropdown-toggle {\n    background-color: @navbarInverseLinkBackgroundActive;\n    color: @navbarInverseLinkColorActive;\n  }\n  .nav li.dropdown > .dropdown-toggle .caret {\n    border-top-color: @navbarInverseLinkColor;\n    border-bottom-color: @navbarInverseLinkColor;\n  }\n  .nav li.dropdown.open > .dropdown-toggle .caret,\n  .nav li.dropdown.active > .dropdown-toggle .caret,\n  .nav li.dropdown.open.active > .dropdown-toggle .caret {\n    border-top-color: @navbarInverseLinkColorActive;\n    border-bottom-color: @navbarInverseLinkColorActive;\n  }\n\n  // Navbar search\n  .navbar-search {\n    .search-query {\n      color: @white;\n      background-color: @navbarInverseSearchBackground;\n      border-color: @navbarInverseSearchBorder;\n      .box-shadow(inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15));\n      .transition(none);\n      .placeholder(@navbarInverseSearchPlaceholderColor);\n\n      // Focus states (we use .focused since IE7-8 and down doesn't support :focus)\n      &:focus,\n      &.focused {\n        padding: 5px 15px;\n        color: @grayDark;\n        text-shadow: 0 1px 0 @white;\n        background-color: @navbarInverseSearchBackgroundFocus;\n        border: 0;\n        .box-shadow(0 0 3px rgba(0,0,0,.15));\n        outline: 0;\n      }\n    }\n  }\n\n  // Navbar collapse button\n  .btn-navbar {\n    .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));\n  }\n\n}\n\n\n\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// BASE CLASS\n// ----------\n\n.nav {\n  margin-left: 0;\n  margin-bottom: @baseLineHeight;\n  list-style: none;\n}\n\n// Make links block level\n.nav > li > a {\n  display: block;\n}\n.nav > li > a:hover {\n  text-decoration: none;\n  background-color: @grayLighter;\n}\n\n// Redeclare pull classes because of specifity\n.nav > .pull-right {\n  float: right;\n}\n\n// Nav headers (for dropdowns and lists)\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: @baseLineHeight;\n  color: @grayLight;\n  text-shadow: 0 1px 0 rgba(255,255,255,.5);\n  text-transform: uppercase;\n}\n// Space them out when they follow another list item (link)\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n\n\n\n// NAV LIST\n// --------\n\n.nav-list {\n  padding-left: 15px;\n  padding-right: 15px;\n  margin-bottom: 0;\n}\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-left:  -15px;\n  margin-right: -15px;\n  text-shadow: 0 1px 0 rgba(255,255,255,.5);\n}\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n.nav-list > .active > a,\n.nav-list > .active > a:hover {\n  color: @white;\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  background-color: @linkColor;\n}\n.nav-list [class^=\"icon-\"] {\n  margin-right: 2px;\n}\n// Dividers (basically an hr) within the dropdown\n.nav-list .divider {\n  .nav-divider();\n}\n\n\n\n// TABS AND PILLS\n// -------------\n\n// Common styles\n.nav-tabs,\n.nav-pills {\n  .clearfix();\n}\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px; // keeps the overall height an even number\n}\n\n// TABS\n// ----\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n// Make the list-items overlay the bottom border\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n// Actual tabs (as links)\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: @baseLineHeight;\n  border: 1px solid transparent;\n  .border-radius(4px 4px 0 0);\n  &:hover {\n    border-color: @grayLighter @grayLighter #ddd;\n  }\n}\n// Active state, and it's :hover to override normal :hover\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover {\n  color: @gray;\n  background-color: @white;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n\n\n// PILLS\n// -----\n\n// Links rendered as pills\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  .border-radius(5px);\n}\n\n// Active state\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover {\n  color: @white;\n  background-color: @linkColor;\n}\n\n\n\n// STACKED NAV\n// -----------\n\n// Stacked tabs and pills\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li > a {\n  margin-right: 0; // no need for the gap between nav items\n}\n\n// Tabs\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  .border-radius(0);\n}\n.nav-tabs.nav-stacked > li:first-child > a {\n  .border-top-radius(4px);\n}\n.nav-tabs.nav-stacked > li:last-child > a {\n  .border-bottom-radius(4px);\n}\n.nav-tabs.nav-stacked > li > a:hover {\n  border-color: #ddd;\n  z-index: 2;\n}\n\n// Pills\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px; // decrease margin to match sizing of stacked tabs\n}\n\n\n\n// DROPDOWNS\n// ---------\n\n.nav-tabs .dropdown-menu {\n  .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu\n}\n.nav-pills .dropdown-menu {\n  .border-radius(6px); // make rounded corners match the pills\n}\n\n// Default dropdown links\n// -------------------------\n// Make carets use linkColor to start\n.nav .dropdown-toggle .caret {\n  border-top-color: @linkColor;\n  border-bottom-color: @linkColor;\n  margin-top: 6px;\n}\n.nav .dropdown-toggle:hover .caret {\n  border-top-color: @linkColorHover;\n  border-bottom-color: @linkColorHover;\n}\n/* move down carets for tabs */\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n// Active dropdown links\n// -------------------------\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: @gray;\n  border-bottom-color: @gray;\n}\n\n// Active:hover dropdown links\n// -------------------------\n.nav > .dropdown.active > a:hover {\n  cursor: pointer;\n}\n\n// Open dropdowns\n// -------------------------\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover {\n  color: @white;\n  background-color: @grayLight;\n  border-color: @grayLight;\n}\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret {\n  border-top-color: @white;\n  border-bottom-color: @white;\n  .opacity(100);\n}\n\n// Dropdowns in stacked tabs\n.tabs-stacked .open > a:hover {\n  border-color: @grayLight;\n}\n\n\n\n// TABBABLE\n// --------\n\n\n// COMMON STYLES\n// -------------\n\n// Clear any floats\n.tabbable {\n  .clearfix();\n}\n.tab-content {\n  overflow: auto; // prevent content from running below tabs\n}\n\n// Remove border on bottom, left, right\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n\n// Show/hide tabbable areas\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n\n// BOTTOM\n// ------\n\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n.tabs-below > .nav-tabs > li > a {\n  .border-radius(0 0 4px 4px);\n  &:hover {\n    border-bottom-color: transparent;\n    border-top-color: #ddd;\n  }\n}\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover {\n  border-color: transparent #ddd #ddd #ddd;\n}\n\n// LEFT & RIGHT\n// ------------\n\n// Common styles\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n\n// Tabs on the left\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  .border-radius(4px 0 0 4px);\n}\n.tabs-left > .nav-tabs > li > a:hover {\n  border-color: @grayLighter #ddd @grayLighter @grayLighter;\n}\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: @white;\n}\n\n// Tabs on the right\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  .border-radius(0 4px 4px 0);\n}\n.tabs-right > .nav-tabs > li > a:hover {\n  border-color: @grayLighter @grayLighter @grayLighter #ddd;\n}\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: @white;\n}\n\n\n\n// DISABLED STATES\n// ---------------\n\n// Gray out text\n.nav > .disabled > a {\n  color: @grayLight;\n}\n// Nuke hover effects\n.nav > .disabled > a:hover {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  margin: @baseLineHeight 0;\n  list-style: none;\n  text-align: center;\n  .clearfix();\n}\n.pager li {\n  display: inline;\n}\n.pager a,\n.pager span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  .border-radius(15px);\n}\n.pager a:hover {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.pager .next a,\n.pager .next span {\n  float: right;\n}\n.pager .previous a {\n  float: left;\n}\n.pager .disabled a,\n.pager .disabled a:hover,\n.pager .disabled span {\n  color: @grayLight;\n  background-color: #fff;\n  cursor: default;\n}"
  },
  {
    "path": "servers/www/assets/bootstrap/less/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n\n\n.pagination {\n  height: @baseLineHeight * 2;\n  margin: @baseLineHeight 0;\n }\n.pagination ul {\n  display: inline-block;\n  .ie7-inline-block();\n  margin-left: 0;\n  margin-bottom: 0;\n  .border-radius(3px);\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n.pagination ul > li {\n  display: inline;\n}\n.pagination ul > li > a,\n.pagination ul > li > span {\n  float: left;\n  padding: 0 14px;\n  line-height: (@baseLineHeight * 2) - 2;\n  text-decoration: none;\n  background-color: @paginationBackground;\n  border: 1px solid @paginationBorder;\n  border-left-width: 0;\n}\n.pagination ul > li > a:hover,\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  background-color: #f5f5f5;\n}\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  color: @grayLight;\n  cursor: default;\n}\n.pagination ul > .disabled > span,\n.pagination ul > .disabled > a,\n.pagination ul > .disabled > a:hover {\n  color: @grayLight;\n  background-color: transparent;\n  cursor: default;\n}\n.pagination ul > li:first-child > a,\n.pagination ul > li:first-child > span {\n  border-left-width: 1px;\n  .border-radius(3px 0 0 3px);\n}\n.pagination ul > li:last-child > a,\n.pagination ul > li:last-child > span {\n  .border-radius(0 3px 3px 0);\n}\n\n// Centered\n.pagination-centered {\n  text-align: center;\n}\n.pagination-right {\n  text-align: right;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindexPopover;\n  display: none;\n  width: 236px;\n  padding: 1px;\n  background-color: @popoverBackground;\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0,0,0,.2);\n  .border-radius(6px);\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-bottom: 10px; }\n  &.right   { margin-left: 10px; }\n  &.bottom  { margin-top: 10px; }\n  &.left    { margin-right: 10px; }\n\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: @popoverTitleBackground;\n  border-bottom: 1px solid darken(@popoverTitleBackground, 5%);\n  .border-radius(5px 5px 0 0);\n}\n\n.popover-content {\n  padding: 9px 14px;\n  p, ul, ol {\n    margin-bottom: 0;\n  }\n}\n\n// Arrows\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: inline-block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover .arrow:after {\n  content: \"\";\n  z-index: -1;\n}\n\n.popover {\n  &.top .arrow {\n    bottom: -@popoverArrowWidth;\n    left: 50%;\n    margin-left: -@popoverArrowWidth;\n    border-width: @popoverArrowWidth @popoverArrowWidth 0;\n    border-top-color: @popoverArrowColor;\n    &:after {\n      border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth 0;\n      border-top-color: @popoverArrowOuterColor;\n      bottom: -1px;\n      left: -@popoverArrowOuterWidth;\n    }\n  }\n  &.right .arrow {\n    top: 50%;\n    left: -@popoverArrowWidth;\n    margin-top: -@popoverArrowWidth;\n    border-width: @popoverArrowWidth @popoverArrowWidth @popoverArrowWidth 0;\n    border-right-color: @popoverArrowColor;\n    &:after {\n      border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth @popoverArrowOuterWidth 0;\n      border-right-color: @popoverArrowOuterColor;\n      bottom: -@popoverArrowOuterWidth;\n      left: -1px;\n    }\n  }\n  &.bottom .arrow {\n    top: -@popoverArrowWidth;\n    left: 50%;\n    margin-left: -@popoverArrowWidth;\n    border-width: 0 @popoverArrowWidth @popoverArrowWidth;\n    border-bottom-color: @popoverArrowColor;\n    &:after {\n      border-width: 0 @popoverArrowOuterWidth @popoverArrowOuterWidth;\n      border-bottom-color: @popoverArrowOuterColor;\n      top: -1px;\n      left: -@popoverArrowOuterWidth;\n    }\n  }\n  &.left .arrow {\n    top: 50%;\n    right: -@popoverArrowWidth;\n    margin-top: -@popoverArrowWidth;\n    border-width: @popoverArrowWidth 0 @popoverArrowWidth @popoverArrowWidth;\n    border-left-color: @popoverArrowColor;\n    &:after {\n      border-width: @popoverArrowOuterWidth 0 @popoverArrowOuterWidth @popoverArrowOuterWidth;\n      border-left-color: @popoverArrowOuterColor;\n      bottom: -@popoverArrowOuterWidth;\n      right: -1px;\n    }\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// ANIMATIONS\n// ----------\n\n// Webkit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Firefox\n@-moz-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// IE9\n@-ms-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Opera\n@-o-keyframes progress-bar-stripes {\n  from  { background-position: 0 0; }\n  to    { background-position: 40px 0; }\n}\n\n// Spec\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// THE BARS\n// --------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @baseLineHeight;\n  margin-bottom: @baseLineHeight;\n  #gradient > .vertical(#f5f5f5, #f9f9f9);\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n  .border-radius(4px);\n}\n\n// Bar of progress\n.progress .bar {\n  width: 0%;\n  height: 100%;\n  color: @white;\n  float: left;\n  font-size: 12px;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  #gradient > .vertical(#149bdf, #0480be);\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .box-sizing(border-box);\n  .transition(width .6s ease);\n}\n.progress .bar + .bar {\n  .box-shadow(inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15));\n}\n\n// Striped bars\n.progress-striped .bar {\n  #gradient > .striped(#149bdf);\n  .background-size(40px 40px);\n}\n\n// Call animation for the active one\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n\n\n// COLORS\n// ------\n\n// Danger (red)\n.progress-danger .bar, .progress .bar-danger {\n  #gradient > .vertical(#ee5f5b, #c43c35);\n}\n.progress-danger.progress-striped .bar, .progress-striped .bar-danger {\n  #gradient > .striped(#ee5f5b);\n}\n\n// Success (green)\n.progress-success .bar, .progress .bar-success {\n  #gradient > .vertical(#62c462, #57a957);\n}\n.progress-success.progress-striped .bar, .progress-striped .bar-success {\n  #gradient > .striped(#62c462);\n}\n\n// Info (teal)\n.progress-info .bar, .progress .bar-info {\n  #gradient > .vertical(#5bc0de, #339bb9);\n}\n.progress-info.progress-striped .bar, .progress-striped .bar-info {\n  #gradient > .striped(#5bc0de);\n}\n\n// Warning (orange)\n.progress-warning .bar, .progress .bar-warning {\n  #gradient > .vertical(lighten(@orange, 15%), @orange);\n}\n.progress-warning.progress-striped .bar, .progress-striped .bar-warning {\n  #gradient > .striped(lighten(@orange, 15%));\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/reset.less",
    "content": "//\n// Modals\n// Adapted from http://github.com/necolas/normalize.css\n// --------------------------------------------------\n\n\n// Display in IE6-9 and FF3\n// -------------------------\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\n\n// Display block in IE6-9 and FF3\n// -------------------------\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\n\n// Prevents modern browsers from displaying 'audio' without controls\n// -------------------------\n\naudio:not([controls]) {\n    display: none;\n}\n\n// Base settings\n// -------------------------\n\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n// Focus states\na:focus {\n  .tab-focus();\n}\n// Hover & Active\na:hover,\na:active {\n  outline: 0;\n}\n\n// Prevents sub and sup affecting line-height in all browsers\n// -------------------------\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\n\n// Img border in a's and image quality\n// -------------------------\n\nimg {\n  /* Responsive images (ensure images don't scale beyond their parents) */\n  max-width: 100%; /* Part 1: Set a maxium relative to the parent */\n  width: auto\\9; /* IE7-8 need help adjusting responsive images */\n  height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */\n\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n\n// Prevent max-width from affecting Google Maps\n#map_canvas img {\n  max-width: none;\n}\n\n// Forms\n// -------------------------\n\n// Font size in all browsers, margin changes, misc consistency\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible; // Inner spacing ie IE6/7\n  line-height: normal; // FF3/4 have !important on line-height in UA stylesheet\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner { // Inner padding and border oddities in FF3/4\n  padding: 0;\n  border: 0;\n}\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer; // Cursors on all buttons applied consistently\n  -webkit-appearance: button; // Style clickable inputs in iOS\n}\ninput[type=\"search\"] { // Appearance in Safari/Chrome\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5\n}\ntextarea {\n  overflow: auto; // Remove vertical scrollbar in IE6-9\n  vertical-align: top; // Readability and alignment cross-browser\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-1200px-min.less",
    "content": "//\n// Responsive: Large desktop and up\n// --------------------------------------------------\n\n\n@media (min-width: 1200px) {\n\n  // Fixed grid\n  #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);\n\n  // Fluid grid\n  #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);\n\n  // Input grid\n  #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);\n\n  // Thumbnails\n  .thumbnails {\n    margin-left: -@gridGutterWidth1200;\n  }\n  .thumbnails > li {\n    margin-left: @gridGutterWidth1200;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-767px-max.less",
    "content": "//\n// Responsive: Landscape phone to desktop/tablet\n// --------------------------------------------------\n\n\n@media (max-width: 767px) {\n\n  // Padding to set content in a bit\n  body {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  // Negative indent the now static \"fixed\" navbar\n  .navbar-fixed-top,\n  .navbar-fixed-bottom,\n  .navbar-static-top {\n    margin-left: -20px;\n    margin-right: -20px;\n  }\n  // Remove padding on container given explicit padding set on body\n  .container-fluid {\n    padding: 0;\n  }\n\n  // TYPOGRAPHY\n  // ----------\n  // Reset horizontal dl\n  .dl-horizontal {\n    dt {\n      float: none;\n      clear: none;\n      width: auto;\n      text-align: left;\n    }\n    dd {\n      margin-left: 0;\n    }\n  }\n\n  // GRID & CONTAINERS\n  // -----------------\n  // Remove width from containers\n  .container {\n    width: auto;\n  }\n  // Fluid rows\n  .row-fluid {\n    width: 100%;\n  }\n  // Undo negative margin on rows and thumbnails\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present\n  }\n  // Make all grid-sized elements block level again\n  [class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    float: none;\n    display: block;\n    width: 100%;\n    margin-left: 0;\n    .box-sizing(border-box);\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    .box-sizing(border-box);\n  }\n\n  // FORM FIELDS\n  // -----------\n  // Make span* classes full width\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    .input-block-level();\n  }\n  // But don't let it screw up prepend/append inputs\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block; // redeclare so they don't wrap to new lines\n    width: auto;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 0;\n  }\n\n  // Modals\n  .modal {\n    position: fixed;\n    top:   20px;\n    left:  20px;\n    right: 20px;\n    width: auto;\n    margin: 0;\n    &.fade.in { top: auto; }\n  }\n\n}\n\n\n\n// UP TO LANDSCAPE PHONE\n// ---------------------\n\n@media (max-width: 480px) {\n\n  // Smooth out the collapsing/expanding nav\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0); // activate the GPU\n  }\n\n  // Block level the page header small tag for readability\n  .page-header h1 small {\n    display: block;\n    line-height: @baseLineHeight;\n  }\n\n  // Update checkboxes for iOS\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n\n  // Remove the horizontal form styles\n  .form-horizontal {\n    .control-label {\n      float: none;\n      width: auto;\n      padding-top: 0;\n      text-align: left;\n    }\n    // Move over all input controls and content\n    .controls {\n      margin-left: 0;\n    }\n    // Move the options list down to align with labels\n    .control-list {\n      padding-top: 0; // has to be padding because margin collaspes\n    }\n    // Move over buttons in .form-actions to align with .controls\n    .form-actions {\n      padding-left: 10px;\n      padding-right: 10px;\n    }\n  }\n\n  // Modals\n  .modal {\n    top:   10px;\n    left:  10px;\n    right: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n\n  // Carousel\n  .carousel-caption {\n    position: static;\n  }\n\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-768px-979px.less",
    "content": "//\n// Responsive: Tablet to desktop\n// --------------------------------------------------\n\n\n@media (min-width: 768px) and (max-width: 979px) {\n\n  // Fixed grid\n  #grid > .core(@gridColumnWidth768, @gridGutterWidth768);\n\n  // Fluid grid\n  #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);\n\n  // Input grid\n  #grid > .input(@gridColumnWidth768, @gridGutterWidth768);\n\n  // No need to reset .thumbnails here since it's the same @gridGutterWidth\n\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-navbar.less",
    "content": "//\n// Responsive: Navbar\n// --------------------------------------------------\n\n\n// TABLETS AND BELOW\n// -----------------\n@media (max-width: @navbarCollapseWidth) {\n\n  // UNFIX THE TOPBAR\n  // ----------------\n  // Remove any padding from the body\n  body {\n    padding-top: 0;\n  }\n  // Unfix the navbars\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: @baseLineHeight;\n  }\n  .navbar-fixed-bottom {\n    margin-top: @baseLineHeight;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  // Account for brand name\n  .navbar .brand {\n    padding-left: 10px;\n    padding-right: 10px;\n    margin: 0 0 0 -5px;\n  }\n\n  // COLLAPSIBLE NAVBAR\n  // ------------------\n  // Nav collapse clears brand\n  .nav-collapse {\n    clear: both;\n  }\n  // Block-level the nav\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 (@baseLineHeight / 2);\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: @navbarText;\n    text-shadow: none;\n  }\n  // Nav and dropdown links in navbar\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: @navbarLinkColor;\n    .border-radius(3px);\n  }\n  // Buttons\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    .border-radius(4px);\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .dropdown-menu a:hover {\n    background-color: @navbarBackground;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover {\n    background-color: @navbarInverseBackground;\n  }\n  // Buttons in the navbar\n  .nav-collapse.in .btn-group {\n    margin-top: 5px;\n    padding: 0;\n  }\n  // Dropdowns in the navbar\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    float: none;\n    display: block;\n    max-width: none;\n    margin: 0 15px;\n    padding: 0;\n    background-color: transparent;\n    border: none;\n    .border-radius(0);\n    .box-shadow(none);\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  .nav-collapse .nav > li > .dropdown-menu {\n    &:before,\n    &:after {\n      display: none;\n    }\n  }\n  // Forms in navbar\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: (@baseLineHeight / 2) 15px;\n    margin: (@baseLineHeight / 2) 0;\n    border-top: 1px solid @navbarBackground;\n    border-bottom: 1px solid @navbarBackground;\n    .box-shadow(inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1));\n  }\n  .navbar-inverse .nav-collapse .navbar-form,\n  .navbar-inverse .nav-collapse .navbar-search {\n    border-top-color: @navbarInverseBackground;\n    border-bottom-color: @navbarInverseBackground;\n  }\n  // Pull right (secondary) nav content\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  // Hide everything in the navbar save .brand and toggle button */\n  .nav-collapse,\n  .nav-collapse.collapse {\n    overflow: hidden;\n    height: 0;\n  }\n  // Navbar button\n  .navbar .btn-navbar {\n    display: block;\n  }\n\n  // STATIC NAVBAR\n  // -------------\n  .navbar-static .navbar-inner {\n    padding-left:  10px;\n    padding-right: 10px;\n  }\n\n\n}\n\n\n// DEFAULT DESKTOP\n// ---------------\n\n@media (min-width: 980px) {\n\n  // Required to make the collapsing navbar work on regular desktops\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// Hide from screenreaders and browsers\n// Credit: HTML5 Boilerplate\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n\n// Visibility utilities\n\n// For desktops\n.visible-phone     { display: none !important; }\n.visible-tablet    { display: none !important; }\n.hidden-phone      { }\n.hidden-tablet     { }\n.hidden-desktop    { display: none !important; }\n.visible-desktop   { display: inherit !important; }\n\n// Tablets & small desktops only\n@media (min-width: 768px) and (max-width: 979px) {\n  // Hide everything else\n  .hidden-desktop    { display: inherit !important; }\n  .visible-desktop   { display: none !important ; }\n  // Show\n  .visible-tablet    { display: inherit !important; }\n  // Hide\n  .hidden-tablet     { display: none !important; }\n}\n\n// Phones only\n@media (max-width: 767px) {\n  // Hide everything else\n  .hidden-desktop    { display: inherit !important; }\n  .visible-desktop   { display: none !important; }\n  // Show\n  .visible-phone     { display: inherit !important; } // Use inherit to restore previous behavior\n  // Hide\n  .hidden-phone      { display: none !important; }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/responsive.less",
    "content": "/*!\n * Bootstrap Responsive v2.1.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n\n// Responsive.less\n// For phone and tablet devices\n// -------------------------------------------------------------\n\n\n// REPEAT VARIABLES & MIXINS\n// -------------------------\n// Required since we compile the responsive stuff separately\n\n@import \"variables.less\"; // Modify this for custom colors, font-sizes, etc\n@import \"mixins.less\";\n\n\n// RESPONSIVE CLASSES\n// ------------------\n\n@import \"responsive-utilities.less\";\n\n\n// MEDIA QUERIES\n// ------------------\n\n// Large desktops\n@import \"responsive-1200px-min.less\";\n\n// Tablets to regular desktops\n@import \"responsive-768px-979px.less\";\n\n// Phones to portrait tablets and narrow desktops\n@import \"responsive-767px-max.less\";\n\n\n// RESPONSIVE NAVBAR\n// ------------------\n\n// From 979px and below, show a button to toggle navbar contents\n@import \"responsive-navbar.less\";\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Body reset\n// -------------------------\n\nbody {\n  margin: 0;\n  font-family: @baseFontFamily;\n  font-size: @baseFontSize;\n  line-height: @baseLineHeight;\n  color: @textColor;\n  background-color: @bodyBackground;\n}\n\n\n// Links\n// -------------------------\n\na {\n  color: @linkColor;\n  text-decoration: none;\n}\na:hover {\n  color: @linkColorHover;\n  text-decoration: underline;\n}\n\n\n// Images\n// -------------------------\n\n// Rounded corners\n.img-rounded {\n  .border-radius(6px);\n}\n\n// Add polaroid-esque trim\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0,0,0,.2);\n  .box-shadow(0 1px 3px rgba(0,0,0,.1));\n}\n\n// Perfect circle\n.img-circle {\n  .border-radius(500px); // crank the border-radius so it works with most reasonably sized images\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/sprites.less",
    "content": "//\n// Sprites\n// --------------------------------------------------\n\n\n// ICONS\n// -----\n\n// All icons receive the styles of the <i> tag with a base class\n// of .i and are then given a unique class to add width, height,\n// and background-position. Your resulting HTML will look like\n// <i class=\"icon-inbox\"></i>.\n\n// For the white version of the icons, just add the .icon-white class:\n// <i class=\"icon-inbox icon-white\"></i>\n\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  display: inline-block;\n  width: 14px;\n  height: 14px;\n  .ie7-restore-right-whitespace();\n  line-height: 14px;\n  vertical-align: text-top;\n  background-image: url(\"@{iconSpritePath}\");\n  background-position: 14px 14px;\n  background-repeat: no-repeat;\n  margin-top: 1px;\n}\n\n/* White icons with optional class, or on hover/active states of certain elements */\n.icon-white,\n.nav-tabs > .active > a > [class^=\"icon-\"],\n.nav-tabs > .active > a > [class*=\" icon-\"],\n.nav-pills > .active > a > [class^=\"icon-\"],\n.nav-pills > .active > a > [class*=\" icon-\"],\n.nav-list > .active > a > [class^=\"icon-\"],\n.nav-list > .active > a > [class*=\" icon-\"],\n.navbar-inverse .nav > .active > a > [class^=\"icon-\"],\n.navbar-inverse .nav > .active > a > [class*=\" icon-\"],\n.dropdown-menu > li > a:hover > [class^=\"icon-\"],\n.dropdown-menu > li > a:hover > [class*=\" icon-\"],\n.dropdown-menu > .active > a > [class^=\"icon-\"],\n.dropdown-menu > .active > a > [class*=\" icon-\"] {\n  background-image: url(\"@{iconWhiteSpritePath}\");\n}\n\n.icon-glass              { background-position: 0      0; }\n.icon-music              { background-position: -24px  0; }\n.icon-search             { background-position: -48px  0; }\n.icon-envelope           { background-position: -72px  0; }\n.icon-heart              { background-position: -96px  0; }\n.icon-star               { background-position: -120px 0; }\n.icon-star-empty         { background-position: -144px 0; }\n.icon-user               { background-position: -168px 0; }\n.icon-film               { background-position: -192px 0; }\n.icon-th-large           { background-position: -216px 0; }\n.icon-th                 { background-position: -240px 0; }\n.icon-th-list            { background-position: -264px 0; }\n.icon-ok                 { background-position: -288px 0; }\n.icon-remove             { background-position: -312px 0; }\n.icon-zoom-in            { background-position: -336px 0; }\n.icon-zoom-out           { background-position: -360px 0; }\n.icon-off                { background-position: -384px 0; }\n.icon-signal             { background-position: -408px 0; }\n.icon-cog                { background-position: -432px 0; }\n.icon-trash              { background-position: -456px 0; }\n\n.icon-home               { background-position: 0      -24px; }\n.icon-file               { background-position: -24px  -24px; }\n.icon-time               { background-position: -48px  -24px; }\n.icon-road               { background-position: -72px  -24px; }\n.icon-download-alt       { background-position: -96px  -24px; }\n.icon-download           { background-position: -120px -24px; }\n.icon-upload             { background-position: -144px -24px; }\n.icon-inbox              { background-position: -168px -24px; }\n.icon-play-circle        { background-position: -192px -24px; }\n.icon-repeat             { background-position: -216px -24px; }\n.icon-refresh            { background-position: -240px -24px; }\n.icon-list-alt           { background-position: -264px -24px; }\n.icon-lock               { background-position: -287px -24px; } // 1px off\n.icon-flag               { background-position: -312px -24px; }\n.icon-headphones         { background-position: -336px -24px; }\n.icon-volume-off         { background-position: -360px -24px; }\n.icon-volume-down        { background-position: -384px -24px; }\n.icon-volume-up          { background-position: -408px -24px; }\n.icon-qrcode             { background-position: -432px -24px; }\n.icon-barcode            { background-position: -456px -24px; }\n\n.icon-tag                { background-position: 0      -48px; }\n.icon-tags               { background-position: -25px  -48px; } // 1px off\n.icon-book               { background-position: -48px  -48px; }\n.icon-bookmark           { background-position: -72px  -48px; }\n.icon-print              { background-position: -96px  -48px; }\n.icon-camera             { background-position: -120px -48px; }\n.icon-font               { background-position: -144px -48px; }\n.icon-bold               { background-position: -167px -48px; } // 1px off\n.icon-italic             { background-position: -192px -48px; }\n.icon-text-height        { background-position: -216px -48px; }\n.icon-text-width         { background-position: -240px -48px; }\n.icon-align-left         { background-position: -264px -48px; }\n.icon-align-center       { background-position: -288px -48px; }\n.icon-align-right        { background-position: -312px -48px; }\n.icon-align-justify      { background-position: -336px -48px; }\n.icon-list               { background-position: -360px -48px; }\n.icon-indent-left        { background-position: -384px -48px; }\n.icon-indent-right       { background-position: -408px -48px; }\n.icon-facetime-video     { background-position: -432px -48px; }\n.icon-picture            { background-position: -456px -48px; }\n\n.icon-pencil             { background-position: 0      -72px; }\n.icon-map-marker         { background-position: -24px  -72px; }\n.icon-adjust             { background-position: -48px  -72px; }\n.icon-tint               { background-position: -72px  -72px; }\n.icon-edit               { background-position: -96px  -72px; }\n.icon-share              { background-position: -120px -72px; }\n.icon-check              { background-position: -144px -72px; }\n.icon-move               { background-position: -168px -72px; }\n.icon-step-backward      { background-position: -192px -72px; }\n.icon-fast-backward      { background-position: -216px -72px; }\n.icon-backward           { background-position: -240px -72px; }\n.icon-play               { background-position: -264px -72px; }\n.icon-pause              { background-position: -288px -72px; }\n.icon-stop               { background-position: -312px -72px; }\n.icon-forward            { background-position: -336px -72px; }\n.icon-fast-forward       { background-position: -360px -72px; }\n.icon-step-forward       { background-position: -384px -72px; }\n.icon-eject              { background-position: -408px -72px; }\n.icon-chevron-left       { background-position: -432px -72px; }\n.icon-chevron-right      { background-position: -456px -72px; }\n\n.icon-plus-sign          { background-position: 0      -96px; }\n.icon-minus-sign         { background-position: -24px  -96px; }\n.icon-remove-sign        { background-position: -48px  -96px; }\n.icon-ok-sign            { background-position: -72px  -96px; }\n.icon-question-sign      { background-position: -96px  -96px; }\n.icon-info-sign          { background-position: -120px -96px; }\n.icon-screenshot         { background-position: -144px -96px; }\n.icon-remove-circle      { background-position: -168px -96px; }\n.icon-ok-circle          { background-position: -192px -96px; }\n.icon-ban-circle         { background-position: -216px -96px; }\n.icon-arrow-left         { background-position: -240px -96px; }\n.icon-arrow-right        { background-position: -264px -96px; }\n.icon-arrow-up           { background-position: -289px -96px; } // 1px off\n.icon-arrow-down         { background-position: -312px -96px; }\n.icon-share-alt          { background-position: -336px -96px; }\n.icon-resize-full        { background-position: -360px -96px; }\n.icon-resize-small       { background-position: -384px -96px; }\n.icon-plus               { background-position: -408px -96px; }\n.icon-minus              { background-position: -433px -96px; }\n.icon-asterisk           { background-position: -456px -96px; }\n\n.icon-exclamation-sign   { background-position: 0      -120px; }\n.icon-gift               { background-position: -24px  -120px; }\n.icon-leaf               { background-position: -48px  -120px; }\n.icon-fire               { background-position: -72px  -120px; }\n.icon-eye-open           { background-position: -96px  -120px; }\n.icon-eye-close          { background-position: -120px -120px; }\n.icon-warning-sign       { background-position: -144px -120px; }\n.icon-plane              { background-position: -168px -120px; }\n.icon-calendar           { background-position: -192px -120px; }\n.icon-random             { background-position: -216px -120px; width: 16px; }\n.icon-comment            { background-position: -240px -120px; }\n.icon-magnet             { background-position: -264px -120px; }\n.icon-chevron-up         { background-position: -288px -120px; }\n.icon-chevron-down       { background-position: -313px -119px; } // 1px, 1px off\n.icon-retweet            { background-position: -336px -120px; }\n.icon-shopping-cart      { background-position: -360px -120px; }\n.icon-folder-close       { background-position: -384px -120px; }\n.icon-folder-open        { background-position: -408px -120px; width: 16px; }\n.icon-resize-vertical    { background-position: -432px -119px; } // 1px, 1px off\n.icon-resize-horizontal  { background-position: -456px -118px; } // 1px, 2px off\n\n.icon-hdd                     { background-position: 0      -144px; }\n.icon-bullhorn                { background-position: -24px  -144px; }\n.icon-bell                    { background-position: -48px  -144px; }\n.icon-certificate             { background-position: -72px  -144px; }\n.icon-thumbs-up               { background-position: -96px  -144px; }\n.icon-thumbs-down             { background-position: -120px -144px; }\n.icon-hand-right              { background-position: -144px -144px; }\n.icon-hand-left               { background-position: -168px -144px; }\n.icon-hand-up                 { background-position: -192px -144px; }\n.icon-hand-down               { background-position: -216px -144px; }\n.icon-circle-arrow-right      { background-position: -240px -144px; }\n.icon-circle-arrow-left       { background-position: -264px -144px; }\n.icon-circle-arrow-up         { background-position: -288px -144px; }\n.icon-circle-arrow-down       { background-position: -312px -144px; }\n.icon-globe                   { background-position: -336px -144px; }\n.icon-wrench                  { background-position: -360px -144px; }\n.icon-tasks                   { background-position: -384px -144px; }\n.icon-filter                  { background-position: -408px -144px; }\n.icon-briefcase               { background-position: -432px -144px; }\n.icon-fullscreen              { background-position: -456px -144px; }\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\n// BASE TABLES\n// -----------------\n\ntable {\n  max-width: 100%;\n  background-color: @tableBackground;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n// BASELINE STYLES\n// ---------------\n\n.table {\n  width: 100%;\n  margin-bottom: @baseLineHeight;\n  // Cells\n  th,\n  td {\n    padding: 8px;\n    line-height: @baseLineHeight;\n    text-align: left;\n    vertical-align: top;\n    border-top: 1px solid @tableBorder;\n  }\n  th {\n    font-weight: bold;\n  }\n  // Bottom align for column headings\n  thead th {\n    vertical-align: bottom;\n  }\n  // Remove top border from thead by default\n  caption + thead tr:first-child th,\n  caption + thead tr:first-child td,\n  colgroup + thead tr:first-child th,\n  colgroup + thead tr:first-child td,\n  thead:first-child tr:first-child th,\n  thead:first-child tr:first-child td {\n    border-top: 0;\n  }\n  // Account for multiple tbody instances\n  tbody + tbody {\n    border-top: 2px solid @tableBorder;\n  }\n}\n\n\n\n// CONDENSED TABLE W/ HALF PADDING\n// -------------------------------\n\n.table-condensed {\n  th,\n  td {\n    padding: 4px 5px;\n  }\n}\n\n\n// BORDERED VERSION\n// ----------------\n\n.table-bordered {\n  border: 1px solid @tableBorder;\n  border-collapse: separate; // Done so we can round those corners!\n  *border-collapse: collapse; // IE7 can't round corners anyway\n  border-left: 0;\n  .border-radius(4px);\n  th,\n  td {\n    border-left: 1px solid @tableBorder;\n  }\n  // Prevent a double border\n  caption + thead tr:first-child th,\n  caption + tbody tr:first-child th,\n  caption + tbody tr:first-child td,\n  colgroup + thead tr:first-child th,\n  colgroup + tbody tr:first-child th,\n  colgroup + tbody tr:first-child td,\n  thead:first-child tr:first-child th,\n  tbody:first-child tr:first-child th,\n  tbody:first-child tr:first-child td {\n    border-top: 0;\n  }\n  // For first th or td in the first row in the first thead or tbody\n  thead:first-child tr:first-child th:first-child,\n  tbody:first-child tr:first-child td:first-child {\n    -webkit-border-top-left-radius: 4px;\n            border-top-left-radius: 4px;\n        -moz-border-radius-topleft: 4px;\n  }\n  thead:first-child tr:first-child th:last-child,\n  tbody:first-child tr:first-child td:last-child {\n    -webkit-border-top-right-radius: 4px;\n            border-top-right-radius: 4px;\n        -moz-border-radius-topright: 4px;\n  }\n  // For first th or td in the first row in the first thead or tbody\n  thead:last-child tr:last-child th:first-child,\n  tbody:last-child tr:last-child td:first-child,\n  tfoot:last-child tr:last-child td:first-child {\n    .border-radius(0 0 0 4px);\n    -webkit-border-bottom-left-radius: 4px;\n            border-bottom-left-radius: 4px;\n        -moz-border-radius-bottomleft: 4px;\n  }\n  thead:last-child tr:last-child th:last-child,\n  tbody:last-child tr:last-child td:last-child,\n  tfoot:last-child tr:last-child td:last-child {\n    -webkit-border-bottom-right-radius: 4px;\n            border-bottom-right-radius: 4px;\n        -moz-border-radius-bottomright: 4px;\n  }\n\n  // Special fixes to round the left border on the first td/th\n  caption + thead tr:first-child th:first-child,\n  caption + tbody tr:first-child td:first-child,\n  colgroup + thead tr:first-child th:first-child,\n  colgroup + tbody tr:first-child td:first-child {\n    -webkit-border-top-left-radius: 4px;\n            border-top-left-radius: 4px;\n        -moz-border-radius-topleft: 4px;\n  }\n  caption + thead tr:first-child th:last-child,\n  caption + tbody tr:first-child td:last-child,\n  colgroup + thead tr:first-child th:last-child,\n  colgroup + tbody tr:first-child td:last-child {\n    -webkit-border-top-right-radius: 4px;\n            border-top-right-radius: 4px;\n         -moz-border-radius-topleft: 4px;\n  }\n\n}\n\n\n\n\n// ZEBRA-STRIPING\n// --------------\n\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n.table-striped {\n  tbody {\n    tr:nth-child(odd) td,\n    tr:nth-child(odd) th {\n      background-color: @tableBackgroundAccent;\n    }\n  }\n}\n\n\n// HOVER EFFECT\n// ------------\n// Placed here since it has to come after the potential zebra striping\n.table-hover {\n  tbody {\n    tr:hover td,\n    tr:hover th {\n      background-color: @tableBackgroundHover;\n    }\n  }\n}\n\n\n// TABLE CELL SIZING\n// -----------------\n\n// Reset default grid behavior\ntable [class*=span],\n.row-fluid table [class*=span] {\n  display: table-cell;\n  float: none; // undo default grid column styles\n  margin-left: 0; // undo default grid column styles\n}\n\n// Change the column widths to account for td/th padding\n.table {\n  .span1     { .tableColumns(1); }\n  .span2     { .tableColumns(2); }\n  .span3     { .tableColumns(3); }\n  .span4     { .tableColumns(4); }\n  .span5     { .tableColumns(5); }\n  .span6     { .tableColumns(6); }\n  .span7     { .tableColumns(7); }\n  .span8     { .tableColumns(8); }\n  .span9     { .tableColumns(9); }\n  .span10    { .tableColumns(10); }\n  .span11    { .tableColumns(11); }\n  .span12    { .tableColumns(12); }\n  .span13    { .tableColumns(13); }\n  .span14    { .tableColumns(14); }\n  .span15    { .tableColumns(15); }\n  .span16    { .tableColumns(16); }\n  .span17    { .tableColumns(17); }\n  .span18    { .tableColumns(18); }\n  .span19    { .tableColumns(19); }\n  .span20    { .tableColumns(20); }\n  .span21    { .tableColumns(21); }\n  .span22    { .tableColumns(22); }\n  .span23    { .tableColumns(23); }\n  .span24    { .tableColumns(24); }\n}\n\n\n\n// TABLE BACKGROUNDS\n// -----------------\n// Exact selectors below required to override .table-striped\n\n.table tbody tr {\n  &.success td {\n    background-color: @successBackground;\n  }\n  &.error td {\n    background-color: @errorBackground;\n  }\n  &.warning td {\n    background-color: @warningBackground;\n  }\n  &.info td {\n    background-color: @infoBackground;\n  }\n}\n\n// Hover states for .table-hover\n.table-hover tbody tr {\n  &.success:hover td {\n    background-color: darken(@successBackground, 5%);\n  }\n  &.error:hover td {\n    background-color: darken(@errorBackground, 5%);\n  }\n  &.warning:hover td {\n    background-color: darken(@warningBackground, 5%);\n  }\n  &.info:hover td {\n    background-color: darken(@infoBackground, 5%);\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files\n\n// Make wrapper ul behave like the grid\n.thumbnails {\n  margin-left: -@gridGutterWidth;\n  list-style: none;\n  .clearfix();\n}\n// Fluid rows have no left margin\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n\n// Float li to make thumbnails appear in a row\n.thumbnails > li {\n  float: left; // Explicity set the float since we don't require .span* classes\n  margin-bottom: @baseLineHeight;\n  margin-left: @gridGutterWidth;\n}\n\n// The actual thumbnail (can be `a` or `div`)\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: @baseLineHeight;\n  border: 1px solid #ddd;\n  .border-radius(4px);\n  .box-shadow(0 1px 3px rgba(0,0,0,.055));\n  .transition(all .2s ease-in-out);\n}\n// Add a hover state for linked versions only\na.thumbnail:hover {\n  border-color: @linkColor;\n  .box-shadow(0 1px 4px rgba(0,105,214,.25));\n}\n\n// Images and captions\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: @gray;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindexTooltip;\n  display: block;\n  visibility: visible;\n  padding: 5px;\n  font-size: 11px;\n  .opacity(0);\n  &.in     { .opacity(80); }\n  &.top    { margin-top:  -3px; }\n  &.right  { margin-left:  3px; }\n  &.bottom { margin-top:   3px; }\n  &.left   { margin-left: -3px; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: @tooltipColor;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltipBackground;\n  .border-radius(4px);\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltipArrowWidth;\n    border-width: @tooltipArrowWidth @tooltipArrowWidth 0;\n    border-top-color: @tooltipArrowColor;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltipArrowWidth;\n    border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;\n    border-right-color: @tooltipArrowColor;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltipArrowWidth;\n    border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;\n    border-left-color: @tooltipArrowColor;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltipArrowWidth;\n    border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;\n    border-bottom-color: @tooltipArrowColor;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 @baseLineHeight / 2;\n}\n.lead {\n  margin-bottom: @baseLineHeight;\n  font-size: @baseFontSize * 1.5;\n  font-weight: 200;\n  line-height: @baseLineHeight * 1.5;\n}\n\n\n// Emphasis & misc\n// -------------------------\n\nsmall {\n  font-size: 85%; // Ex: 14px base font * 85% = about 12px\n}\nstrong {\n  font-weight: bold;\n}\nem {\n  font-style: italic;\n}\ncite {\n  font-style: normal;\n}\n\n// Utility classes\n.muted {\n  color: @grayLight;\n}\n.text-warning {\n  color: @warningText;\n}\n.text-error {\n  color: @errorText;\n}\n.text-info {\n  color: @infoText;\n}\n.text-success {\n  color: @successText;\n}\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6 {\n  margin: (@baseLineHeight / 2) 0;\n  font-family: @headingsFontFamily;\n  font-weight: @headingsFontWeight;\n  line-height: 1;\n  color: @headingsColor;\n  text-rendering: optimizelegibility; // Fix the character spacing for headings\n  small {\n    font-weight: normal;\n    line-height: 1;\n    color: @grayLight;\n  }\n}\nh1 { font-size: 36px; line-height: 40px; }\nh2 { font-size: 30px; line-height: 40px; }\nh3 { font-size: 24px; line-height: 40px; }\nh4 { font-size: 18px; line-height: 20px; }\nh5 { font-size: 14px; line-height: 20px; }\nh6 { font-size: 12px; line-height: 20px; }\n\nh1 small { font-size: 24px; }\nh2 small { font-size: 18px; }\nh3 small { font-size: 14px; }\nh4 small { font-size: 14px; }\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (@baseLineHeight / 2) - 1;\n  margin: @baseLineHeight 0 (@baseLineHeight * 1.5);\n  border-bottom: 1px solid @grayLighter;\n}\n\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul, ol {\n  padding: 0;\n  margin: 0 0 @baseLineHeight / 2 25px;\n}\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\nli {\n  line-height: @baseLineHeight;\n}\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\n\n// Description Lists\ndl {\n  margin-bottom: @baseLineHeight;\n}\ndt,\ndd {\n  line-height: @baseLineHeight;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: @baseLineHeight / 2;\n}\n// Horizontal layout (like forms)\n.dl-horizontal {\n  .clearfix(); // Ensure dl clears floats if empty dd elements present\n  dt {\n    float: left;\n    width: @horizontalComponentOffset - 20;\n    clear: left;\n    text-align: right;\n    .text-overflow();\n  }\n  dd {\n    margin-left: @horizontalComponentOffset;\n  }\n}\n\n// MISC\n// ----\n\n// Horizontal rules\nhr {\n  margin: @baseLineHeight 0;\n  border: 0;\n  border-top: 1px solid @hrBorder;\n  border-bottom: 1px solid @white;\n}\n\n// Abbreviations and acronyms\nabbr[title] {\n  cursor: help;\n  border-bottom: 1px dotted @grayLight;\n}\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 @baseLineHeight;\n  border-left: 5px solid @grayLighter;\n  p {\n    margin-bottom: 0;\n    #font > .shorthand(16px,300,@baseLineHeight * 1.25);\n  }\n  small {\n    display: block;\n    line-height: @baseLineHeight;\n    color: @grayLight;\n    &:before {\n      content: '\\2014 \\00A0';\n    }\n  }\n\n  // Float right with text-align: right\n  &.pull-right {\n    float: right;\n    padding-right: 15px;\n    padding-left: 0;\n    border-right: 5px solid @grayLighter;\n    border-left: 0;\n    p,\n    small {\n      text-align: right;\n    }\n    small {\n      &:before {\n        content: '';\n      }\n      &:after {\n        content: '\\00A0 \\2014';\n      }\n    }\n  }\n}\n\n// Quotes\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  display: block;\n  margin-bottom: @baseLineHeight;\n  font-style: normal;\n  line-height: @baseLineHeight;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Quick floats\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n\n// Toggling content\n.hide {\n  display: none;\n}\n.show {\n  display: block;\n}\n\n// Visibility\n.invisible {\n  visibility: hidden;\n}\n\n// For Affix plugin\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// --------------------------------------------------\n\n\n// Grays\n// -------------------------\n@black:                 #000;\n@grayDarker:            #222;\n@grayDark:              #333;\n@gray:                  #555;\n@grayLight:             #999;\n@grayLighter:           #eee;\n@white:                 #fff;\n\n\n// Accent colors\n// -------------------------\n@blue:                  #049cdb;\n@blueDark:              #0064cd;\n@green:                 #46a546;\n@red:                   #9d261d;\n@yellow:                #ffc40d;\n@orange:                #f89406;\n@pink:                  #c3325f;\n@purple:                #7a43b6;\n\n\n// Scaffolding\n// -------------------------\n@bodyBackground:        @white;\n@textColor:             @grayDark;\n\n\n// Links\n// -------------------------\n@linkColor:             #08c;\n@linkColorHover:        darken(@linkColor, 15%);\n\n\n// Typography\n// -------------------------\n@sansFontFamily:        \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@serifFontFamily:       Georgia, \"Times New Roman\", Times, serif;\n@monoFontFamily:        Monaco, Menlo, Consolas, \"Courier New\", monospace;\n\n@baseFontSize:          13px;\n@baseFontFamily:        @sansFontFamily;\n@baseLineHeight:        18px;\n@altFontFamily:         @serifFontFamily;\n\n@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily\n@headingsFontWeight:    bold;    // instead of browser default, bold\n@headingsColor:         inherit; // empty to use BS default, @textColor\n\n// Tables\n// -------------------------\n@tableBackground:                   transparent; // overall background-color\n@tableBackgroundAccent:             #f9f9f9; // for striping\n@tableBackgroundHover:              #f5f5f5; // for hover\n@tableBorder:                       #ddd; // table and cell border\n\n// Buttons\n// -------------------------\n@btnBackground:                     @white;\n@btnBackgroundHighlight:            darken(@white, 10%);\n@btnBorder:                         #bbb;\n\n@btnPrimaryBackground:              @linkColor;\n@btnPrimaryBackgroundHighlight:     spin(@btnPrimaryBackground, 20%);\n\n@btnInfoBackground:                 #5bc0de;\n@btnInfoBackgroundHighlight:        #2f96b4;\n\n@btnSuccessBackground:              #62c462;\n@btnSuccessBackgroundHighlight:     #51a351;\n\n@btnWarningBackground:              lighten(@orange, 15%);\n@btnWarningBackgroundHighlight:     @orange;\n\n@btnDangerBackground:               #ee5f5b;\n@btnDangerBackgroundHighlight:      #bd362f;\n\n@btnInverseBackground:              #444;\n@btnInverseBackgroundHighlight:     @grayDarker;\n\n\n// Forms\n// -------------------------\n@inputBackground:               @white;\n@inputBorder:                   #ccc;\n@inputBorderRadius:             3px;\n@inputDisabledBackground:       @grayLighter;\n@formActionsBackground:         #f5f5f5;\n\n// Dropdowns\n// -------------------------\n@dropdownBackground:            @white;\n@dropdownBorder:                rgba(0,0,0,.2);\n@dropdownDividerTop:            #e5e5e5;\n@dropdownDividerBottom:         @white;\n\n@dropdownLinkColor:             @grayDark;\n@dropdownLinkColorHover:        @white;\n@dropdownLinkColorActive:       @dropdownLinkColor;\n\n@dropdownLinkBackgroundActive:  @linkColor;\n@dropdownLinkBackgroundHover:   @dropdownLinkBackgroundActive;\n\n\n\n// COMPONENT VARIABLES\n// --------------------------------------------------\n\n// Z-index master list\n// -------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n@zindexDropdown:          1000;\n@zindexPopover:           1010;\n@zindexTooltip:           1030;\n@zindexFixedNavbar:       1030;\n@zindexModalBackdrop:     1040;\n@zindexModal:             1050;\n\n\n// Sprite icons path\n// -------------------------\n@iconSpritePath:          \"../img/glyphicons-halflings.png\";\n@iconWhiteSpritePath:     \"../img/glyphicons-halflings-white.png\";\n\n\n// Input placeholder text color\n// -------------------------\n@placeholderText:         @grayLight;\n\n\n// Hr border color\n// -------------------------\n@hrBorder:                @grayLighter;\n\n\n// Horizontal forms & lists\n// -------------------------\n@horizontalComponentOffset:       180px;\n\n\n// Wells\n// -------------------------\n@wellBackground:                  #f5f5f5;\n\n\n// Navbar\n// -------------------------\n@navbarCollapseWidth:             979px;\n\n@navbarHeight:                    40px;\n@navbarBackgroundHighlight:       #ffffff;\n@navbarBackground:                darken(@navbarBackgroundHighlight, 5%);\n@navbarBorder:                    darken(@navbarBackground, 12%);\n\n@navbarText:                      #777;\n@navbarLinkColor:                 #777;\n@navbarLinkColorHover:            @grayDark;\n@navbarLinkColorActive:           @gray;\n@navbarLinkBackgroundHover:       transparent;\n@navbarLinkBackgroundActive:      darken(@navbarBackground, 5%);\n\n@navbarBrandColor:                @navbarLinkColor;\n\n// Inverted navbar\n@navbarInverseBackground:                #111111;\n@navbarInverseBackgroundHighlight:       #222222;\n@navbarInverseBorder:                    #252525;\n\n@navbarInverseText:                      @grayLight;\n@navbarInverseLinkColor:                 @grayLight;\n@navbarInverseLinkColorHover:            @white;\n@navbarInverseLinkColorActive:           @navbarInverseLinkColorHover;\n@navbarInverseLinkBackgroundHover:       transparent;\n@navbarInverseLinkBackgroundActive:      @navbarInverseBackground;\n\n@navbarInverseSearchBackground:          lighten(@navbarInverseBackground, 25%);\n@navbarInverseSearchBackgroundFocus:     @white;\n@navbarInverseSearchBorder:              @navbarInverseBackground;\n@navbarInverseSearchPlaceholderColor:    #ccc;\n\n@navbarInverseBrandColor:                @navbarInverseLinkColor;\n\n\n// Pagination\n// -------------------------\n@paginationBackground:                #fff;\n@paginationBorder:                    #ddd;\n@paginationActiveBackground:          #f5f5f5;\n\n\n// Hero unit\n// -------------------------\n@heroUnitBackground:              @grayLighter;\n@heroUnitHeadingColor:            inherit;\n@heroUnitLeadColor:               inherit;\n\n\n// Form states and alerts\n// -------------------------\n@warningText:             #c09853;\n@warningBackground:       #fcf8e3;\n@warningBorder:           darken(spin(@warningBackground, -10), 3%);\n\n@errorText:               #b94a48;\n@errorBackground:         #f2dede;\n@errorBorder:             darken(spin(@errorBackground, -10), 3%);\n\n@successText:             #468847;\n@successBackground:       #dff0d8;\n@successBorder:           darken(spin(@successBackground, -10), 5%);\n\n@infoText:                #3a87ad;\n@infoBackground:          #d9edf7;\n@infoBorder:              darken(spin(@infoBackground, -10), 7%);\n\n\n// Tooltips and popovers\n// -------------------------\n@tooltipColor:            #fff;\n@tooltipBackground:       #000;\n@tooltipArrowWidth:       5px;\n@tooltipArrowColor:       @tooltipBackground;\n\n@popoverBackground:       #fff;\n@popoverArrowWidth:       10px;\n@popoverArrowColor:       #fff;\n@popoverTitleBackground:  darken(@popoverBackground, 3%);\n\n// Special enhancement for popovers\n@popoverArrowOuterWidth:  @popoverArrowWidth + 1;\n@popoverArrowOuterColor:  rgba(0,0,0,.25);\n\n\n\n// GRID\n// --------------------------------------------------\n\n\n// Default 940px grid\n// -------------------------\n@gridColumns:             12;\n@gridColumnWidth:         60px;\n@gridGutterWidth:         20px;\n@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));\n\n// 1200px min\n@gridColumnWidth1200:     70px;\n@gridGutterWidth1200:     30px;\n@gridRowWidth1200:        (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));\n\n// 768px-979px\n@gridColumnWidth768:      42px;\n@gridGutterWidth768:      20px;\n@gridRowWidth768:         (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));\n\n\n// Fluid grid\n// -------------------------\n@fluidGridColumnWidth:    percentage(@gridColumnWidth/@gridRowWidth);\n@fluidGridGutterWidth:    percentage(@gridGutterWidth/@gridRowWidth);\n\n// 1200px min\n@fluidGridColumnWidth1200:     percentage(@gridColumnWidth1200/@gridRowWidth1200);\n@fluidGridGutterWidth1200:     percentage(@gridGutterWidth1200/@gridRowWidth1200);\n\n// 768px-979px\n@fluidGridColumnWidth768:      percentage(@gridColumnWidth768/@gridRowWidth768);\n@fluidGridGutterWidth768:      percentage(@gridGutterWidth768/@gridRowWidth768);\n"
  },
  {
    "path": "servers/www/assets/bootstrap/less/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @wellBackground;\n  border: 1px solid darken(@wellBackground, 7%);\n  .border-radius(4px);\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-large {\n  padding: 24px;\n  .border-radius(6px);\n}\n.well-small {\n  padding: 9px;\n  .border-radius(3px);\n}\n"
  },
  {
    "path": "servers/www/assets/css/common/style.less",
    "content": ".help-block {\n  font-style: italic;\n  font-size: 80%;\n}"
  },
  {
    "path": "servers/www/assets/css/components/discussion.less",
    "content": ".plunker-discussion {\r\n  .thumbnails {\r\n    margin-bottom: 4px;\r\n    margin-left: -10px;\r\n  }\r\n  \r\n  form {\r\n    margin-bottom: 8px;\r\n    \r\n    .help-block, .help-block code {\r\n      font-size: 10px;\r\n      font-style: italic;\r\n      line-height: 13px;\r\n    }\r\n  }\r\n  \r\n  .user {\r\n    width: 40px;\r\n    text-align: center;\r\n    margin-bottom: 4px;\r\n    margin-left: 10px;\r\n    \r\n    .username {\r\n      height: 14px;\r\n      overflow: hidden;\r\n      white-space: nowrap;\r\n      text-overflow: ellipsis;\r\n      font-size: 8px;\r\n      display: block;\r\n    }\r\n  }\r\n  .chat-messages {\r\n    margin: 0;\r\n    padding: 0;\r\n    list-style: none;\r\n  }\r\n  \r\n  .message {\r\n    margin: 0;\r\n    padding: 0;\r\n    padding-bottom: 6px;\r\n    border-top: 1px solid #f5f5f5;\r\n    list-style: none;\r\n    \r\n    .body {\r\n      margin: 0;\r\n      padding: 8px 0 0;\r\n    }\r\n    .meta {\r\n      font-size: 10px;\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "servers/www/assets/css/components/gallery.less",
    "content": "@import \"./tags\";\r\n\r\n.card.span3 {\r\n  width: 270px;\r\n}\r\n\r\n.page-header {\r\n  margin: 18px 0 10px;\r\n  border-bottom: 1px solid #ccc;\r\n  \r\n  .nav {\r\n    margin-bottom: 0;\r\n  }\r\n  \r\n  .pagination {\r\n    margin: 0;\r\n  }\r\n}\r\n\r\n.cards {\r\n  .thumbnail {\r\n    background-color: white;\r\n    position: relative;\r\n    \r\n    .meta, .extras {\r\n      text-align: right;\r\n      list-style: none;\r\n      \r\n      margin: 0; padding: 0;\r\n      \r\n      li {\r\n        display: inline-block;\r\n        \r\n        a {\r\n          color: #666;\r\n          text-decoration: none;\r\n        }\r\n        a:hover {\r\n          color: #08C;\r\n        }\r\n      }\r\n      .votes.thumbed a:hover {\r\n        color: red;\r\n      }\r\n    }\r\n    \r\n    .hover {\r\n      display: none;\r\n    }\r\n    \r\n    .preview {\r\n      display: block;\r\n      width: 238px;\r\n      height: 179px;\r\n    }\r\n    \r\n    .meta {\r\n      margin: 4px 10px; \r\n    }\r\n    \r\n    .extras {\r\n      position: absolute;\r\n      \r\n      bottom: 7px;\r\n      left: 10px;\r\n    }\r\n  }\r\n  \r\n  .plunk {\r\n    width: 270px;\r\n  }\r\n  .owned {\r\n    position: absolute;\r\n    top: 4px; right: 4px;\r\n  }\r\n  \r\n  .thumbnail img {\r\n    width: 238px;\r\n    margin: 0 10px;\r\n    border: 1px solid #ccc;\r\n    -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\r\n    -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\r\n    box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\r\n  }\r\n  \r\n  .thumbnail .description {\r\n    color: #333;\r\n    height: 18px;\r\n    overflow: hidden;\r\n    white-space: nowrap;\r\n    text-overflow: ellipsis;\r\n    margin: 0 10px;\r\n  }\r\n    \r\n  .thumbnail .created_at {\r\n    text-transform: none;\r\n  }\r\n  \r\n  .thumbnail {\r\n    border-color: #0088cc;\r\n    -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\r\n    -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\r\n    box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\r\n    \r\n    .preview {\r\n      position: relative;\r\n    \r\n      .hover {\r\n        display: block;\r\n        position: absolute;\r\n        bottom: 2px;\r\n        right: 2px;\r\n      }\r\n    }\r\n  }\r\n  .user {\r\n    margin: 5px 15px;\r\n    height: 39px;\r\n    \r\n    a {\r\n      color: #666;\r\n      text-decoration: none;\r\n    }\r\n    .gravatar {\r\n      border: 1px solid white;\r\n    }\r\n    a:hover {\r\n      color: #08C;\r\n      \r\n      .gravatar {\r\n        border: 1px solid #08C;\r\n      }\r\n    }\r\n  }\r\n  \r\n  .created_at {\r\n    color: #aaa;\r\n  }\r\n}"
  },
  {
    "path": "servers/www/assets/css/components/importer.less",
    "content": "#importer {\r\n  position: relative;\r\n\r\n  .import-form {\r\n    padding-top: 46px;\r\n    padding-left: 5px;\r\n    margin-bottom: 0px;\r\n    \r\n    .import-source {\r\n      width: auto;\r\n      height: 27px;\r\n      display: block;\r\n      font-size: 20px;\r\n      line-height: normal;\r\n      position: absolute;\r\n      left: 20px; top: 20px;\r\n      right: 111px;\r\n    }\r\n    .import-submit {\r\n      position: absolute;\r\n      top: 20px; right: 20px;\r\n    }\r\n    .help-text {\r\n      font-style: italic;\r\n      margin: 0;\r\n    }\r\n  }\r\n  input {\r\n    display: block;\r\n    margin-bottom: 0;\r\n  }\r\n}"
  },
  {
    "path": "servers/www/assets/css/components/multipanel.less",
    "content": "#multipanel {\n  .panel {\n    width: 100%;\n    height: 100%;\n    position: relative;\n  }\n}\n\n#multipane-buttons {\n  background: whiteSmoke;\n  text-align: center;\n  \n  ul {\n    > li {\n      text-align: center;\n      font-size: 16px;\n      position: relative;\n      \n      a {\n        padding: 8px;\n        color: #999;\n        text-decoration: none;\n      }\n      .badge {\n        padding: 1px 5px 2px;\n        -webkit-border-radius: 6px;\n        -moz-border-radius: 6px;\n        border-radius: 6px;\n        font-size: 8px;\n        line-height: 8px;\n        position: absolute;\n        right: -13px; // Bootstrap negative margin counter\n        top: 2px;\n      }\n    }\n    > li:hover {\n      a {\n        color: #005580;\n      }\n    }\n    > li.active {\n      a {\n        color: white;\n      }\n    }\n  }\n}\n\n#panel-explore, #panel-discussion, #panel-streamer, #panel-lint, #panel-builder, #panel-readme {\n  padding: 8px;\n}\n\n\n#panel-streamer {\n  .status {\n    margin: -8px;\n    margin-bottom: 8px;\n    padding: 8px;\n    background-color: #eef0ee;\n  }\n  \n}\n\n#panel-lint {\n  .jshint-report {\n    margin: 0;\n    color: #404040;\n  }\n  \n  ul.jshint-errors {\n    margin: 0;\n    list-style-type: none;\n  }\n  \n  ul.jshint-errors li {\n    margin-bottom: 15px;\n  }\n}"
  },
  {
    "path": "servers/www/assets/css/components/navbar.less",
    "content": ".navbar {\r\n  .navbar-inner {\r\n    padding: 0 8px;\r\n  }\r\n  \r\n  .brand {\r\n    background: rgba(0,0,0,0.0) url('../../img/plunker.png') no-repeat left top;\r\n    background-size: 40px;\r\n    font-family: 'Exo', sans-serif;\r\n    font-size: 24px;\r\n    padding: 8px 20px 8px 40px;\r\n    margin-left: -5px;\r\n    line-height: 24px;\r\n    height: 24px;\r\n  }\r\n  .version {\r\n    font-size: 8px;\r\n    vertical-align: bottom;\r\n    color: #999;\r\n    font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\r\n    line-height: 10px;\r\n  }\r\n  @media (max-width: 979px) {\r\n    .brand {\r\n      margin-left: 5px;\r\n    }\r\n  }\r\n  @media (max-width: 399px) {\r\n    .brand {\r\n      width: 0px;\r\n      text-indent: -9999px;\r\n    }\r\n    .version {\r\n      display: none;\r\n    }\r\n  }\r\n\r\n}"
  },
  {
    "path": "servers/www/assets/css/components/previewer.less",
    "content": ".plnk-previewer {\n  width: 100%; height: 100%;\n  overflow: hidden;\n}\n.plnk-runner {\n  border: 0; margin: 0; padding: 0;\n  overflow: hidden;\n}\n\n#preview-ops {\n  border: 1px solid #ccc;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  -webkit-border-bottom-right-radius: 3px;\n  -webkit-border-bottom-left-radius: 3px;\n  -moz-border-radius-bottomright: 3px;\n  -moz-border-radius-bottomleft: 3px;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n  position: absolute;\n  top: -1px;\n  right: 8px;\n  z-index: 1000;\n  background-color: #eee;\n  font-family: sans-serif;\n  -ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";\n  filter: alpha(opacity=50);\n\t-moz-opacity:0.5;\n\t-khtml-opacity: 0.5;\n\topacity: 0.5;\n\n  .btn-toolbar {\n    margin: 2px;\n    height: 20px;\n  }\n}\n\n#preview-ops:hover {\n  -ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n  filter: alpha(opacity=100);\n\t-moz-opacity:1.0;\n\t-khtml-opacity: 1.0;\n\topacity: 1.0;\n}\n"
  },
  {
    "path": "servers/www/assets/css/components/share.less",
    "content": "div.share-panel {\n  padding: 8px;\n  \n  #share-embed {\n    //width: 100%;\n  }\n  .share-button {\n    margin-top: 6px;\n  }\n}"
  },
  {
    "path": "servers/www/assets/css/components/sidebar.less",
    "content": ".plnk-sidebar {\n  position: absolute;\n  top: 0; bottom: 0; left: 0; right: 0;\n  background-color: #f5f5f5;\n  \n  details {\n    margin-bottom: 6px;\n  }\n  li[ng-show=addInPlace] {\n    margin: 0;\n  }\n  li[ng-show=addInPlace]:hover {\n    background: inherit;\n  }\n\n  summary.header {\n    display: block;\n    padding: 3px 15px;\n    font-size: 11px;\n    font-weight: bold;\n    line-height: 18px;\n    color: #999;\n    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n    text-transform: uppercase;\n    cursor: pointer;\n    \n    position: relative;\n  \n    a.file-add {\n      font-size: 80%;\n      color: #666;\n      background: none;\n      border: none;\n      margin: 0; padding: 2px 0;\n      margin-left: 10px;\n      -webkit-box-shadow: none;\n      -moz-box-shadow: none;\n      box-shadow: none;\n      \n      position: absolute;\n      right: 8px;\n    }\n    a.file-add:hover {\n      color: black;\n    }\n  }\n  \n  .file {\n    position: relative;\n    \n    .file-ops {\n      display: none;\n    }\n  }\n  \n  .file:hover {\n    .file-ops {\n      display: inline-block;\n      list-style: none;\n      margin: 0; padding: 0;\n      position: absolute;\n      right: -13px;\n      top: 0;\n      \n      li {\n        display: inline-block;\n        \n        button {\n          background: none;\n          border: none;\n          margin: 0; padding: 5px 0;\n          -webkit-box-shadow: none;\n          -moz-box-shadow: none;\n          box-shadow: none;\n        }\n        button:hover {\n          color: red;\n        }\n      }\n    }\n  }\n  \n  form, textarea, label {\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    width: 100%;\n  }\n  form {\n    padding: 0 15px;\n  }\n  \n  label {\n    span {\n      margin-top: 4px;\n      padding-left: 4px;\n    }\n    input {\n      margin-top: 0;\n      vertical-align: middle;\n    }\n  }\n  \n  .inline {\n    width: auto;\n  }\n  \n  .user, .thumb {\n    padding: 0 15px;\n    \n    .login {\n      padding-left: 4px;\n    }\n  }\n}"
  },
  {
    "path": "servers/www/assets/css/components/statusbar.less",
    "content": "#editor-file-list {\n  .file {\n    position: relative;\n    \n    .file-ops {\n      display: none;\n    }\n  }\n  \n  .file:hover {\n    .file-ops {\n      display: inline-block;\n      list-style: none;\n      margin: 0; padding: 0;\n      position: absolute;\n      right: 4px;\n      top: -2px;\n      \n      li {\n        display: inline-block;\n        \n        button {\n          background: none;\n          border: none;\n          margin: 0; padding: 5px 0;\n          -webkit-box-shadow: none;\n          -moz-box-shadow: none;\n          box-shadow: none;\n        }\n        button:hover {\n          color: red;\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "servers/www/assets/css/components/streamer.less",
    "content": ""
  },
  {
    "path": "servers/www/assets/css/components/tags.less",
    "content": "ul.tags {\r\n  margin: 0 11px; padding: 0; border: 0;\r\n  list-style: none;\r\n  display: block;\r\n  overflow: hidden;\r\n  width: 100%;\r\n  \r\n  li, a {\r\n    float: right;\r\n    height: 16px;\r\n  \tline-height: 16px;\r\n  \tposition: relative;\r\n  \tfont-size: 11px;\r\n    margin-bottom: 4px;\r\n  }\r\n  a {\r\n    margin-left:14px;\r\n  \tpadding:0 6px 0 8px;\r\n  \tbackground:#0089e0;\r\n  \tcolor:#fff;\r\n  \ttext-decoration:none;\r\n  \t-moz-border-radius-bottomright:4px;\r\n  \t-webkit-border-bottom-right-radius:4px;\t\r\n  \tborder-bottom-right-radius:4px;\r\n  \t-moz-border-radius-topright:4px;\r\n  \t-webkit-border-top-right-radius:4px;\t\r\n  \tborder-top-right-radius:4px;\t\r\n\t}\r\n  a:before {\r\n    content:\"\";\r\n  \tfloat:left;\r\n  \tposition:absolute;\r\n  \ttop:0;\r\n  \tleft:-8px;\r\n  \twidth:0;\r\n  \theight:2px;\r\n  \tborder-color:transparent #0089e0 transparent transparent;\r\n  \tborder-style:solid;\r\n  \tborder-width:7px 8px 7px 0;\t\t\r\n\t}\r\n  a:after {\r\n    content:\"\";\r\n  \tposition:absolute;\r\n  \ttop:6px;\r\n  \tleft:0;\r\n  \tfloat:left;\r\n  \twidth:4px;\r\n  \theight:4px;\r\n  \t-moz-border-radius:2px;\r\n  \t-webkit-border-radius:2px;\r\n  \tborder-radius:2px;\r\n  \tbackground:#fff;\r\n  \t-moz-box-shadow:-1px -1px 2px #004977;\r\n  \t-webkit-box-shadow:-1px -1px 2px #004977;\r\n  \tbox-shadow:-1px -1px 2px #004977;\r\n  }\r\n  a:hover{background:#555;}\r\n  a:hover:before{border-color:transparent #555 transparent transparent;}\r\n}"
  },
  {
    "path": "servers/www/assets/css/components/toolbar.less",
    "content": "#toolbar {\n  margin: 0; padding: 0;\n  \n  > .btn-group {\n    padding-bottom: 0;\n  }\n  \n  .dropdown-menu > li {\n    position: relative;\n    \n    a.coffee {\n      position: absolute;\n      right: 0;\n      top: 0;\n      z-index: 10;\n      \n      img {\n        width: 18px;\n        height: 18px;\n      }\n      \n      padding: 3px;\n      margin: 0 12px;\n    }\n  }\n  \n  .select2-container {\n    font-size: 13px;\n  }\n}\n"
  },
  {
    "path": "servers/www/assets/css/components/userpanel.less",
    "content": "#userpanel {\r\n  margin-left: 18px;\r\n  \r\n  .user-menu {\r\n    position: relative;\r\n    padding-left: 30px;\r\n    \r\n    .gravatar {\r\n      position: absolute;\r\n      left: 6px; top: 3px; width: 20px; height: 20px;\r\n    }\r\n  }\r\n  .dropdown-menu {\r\n    right: 0;\r\n    left: auto;\r\n  }\r\n}"
  },
  {
    "path": "servers/www/assets/css/pages/editor.less",
    "content": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\r\n\r\n@import \"../../bootstrap/less/bootstrap\";\r\n@import \"../../select2/select2.css\";\r\n\r\n@import \"../common/style\";\r\n\r\n@import \"../components/navbar\";\r\n@import \"../components/userpanel\";\r\n@import \"../components/previewer\";\r\n@import \"../components/statusbar\";\r\n@import \"../components/toolbar\";\r\n@import \"../components/multipanel\";\r\n@import \"../components/discussion\";\r\n@import \"../components/gallery\";\r\n@import \"../components/share\";\r\n\r\n@import \"../vendor/jquery-layout\";\r\n@import \"../vendor/prettify\";\r\n\r\nbody {\r\n  min-width: 410px;\r\n}\r\n\r\n#container {\r\n  padding-top: 50px;\r\n}\r\n\r\n.navbar-fixed-top {\r\n  height: 40px;\r\n  overflow: none;\r\n}\r\n\r\n@media (max-width: 979px) {\r\n  #container {\r\n    padding-top: 0;\r\n  }\r\n  .navbar-fixed-top .navbar-inner {\r\n    position: relative;\r\n    z-index: 5;\r\n  }\r\n}\r\n\r\n@media (max-width: 720px) {\r\n  .navbar-fixed-top .shrink {\r\n    display: none;\r\n  }\r\n}\r\n\r\n.brand {\r\n  height: 40px;\r\n}\r\n\r\n#editor {\r\n  position: absolute;\r\n  top: 40px;\r\n  left: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  \r\n  .plnk-overlay {\r\n    z-index: 9999;\r\n    background-color: rgba(0,0,0,0.5);\r\n    position: absolute;\r\n    top: 0; left: 0; right: 0; bottom: 0;\r\n    display: none;\r\n  }\r\n  \r\n  @import \"../components/sidebar\";\r\n  \r\n  .ui-layout-pane {\r\n    position: relative;\r\n    border: none;\r\n  }\r\n  \r\n  .editor-canvas {\r\n    position: absolute;\r\n    top: 0; left: 0; right: 0; bottom: 0;\r\n  }\r\n  .editor-status {\r\n    position: absolute;\r\n    height: 18px; left: 0; right: 0; bottom: 0;\r\n    background-color: #333;\r\n    \r\n    .navbar-fixed-bottom {\r\n      position: absolute;\r\n      \r\n      .nav {\r\n        margin: 0;\r\n        \r\n        .divider-vertical {\r\n          height: 20px;\r\n        }\r\n      }\r\n      .nav > li > a {\r\n        padding-top: 0;\r\n        padding-bottom: 0;\r\n      }\r\n    }\r\n    .navbar-inner {\r\n      min-height: 20px;\r\n      height: 20px;\r\n    }\r\n  }\r\n}\r\n\r\n#editor.loading {\r\n  .plnk-overlay {\r\n    display: block;\r\n  }\r\n}"
  },
  {
    "path": "servers/www/assets/css/pages/landing.less",
    "content": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\n\n@import \"../common/style\";\n\n@import \"../../bootstrap/less/bootstrap\";\n@import \"../../bootstrap/less/responsive\";\n\n@import \"../components/importer\";\n@import \"../components/gallery\";\n@import \"../components/navbar\";\n@import \"../components/userpanel\";\n\n\nbody {\n  padding-top: 50px;\n  background-color: #e5e5e5;\n  background: url('/img/noise_lines.png');\n  background-position: initial initial;\n  background-repeat: initial initial;\n}\n\n@media (max-width: 979px) {\n  body {\n    padding-top: 0;\n  }\n  .navbar-fixed-top .navbar-inner {\n    padding: 0;\n  }\n}\n\n\n#marketing {\n  h1 {\n    margin: 36px 0 27px;\n    font-size: 40px;\n    font-weight: 300;\n    text-align: center;\n  }\n  .marketing-byline {\n    margin: -18px 0 27px;\n    font-size: 18px;\n    font-weight: 300;\n    line-height: 24px;\n    color: #999;\n    text-align: center;\n  }\n}\n  \n#preview {\n  div.preview {\n    background-color: white;\n\n    iframe.plnk-preview {\n      border: 1px solid #999;\n    }    \n  }\n\n}\n\n#user {\n  .gallery .page-header {\n    padding-top: 13px;\n  }\n}\n\n"
  },
  {
    "path": "servers/www/assets/css/pages/preview.less",
    "content": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\r\n\r\n@import \"../../bootstrap/less/bootstrap\";\r\n@import \"../../bootstrap/less/responsive\";\r\n\r\n@import \"../components/navbar\";\r\n@import \"../components/userpanel\";\r\n\r\n@import \"../vendor/prettify\";\r\n\r\nbody {\r\n  height: 100%;\r\n}\r\n\r\n#container {\r\n  padding-top: 50px;\r\n}\r\n\r\n@media (max-width: 979px) {\r\n  #container {\r\n    padding-top: 0;\r\n  }\r\n  .navbar-fixed-top .navbar-inner {\r\n    padding: 0;\r\n    position: relative;\r\n    z-index: 5;\r\n  }\r\n}\r\n\r\n#pages .page {\r\n  display: none;\r\n}\r\n\r\n#pages.preview .page.preview {\r\n  display: block;\r\n}\r\n\r\n#pages.code .page.code {\r\n  display: block;\r\n}\r\n\r\n\r\n#preview {\r\n  position: absolute;\r\n  top: 0px;\r\n  left: 0; right: 0; bottom: 0;\r\n  padding-top: 40px;\r\n  overflow: hidden;\r\n}\r\n#preview-frame {\r\n  width: 100%;\r\n  margin: 0; padding: 0;\r\n  border: 0;\r\n  height: 100%;\r\n}"
  },
  {
    "path": "servers/www/assets/css/vendor/jquery-layout.less",
    "content": "/*\r\n * Default Layout Theme\r\n *\r\n * Created for jquery.layout \r\n *\r\n * Copyright (c) 2010 \r\n *   Fabrizio Balliano (http://www.fabrizioballiano.net)\r\n *   Kevin Dalman (http://allpro.net)\r\n *\r\n * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)\r\n * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.\r\n *\r\n * Last Updated: 2010-02-10\r\n * NOTE: For best code readability, view this with a fixed-space font and tabs equal to 4-chars\r\n */\r\n\r\n\r\n/*\r\n *\tPANES & CONTENT-DIVs\r\n */\r\n.ui-layout-pane { /* all 'panes' */\r\n\tbackground:\t#FFF; \r\n\tborder:\t\t1px solid #BBB;\r\n\tpadding:\t0; \r\n\toverflow:\tauto;\r\n\t/* DO NOT add scrolling (or padding) to 'panes' that have a content-div,\r\n\t   otherwise you may get double-scrollbars - on the pane AND on the content-div\r\n\t   - use ui-layout-wrapper class if pane has a content-div\r\n\t   - use ui-layout-container if pane has an inner-layout\r\n\t*/\r\n\t}\r\n\t/* (scrolling) content-div inside pane allows for fixed header(s) and/or footer(s) */\r\n\t.ui-layout-content {\r\n\t\tpadding:\t10px;\r\n\t\tposition:\trelative; /* contain floated or positioned elements */\r\n\t\toverflow:\tauto; /* add scrolling to content-div */\r\n\t}\r\n\r\n/*\r\n *\tUTILITY CLASSES\r\n *\tMust come AFTER pane-class above so will override\r\n *\tThese classes are NOT auto-generated and are NOT used by Layout\r\n */\r\n.layout-child-container,\r\n.layout-content-container {\r\n\tpadding:\t0;\r\n\toverflow:\thidden;\r\n}\r\n.layout-child-container {\r\n\tborder:\t\t0; /* remove border because inner-layout-panes probably have borders */\r\n}\r\n.layout-scroll {\r\n\toverflow:\tauto;\r\n}\r\n.layout-hide {\r\n\tdisplay:\tnone;\r\n}\r\n\r\n/*\r\n *\tRESIZER-BARS\r\n */\r\n.ui-layout-resizer\t{ /* all 'resizer-bars' */\r\n\tbackground:\t\t#9B9B9B;\r\n\tborder:\t\t\t1px solid #BBB;\r\n\tborder-width:\t0;\r\n\t}\r\n\t.ui-layout-resizer-drag {\t\t/* REAL resizer while resize in progress */\r\n\t}\r\n\t.ui-layout-resizer-hover\t{\t/* affects both open and closed states */\r\n\t}\r\n\t/* NOTE: It looks best when 'hover' and 'dragging' are set to the same color,\r\n\t\totherwise color shifts while dragging when bar can't keep up with mouse */\r\n\t.ui-layout-resizer-open-hover ,\t/* hover-color to 'resize' */\r\n\t.ui-layout-resizer-dragging {\t/* resizer beging 'dragging' */\r\n\t\tbackground: #C4E1A4;\r\n\t}\r\n\t.ui-layout-resizer-dragging {\t/* CLONED resizer being dragged */\r\n\t\tborder: \t 1px solid #BBB;\r\n\t}\r\n\t/* NOTE: Add a 'dragging-limit' color to provide visual feedback when resizer hits min/max size limits */\r\n\t.ui-layout-resizer-dragging-limit {\t/* CLONED resizer at min or max size-limit */\r\n\t\tbackground: #E1A4A4; /* red */\r\n\t}\r\n\r\n\t.ui-layout-resizer-closed-hover\t{ /* hover-color to 'slide open' */\r\n\t\tbackground: #EBD5AA;\r\n\t}\r\n\t.ui-layout-resizer-sliding {\t/* resizer when pane is 'slid open' */\r\n\t\topacity: .10; /* show only a slight shadow */\r\n\t\tfilter:  alpha(opacity=10);\r\n\t\t}\r\n\t\t.ui-layout-resizer-sliding-hover {\t/* sliding resizer - hover */\r\n\t\t\topacity: 1.00; /* on-hover, show the resizer-bar normally */\r\n\t\t\tfilter:  alpha(opacity=100);\r\n\t\t}\r\n\t\t/* sliding resizer - add 'outside-border' to resizer on-hover \r\n\t\t * this sample illustrates how to target specific panes and states */\r\n\t\t.ui-layout-resizer-north-sliding-hover\t{ border-bottom-width:\t1px; }\r\n\t\t.ui-layout-resizer-south-sliding-hover\t{ border-top-width:\t\t1px; }\r\n\t\t.ui-layout-resizer-west-sliding-hover\t{ border-right-width:\t1px; }\r\n\t\t.ui-layout-resizer-east-sliding-hover\t{ border-left-width:\t1px; }\r\n\r\n/*\r\n *\tTOGGLER-BUTTONS\r\n */\r\n.ui-layout-toggler {\r\n\tborder: 1px solid #BBB; /* match pane-border */\r\n\tbackground-color: #BBB;\r\n\t}\r\n\t.ui-layout-resizer-hover .ui-layout-toggler {\r\n\t\topacity: .60;\r\n\t\tfilter:  alpha(opacity=60);\r\n\t}\r\n\t.ui-layout-toggler-hover , /* need when NOT resizable */\r\n\t.ui-layout-resizer-hover .ui-layout-toggler-hover { /* need specificity when IS resizable */\r\n\t\tbackground-color: #FC6;\r\n\t\topacity: 1.00;\r\n\t\tfilter:  alpha(opacity=100);\r\n\t}\r\n\t.ui-layout-toggler-north ,\r\n\t.ui-layout-toggler-south {\r\n\t\tborder-width: 0 1px; /* left/right borders */\r\n\t}\r\n\t.ui-layout-toggler-west ,\r\n\t.ui-layout-toggler-east {\r\n\t\tborder-width: 1px 0; /* top/bottom borders */\r\n\t}\r\n\t/* hide the toggler-button when the pane is 'slid open' */\r\n\t.ui-layout-resizer-sliding  .ui-layout-toggler {\r\n\t\tdisplay: none;\r\n\t}\r\n\t/*\r\n\t *\tstyle the text we put INSIDE the togglers\r\n\t */\r\n\t.ui-layout-toggler .content {\r\n\t\tcolor:\t\t\t#666;\r\n\t\tfont-size:\t\t12px;\r\n\t\tfont-weight:\tbold;\r\n\t\twidth:\t\t\t100%;\r\n\t\tpadding-bottom:\t0.35ex; /* to 'vertically center' text inside text-span */\r\n\t}\r\n\r\n/*\r\n *\tPANE-MASKS\r\n *\tthese styles are hard-coded on mask elems, but are also \r\n *\tincluded here as !important to ensure will overrides any generic styles\r\n */\r\n.ui-layout-mask {\r\n\tborder:\t\tnone !important;\r\n\tpadding:\t0 !important;\r\n\tmargin:\t\t0 !important;\r\n\toverflow:\thidden !important;\r\n\tposition:\tabsolute !important;\r\n\topacity:\t0 !important;\r\n}\r\n.ui-layout-mask-inside-pane { /* masks always inside pane EXCEPT when pane is an iframe */\r\n\ttop:\t\t0 !important;\r\n\tleft:\t\t0 !important;\r\n\twidth:\t\t100% !important;\r\n\theight:\t\t100% !important;\r\n}\r\ndiv.ui-layout-mask {}\t\t/* standard mask for iframes */\r\niframe.ui-layout-mask {}\t/* extra mask for objects/applets */\r\n"
  },
  {
    "path": "servers/www/assets/css/vendor/prettify.less",
    "content": ".com { color: #93a1a1; }\r\n.lit { color: #195f91; }\r\n.pun, .opn, .clo { color: #93a1a1; }\r\n.fun { color: #dc322f; }\r\n.str, .atv { color: #D14; }\r\n.kwd, .linenums .tag { color: #1e347b; }\r\n.typ, .atn, .dec, .var { color: teal; }\r\n.pln { color: #48484c; }\r\n\r\n.prettyprint {\r\n  padding: 8px;\r\n  background-color: #f7f7f9;\r\n  border: 1px solid #e1e1e8;\r\n}\r\n.prettyprint.linenums {\r\n  -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\r\n     -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\r\n          box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\r\n}\r\n\r\n/* Specify class=linenums on a pre to get line numbering */\r\nol.linenums {\r\n  margin: 0 0 0 33px; /* IE indents via margin-left */\r\n} \r\nol.linenums li {\r\n  padding-left: 12px;\r\n  color: #bebec5;\r\n  line-height: 18px;\r\n  text-shadow: 0 1px 0 #fff;\r\n}"
  },
  {
    "path": "servers/www/assets/js/directives/ace.coffee",
    "content": "#= require ../services/modes\r\n\r\nEditSession = require(\"ace/edit_session\").EditSession\r\nUndoManager = require(\"ace/undomanager\").UndoManager\r\n\r\n\r\nmodule = angular.module(\"plunker.ace\", [\"plunker.modes\"])\r\n\r\nmodule.directive \"plunkerSession\", [\"$rootScope\", \"$timeout\", \"modes\", ($rootScope, $timeout, modes) ->\r\n  restrict: \"E\"\r\n  require: \"?ngModel\"\r\n  template: \"\"\"\r\n    <div style=\"display: none\" ng-model=\"buffer.content\"></div>\r\n  \"\"\"\r\n  replace: true\r\n  link: ($scope, el, attrs, ngModel) ->\r\n    buffer = $scope.buffer\r\n    \r\n    session = new EditSession(buffer.content or \"\")\r\n    session.setTabSize(2)\r\n    session.setUseSoftTabs(true)\r\n    session.setUndoManager(new UndoManager())\r\n    session.setMode(mode.source) if mode = modes.findByFilename(buffer.filename)\r\n    \r\n    ngModel.$render = ->\r\n      session.setValue(ngModel.$viewValue or \"\")\r\n    \r\n    read = -> ngModel.$setViewValue(session.getValue())\r\n    session.on 'change', ->\r\n      if $scope.$$phase then read()\r\n      else $scope.$apply(read)\r\n    \r\n    session.on \"changeAnnotation\", -> $scope.$apply ->\r\n      errors = []\r\n      for linenum, notes of session.getAnnotations()\r\n        for note in notes\r\n          if note.lint then errors.push\r\n            message: note.text\r\n            evidence: note.lint.evidence\r\n            col: note.column\r\n            line: note.row\r\n            type: note.type\r\n          else errors.push\r\n            message: note.text\r\n            col: note.column\r\n            line: note.row\r\n            type: note.type\r\n      \r\n      buffer.annotations = errors\r\n    \r\n    read()\r\n    \r\n    $scope.buffer.session = session\r\n    \r\n    $scope.$on \"$destroy\", ->\r\n      $timeout -> $rootScope.$broadcast \"buffer:remove\", $scope.buffer\r\n    \r\n    $scope.$watch \"buffer.content\", (content, old_content) ->\r\n      $rootScope.$broadcast \"buffer:change:content\", $scope.buffer, content, old_content\r\n    \r\n    $scope.$watch \"buffer.filename\", (filename, old_filename) ->\r\n      session.setMode(mode.source) if mode = modes.findByFilename(buffer.filename)\r\n      $rootScope.$broadcast \"buffer:change:filename\", $scope.buffer, filename, old_filename\r\n    \r\n    $scope.$watch \"scratch.buffers.active()\", (active) ->\r\n      if active == buffer\r\n        $scope.ace.setSession(session)\r\n        $scope.ace.focus()\r\n    \r\n    $rootScope.$broadcast \"buffer:add\", $scope.buffer\r\n] \r\n\r\nmodule.directive \"plunkerAce\", [\"$rootScope\", \"modes\", \"scratch\", ($rootScope, modes, scratch) ->\r\n  restrict: \"E\"\r\n  template: \"\"\"\r\n    <div class=\"editor-canvas\">\r\n      <plunker-session ng-repeat=\"buffer in scratch.buffers.queue\"></plunker-session>\r\n    </div>\r\n  \"\"\"\r\n  replace: true\r\n  link: ($scope, el, attrs, ngModel) ->\r\n    $scope.ace = ace.edit(el[0])\r\n  \r\n    $scope.ace.commands.addCommand\r\n      name: \"saveFile\"\r\n      bindKey:\r\n        win: \"Ctrl-S\"\r\n        mac: \"Command-S\"\r\n      exec: (editor) -> scratch.save()\r\n    \r\n    $rootScope.$on \"layout:resize\", ->\r\n      $scope.ace.resize()\r\n]"
  },
  {
    "path": "servers/www/assets/js/directives/builder.coffee",
    "content": "#= require ../../select2/select2\r\n\r\n#= require ../vendor/underscore\r\n#= require ../vendor/semver\r\n#= require ../vendor/beautify\r\n\r\n#= require ../services/catalogue\r\n\r\nmodule = angular.module(\"plunker.builder\", [\"plunker.catalogue\"])\r\n\r\nmodule.service \"builder\", [ \"catalogue\", (catalogue) ->\r\n  new class Builder\r\n    constructor: ->\r\n      @reset()\r\n    \r\n    reset: ->\r\n      @catalogue = catalogue\r\n      @packages = [] # Ordered list of all packages\r\n      @names = []\r\n      @dependencies = {} # Mapping of selected packages to their resolved dependencies\r\n      @after = {} # After constraints\r\n    \r\n    getUnusedCatalogueItems: ->\r\n      unused = []\r\n      \r\n      for name, pkg of catalogue.catalogue\r\n        if @names.indexOf(name) < 0\r\n          add = catalogue.getBestMatch(name)\r\n          add.versions = pkg.versions\r\n          unused.push add\r\n          \r\n      unused\r\n    \r\n    addDependencies: (lib, index, parent) ->\r\n      @dependencies[parent] ||= []\r\n      \r\n      if lib.dependencies\r\n        for depName, depVersion of lib.dependencies\r\n          dep = catalogue.getBestMatch(\"#{depName}@#{depVersion}\")\r\n          \r\n          @addLib(dep, index, parent)\r\n          \r\n          index++ if index\r\n          \r\n          @dependencies[parent].push dep\r\n      \r\n      index\r\n    \r\n    removeLib: (lib) ->\r\n      throw new Error(\"Cannot remove lib not added: #{lib}\") unless @dependencies[lib]\r\n      \r\n      for dep in @dependencies[lib]\r\n        idx = @packages.indexOf(dep)\r\n        \r\n        @packages.splice(idx, 1)\r\n      \r\n      lib = catalogue.getBestMatch(lib) if _.isString(lib)\r\n\r\n    \r\n    addLib: (lib, index, parent) ->\r\n      lib = catalogue.getBestMatch(lib) if angular.isString(lib)\r\n      \r\n      return if @names.indexOf(lib.name) >= 0\r\n      \r\n      throw new Error(\"Invalid lib\") unless lib\r\n      \r\n      if lib.after\r\n        (@after[after] ||= []).push lib for after in lib.after\r\n      \r\n      if after = @after[lib.name]\r\n        index = @packages.length\r\n        for other in after\r\n          index = Math.min(index, @packages.indexOf(other))\r\n      \r\n      index = @addDependencies(lib, index, parent or lib.name)\r\n      \r\n      if index? then @packages.splice(index, 0, lib)\r\n      else @packages.push(lib)\r\n      \r\n      @names.push(lib.name)\r\n    \r\n    applyTransformation: (doc, selector, method, args...) ->\r\n      switch method\r\n        when \"append\"\r\n          if selector is \"head\"\r\n            ih = doc.head\r\n            for tag in args\r\n              ih.innerHTML += tag unless ih.innerHTML.indexOf(tag) >= 0\r\n          else  \r\n            $(selector, doc).append(args...)\r\n        when \"attr\" then $(selector, doc).attr(args...)\r\n    \r\n    build: (json = {}) ->\r\n      json.description ||= \"Custom Plunk\"\r\n      json.tags ||= []\r\n      json.files ||= {}\r\n      \r\n      content = \"\"\"\r\n        <!DOCTYPE html>\r\n        <html>\r\n        \r\n          <head lang=\"en\">\r\n            <meta charset=\"utf-8\">\r\n            <title>Custom Plunker</title>\r\n          </head>\r\n          \r\n          <body></body>\r\n          \r\n        </html>\r\n      \"\"\".replace(/\\n\\s+/gm, \"\")\r\n      \r\n      if index = json.files[\"index.html\"]\r\n        content = index.content\r\n      \r\n      doc = window.document.implementation.createHTMLDocument(\"\")\r\n      doc.open()\r\n      doc.write(content)\r\n      doc.close()\r\n      \r\n      for lib in @packages\r\n        json.tags = json.tags.concat(lib.tags)\r\n        \r\n        for transform in lib.transform\r\n          @applyTransformation(doc, transform...)\r\n        \r\n        angular.extend json.files, lib.files\r\n      \r\n      serializer = new XMLSerializer()\r\n      html = serializer.serializeToString(doc)\r\n\r\n      json.tags = _.uniq(json.tags)\r\n\r\n      json.files[\"index.html\"] =\r\n        filename: \"index.html\"\r\n        content: style_html(html, {\r\n          'indent_size': 2\r\n          'indent_char': ' '\r\n          'max_char': 78\r\n          'brace_style': 'expand'\r\n        })\r\n      \r\n      json\r\n    \r\n]\r\n\r\nmodule.directive \"plunkerBuilder\", [\"$timeout\", \"builder\", ($timeout, builder) ->\r\n  restrict: \"E\"\r\n  replace: true\r\n  scope: {}\r\n  template: \"\"\"\r\n    <input type=\"text\" style=\"width: 100%\" value=\"\" />\r\n  \"\"\"\r\n  link: ($scope, $el, attrs) ->\r\n    format = (state) ->\r\n      return state.text unless state.id\r\n      \r\n      state.text\r\n      \r\n    $scope.$parent.resetBar = ->\r\n      $select.select2(\"val\", \"\")\r\n    \r\n    $select = $el.select2\r\n      width: \"100%\"\r\n      minimumInputLength: 0\r\n      multiple: true\r\n      formatResult: format\r\n      formatSelection: format\r\n      placeholder: \"Click to add packages...\"\r\n      allowClear: true\r\n      query: (options) ->\r\n        results = {}\r\n        ret = []\r\n        \r\n        search = options.term.split(\"@\")\r\n        query = search.shift()\r\n        version = query[0] if search.length\r\n        \r\n        for pkg in builder.getUnusedCatalogueItems()\r\n          if options.matcher(query, pkg.name) or options.matcher(query, pkg.keywords.join(\" \"))\r\n            results[pkg.category] ||=\r\n              text: pkg.category\r\n              children: []\r\n            \r\n            if search.length\r\n              for tag, def of pkg.versions\r\n                if options.matcher(options.term, def.id)\r\n                  results[pkg.category].children.push\r\n                    text: def.id\r\n                    id: def.id\r\n                    pkg: def\r\n            else  \r\n              results[pkg.category].children.push\r\n                text: pkg.name\r\n                id: pkg.id\r\n                pkg: pkg\r\n              \r\n        for category, result of results\r\n          ret.push(result)\r\n        \r\n        options.callback(results: ret)\r\n    \r\n    $select.on \"change\", (e) -> $scope.$apply ->\r\n      builder.reset()\r\n      \r\n      for item in e.val\r\n        builder.addLib(item)\r\n\r\n]"
  },
  {
    "path": "servers/www/assets/js/directives/card.coffee",
    "content": "#= require ../vendor/jquery.timeago\r\n#= require ../vendor/jquery.lazyload\r\n\r\n#= require ../services/plunks\r\n\r\nmodule = angular.module(\"plunker.card\", [\"plunker.plunks\"])\r\n\r\nmodule.filter \"toHumanReadable\", ->\r\n  (value) -> value.toString() if value\r\n\r\nmodule.directive \"card\", [\"$timeout\", \"session\", ($timeout, session) ->\r\n  restrict: \"E\"\r\n  replace: true\r\n  scope:\r\n    model: \"=model\"\r\n  template: \"\"\"\r\n    <li class=\"span3 card\">\r\n      <div class=\"card thumbnail\">\r\n        <h5 class=\"description\" title=\"{{model.description}}\">\r\n          <a ng-href=\"{{model.getEditUrl()}}\">\r\n            {{model.description}}\r\n          </a>\r\n        </h5>\r\n        <div class=\"preview\">\r\n          <a class=\"preview\" ng-click=\"showPreview()\" ng-href=\"{{model.getHtmlUrl()}}\">\r\n            <img class=\"preview lazyload\" ng-src=\"http://www.placehold.it/205x154&text=Loading...\" data-original=\"http://immediatenet.com/t/l3?Size=1024x768&URL={{model.raw_url}}?_={{model.updated_at}}\" />\r\n          </a>\r\n          <div class=\"hover\">\r\n            <ul class=\"tags\">\r\n              <li ng-repeat=\"tag in model.tags\">\r\n                <a ng-href=\"/tags/{{tag}}\">{{tag}}</a>\r\n              </li>\r\n            </ul>\r\n          </div>\r\n        </div>\r\n        <ul class=\"meta\">\r\n          <li class=\"edit\">\r\n            <a ng-href=\"{{model.getEditUrl()}}\" title=\"Edit this plunk\">\r\n              <i class=\"icon-edit\" />\r\n              <span class=\"live-editors\">{{editors}}</span>\r\n            </a>\r\n          </li>\r\n          <li class=\"comments\">\r\n            <a ng-href=\"{{model.getEditUrl()}}?p=comments\" title=\"Join the discussion\">\r\n              <i class=\"icon-comments\" />\r\n              <span class=\"live-comments\">{{comments}}</span>\r\n            </a>\r\n          </li>\r\n          <li class=\"votes\" ng-switch ng-class=\"{thumbed: model.thumbed}\" on=\"model.thumbed\">\r\n            <a ng-show=\"session.user\" ng-switch-when=\"true\" ng-click=\"model.removeThumbsUp()\" ng-href=\"javascript:void(0)\" title=\"Remove your thumbs-up from this plunk.\">\r\n              <i class=\"icon-thumbs-up\" />\r\n              <span class=\"thumbs-up\">{{model.thumbs || 0 | number}}</span>\r\n            </a>\r\n            <a ng-show=\"session.user\" ng-switch-when=\"false\" ng-click=\"model.addThumbsUp()\" ng-href=\"javascript:void(0)\" title=\"Give a thumbs-up to this plunk.\">\r\n              <i class=\"icon-thumbs-up\" />\r\n              <span class=\"thumbs-up\">{{model.thumbs || 0 | number}}</span>\r\n            </a>\r\n            <span ng-hide=\"session.user\" title=\"{{model.thumbs || 0 | number}} users have given a thumbs-up to this plunk.\">\r\n              <i class=\"icon-thumbs-up\" />\r\n              <span class=\"thumbs-up\">{{model.thumbs || 0 | number}}</span>\r\n            </span>\r\n          </li>\r\n        </ul>\r\n        <ul class=\"extras\">\r\n          <li ng-show=\"model.token\">\r\n            <a ng-href=\"{{model.getEditUrl()}}\" title=\"You created this Plunk. Click here to edit it.\">\r\n              <i class=\"icon-unlock\"></i>\r\n            </a>\r\n          </li>\r\n          <li ng-show=\"model.source\">\r\n            <a ng-href=\"{{model.source.url}}\" title=\"This plunk was imported. Click here to go to its source\" target=\"_blank\">\r\n              <i class=\"icon-link\" />\r\n            </a>\r\n          </li>\r\n          <li ng-show=\"model.thumbed && session.user\">\r\n            <a ng-href=\"/users/{{session.user.login}}/thumbed\" title=\"You have given a thumbs-up to this plunk. Click here to see all your thumbed plunks.\">\r\n              <i class=\"icon-heart\" />\r\n            </a>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n      <div class=\"user\">\r\n        <a ng-href=\"/users/{{model.user.login}}\" ng-show=\"model.user\">\r\n          <img class=\"gravatar\" ng-src=\"http://www.gravatar.com/avatar/{{model.user.gravatar_id}}?s=18&d=mm\" />\r\n          {{model.user.login}}\r\n        </a>\r\n\r\n        <span ng-hide=\"model.user\">\r\n          <img class=\"gravatar\" ng-src=\"http://www.gravatar.com/avatar/0?s=18&d=mm\" />\r\n          Anonymous\r\n        </span>\r\n        <abbr class=\"timeago created_at\" title=\"{{model.updated_at}}\">{{model.updated_at}}</abbr>\r\n      </div>\r\n    </li>\r\n  \"\"\"\r\n  link: ($scope, $el, attrs) ->\r\n    $scope.viewers = 0\r\n    $scope.editors = 0\r\n    $scope.comments = 0\r\n    \r\n    $scope.session = session\r\n    \r\n    $scope.addThumbsUp = (plunk) ->\r\n      \r\n    \r\n    $scope.$watch \"model.updated_at\", (updated_at) -> $(\".timeago\", $el).timeago() if updated_at\r\n    $scope.$watch \"model.raw_url\", (raw_url) -> $(\".lazyload\", $el).lazyload() if raw_url\r\n    \r\n    $scope.$watch 'model', (model) ->\r\n      if model\r\n        count_keys = (obj) ->\r\n          count = 0\r\n          count++ for key of obj\r\n          count\r\n        \r\n        plunkRef = new Firebase(\"https://filearts.firebaseio.com/#{model.id}\")\r\n        \r\n        viewersRef = plunkRef.child(\"viewers\")\r\n        viewersRef.on \"child_added\", (snapshot) -> $timeout -> $scope.viewers += 1\r\n        viewersRef.on \"child_removed\", (snapshot) -> $timeout -> $scope.viewers -= 1\r\n        \r\n        editorsRef = plunkRef.child(\"editors\")\r\n        editorsRef.on \"child_added\", (snapshot) -> $timeout -> $scope.editors += 1\r\n        editorsRef.on \"child_removed\", (snapshot) -> $timeout -> $scope.editors -= 1\r\n\r\n        messagesRef = plunkRef.child(\"messages\")\r\n        messagesRef.on \"child_added\", (snapshot) -> $timeout -> $scope.comments += 1\r\n\r\n]"
  },
  {
    "path": "servers/www/assets/js/directives/chat.coffee",
    "content": "#= require ../services/session\r\n\r\nmodule = angular.module(\"plunker.chat\", [])\r\n\r\nmodule.directive \"plunkerChat\", [\"$timeout\", \"session\", ($timeout, session) ->\r\n  restrict: \"A\"\r\n  link: ($scope, el, attrs) ->\r\n    #pane = $scope.panes[4]\r\n    ownStatusRef = null\r\n    editorsRef = null\r\n    \r\n    $scope.viewers = {}\r\n    \r\n    updateOwnStatus = ->\r\n      if ownStatusRef\r\n        ownStatusRef.set session.user or\r\n          login: \"Anonymous\"\r\n          gravatar_id: \"0\"\r\n    \r\n    createOwnStatusRef = ->\r\n      if editorsRef\r\n        ownStatusRef.remove() if ownStatusRef\r\n        ownStatusRef = editorsRef.child(session.public_id)\r\n        ownStatusRef.removeOnDisconnect()\r\n\r\n        updateOwnStatus()\r\n    \r\n    $scope.$watch \"session.public_id\", (public_id) -> createOwnStatusRef()\r\n    $scope.$watch \"session.user\", (user) -> updateOwnStatus()\r\n      \r\n    \r\n    $scope.$watch \"plunk.id\", (id, old_id) ->\r\n      id ||= $scope.plunk.source?.title or \"empty_plunk\"\r\n            \r\n      if (id isnt old_id) and ownStatusRef\r\n        ownStatusRef.remove()\r\n\r\n      if id\r\n        editorsRef = new Firebase(\"http://filearts.firebaseio.com/#{id}/editors/\")\r\n        editorsRef.on \"value\", (snapshot) ->\r\n          if val = snapshot.val() then $timeout ->\r\n            $scope.viewers = val\r\n        editorsRef.on \"child_added\", (snapshot) ->\r\n          if val = snapshot.val() and public_id = snapshot.name() then $timeout ->\r\n            $scope.viewers[public_id] = val\r\n        editorsRef.on \"child_removed\", (snapshot) ->\r\n          if public_id = snapshot.name() then $timeout ->\r\n            delete $scope.viewers[public_id]\r\n        \r\n        createOwnStatusRef()\r\n]"
  },
  {
    "path": "servers/www/assets/js/directives/discussion.coffee",
    "content": "#= require ../vendor/angular-ui\r\n#= require ../vendor/showdown\r\n#= require ../vendor/prettify\r\n#= require ../vendor/jquery.timeago\r\n#= require ../vendor/jquery.cookie\r\n\r\n#= require ../services/panels\r\n#= require ../services/session\r\n#= require ../services/scratch\r\n\r\ngenid = (len = 16, prefix = \"\", keyspace = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") ->\r\n  prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0\r\n  prefix\r\n\r\n\r\nmodule = angular.module(\"plunker.discussion\", [])\r\n\r\nmodule.requires.push(\"ngSanitize\")\r\nmodule.requires.push(\"ui.directives\")\r\n\r\nmodule.filter \"iso8601\", ->\r\n  (value) -> (new Date(value)).toISOString()\r\n  \r\nmodule.filter \"markdown\", ->\r\n  converter = new Showdown.converter()\r\n  (value) -> converter.makeHtml(value)\r\n\r\n\r\nmodule.directive \"chatMessage\", [\"$timeout\", ($timeout) ->\r\n  restrict: \"E\"\r\n  replace: true\r\n  template: \"\"\"\r\n    <li class=\"message\">\r\n      <div class=\"body\" ng-bind-html=\"message.body | markdown\"></div>\r\n      <div class=\"meta\">\r\n        <a href=\"javascript:void(0)\" ng-click=\"targetMessage(message.user)\" title=\"{{message.user.name}}\">\r\n          <img class=\"gravatar\" ng-src=\"http://www.gravatar.com/avatar/{{message.user.gravatar_id}}?s=18&d=mm\" />\r\n          <span class=\"username\" ng-class=\"{existing: message.user.type == 'registered'}\">{{message.user.name}}</span>\r\n        </a>\r\n        <abbr class=\"timeago posted_at\" title=\"{{message.posted_at | iso8601}}\">{{message.posted_at | date:'MM/dd/yyyy @ h:mma'}}</abbr>\r\n      </div>\r\n    </li>\r\n  \"\"\"\r\n  link: ($scope, $el, attrs) ->\r\n    converter = new Showdown.converter()\r\n    \r\n    $timeout ->\r\n      $(\".timeago\", $el).timeago()\r\n      prettyPrint()\r\n    \r\n    $scope.$watch \"message.body\", (body) ->\r\n      $scope.markdown = converter.makeHtml(body)\r\n]\r\n\r\nmodule.directive \"plunkerDiscussion\", [ \"$timeout\", \"$location\", \"panels\", \"session\", \"scratch\", ($timeout, $location, panels, session, scratch) ->\r\n  restrict: \"E\"\r\n  replace: true\r\n  scope:\r\n    room: \"=\"\r\n  template: \"\"\"\r\n    <div class=\"plunker-discussion\">\r\n      <ul class=\"thumbnails\">\r\n        <li class=\"user\" ng-repeat=\"(public_id, user) in users\">\r\n          <a href=\"javascript:void(0)\" ng-click=\"targetMessage(user)\" class=\"thumbnail\" title=\"{{user.name}}\">\r\n            <img ng-src=\"http://www.gravatar.com/avatar/{{user.gravatar_id}}?s=32&d=mm\" />\r\n            <span class=\"username\" title=\"{{user.name}}\">{{user.name}}</span>\r\n          </a>\r\n        </li>\r\n      </ul>\r\n      <form ng-submit=\"postChatMessage()\">\r\n        <label>Discussion:</label>\r\n        <textarea ui-keypress=\"{'ctrl-enter':'postChatMessage()'}\" id=\"comments-message\" type=\"text\" placeholder=\"Enter message...\" class=\"span4\" ng-model=\"message\"></textarea>\r\n        <span class=\"help-block\">Comments are markdown formatted.</span>\r\n        <button class=\"btn btn-primary\" ng-click=\"postChatMessage()\">Comment</button>\r\n      </form>\r\n      <ul class=\"chat-messages\">\r\n        <chat-message message=\"message\" ng-repeat=\"message in messages | orderBy:'posted_at':true\"></chat-message>\r\n      </ul>\r\n    </div>\r\n  \"\"\"\r\n        \r\n  link: ($scope, el, attrs) ->\r\n    self = @\r\n    \r\n    roomRef = null\r\n    chatRef = null\r\n    usersRef = null\r\n    presenceRef = null\r\n    \r\n    handlePresenceValue = (snapshot) ->\r\n      if snapshot.val() is null then setOwnPresence(presenceRef)\r\n    \r\n    handleUsersValue = (snapshot) ->\r\n      if (users = snapshot.val()) isnt null then $scope.$apply ->\r\n        angular.copy(users, $scope.users)\r\n\r\n    handleChatAdded = (snapshot) -> $timeout ->\r\n      $scope.messages.push(snapshot.val())\r\n      \r\n      $scope.$emit \"discussion.message\", snapshot.val()\r\n\r\n    $scope.message = \"\"\r\n    $scope.messages = []\r\n    $scope.users = {}\r\n\r\n    $scope.$watch ( -> session.user), (user) ->\r\n      $scope.user = do ->\r\n        if user \r\n          type: \"registered\"\r\n          name: user.login\r\n          pubId: session.public_id\r\n          gravatar_id: user.gravatar_id\r\n        else\r\n          type: \"anonymous\"\r\n          name: $.cookie(\"plnk_anonName\") or do ->\r\n            $.cookie \"plnk_anonName\", prompt(\"You are not logged in. Please provide a name for streaming:\", genid(5, \"Anon-\")) or genid(5, \"Anon-\")\r\n            $.cookie \"plnk_anonName\"\r\n          pubId: session.public_id\r\n          gravatar_id: 0\r\n          \r\n    $scope.$watch \"user\", (user) ->\r\n      setOwnPresence(presenceRef) if presenceRef\r\n    \r\n\r\n    $scope.$watch \"room\", (room) ->\r\n      # Reset messages\r\n      $scope.messages.length = 0\r\n      \r\n      # Remove presenceRef\r\n      if presenceRef\r\n        presenceRef.off \"value\", handlePresenceValue\r\n        usersRef.off \"value\", handleUsersValue\r\n        presenceRef.remove()\r\n      \r\n      roomRef = null\r\n      chatRef = null\r\n      \r\n      return unless room\r\n\r\n      roomRef = new Firebase(\"https://filearts.firebaseio.com/rooms/#{room}/\")\r\n      chatRef = roomRef.child(\"messages\")\r\n      usersRef = roomRef.child(\"users\")\r\n      presenceRef = usersRef.child(session.public_id)\r\n      \r\n      setOwnPresence(presenceRef)\r\n        \r\n      chatRef.limit(50).on \"child_added\", handleChatAdded\r\n      \r\n      presenceRef.on \"value\", handlePresenceValue\r\n      usersRef.on \"value\", handleUsersValue\r\n\r\n    setOwnPresence = (presenceRef) -> $timeout ->\r\n      presenceRef.removeOnDisconnect()\r\n      presenceRef.set($scope.user)\r\n    \r\n    $scope.postChatMessage = ->\r\n      if chatRef and $scope.message\r\n        message =\r\n          body: $scope.message\r\n          posted_at: +new Date\r\n          user: $scope.user\r\n        \r\n        chatRef.push(message)\r\n        \r\n        $scope.message = \"\"\r\n    \r\n    $scope.targetMessage = (user) ->\r\n      unless $scope.message then $scope.message = \"@#{user.name} \"\r\n      \r\n      $(\"#comments-message\").focus()\r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/directives/layout.coffee",
    "content": "#= require ../vendor/jquery.ui.custom\n#= require ../vendor/jquery.layout\n\n#= require_tree ../services/panes\n#= require ../services/panels\n\nmodule = angular.module(\"plunker.layout\", [\"plunker.panels\"])\n\nmodule.directive \"plunkerLayout\", [\"$rootScope\", \"$location\", \"$timeout\", \"panels\", ($rootScope, $location, $timeout, panels) ->\n  restrict: \"A\"\n  link: ($scope, el, attrs) ->\n        \n    $scope.panels = panels\n\n    $scope.layout = layout = $(el).layout\n      defaults:\n        spacing_open: 4\n        spacing_closed: 8\n      center: # Editor / Multipane\n        minSize: 100\n        childOptions:\n          maskContents: true\n          east: # Multipane\n            spacing_open: 4\n            spacing_closed: 0\n            size: \"50%\"\n            onclose: ->\n              if angularClose then panels.active = null\n              else $scope.$apply -> panels.active = null\n            onresize: (pane, $el, state) ->\n              panels.active.size = state.size\n          center: # Editor\n            minSize: \"20%\"\n            size: \"50%\"\n\n      east: # Multipane buttons\n        size: 41 # 40px + 1px border\n        closable: false\n        resizable: false\n        spacing_open: 1\n        spacing_closed: 1\n      west: # Sidbar\n        initClosed: false\n        size: 160\n        minSize: 160\n        maxSize: 320\n      onresize: ->\n        $timeout ->\n          $scope.layout.state = layout.state\n          $rootScope.$broadcast \"layout:resize\"\n        , 100\n          \n    innerLayout = layout.center.child\n    innerLayout.resizers.east.mousedown -> innerLayout.showMasks(\"east\")\n    innerLayout.resizers.east.mouseup -> innerLayout.hideMasks(\"east\")\n    \n    $scope.$watch \"layout.center.child.state.east.isClosed\", (closed) ->\n      if closed then $\n    \n    angularClose = false\n    \n    panels.openPanel = (panel) ->\n      search = $location.search()\n      \n      panels.active = panel\n      layout.center.child.sizePane(\"east\", panel.size or \"50%\")\n      layout.center.child.open(\"east\")\n      search.p = panel.name\n        \n      $location.search(search).replace()\n      \n    panels.closePanel = (panel) ->\n      search = $location.search()\n      \n      angularClose = true\n      layout.center.child.close(\"east\")\n      angularClose = false\n      delete panels.active\n      delete search.p\n        \n      $location.search(search).replace()\n    \n    panels.togglePanel = (panel) ->\n      if panels.active == panel then panels.closePanel(panel)\n      else panels.openPanel(panel)\n    \n    $scope.togglePanel = panels.togglePanel\n    \n    $scope.$watch \"panels.active.hidden\", (hidden) ->\n      if hidden\n        panels.reopen = panels.active\n        panels.closePanel(panels.active)\n    \n    $scope.$watch \"panels.reopen.hidden\", (hidden) ->\n      unless hidden\n        panels.openPanel(panels.reopen) if panels.reopen\n        delete panels.reopen\n\n    if active = $location.search().p\n      matched = false\n      for panel in panels\n        if panel.name == active and not panels.active != panel\n          panels.openPanel(panel)\n          matched = true\n          break\n      unless matched\n        search = $location.search()\n        delete search.p\n        $location.search(search).replace()\n    else\n      panels.togglePanel()\n]"
  },
  {
    "path": "servers/www/assets/js/directives/multipanel.coffee",
    "content": "#= require ../services/panels\n#= require_tree ../services/panes\n\nmodule = angular.module(\"plunker.multipanel\", [\"plunker.panels\"])\n\nmodule.directive \"plunkerPanel\", [ \"$compile\", ($compile) ->\n  restrict: \"E\"\n  replace: true\n  template: \"\"\"\n    <div class=\"panel\"></div>\n  \"\"\"\n  link: ($scope, el, attrs) ->\n    child = $compile($scope.panel.template or \"\")($scope)[0]\n    el.append(child)\n\n    $scope.panel.link($scope, child, attrs) if $scope.panel.link\n    \n    $scope.$watch \"panels.active==panel\", (isActive, wasActive) ->\n      #return if isActive == wasActive\n      \n      if isActive then $scope.panel.activate($scope, el, attrs) if $scope.panel.activate\n      else $scope.panel.deactivate($scope, el, attrs) if $scope.panel.deactivate\n\n]\n\nmodule.directive \"plunkerMultipanel\", [ \"$location\", \"panels\", ($location, panels) ->\n  restrict: \"E\"\n  replace: true\n  scope: {}\n  template: \"\"\"\n    <div>\n      <plunker-panel ng-repeat=\"panel in panels\" ng-show=\"panels.active==panel\"></plunker-panel>\n    </div>\n  \"\"\"\n  link: ($scope, el, attrs) ->\n    $scope.panels = panels\n    \n]"
  },
  {
    "path": "servers/www/assets/js/directives/share.coffee",
    "content": "#= require ../services/url\r\n\r\n#= require ../socialbuttons\r\n\r\n\r\nmodule = angular.module(\"plunker.share\", [])\r\n\r\nmodule.directive \"plunkerSharePanel\", [\"$timeout\", \"url\", ($timeout, url) ->\r\n  restrict: \"E\"\r\n  template: \"\"\"\r\n    <div class=\"share-panel\">\r\n      <form>\r\n        <label for=\"share-link\">Share link:</label>\r\n        <div class=\"input-prepend\">\r\n          <span class=\"add-on\">\r\n            <i class=\"icon-link\" />\r\n          </span>\r\n          <input id=\"share-link\" class=\"span4\" type=\"text\" value=\"{{url.www}}{{plunk.getEditUrl()}}\"       />\r\n        </div>\r\n        <label for=\"share-preview\">Share preview:</label>\r\n        <div class=\"input-prepend\">\r\n          <span class=\"add-on\">\r\n            <i class=\"icon-eye-open\" />\r\n          </span>\r\n          <input id=\"share-preview\" class=\"span4\" type=\"text\" value=\"{{url.embed}}/{{plunk.id}}\" />\r\n        </div>\r\n        <label for=\"share-embed\">Embed:</label>\r\n        <div>\r\n          <textarea id=\"share-embed\" class=\"span4\">{{createEmbedSnippet(plunk)}}</textarea>\r\n        </div>\r\n        <hr />\r\n        <div class=\"share-button\">\r\n          <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-text=\"Check out this magic I just put together on Plunker\" data-size=\"medium\" data-hashtags=\"plunker\">Share on Twitter</a>\r\n          <div class=\"g-plus\" data-action=\"share\" data-height=\"20\" data-annotation=\"bubble\"></div>\r\n        </div>\r\n      </form>\r\n    </div>\r\n  \"\"\"\r\n  replace: true\r\n  scope:\r\n    plunk: \"=\"\r\n  link: ($scope, el, attrs) ->\r\n    $scope.url = url\r\n    $scope.createEmbedSnippet = (plunk) ->\r\n      \"\"\"<iframe style=\"width: 100%; height: 300px\" src=\"#{url.embed}/#{plunk.id}\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"></iframe>\"\"\"\r\n      \r\n    $(el).on \"click\", (e) -> e.stopPropagation()\r\n]"
  },
  {
    "path": "servers/www/assets/js/directives/statusbar.coffee",
    "content": "#= require ../services/scratch\r\n\r\nmodule = angular.module(\"plunker.statusbar\", [])\r\n\r\nmodule.directive \"plunkerStatusbar\", [\"scratch\", (scratch) ->\r\n  restrict: \"E\"\r\n  template: \"\"\"\r\n    <div class=\"editor-status\">\r\n      <div class=\"navbar navbar-fixed-bottom navbar-inverse\">\r\n        <div class=\"navbar-inner\">\r\n          <ul class=\"nav\">\r\n            <li class=\"dropdown\"><a href=\"javascript:void(0)\" data-toggle=\"dropdown\" class=\"dropdown-toggle\">{{scratch.buffers.active().filename}}<b class=\"caret\"></b></a>\r\n              <ul id=\"editor-file-list\" class=\"dropdown-menu\">\r\n                <li class=\"file-add\"><a href=\"javascript:void(0)\" ng-click=\"scratch.promptFileAdd()\">Add file...</a></li>\r\n                <li class=\"divider\"></li>\r\n                <li ng-repeat=\"buffer in scratch.buffers.queue | orderBy:'filename'\" ng-class=\"{active:buffer==scratch.buffers.active()}\" class=\"file\">\r\n                  <a href=\"javascript:void(0)\" ng-click=\"scratch.buffers.activate(buffer)\" ng-dblclick=\"scratch.promptFileRename(buffer.filename)\" class=\"buffer\">{{buffer.filename}}</a>\r\n                  <ul class=\"file-ops\">\r\n                    <li class=\"delete\">\r\n                      <button ng-click=\"scratch.promptFileRemove(buffer.filename)\" class=\"btn btn-mini\"><i class=\"icon-remove\"></i></button>\r\n                    </li>\r\n                  </ul>\r\n                </li>\r\n              </ul>\r\n            </li>\r\n            <li class=\"divider-vertical\"></li>\r\n          </ul>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  \"\"\"\r\n  link: ($scope, el, attrs) ->\r\n    $scope.scratch = scratch  \r\n\r\n]"
  },
  {
    "path": "servers/www/assets/js/directives/toolbar.coffee",
    "content": "#= require ../services/scratch\r\n#= require ../services/downloader\r\n\r\n#= require ../directives/share\r\n\r\n\r\nmodule = angular.module(\"plunker.toolbar\", [\"plunker.share\", \"plunker.downloader\"])\r\n\r\nmodule.directive \"plunkerToolbar\", [\"$location\", \"scratch\", \"downloader\", ($location, scratch, downloader) ->\r\n  restrict: \"E\"\r\n  scope: {}\r\n  replace: true\r\n  template: \"\"\"\r\n    <div id=\"toolbar\" class=\"btn-toolbar\">\r\n      <div class=\"btn-group\" ng-show=\"scratch.isOwned()\">\r\n        <button ng-click=\"scratch.save()\" title=\"{{saveTitle}}\" class=\"btn btn-primary\"><i ng-class=\"saveIcon\"></i><span class=\"shrink\"> Save</span></button>\r\n      </div>\r\n      <div class=\"btn-group\" ng-show=\"scratch.isSaved()\">\r\n        <button ng-click=\"scratch.fork()\" title=\"Save your changes as a fork of this Plunk\" class=\"btn\"><i class=\"icon-git-fork\"></i><span class=\"shrink\"> Fork</span></button>\r\n        <button data-toggle=\"dropdown\" class=\"btn dropdown-toggle\"><span class=\"caret\"></span></button>\r\n        <ul class=\"dropdown-menu\" ng-switch on=\"scratch.plunk.private\">\r\n          <li ng-switch-when=\"false\"><a ng-click=\"scratch.fork({private: true})\">Fork to private plunk</a></li>\r\n          <li ng-switch-when=\"true\"><a ng-click=\"scratch.fork({private: false})\">Fork to public plunk</a></li>\r\n        </ul>\r\n      </div>\r\n      <div ng-show=\"scratch.isOwned() && scratch.isSaved()\" class=\"btn-group\">\r\n        <button ng-click=\"scratch.promptDestroy()\" title=\"Delete the current plunk\" class=\"btn btn-danger\"><i class=\"icon-trash\"></i></button>\r\n      </div>\r\n      <div class=\"btn-group\"><a href=\"/edit/\" title=\"Start a new plunk from a blank slate\" class=\"btn btn-success\"><i class=\"icon-file\"></i><span class=\"shrink\"> New</span></a>\r\n        <button data-toggle=\"dropdown\" class=\"btn btn-success dropdown-toggle\"><span class=\"caret\"></span></button>\r\n        <ul class=\"dropdown-menu\">\r\n          <li><a href=\"/edit/gist:1986619\">jQuery<a href=\"/edit/gist:1992850\" class=\"coffee\" title=\"In coffee-script\"><img src=\"/img/coffeescript-logo-small_med.png\"></a></a></li>\r\n          <li><a href=\"/edit/gist:2006604\">jQuery UI</a></li>\r\n          <li class=\"divider\"></li>\r\n          <li class=\"dropdown-submenu\">\r\n            <a tabindex=\"-1\" href=\"#\">AngularJS</a>\r\n            <ul class=\"dropdown-menu\">\r\n              <li><a href=\"/edit/b:starter-angularjs\">1.0.x (stable)<a href=\"/edit/b:starter-angularjs-coffee\" class=\"coffee\" title=\"In coffee-script\"><img src=\"/img/coffeescript-logo-small_med.png\"></a></a></li>\r\n              <li><a href=\"/edit/b:angularjs@1.1.x+starter-angularjs\">1.1.x (unstable)<a href=\"/edit/b:angularjs@1.1.x+starter-angularjs-coffee\" class=\"coffee\" title=\"In coffee-script\"><img src=\"/img/coffeescript-logo-small_med.png\"></a></a></li>\r\n              <li class=\"divider\"></li>\r\n              <li><a href=\"/edit/gist:3743008\">1.0.2 + Jasmine</a></li>\r\n            </ul>\r\n          </li>\r\n          <li class=\"divider\"></li>\r\n          <li><a href=\"/edit/gist:2016721\">Bootstrap<a href=\"/edit/gist:2016721\" class=\"coffee\" title=\"In coffee-script\"><img src=\"/img/coffeescript-logo-small_med.png\"></a></a></li>\r\n          <li class=\"divider\"></li>\r\n          <li><a href=\"/edit/gist:2050713\">Backbone.js<a href=\"/edit/gist:2050746\" class=\"coffee\" title=\"In coffee-script\"><img src=\"/img/coffeescript-logo-small_med.png\"></a></a></li>\r\n          <li class=\"divider\"></li>\r\n          <li><a href=\"/edit/gist:3510115\">YUI</a></li>\r\n          <li class=\"divider\"></li>\r\n          <li>\r\n            <a href=\"javascript:void(0)\" ng-click=\"promptImportGist()\" title=\"Import code from a gist or another plunk\">Import gist...</a>\r\n          </li>\r\n          <li class=\"divider\"></li>\r\n          <li>\r\n            <div ng-click=\"builder.launch()\" title=\"Launch the Plunk builder (coming soon...)\"><i class=\"icon-beaker\"></i>Launch builder...</div>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n      <div class=\"btn-group\">\r\n          <button ng-click=\"triggerDownload()\" class=\"btn\" title=\"Save your work as a zip file\">\r\n            <i class=\"icon-download-alt\" />\r\n          </button>\r\n      </div>\r\n      <div ng-switch on=\"scratch.isSaved()\" class=\"btn-group\">\r\n        <div ng-switch-when=\"true\">\r\n          <button ng-click=\"lazyLoadShareButtons()\" class=\"btn btn-warning dropdown-toggle\" data-toggle=\"dropdown\" title=\"Show off your work.\">\r\n            <i class=\"icon-share\" />\r\n            <span class=\"caret\"></span>\r\n          </button>\r\n          <plunker-share-panel plunk=\"scratch.plunk\" class=\"dropdown-menu\"></plunker-share-panel>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  \"\"\"\r\n  link: ($scope, el, attrs) ->\r\n    $scope.scratch = scratch\r\n\r\n    # Watch the ownership of the active plunk and change the save text accordingly\r\n    $scope.$watch \"scratch.isSaved()\", (isSaved) ->\r\n      if isSaved\r\n        $scope.saveText = \"Save\"\r\n        $scope.saveTitle = \"Save your work as a new Plunk\"\r\n        $scope.saveIcon = \"icon-save\"\r\n      else\r\n        $scope.saveText = \"Fork\"\r\n        $scope.saveTitle = \"Save your work as a fork of the original Plunk\"\r\n        $scope.saveIcon = \"icon-save\"\r\n  \r\n    $scope.promptImportGist = (source) ->\r\n      if source ||= prompt(\"Please enter a gist id to import\")\r\n        $location.path(\"gist:#{source}\")\r\n    \r\n    $shareBtn = $(\"#share-buttons\")\r\n    \r\n    lazyLoadedShareButtons = false\r\n    \r\n    $scope.triggerDownload = ->\r\n      json = scratch.toJSON()\r\n      \r\n      filename = if scratch.plunk.id then \"plunk-#{scratch.plunk.id}.zip\" else \"plunk.zip\"\r\n      \r\n      downloader.download(json, filename)\r\n    \r\n    $scope.lazyLoadShareButtons = ->\r\n      unless lazyLoadedShareButtons\r\n        initSocialButtons()\r\n        lazyLoadedShareButtons = true\r\n]"
  },
  {
    "path": "servers/www/assets/js/directives/userpanel.coffee",
    "content": "#= require ../services/session\n\nmodule = angular.module(\"plunker.userpanel\", [\"plunker.session\"])\n\nmodule.directive \"plnkrPress\", [\"$parse\", ($parse) ->\n  (scope, element, attrs) ->\n    tapping = false\n    fn = $parse(attrs[\"plnkrPress\"])\n    \n    element.bind 'touchstart', (e) -> tapping = true\n    element.bind 'touchmove', (e) -> tapping = false\n    element.bind 'touchend', (e) -> if tapping then scope.$apply -> fn(scope, $event: e)\n    element.bind 'click', (e) -> scope.$apply -> fn(scope, $event: e)\n]\n\nmodule.directive \"userpanel\", [ ->\n  restrict: \"E\"\n  replace: true\n  template: \"\"\"\n    <div id=\"userpanel\" class=\"pull-right\">\n      <div class=\"btn-group\" ng-show=\"session.user.id\">\n        <button class=\"user-menu btn dropdown-toggle\" data-toggle=\"dropdown\" title=\"User options\">\n          <img class=\"gravatar\" src=\"http://www.gravatar.com/avatar/{{session.user.gravatar_id}}?s=20\" />\n          <span class=\"text shrink\">{{session.user.login}}</span>\n          <b class=\"caret\" />\n        </button>\n        <ul class=\"dropdown-menu\">\n          <li>\n            <a href=\"/users/{{session.user.login}}\">My Profile</a>\n          </li>\n          <li>\n            <a href=\"/users/{{session.user.login}}/thumbed\">My thumbed plunks</a>\n          </li>\n          <li class=\"divider\"></li>\n          <li>\n            <a class=\"logout\" href=\"javascript:void(0)\" plnkr-press=\"session.logout()\">Logout</a>\n          </li>\n        </ul>\n      </div>\n      <div class=\"btn-group\" ng-hide=\"session.user.id\">\n        <button class=\"user-login btn dropdown-toggle\" data-toggle=\"dropdown\" title=\"Sign in\">\n          <i class=\"icon-user\" />\n          <span class=\"text shrink\">Sign in</span>\n          <span class=\"caret\"></span>\n        </button>\n        <ul class=\"dropdown-menu\">\n          <li>\n            <a class=\"login login-github\" data-service=\"github\" href=\"javascript:void(0)\" plnkr-press=\"session.login()\">\n              <i class=\"icon-github\" />\n              Sign in with Github\n            </a>\n          </li>\n        </ul>\n      </div>\n    </div>\n  \"\"\"\n  controller: [\"$scope\", \"session\", ($scope, session) ->\n    $scope.session = session\n  ]\n]"
  },
  {
    "path": "servers/www/assets/js/pages/editor.coffee",
    "content": "#= require ../../bootstrap/js/bootstrap-all\r\n\r\n#= require ../../select2/select2\r\n\r\n#= require ../vendor/angular-ui\r\n#= require ../vendor/overthrow\r\n\r\n#= require ../services/scratch\r\n#= require ../services/url\r\n\r\n#= require ../directives/userpanel\r\n#= require ../directives/layout\r\n#= require ../directives/ace\r\n#= require ../directives/multipanel\r\n#= require ../directives/toolbar\r\n#= require ../directives/statusbar\r\n\r\n\r\nmodule = angular.module(\"plunker.editor\", [\"ui.directives\", \"plunker.scratch\", \"plunker.url\", \"plunker.userpanel\", \"plunker.layout\", \"plunker.ace\", \"plunker.statusbar\", \"plunker.multipanel\", \"plunker.toolbar\"])\r\n\r\nmodule.value \"ui.config\",\r\n  select2:\r\n    tags:[\"angularjs\",\"angular-ui\",\"jquery\",\"bootstrap\",\"jquery-ui\",\"coffee\", \"YUI\"]\r\n    tokenSeparators: [\",\", \" \"]\r\n\r\n\r\nmodule.directive \"selectList\", ->\r\n  restrict: \"A\"\r\n  require: \"ngModel\"\r\n  priority: 99\r\n  link: ($scope, element, args, ngModel) ->\r\n    ngModel.$parsers.push (options = []) ->\r\n      tags = []\r\n      tags.push(option.text) for option in options\r\n      tags\r\n  \r\n\r\nmodule.config [\"$routeProvider\", \"$locationProvider\", ($routeProvider, $locationProvider) ->\r\n  $locationProvider.html5Mode(true)\r\n]\r\n\r\nmodule.controller \"editor\", [\"$scope\", \"$location\", \"scratch\", \"url\", ($scope, $location, scratch, url) ->\r\n  $scope.url = url\r\n  \r\n  repaintSidebar = ->\r\n    # Hack to force a repaint after AngularJS does first rendering\r\n    setTimeout ->\r\n      el = $(\".plnk-sidebar\")[0]\r\n      el.style.display = \"none\"\r\n      el.offsetHeight\r\n      el.style.display = \"block\"\r\n    , 1\r\n  \r\n  # Watch for changes in the path and load the appropriate plunk into the scratch\r\n  $scope.$watch (-> $location.path()), (path) ->\r\n    if path is \"/\" then scratch.reset(_plunker.bootstrap)\r\n    else\r\n      source = path.slice(1)\r\n      unless scratch.plunk.id is source then scratch.loadFrom(source).then(repaintSidebar)\r\n    \r\n    delete _plunker.bootstrap\r\n  \r\n  $scope.scratch = scratch\r\n  \r\n  $scope.isPaneEnabled = (pane) -> !pane.hidden\r\n  \r\n  repaintSidebar()\r\n  \r\n  window.onbeforeunload = ->\r\n      json = if scratch.savedState then scratch._getDeltaJSON(scratch.savedState) else scratch._getSaveJSON()\r\n      \r\n      count = 0\r\n      count++ for filename, file of json.files\r\n      \r\n      if count or json.description or json.tags\r\n        return \"You have not saved your changes to this plunk.\"\r\n\r\n]"
  },
  {
    "path": "servers/www/assets/js/pages/landing.coffee",
    "content": "#= require ../../bootstrap/js/bootstrap-all\r\n\r\n#= require ../services/plunks\r\n#= require ../services/url\r\n#= require ../services/whitelist\r\n\r\n#= require ../directives/userpanel\r\n#= require ../directives/card\r\n\r\nmodule = angular.module(\"plunker.landing\", [\"ngResource\", \"plunker.userpanel\", \"plunker.plunks\", \"plunker.card\", \"plunker.whitelist\", \"plunker.url\"])\r\n\r\nmodule.controller \"LandingController\", [\"$rootScope\", ($rootScope) ->\r\n\r\n]\r\n\r\nmodule.config [\"$routeProvider\", \"$locationProvider\", ($routeProvider, $locationProvider) ->\r\n  \r\n  $locationProvider.html5Mode(true)\r\n  $routeProvider.when \"/\", templateUrl: \"/partials/home\", controller: \"HomeController\"\r\n  $routeProvider.when \"/plunks/:ranking\", templateUrl: \"/partials/home\", controller: \"HomeController\"\r\n  $routeProvider.when \"/discuss\", templateUrl: \"/partials/discuss\", controller: \"DiscussController\"\r\n  $routeProvider.when \"/users/:username\", templateUrl: \"/partials/user\", controller: \"UserController\"\r\n  $routeProvider.when \"/users/:username/:ranking\", templateUrl: \"/partials/user\", controller: \"UserController\"\r\n  $routeProvider.when \"/tags/:tagname\", templateUrl: \"/partials/tag\", controller: \"TagController\"\r\n  $routeProvider.when \"/tags\", templateUrl: \"/partials/tags\", controller: \"TagsController\"\r\n  $routeProvider.when \"/users\", templateUrl: \"/partials/users\", controller: \"UsersController\"  \r\n  $routeProvider.when \"/:plunk/:filename\", templateUrl: \"/partials/preview\", controller: \"PreviewController\"\r\n  $routeProvider.when \"/:plunk\", templateUrl: \"/partials/preview\", controller: \"PreviewController\"\r\n  $routeProvider.otherwise redirectTo: \"/\"\r\n]\r\n\r\nmodule.run [\"whitelist\", (whitelist) ->\r\n  # Prevent AngularJS from handling /edit/ urls\r\n  whitelist.push /^\\/edit\\//\r\n]\r\n\r\nmodule.controller \"HomeController\", [ \"$scope\", \"$routeParams\", \"$location\", ($scope, $routeParams, $location) ->\r\n  $scope.$parent.section = \"plunks\"\r\n  \r\n  $scope.filters = []\r\n  \r\n  $scope.filters.push\r\n    name: \"trending\"\r\n    title: \"Trending\"\r\n    path: \"/plunks/trending\"\r\n  \r\n  $scope.filters.push\r\n    name: \"popular\"\r\n    title: \"Popular\"\r\n    path: \"/plunks/popular\"\r\n  \r\n  $scope.filters.push\r\n    name: \"recent\"\r\n    title: \"Recent\"\r\n    path: \"/plunks/recent\"\r\n    \r\n  ranking = $routeParams.ranking or \"trending\"\r\n  \r\n  for filter in $scope.filters\r\n    if filter.name == ranking\r\n      $scope.ranking = filter\r\n      break\r\n  \r\n  unless $scope.ranking then $location.path(\"/\")\r\n]\r\n\r\nmodule.controller \"UserController\", [ \"$scope\", \"$resource\", \"$routeParams\", \"url\", ($scope, $resource, $routeParams, url) ->\r\n  $scope.$parent.section = \"users\"\r\n\r\n  User = $resource(\"#{url.api}/users/:username\", username: \"@login\")\r\n  \r\n  $scope.username = $routeParams.username\r\n  $scope.user = User.get(username: $routeParams.username)\r\n\r\n  $scope.filters = []\r\n  \r\n  $scope.filters.push\r\n    name: \"recent\"\r\n    title: \"Recent\"\r\n    path: \"/users/#{$scope.username}\"\r\n  \r\n  $scope.filters.push\r\n    name: \"thumbed\"\r\n    title: \"Thumbed\"\r\n    path: \"/users/#{$scope.username}/thumbed\"\r\n    \r\n  ranking = $routeParams.ranking or \"recent\"\r\n  \r\n  for filter in $scope.filters\r\n    if filter.name == ranking\r\n      $scope.ranking = filter\r\n      break\r\n  \r\n  unless $scope.ranking then $location.path(\"/\")\r\n]\r\n\r\n\r\nmodule.controller \"UserPlunksController\", [ \"$scope\", \"$routeParams\", \"$location\",\"Plunk\", \"url\", ($scope, $routeParams, $location, Plunk, url) ->\r\n  $scope.$watch (-> $location.search()), (search) ->\r\n    page = parseInt(search.p, 10) or 1\r\n    size = parseInt(search.pp, 10) or 8\r\n    \r\n    ranking = $scope.ranking.name or $routeParams.ranking or \"recent\"\r\n    \r\n    suffixes =\r\n      recent: \"/plunks\"\r\n      thumbed: \"/thumbed\"\r\n    \r\n    $scope.plunks = Plunk.query\r\n      url: \"#{url.api}/users/#{$routeParams.username}#{suffixes[ranking]}\"\r\n      page: page\r\n      size: size\r\n      \r\n  $scope.pageTo = (url) ->\r\n    matches = url.match(/\\?p=(\\d+)&pp=(\\d+)/i)\r\n    \r\n    search = $location.search()\r\n    search.p = matches[1] or 1\r\n    search.pp = matches[2] or 8\r\n    \r\n    $location.search(search)\r\n]\r\nmodule.controller \"TagController\", [ \"$scope\", \"$routeParams\", \"$location\",\"Plunk\", \"url\", ($scope, $routeParams, $location, Plunk, url) ->\r\n  $scope.$parent.section = \"tags\"\r\n  \r\n  $scope.tagname = $routeParams.tagname\r\n  \r\n  $scope.$watch (-> $location.search()), (search) ->\r\n    page = parseInt(search.p, 10) or 1\r\n    size = parseInt(search.pp, 10) or 8\r\n    \r\n    $scope.plunks = Plunk.query\r\n      url: \"#{url.api}/tags/#{$routeParams.tagname}/plunks\"\r\n      page: page\r\n      size: size\r\n  \r\n  $scope.pageTo = (url) ->\r\n    matches = url.match(/\\?p=(\\d+)&pp=(\\d+)/i)\r\n    \r\n    search = $location.search()\r\n    search.p = matches[1] or 1\r\n    search.pp = matches[2] or 8\r\n    \r\n    $location.search(search)\r\n]\r\n\r\nmodule.controller \"PreviewController\", [ \"$scope\", \"$routeParams\", \"$location\", \"$timeout\", \"Plunk\", ($scope, $routeParams, $location, $timeout, Plunk) ->\r\n  $scope.state = \"loading\"\r\n  $scope.plunk = new Plunk(id: $routeParams.plunk)\r\n  $scope.resizePreview = ->\r\n    $footer = $(\"#container footer\")\r\n    targetHeight = $(window).height() - 50 - 38 - $footer.outerHeight() - 2\r\n    minHeight = $(\"#plunk-info\").outerHeight()\r\n    \r\n    $(\"iframe.plnk-preview\").height(Math.max(minHeight, targetHeight))\r\n\r\n  $(window).resize($scope.resizePreview);\r\n\r\n  $scope.plunk.fetch ->\r\n    $scope.state = \"ready\"\r\n    $timeout -> $scope.resizePreview()\r\n  , (err) ->\r\n    $location.path(\"/\")\r\n    \r\n  $scope.$parent.section = \"plunks\"\r\n  \r\n]\r\nmodule.controller \"UserDetailController\", [ \"$scope\", \"$routeParams\", \"$location\", \"$timeout\", \"Plunk\", ($scope, $routeParams, $location, $timeout, Plunk) ->\r\n  $scope.state = \"loading\"\r\n  $scope.plunk = new Plunk(id: $routeParams.plunk)\r\n  $scope.resizePreview = ->\r\n    $footer = $(\"#container footer\")\r\n    targetHeight = $(window).height() - 50 - 38 - $footer.outerHeight() - 2\r\n    minHeight = $(\"#plunk-info\").outerHeight()\r\n    \r\n    $(\"iframe.plnk-preview\").height(Math.max(minHeight, targetHeight))\r\n\r\n  $(window).resize($scope.resizePreview);\r\n\r\n  $scope.plunk.fetch ->\r\n    $scope.state = \"ready\"\r\n    $timeout -> $scope.resizePreview()\r\n  , (err) ->\r\n    $location.path(\"/\")\r\n    \r\n  $scope.$parent.section = \"users\"\r\n  \r\n]\r\nmodule.controller \"DiscussController\", [ \"$scope\", ($scope) ->\r\n  $iframe = $(\"#forum_embed\")\r\n  $footer = $(\"#container footer\")\r\n\r\n  $scope.$parent.section = \"discuss\"\r\n  \r\n  $scope.resizeDiscussion = ->\r\n    minHeight = 400\r\n    $iframe.height(Math.max(minHeight, $(window).height() - 50 - 38 - $footer.outerHeight()))\r\n  \r\n  $(window).resize($scope.resizeDiscussion)\r\n  \r\n  $scope.resizeDiscussion()\r\n\r\n  $iframe.attr(\"src\", 'https://groups.google.com/forum/embed/?place=forum/plunker&showsearch=true&showpopout=true&hideforumtitle=true&showtabs=false&parenturl=' + encodeURIComponent(window.location.href));\r\n\r\n]\r\n\r\nmodule.controller \"GalleryController\", [\"$scope\", \"$location\", \"$routeParams\", \"Plunk\", \"url\", ($scope, $location, $routeParams, Plunk, url) ->\r\n  $scope.$watch (-> $location.search()), (search) ->\r\n    page = parseInt(search.p, 10) or 1\r\n    size = parseInt(search.pp, 10) or 8\r\n    \r\n    ranking = $scope.ranking.name or $routeParams.ranking or \"recent\"\r\n    \r\n    suffixes =\r\n      popular: \"/popular\"\r\n      trending: \"/trending\"\r\n      recent: \"\"\r\n    \r\n    $scope.plunks = Plunk.query\r\n      url: \"#{url.api}/plunks#{suffixes[ranking]}\"\r\n      page: page\r\n      size: size\r\n  \r\n  $scope.pageTo = (url) ->\r\n    matches = url.match(/\\?p=(\\d+)&pp=(\\d+)/i)\r\n    \r\n    search = $location.search()\r\n    search.p = matches[1] or 1\r\n    search.pp = matches[2] or 8\r\n    \r\n    $location.search(search)\r\n]\r\nmodule.controller \"TagsController\", [ \"$scope\", ($scope) ->\r\n  $scope.$parent.section = \"tags\"\r\n  \r\n]\r\n\r\nmodule.controller \"UsersController\", [ \"$scope\", ($scope) ->\r\n  $scope.$parent.section = \"users\"\r\n  \r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/catalogue.coffee",
    "content": "module = angular.module(\"plunker.catalogue\", [])\n\nmodule.service \"catalogue\", [ ->\n  catalogue =\n    \"starter\":\n      \"category\": \"Starter Templates\"\n      \"tags\": []\n      \"description\": \"\"\"\n        Basic starter template with a javascript and css file\n      \"\"\"\n      \"versions\":\n        \"0.0.1\":\n          \"dependencies\":\n            \"user-css\": \"*\"\n            \"user-js\": \"*\"\n\n    \"starter-coffee\":\n      \"category\": \"Starter Templates\"\n      \"tags\": []\n      \"description\": \"\"\"\n        Basic starter template with a coffee-script and css file\n      \"\"\"\n      \"versions\":\n        \"0.0.1\":\n          \"dependencies\":\n            \"user-css\": \"*\"\n            \"user-coffee\": \"*\"\n            \n    \"user-js\":\n      \"versions\":\n        \"0.1.1\":\n          \"after\": [\"jquery\",\"jquery-ui\",\"bootstrap-js\",\"angularjs\"]\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"script.js\\\"></script>\"]\n          ]\n          \"files\":\n            \"script.js\": \"\"\"\n              /* Code goes here */\n            \"\"\"\n    \"user-css\":\n      \"versions\":\n        \"0.1.1\":\n          \"after\": [\"jquery-ui\",\"bootstrap-css-combined\",\"angularjs\"]\n          \"transform\": [\n            [\"head\", \"append\", \"<link rel=\\\"stylesheet\\\" href=\\\"style.css\\\">\"]\n          ]\n          \"files\":\n            \"style.css\": \"\"\"\n              /* CSS goes here */\n            \"\"\"\n    \"user-coffee\":\n      \"versions\":\n        \"0.1.1\":\n          \"after\": [\"jquery\",\"jquery-ui\",\"bootstrap-js\",\"angularjs\"]\n          \"dependencies\":\n            \"coffee-script\": \"*\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script type=\\\"text/coffeescript\\\" src=\\\"script.coffee\\\"></script>\"]\n          ]\n          \"files\":\n            \"script.coffee\": \"\"\"\n              # Coffee-script goes here\n            \"\"\"\n    \"jquery\":\n      \"tags\": [\"jquery\"]\n      \"category\": \"jQuery\"\n      \"versions\":\n        \"1.8.3\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js\\\"></script>\"]\n          ]\n        \"1.8.2\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js\\\"></script>\"]\n          ]\n        \"1.7.2\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js\\\"></script>\"]\n          ]\n    \"jquery-ui\":\n      \"tags\": [\"jquery-ui\"]\n      \"category\": \"jQuery\"\n      \"versions\":\n        \"1.8.23\":\n          \"dependencies\":\n            \"jquery\": \"1.8.x\"\n          \"transform\": [\n            [\"head\", \"append\", \"<link href=\\\"//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/themes/base/jquery-ui.css\\\" rel=\\\"stylesheet\\\">\"]\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js\\\"></script>\"]\n          ]\n    \"angularjs\":\n      \"tags\": [\"angularjs\"]\n      \"category\": \"AngularJS\"\n      \"versions\":\n        \"1.0.3\":\n          \"after\": \"jquery\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js\\\"></script>\"]\n          ]\n        \"1.0.2\":\n          \"after\": \"jquery\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js\\\"></script>\"]\n          ]\n        \"1.0.1\":\n          \"after\": \"jquery\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js\\\"></script>\"]\n          ]\n        \"1.1.0\":\n          \"unstable\": true\n          \"after\": \"jquery\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//code.angularjs.org/1.1.0/angular.js\\\"></script>\"]\n          ]\n        \"1.1.1\":\n          \"unstable\": true\n          \"after\": \"jquery\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//code.angularjs.org/1.1.1/angular.js\\\"></script>\"]\n          ]\n    \"angularjs-resource\":\n      \"category\": \"AngularJS\"\n      \"versions\":\n        \"1.0.3\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.3\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular-resource.min.js\\\"></script>\"]\n          ]\n        \"1.0.2\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.2\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular-resource.min.js\\\"></script>\"]\n          ]\n        \"1.0.1\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.1\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-resource.min.js\\\"></script>\"]\n          ]\n    \"angularjs-cookies\":\n      \"category\": \"AngularJS\"\n      \"versions\":\n        \"1.0.3\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.3\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular-cookies.min.js\\\"></script>\"]\n          ]\n        \"1.0.2\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.2\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular-cookies.min.js\\\"></script>\"]\n          ]\n        \"1.0.1\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.1\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-cookies.min.js\\\"></script>\"]\n          ]\n    \"angularjs-sanitize\":\n      \"category\": \"AngularJS\"\n      \"versions\":\n        \"1.0.3\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.3\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular-sanitize.min.js\\\"></script>\"]\n          ]\n        \"1.0.2\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.2\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular-sanitize.min.js\\\"></script>\"]\n          ]\n        \"1.0.1\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.1\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-sanitize.min.js\\\"></script>\"]\n          ]\n    \"starter-angularjs\":\n      \"category\": \"Starter Templates\"\n      \"keywords\": [\"angularjs\"]\n      \"description\": \"\"\"\n        Hello world in AngularJS\n      \"\"\"\n      \"versions\":\n        \"0.0.1\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.x\"\n            \"user-css\": \"*\"\n          \"transform\": [\n            [\"html\", \"attr\", \"ng-app\", \"angularjs-starter\"]\n            [\"head\", \"append\", \"\"\"<script>document.write('<base href=\"' + document.location + '\" />');</script>\"\"\"]\n            [\"head\", \"append\", \"<script src=\\\"app.js\\\"></script>\"]\n            [\"body\", \"attr\", \"ng-controller\", \"MainCtrl\"]\n            [\"body\", \"append\", \"<h1>Hello {{name}}</h1>\"]\n          ]\n          \"files\":\n            \"app.js\": \"\"\"\n              var app = angular.module('angularjs-starter', []);\n              \n              app.controller('MainCtrl', function($scope) {\n                $scope.name = 'World';\n              });\n            \"\"\"\n    \"starter-angularjs-coffee\":\n      \"category\": \"Starter Templates\"\n      \"keywords\": [\"angularjs\"]\n      \"description\": \"\"\"\n        Hello world in AngularJS using Coffee-Script\n      \"\"\"\n      \"versions\":\n        \"0.0.1\":\n          \"dependencies\":\n            \"angularjs\": \"1.0.x\"\n            \"coffee-script\": \"1.x\"\n            \"user-css\": \"*\"\n          \"transform\": [\n            [\"head\", \"append\", \"\"\"<script>document.write('<base href=\"' + document.location + '\" />');</script>\"\"\"]\n            [\"head\", \"append\", \"\"\"<script type=\"text/coffeescript\" src=\"app.coffee\"></script>\"\"\"]\n            [\"body\", \"attr\", \"ng-controller\", \"MainCtrl\"]\n            [\"body\", \"append\", \"<h1>Hello {{name}}</h1>\"]\n          ]\n          \"files\":\n            \"app.coffee\": \"\"\"\n              app = angular.module('angularjs-starter', [])\n              \n              app.controller 'MainCtrl', ($scope) ->\n                $scope.name = 'World'\n              \n              angular.bootstrap(document, ['angularjs-starter'])\n            \"\"\"\n    \"angular-ui\":\n      \"category\": \"AngularJS\"\n      \"tags\": [\"angular-ui\"]\n      \"versions\":\n        \"0.0.1\":\n          \"dependencies\":\n            \"jquery-ui\": \">=1.8.0\"\n            \"angularjs\": \"1.0.x\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//raw.github.com/angular-ui/angular-ui/master/build/angular-ui.js\\\"></script>\"]\n          ]\n    \"bootstrap\":\n      \"category\": \"Bootstrap\"\n      \"keywords\": [\"bootstrap\"]\n      \"description\": \"\"\"\n        Add the full Twitter Bootstrap framework\n      \"\"\"\n      \"versions\":\n        \"2.1.1\":\n          \"dependencies\":\n            \"bootstrap-css-combined\": \"2.1.1\"\n            \"bootstrap-js\": \"2.1.1\"\n        \"2.2.0\":\n          \"dependencies\":\n            \"bootstrap-css-combined\": \"2.2.0\"\n            \"bootstrap-js\": \"2.2.0\"\n    \"bootstrap-css-combined\":\n      \"category\": \"Bootstrap\"\n      \"tags\": [\"bootstrap\"]\n      \"keywords\": [\"bootstrap\"]\n      \"description\": \"\"\"\n        Add dependencies for Twitter's Bootstrap framework.\n        \n        Note that this does *not* include the javascript component. Please also include bootstrap-js to get access to that.\n      \"\"\"\n      \"versions\":\n        \"2.1.1\":\n          \"transform\": [\n            [\"head\", \"append\", \"<link href=\\\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/css/bootstrap-combined.min.css\\\" rel=\\\"stylesheet\\\">\"]\n          ]\n        \"2.2.0\":\n          \"transform\": [\n            [\"head\", \"append\", \"<link href=\\\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.0/css/bootstrap-combined.min.css\\\" rel=\\\"stylesheet\\\">\"]\n          ]\n    \"bootstrap-js\":\n      \"category\": \"Bootstrap\"\n      \"keywords\": [\"bootstrap\"]\n      \"description\": \"\"\"\n        Add the javascript components of Twitter's Bootstrap\n      \"\"\"\n      \"versions\":\n        \"2.1.1\":\n          \"dependencies\":\n            \"jquery\": \">= 1.7.0\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/js/bootstrap.min.js\\\"></script>\"]\n          ]\n        \"2.2.0\":\n          \"dependencies\":\n            \"jquery\": \">= 1.7.0\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.0/js/bootstrap.min.js\\\"></script>\"]\n          ]\n\n\n    \"starter-bootstrap\":\n      \"category\": \"Starter Templates\"\n      \"tags\": [\"bootstrap\"]\n      \"description\": \"\"\"\n        Basic starter template for Twitter's Bootstrap\n      \"\"\"\n      \"versions\":\n        \"0.0.1\":\n          \"dependencies\":\n            \"bootstrap-css-combined\": \"*\"\n            \"bootstrap-js\": \"*\"\n          \"transform\": [\n            [\"body\", \"append\", \"\"\"<h1>Todo</h1>\"\"\"]\n          ]\n    \"coffee-script\":\n      \"tags\": [\"coffee\"]\n      \"versions\":\n        \"1.3.3\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/coffee-script/1.3.3/coffee-script.min.js\\\"></script>\"]\n          ]\n    \"date.js\":\n      \"category\": \"Date / time\"\n      \"versions\":\n        \"1.0.0\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/datejs/1.0/date.min.js\\\"></script>\"]\n          ]\n    \"moment.js\":\n      \"category\": \"Date / time\"\n      \"versions\":\n        \"1.7.2\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/moment.js/1.7.2/moment.min.js\\\"></script>\"]\n          ]\n    \"underscore\":\n      \"category\": \"Utility\"\n      \"versions\":\n        \"1.4.2\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.2/underscore-min.js\\\"></script>\"]\n          ]\n    \"backbone\":\n      \"category\": \"Backbone\"\n      \"tags\": \"Backbone\"\n      \"versions\":\n        \"1.4.2\":\n          \"dependencies\":\n            \"jquery\": \"~1.7.0\"\n            \"underscore\": \"~1.4.0\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js\\\"></script>\"]\n          ]\n    \"backbone-localStorage\":\n      \"category\": \"Backbone\"\n      \"tags\": \"Backbone\"\n      \"versions\":\n        \"1.0.0\":\n          \"dependencies\":\n            \"backbone\": \"~1.4.0\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/backbone-localstorage.js/1.0/backbone.localStorage-min.js\\\"></script>\"]\n          ]\n    \"knockout\":\n      \"category\": \"Knockout.js\"\n      \"tags\": \"knockout\"\n      \"versions\":\n        \"2.1.0\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/knockout/2.1.0/knockout-min.js\\\"></script>\"]\n          ]\n    \"knockout.mapping\":\n      \"category\": \"Knockout.js\"\n      \"versions\":\n        \"2.3.2\":\n          \"dependencies\":\n            \"knockout\": \"2.1.x\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.3.2/knockout.mapping.js\\\"></script>\"]\n          ]\n    \"handlebars\":\n      \"category\": \"Templating\"\n      \"tags\": [\"handlebars\"]\n      \"versions\":\n        \"1.0.0-RC1\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.rc.1/handlebars.min.js\\\"></script>\"]\n          ]\n    \"ember\":\n      \"category\": \"Ember.js\"\n      \"tags\": [\"ember\"]\n      \"versions\":\n        \"1.0.0-pre2\":\n          \"dependencies\":\n            \"jquery\": \">=1.7.2\"\n            \"handlebars\": \"~1.0.0\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/ember.js/1.0.0-pre.2/ember-1.0.0-pre.2.min.js\\\"></script>\"]\n          ]\n        \"0.9.8\":\n          \"dependencies\":\n            \"jquery\": \">=1.7.2\"\n            \"handlebars\": \"~1.0.0\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/ember.js/0.9.8/ember-0.9.8.js\\\"></script>\"]\n          ]\n    \"select2\":\n      \"category\": \"User Interface\"\n      \"tags\": [\"select2\"]\n      \"versions\":\n        \"3.2.0\":\n          \"dependencies\":\n            \"jquery\": \">=1.7.2\"\n          \"transform\": [\n            [\"head\", \"append\", \"<link rel=\\\"stylesheet\\\" href=\\\"//ivaynberg.github.com/select2/select2-3.2/select2.css\\\" />\"]\n            [\"head\", \"append\", \"<script src=\\\"//ivaynberg.github.com/select2/select2-3.2/select2.js\\\"></script>\"]\n          ]\n    \"d3\":\n      \"category\": \"D3.js\"\n      \"tags\": [\"d3\"]\n      \"versions\":\n        \"2.7.4\":\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/d3/2.7.4/d3.min.js\\\"></script>\"]\n          ]\n    \"d3-time\":\n      \"category\": \"D3.js\"\n      \"tags\": [\"d3\"]\n      \"versions\":\n        \"2.7.4\":\n          \"dependencies\":\n            \"d3\": \"2.7.4\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/d3/2.7.4/d3.time.min.js\\\"></script>\"]\n          ]\n    \"d3-layout\":\n      \"category\": \"D3.js\"\n      \"tags\": [\"d3\"]\n      \"versions\":\n        \"2.7.4\":\n          \"dependencies\":\n            \"d3\": \"2.7.4\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/d3/2.7.4/d3.layout.min.js\\\"></script>\"]\n          ]\n    \"d3-geom\":\n      \"category\": \"D3.js\"\n      \"tags\": [\"d3\"]\n      \"versions\":\n        \"2.7.4\":\n          \"dependencies\":\n            \"d3\": \"2.7.4\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/d3/2.7.4/d3.geom.min.js\\\"></script>\"]\n          ]\n    \"d3-geo\":\n      \"category\": \"D3.js\"\n      \"tags\": [\"d3\"]\n      \"versions\":\n        \"2.7.4\":\n          \"dependencies\":\n            \"d3\": \"2.7.4\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/d3/2.7.4/d3.geo.min.js\\\"></script>\"]\n          ]                              \n    \"d3-csv\":\n      \"category\": \"D3.js\"\n      \"tags\": [\"d3\"]\n      \"versions\":\n        \"2.7.4\":\n          \"dependencies\":\n            \"d3\": \"2.7.4\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/d3/2.7.4/d3.csv.min.js\\\"></script>\"]\n          ]\n    \"d3-chart\":\n      \"category\": \"D3.js\"\n      \"tags\": [\"d3\"]\n      \"versions\":\n        \"2.7.4\":\n          \"dependencies\":\n            \"d3\": \"2.7.4\"\n          \"transform\": [\n            [\"head\", \"append\", \"<script src=\\\"//cdnjs.cloudflare.com/ajax/libs/d3/2.7.4/d3.chart.min.js\\\"></script>\"]\n          ]\n\n\n  new class Catalogue\n    constructor: ->\n      @catalogue = catalogue\n      \n      # Clean up the libs object\n      for name, pkg of @catalogue\n        pkg.description ||= \"\"\n        pkg.category ||= \"Misc\"\n        pkg.name = name\n        pkg.keywords ||= []\n        pkg.tags ||= []\n        \n        for version, def of pkg.versions\n          def.name = name\n          def.version = version\n          def.keywords = pkg.keywords\n          def.description = pkg.description\n          def.category = pkg.category\n          def.tags = pkg.tags\n          def.id = \"#{name}@#{version}\"\n          def.files ||= {}\n          def.transform ||= []\n          def.after ||= []\n          def.after = [def.after] if angular.isString(def.after)\n          \n          for filename, file of def.files\n            if angular.isString(file) then def.files[filename] =\n              filename: filename\n              content: file\n    \n    getBestMatch: (ref) ->\n      [refName, refVersion] = @parseRef(ref)\n      \n      unless pkg = @catalogue[refName]\n        throw new Error(\"No such package: #{refName}\")\n      \n      versions = []\n      for version, def of pkg.versions\n        versions.push version unless def.unstable and refVersion == \"*\"\n      \n      unless bestMatch = semver.maxSatisfying(versions, refVersion)\n        throw new Error(\"No package found that satisfies: #{refName}@{refVersion}\")\n      \n      pkg.versions[bestMatch]\n      \n    \n    parseRef: (ref) ->\n      parts = ref.split(\"@\")\n      \n      name = parts.shift()\n      version = if parts.length then parts.shift() else \"*\"\n    \n      [name, version]\n\n]"
  },
  {
    "path": "servers/www/assets/js/services/downloader.coffee",
    "content": "#= require ../vendor/jszip\n\n\nmodule = angular.module(\"plunker.downloader\", [])\n\nmodule.factory \"downloader\", [\"$location\", ($location) ->\n  download: (json, saveAs = \"plunker.zip\") ->\n    zip = new JSZip()\n    zip.file(file.filename, file.content) for filename, file of json.files\n    \n    url = \"data:application/zip;base64,\" + zip.generate()\n    \n    link = document.createElement(\"a\")\n    \n    if link.download?\n      link.setAttribute(\"href\", url)\n      link.setAttribute(\"download\", saveAs)\n      \n      event = document.createEvent('MouseEvents');\n      event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null)\n      \n      link.dispatchEvent(event)\n    else\n      window.open(url, \"_blank\", \"\")\n    \n]"
  },
  {
    "path": "servers/www/assets/js/services/importer.coffee",
    "content": "#= require ../directives/builder\n\n#= require ../services/plunks\n\nplunkerRegex = ///\n  ^\n    \\s*                   # Leading whitespace\n    (?:plunk:)?           # Optional plunk:prefix\n    ([-\\._a-zA-Z0-9]+)     # Plunk ID\n    \\s*                   # Trailing whitespace\n  $\n///i\n\ngithubRegex = ///\n  ^\n    \\s*                   # Leading whitespace\n    (?:                   # Optional protocol/hostname\n      (?:https?\\://)?     # Protocol\n      gist\\.github\\.com/  # Hostname\n    |\n      gist\\:\n    )\n    ([0-9]+|[0-9a-z]{20}) # Gist ID\n    (?:#.+)?              # Optional anchor\n    \\s*                   # Trailing whitespace\n  $\n///i\n\nbuilderRegex = ///\n  ^\n    \\s*                   # Leading whitespace\n    b(?:uild)?:           # Prefix of b: or build:\n    ([-\\._@+a-zA-Z0-9]+)  # Build definition\n    \\s*                   # Trailing whitespace\n  $\n///i\n\n\nmodule = angular.module(\"plunker.importer\", [\"plunker.plunks\", \"plunker.builder\"])\n\nmodule.factory \"importer\", [ \"$q\", \"$http\", \"Plunk\", \"builder\", ($q, $http, Plunk, builder) ->\n  import: (source) ->\n    deferred = $q.defer()\n    \n    if matches = source.match(plunkerRegex)\n      Plunk.get {id: matches[1]}, (plunk) ->\n        deferred.resolve(angular.copy(plunk))\n      , (error) ->\n        deferred.reject(\"Plunk not found\")\n    else if matches = source.match(builderRegex)\n      names = matches[1].split(\"+\")\n      error = null\n    \n      builder.reset()\n      \n      try\n        builder.addLib(name) for name in names\n      catch e\n        error = e\n        \n      build = angular.extend(builder.build(), private: true)\n      \n      unless error then deferred.resolve(build)\n      else deferred.reject(error)\n      \n      builder.reset()\n      \n    else if matches = source.match(githubRegex)\n      request = $http.jsonp(\"https://api.github.com/gists/#{matches[1]}?callback=JSON_CALLBACK\")\n      \n      request.then (response) ->\n        if response.data.meta.status >= 400 then deferred.reject(\"Gist not found\")\n        else\n          gist = response.data.data\n          json = {}\n          \n          if manifest = gist.files[\"plunker.json\"]\n            try\n              angular.extend json, angular.fromJson(manifest.content)\n            catch e\n              console.error \"Unable to parse manifest file:\", e\n\n  \n          angular.extend json,\n            private: true\n            source:\n              type: \"gist\"\n              url: gist.html_url\n              title: \"gist:#{gist.id}\"\n            files: {}\n          \n          json.description = json.source.description = gist.description if gist.description\n\n          for filename, file of gist.files\n            unless filename == \"plunker.json\"\n              json.files[filename] =\n                filename: filename\n                content: file.content \n          \n          deferred.resolve(json)\n    else deferred.reject(\"Not a recognized source\")\n          \n    deferred.promise\n]"
  },
  {
    "path": "servers/www/assets/js/services/modes.coffee",
    "content": "modes =\r\n  c_cpp:\r\n    title: \"C/C++\"\r\n    extensions: [\"c\", \"cpp\", \"cxx\", \"h\", \"hpp\"]\r\n  clojure:\r\n    title: \"Clojure\"\r\n    extensions: [\"clj\"]\r\n  coffee:\r\n    title: \"CoffeeScript\"\r\n    extensions: [\"coffee\"]\r\n  coldfusion:\r\n    title: \"ColdFusion\"\r\n    extensions: [\"cfm\"]\r\n  csharp:\r\n    title: \"C#\"\r\n    extensions: [\"cs\"]\r\n  css:\r\n    title: \"CSS\"\r\n    extensions: [\"css\"]\r\n  groovy:\r\n    title: \"Groovy\"\r\n    extensions: [\"groovy\"]\r\n  haxe:\r\n    title: \"haXe\"\r\n    extensions: [\"hx\"]\r\n  html:\r\n    title: \"HTML\"\r\n    extensions: [\"html\", \"htm\"]\r\n  java:\r\n    title: \"Java\"\r\n    extensions: [\"java\"]\r\n  javascript:\r\n    title: \"JavaScript\"\r\n    extensions: [\"js\"]\r\n  json:\r\n    title: \"JSON\"\r\n    extensions: [\"json\"]\r\n  latex:\r\n    title: \"LaTeX\"\r\n    extensions: [\"tex\"]\r\n  lua:\r\n    title: \"Lua\"\r\n    extensions: [\"lua\"]\r\n  markdown:\r\n    title: \"Markdown\"\r\n    extensions: [\"md\", \"markdown\"]\r\n  ocaml:\r\n    title: \"OCaml\"\r\n    extensions: [\"ml\", \"mli\"]\r\n  perl:\r\n    title: \"Perl\"\r\n    extensions: [\"pl\", \"pm\"]\r\n  pgsql:\r\n    title: \"pgSQL\"\r\n    extensions: [\"pgsql\", \"sql\"]\r\n  php:\r\n    title: \"PHP\"\r\n    extensions: [\"php\"]\r\n  powershell:\r\n    title: \"Powershell\"\r\n    extensions: [\"ps1\"]\r\n  python:\r\n    title: \"Python\"\r\n    extensions: [\"py\"]\r\n  scala:\r\n    title: \"Scala\"\r\n    extensions: [\"scala\"]\r\n  scss:\r\n    title: \"SCSS\"\r\n    extensions: [\"scss\"]\r\n  ruby:\r\n    title: \"Ruby\"\r\n    extensions: [\"rb\"]\r\n  sql:\r\n    title: \"SQL\"\r\n    extensions: [\"sql\"]\r\n  svg:\r\n    title: \"SVG\"\r\n    extensions: [\"svg\"]\r\n  text:\r\n    title: \"Text\"\r\n    extensions: [\"txt\"]\r\n  textile:\r\n    title: \"Textile\"\r\n    extensions: [\"textile\"]\r\n  xml:\r\n    title: \"XML\"\r\n    extensions: [\"xml\"]\r\n\r\n# Build the regex's to match the modes\r\nfor name, mode of modes\r\n  mode.name = name\r\n  mode.regex =  new RegExp(\"\\\\.(\" + mode.extensions.join(\"|\") + \")$\", \"i\")\r\n  mode.source = \"ace/mode/#{name}\"\r\n  \r\nmodes.findByFilename = (filename) ->\r\n  for name, mode of modes\r\n    if filename.match(mode.regex) then return mode\r\n  \r\n  modes.text\r\n\r\nmodule = angular.module(\"plunker.modes\", [])\r\n\r\nmodule.service \"modes\", -> modes"
  },
  {
    "path": "servers/www/assets/js/services/notifier.coffee",
    "content": "#= require ../vendor/noty/jquery.noty\r\n#= require ../vendor/noty/layouts/bottomRight\r\n#= require ../vendor/noty/themes/default\r\n\r\n\r\nmodule = angular.module(\"plunker.notifier\", [])\r\n\r\nmodule.factory \"notifier\", [ () ->\r\n  \r\n  notifier = {}\r\n  methods = [\"alert\", \"success\", \"error\", \"warning\", \"information\", \"confirm\"]\r\n  \r\n  for method in methods then do (method) ->\r\n    notifier[method] = (title, text, options = {}) ->\r\n      switch arguments.length\r\n        when 3\r\n          options.title = title\r\n          options.text = text\r\n        when 2\r\n          if angular.isObject(text)\r\n            options = text\r\n            options.text = title\r\n        when 1\r\n          if angular.isObject(title)\r\n            options = title\r\n          else options.text = title\r\n          \r\n      options.layout ||= \"bottomRight\"\r\n      options.type ||= method\r\n      options.timeout ||= \"3000\"\r\n      options.text = (if options.title then \"#{options.title} - \" else \"\") + options.text\r\n      \r\n      noty(options)\r\n  \r\n  notifier\r\n]"
  },
  {
    "path": "servers/www/assets/js/services/pages.coffee",
    "content": "module = angular.module(\"plunker.pages\", [])\n\nmodule.factory \"pages\", [ () ->\n  return []\n]"
  },
  {
    "path": "servers/www/assets/js/services/panels.coffee",
    "content": "module = angular.module(\"plunker.panels\", [])\r\n\r\nmodule.factory \"panels\", [ () ->\r\n  return []\r\n]"
  },
  {
    "path": "servers/www/assets/js/services/panes/builder.coffee",
    "content": "#= require ../../services/panels\r\n#= require ../../services/scratch\r\n\r\n#= require ../../directives/builder\r\n\r\n#= require ../../vendor/underscore\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.requires.push(\"plunker.scratch\", \"plunker.builder\", \"plunker.scratch\")\r\n\r\nmodule.run [ \"panels\", \"builder\", \"scratch\", (panels, builder, scratch) ->\r\n  panels.push new class\r\n    name: \"builder\"\r\n    order: 1\r\n    size: 375\r\n    title: \"Create a new plunk using the Builder\"\r\n    icon: \"icon-beaker\"\r\n    badge:\r\n      title: \"Try out the new Plunk builder\"\r\n      class: \"badge badge-important\"\r\n      value: \"new\"\r\n    template: \"\"\"\r\n      <div id=\"panel-builder\">\r\n        <h4>Plunk builder:</h4>\r\n        <details>\r\n          <summary>About the Builder</summary>\r\n          <p>The plunk Builder lets you quickly bootstrap your code with a huge combination of predefined libraries.</p>\r\n          <p>Search for libraries using the magic builder bar below. When you add libraries, their dependencies will\r\n          also be automagically added.</p>\r\n          <p>When you are finished, hit <strong>Create</strong> to load the bootstrapped Plunk\r\n          into the editor.</p>\r\n          <p>Alternatively, hit <strong>Import</strong> to import the selected libraries into your current Plunk.</p>\r\n        </details>\r\n        <p>\r\n          <plunker-builder></plunker-builder>\r\n        </p>\r\n        <p>\r\n          <button title=\"Create a new Plunk based on the build defined below\" class=\"btn btn-primary\" ng-click=\"launch()\">Create</button>\r\n          <button title=\"Apply the build defined below to the current editor state\" class=\"btn btn-success\" ng-click=\"import()\">Import</button>\r\n        <ul>\r\n          <li ng-repeat=\"(ref, deps) in builder.dependencies\">\r\n            <strong>{{ref}}</strong>\r\n            <ul>\r\n              <li ng-repeat=\"pkg in deps\">\r\n                {{pkg.id}}\r\n              </li>\r\n            </ul>\r\n          </li>\r\n        </ul>\r\n        <div class=\"alert\">\r\n          <strong>Hint:</strong> You can pick versions of the libs by putting an '@' after. For example, try 'jquery@'.\r\n        </div>\r\n        <div class=\"alert\">\r\n          <strong>Note:</strong> When you import libraries, Plunker does <strong>not</strong> parse your existing html\r\n          to resolve dependencies based on what already exists. I will see what can be done to improve this.\r\n        </div>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n      $scope.builder = builder\r\n      \r\n      $scope.launch = ->\r\n        unless confirm(\"\"\"\r\n          This operation will overwrite your current work and any work in a connected stream.\r\n          \r\n          Are you sure that you want to reset your session?\r\n        \"\"\")\r\n          return\r\n          \r\n        build = angular.extend builder.build(), private: true\r\n        \r\n        scratch.loadJson build,\r\n          skipNext: true\r\n          ignoreLock: true\r\n        builder.reset()\r\n        $scope.resetBar()\r\n      \r\n      $scope.import = ->\r\n        build = builder.build(scratch._getSaveJSON())\r\n        \r\n        for filename, file of build.files\r\n          if buffer = scratch.buffers.findBy(\"filename\", file.filename)\r\n            buffer.content = file.content\r\n          else\r\n            scratch.addFile(file.filename, file.content)\r\n        \r\n        scratch.tags = _.uniq(scratch.tags.concat(build.tags or []))\r\n        \r\n        builder.reset()\r\n        $scope.resetBar()\r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      @active = false\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      @active = true\r\n    \r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/panes/explore.coffee",
    "content": "#= require ../../directives/card\r\n\r\n#= require ../../services/panels\r\n#= require ../../services/plunks\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.requires.push(\"plunker.card\")\r\n\r\nmodule.run [ \"$location\", \"panels\", \"Plunk\", ($location, panels, Plunk) ->\r\n  activated = false\r\n  \r\n  panels.push new class\r\n    name: \"explore\"\r\n    order: 2\r\n    size: 304\r\n    title: \"Find and discover other plunks\"\r\n    icon: \"icon-th\"\r\n    template: \"\"\"\r\n      <div id=\"panel-explore\" class=\"cards\">\r\n        <div class=\"page-header\">\r\n          <div class=\"pagination pull-right\">\r\n            <ul>\r\n              <li ng-class=\"{disabled: !plunks.pager.prev}\"><a ng-href=\"javascript:void(0)\" ng-click=\"pageTo(plunks.pager.prev)\">«</a></li>\r\n              <li ng-class=\"{disabled: !plunks.pager.next}\"><a ng-href=\"javascript:void(0)\" ng-click=\"pageTo(plunks.pager.next)\">»</a></li>\r\n            </ul>\r\n          </div>\r\n          <button class=\"btn btn-large btn-success\" ng-click=\"refresh()\">\r\n            <i class=\"icon-refresh\" />\r\n            Refresh\r\n          </button>\r\n        </div>\r\n        \r\n\r\n\r\n        <ul id=\"gallery\" class=\"thumbnails cards\"><card model=\"plunk\" ng-repeat=\"plunk in plunks\"></card></ul>\r\n        <ul class=\"pager\">\r\n          <li ng-show=\"plunks.pager.prev\" class=\"previous\"><a ng-href=\"\" ng-click=\"pageTo(plunks.pager.prev)\">&larr; Newer</a></li>\r\n          <li ng-show=\"plunks.pager.next\" class=\"next\"><a ng-href=\"javascript:void(0)\" ng-click=\"pageTo(plunks.pager.next)\">Older  &rarr;</a></li>\r\n        </ul>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n            \r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      @active = false\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      unless activated\r\n        self = @\r\n        \r\n        $scope.refresh = (search = {}) ->\r\n          page = parseInt(search.p, 10) or 1\r\n          size = parseInt(search.pp, 10) or 8\r\n          \r\n          $scope.plunks = Plunk.query\r\n            page: page\r\n            size: size\r\n            \r\n        $scope.$watch (-> $location.search()), $scope.refresh\r\n        \r\n        $scope.pageTo = (url) ->\r\n          matches = url.match(/\\?p=(\\d+)&pp=(\\d+)/i)\r\n          \r\n          search = $location.search()\r\n          search.p = matches[1] or 1\r\n          search.pp = matches[2] or 8\r\n          \r\n          $location.search(search)\r\n          $scope.refresh(search)\r\n\r\n      activated = true\r\n      \r\n      @active = true\r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/panes/lint.coffee",
    "content": "#= require ../../services/panels\r\n#= require ../../services/scratch\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.requires.push(\"plunker.card\", \"plunker.scratch\")\r\n\r\nmodule.directive \"plunkerLintReport\", [ ->\r\n  restrict: \"E\"\r\n  scope:\r\n    errors: \"=\"\r\n    \r\n  link: ($scope, el, attrs) ->\r\n    \r\n    $scope.$watch \"errors\", (errors) ->\r\n      if errors\r\n        $wrap = $(\"<div></div>\")\r\n        $report = $(\"<div></div>\")\r\n          .addClass(\"jshint-report\")\r\n          .appendTo($wrap)\r\n        $errors = $(\"<ul></ul>\").addClass(\"jshint-errors\").appendTo($report)\r\n      \r\n        angular.forEach errors, (error) ->\r\n          if error\r\n            {line, message, evidence, character} = error\r\n            $li = $(\"<li></li>\").addClass(\"alert\").appendTo($errors)\r\n            if error.type is \"error\" then $li.addClass(\"alert-error\")\r\n            else $li.addClass(\"alert-info\")\r\n            $error = $(\"<p></p>\").appendTo($li)\r\n            $line = $(\"<a>Line #{line}</a>\")\r\n              .attr(\"href\", \"javascript:void(0)\")\r\n              .attr(\"data-line\", line)\r\n              .attr(\"data-char\", character)\r\n              .addClass(\"lineno\")\r\n              .appendTo($error)\r\n            if evidence\r\n              $error.append(\":&nbsp;\")\r\n              $code = $(\"<code>#{evidence}</code>\").appendTo($error)\r\n            $reason = $(\"<p>#{message}</p>\").appendTo($li) if message\r\n        \r\n        html = $wrap.html()\r\n        $wrap.remove()\r\n        \r\n        el.html(html)\r\n]\r\n\r\nmodule.run [ \"$location\", \"panels\", \"scratch\", ($location, panels, scratch) ->\r\n  panels.push new class\r\n    name: \"lint\"\r\n    order: 99\r\n    size: 375\r\n    title: \"Run a lint check on the active file\"\r\n    icon: \"icon-check\"\r\n    template: \"\"\"\r\n      <div id=\"panel-lint\" ng-switch on=\"state\">\r\n        <h4>Code linting:</h4>\r\n        <p ng-switch-when=\"valid\" class=\"alert alert-success\">\r\n          No errors\r\n        </p>\r\n        <plunker-lint-report errors=\"errors\" ng-switch-when=\"invalid\"></plunker-lint-report>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n      self = @\r\n      \r\n      $scope.state = \"valid\"\r\n\r\n      $scope.scratch = scratch\r\n      $scope.$watch \"scratch.buffers.active().annotations\", (errors) ->\r\n        if errors and errors.length\r\n          $scope.state = \"invalid\"\r\n          $scope.errors = errors\r\n          \r\n          self.badge =\r\n            class: \"badge badge-important\"\r\n            title: \"Your code has some errors\"\r\n            value: errors.length     \r\n            \r\n        else\r\n          $scope.state = \"valid\"\r\n          self.badge = null\r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      @active = false\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      @active = true\r\n    \r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/panes/previewer.coffee",
    "content": "#= require ../../services/panels\r\n#= require ../../services/scratch\r\n#= require ../../services/url\r\n\r\ndebounce = (func, threshold, execAsap) ->\r\n  timeout = false\r\n  \r\n  return debounced = ->\r\n    obj = this\r\n    args = arguments\r\n    \r\n    delayed = ->\r\n      func.apply(obj, args) unless execAsap\r\n      timeout = null\r\n    \r\n    if timeout\r\n      clearTimeout(timeout)\r\n    else if (execAsap)\r\n      func.apply(obj, args)\r\n    \r\n    timeout = setTimeout delayed, threshold || 100\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.run [\"$http\", \"$timeout\", \"panels\", \"scratch\", \"url\", ($http, $timeout, panels, scratch, url) ->\r\n  panels.push new class\r\n    name: \"preview\"\r\n    order: 0\r\n    title: \"Preview your work in real-time\"\r\n    icon: \"icon-eye-open\"\r\n    template: \"\"\"\r\n      <div class=\"plnk-previewer\">\r\n        <div id=\"preview-ops\">\r\n          <div class=\"btn-toolbar\">\r\n            <div class=\"btn-group\" ng-switch on=\"windowed\">\r\n              <button id=\"refresh-preview\" ng-click=\"refreshPreview()\" class=\"btn btn-mini btn-success\" title=\"Manually trigger a refresh of the preview\"><i class=\"icon-refresh icon-white\"></i></button>\r\n              <button id=\"expand-preview\" ng-click=\"expandWindow()\" ng-switch-when=\"false\" class=\"btn btn-mini btn-primary\" title=\"Launch the preview in a separate window\"><i class=\"icon-fullscreen icon-white\"></i></button>\r\n              <button id=\"expand-preview\" ng-click=\"contractWindow()\" ng-switch-when=\"true\" class=\"btn btn-mini btn-danger\" title=\"Close the child preview window\"><i class=\"icon-remove icon-white\"></i></button>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <iframe class=\"plnk-runner overthrow\" frameborder=\"0\" width=\"100%\" height=\"100%\" scrolling=\"auto\"></iframe>\r\n      </div>\r\n    \"\"\"\r\n    watchChildWindow: ->\r\n      self = @\r\n      \r\n      if self.windowed\r\n        if self.childWindow is null or self.childWindow.closed\r\n          # We are supposed to be in windowed mode, but the user closed the child window.\r\n          # Switch back to normal mode\r\n          self.scope.contractWindow()\r\n        else\r\n          # Keep watching while windowed\r\n          $timeout angular.bind(self, self.watchChildWindow), 200\r\n    \r\n    refreshPreview: ->\r\n      self = @\r\n      json = { files: {} }\r\n      \r\n      for buffer in scratch.buffers.queue\r\n        json.files[buffer.filename] =\r\n          content: buffer.content\r\n      \r\n      unless self.windowed\r\n        self.$preview.fadeOut(\"\")\r\n      \r\n      request = $http.post(\"#{url.run}/#{@previewId}\", json, cache: false)\r\n      \r\n      request.then (response) ->\r\n        if self.windowed\r\n          if self.childWindow is null or self.childWindow.closed\r\n            self.childWindow = window.open response.data.run_url, \"plnk_previewer\", \"resizable=yes,scrollbars=yes,status=yes\"\r\n          else\r\n            self.childWindow.location.reload()\r\n          self.watchChildWindow()\r\n        else\r\n          loc = self.$preview[0].contentWindow.location\r\n          if loc is response.data.run_url\r\n            loc.reload(true)\r\n          else\r\n            loc.replace(response.data.run_url)\r\n\r\n          self.$preview.fadeIn(10).ready ->\r\n            self.badge = null\r\n\r\n        self.previewId = response.data.id\r\n        \r\n          \r\n    link: ($scope, el, attrs) ->\r\n      self = @\r\n      @el = el\r\n      @$preview = $(\".plnk-runner\", el)\r\n      @active = false\r\n      @awaiting = false\r\n      \r\n      @childWindow = null\r\n      \r\n      @previewId = \"\"\r\n      \r\n      @scope = $scope\r\n      \r\n      refresh = angular.bind(@, debounce(@refreshPreview, 750))\r\n      \r\n      $scope.scratch = scratch\r\n      $scope.refreshPreview = refresh\r\n      $scope.windowed = false\r\n      \r\n      setInterval\r\n      \r\n      $scope.expandWindow = ->\r\n        $scope.windowed = self.windowed = true\r\n        \r\n        loc = self.$preview[0].contentWindow.location.replace(\"about:blank\")\r\n        \r\n        self.refreshPreview()\r\n      \r\n      $scope.contractWindow = ->\r\n        if self.windowed\r\n          $scope.windowed = self.windowed = false\r\n          self.childWindow?.close()\r\n          \r\n          self.refreshPreview()\r\n      \r\n      handleChange = ->\r\n        if self.active\r\n          self.awaiting = false\r\n          refresh()\r\n        else\r\n          self.awaiting = true\r\n          self.badge =\r\n            class: \"badge badge-important\"\r\n            title: \"Click here to preview your changes\"\r\n            value: \"*\"\r\n      \r\n      $scope.$watch \"scratch.id\", ->\r\n        @previewId = \"\"\r\n      \r\n      $scope.$on \"buffer:change:content\", handleChange\r\n      $scope.$on \"buffer:change:filename\", handleChange\r\n      $scope.$on \"buffer:add\", handleChange\r\n      $scope.$on \"buffer:remove\", handleChange\r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      @active = false\r\n      \r\n      @$preview[0].contentWindow.location.replace(\"about:blank\")\r\n\r\n      @awaiting = true\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      \r\n      @active = true\r\n      if @awaiting\r\n        @refreshPreview()\r\n        @awaiting = false\r\n]"
  },
  {
    "path": "servers/www/assets/js/services/panes/readme.coffee",
    "content": "#= require ../../vendor/showdown\r\n#= require ../../vendor/prettify\r\n\r\n#= require ../../services/panels\r\n#= require ../../services/scratch\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.requires.push(\"ngSanitize\")\r\n\r\nmodule.filter \"markdown\", ->\r\n  converter = new Showdown.converter()\r\n  (value) -> converter.makeHtml(value)\r\n  \r\n\r\nmodule.run [ \"panels\", \"scratch\", (panels, scratch) ->\r\n  panels.push new class\r\n    name: \"readme\"\r\n    order: 1\r\n    size: \"50%\"\r\n    title: \"Show the readme for the current plunk\"\r\n    icon: \"icon-info-sign\"\r\n    hidden: true\r\n    template: \"\"\"\r\n      <div id=\"panel-readme\" ng-switch on=\"getReadme()!=null\">\r\n        <div ng-switch-when=\"true\" ng-bind-html=\"getReadme() | markdown\"></div>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n      self = @\r\n      \r\n      $scope.getReadme = ->\r\n        if buffer = scratch.buffers.findBy(\"filename\", \"README.md\")\r\n          return buffer.content\r\n        return null\r\n          \r\n      $scope.$watch \"getReadme()\", (readme) ->\r\n        self.hidden = readme == null    \r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/panes/streamer.coffee",
    "content": "#= require ../../services/panels\r\n#= require ../../services/scratch\r\n#= require ../../services/url\r\n\r\n#= require ../../directives/discussion\r\n\r\nuid = (len = 16, prefix = \"\", keyspace = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") ->\r\n  prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0\r\n  prefix\r\n\r\n\r\nsynchro = new class Synchro\r\n  constructor: (@scope) ->\r\n    @localEvents = 0\r\n    @remoteEvents = 0\r\n  \r\n  handleRemoteEvent: (cb) ->\r\n    return false if @localEvents > @remoteEvents\r\n    @remoteEvents++\r\n    cb()\r\n    @remoteEvents--\r\n    true\r\n  \r\n  handleLocalEvent: (cb) ->\r\n    return false if @remoteEvents > @localEvents\r\n    @localEvents++\r\n    cb()\r\n    @localEvents--\r\n    true\r\n\r\nresetFiles = (scratch, files) ->\r\n  # We don't want to reset the *whole* scratch here as that would result\r\n  # in changing the active plunk to a blank one. We will just adjust the\r\n  # plunk's description and tags and reset the buffers.\r\n  new_files = []\r\n  for channel, file of files\r\n    new_files.push angular.extend file,\r\n      channel: channel\r\n  \r\n  scratch.buffers.reset(new_files)\r\n  scratch.buffers.activate(index) if index = scratch.buffers.findBy(\"filename\", \"index.html\")\r\n\r\nresetScratch = (scratch, state) ->\r\n  scratch.plunk.description = state.description\r\n  scratch.plunk.tags = state.tags\r\n\r\n  resetFiles(scratch, state.files)\r\n  \r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.directive \"plunkerChannel\", [ \"stream\", (stream) ->\r\n  restrict: \"E\"\r\n  replace: true\r\n  template: \"\"\"\r\n    <div style=\"display: none;\"></div>\r\n  \"\"\"\r\n  link: ($scope, el, attr) ->\r\n    buffer = $scope.buffer\r\n    \r\n    #\r\n    finalize = (channel) ->\r\n      # Sync the content\r\n      filename = channel.at(\"filename\")\r\n      content = channel.at(\"content\")\r\n      content.attach_ace(buffer.session, stream.keep)\r\n      \r\n      # Watch for remote changes to filename\r\n      channel.on \"replace\", (key, previous, current) ->\r\n        if key is \"filename\" then synchro.handleRemoteEvent ->\r\n          $scope.$apply -> buffer.filename = current\r\n      \r\n      # Watch for local changes to filename\r\n      $scope.$watch \"buffer.filename\", (new_filename, old_filename) ->\r\n        if new_filename isnt old_filename then synchro.handleLocalEvent ->\r\n          filename.set(new_filename)\r\n      \r\n      $scope.$on \"$destroy\", ->\r\n        content.detach_ace()\r\n        \r\n        synchro.handleLocalEvent ->\r\n          channel.remove()\r\n          delete buffer.channel\r\n      \r\n      \r\n    # No channel has been created yet. This is a new file, created locally\r\n    unless buffer.channel\r\n      buffer.channel = uid(10)\r\n      \r\n      state =\r\n        filename: buffer.filename\r\n        content: buffer.content\r\n    \r\n      channel = stream.doc.at([\"files\", buffer.channel])\r\n      channel.set state, (err) ->\r\n        if err then console.error(\"Error creating channel\")\r\n        else finalize(channel)\r\n    else finalize(stream.doc.at([\"files\", buffer.channel]))\r\n]\r\n\r\nmodule.factory \"stream\", [ () ->\r\n  id: uid(16)\r\n  streaming: false\r\n  doc: null\r\n]\r\n\r\n\r\nmodule.requires.push(\"plunker.discussion\", \"plunker.url\")\r\n\r\nmodule.run [ \"$location\", \"$timeout\", \"$q\", \"panels\", \"scratch\", \"stream\", \"url\", ($location, $timeout, $q, panels, scratch, stream, url) ->\r\n  panels.push new class\r\n    name: \"streamer\"\r\n    order: 3\r\n    size: 340\r\n    title: \"Real-time collaboration\"\r\n    icon: \"icon-fire\"\r\n    template: \"\"\"\r\n      <div id=\"panel-streamer\" class=\"plnk-stream\" ng-switch=\"stream.streaming\">\r\n        <div ng-switch-when=\"streaming\">\r\n          <plunker-channel ng-repeat=\"buffer in scratch.buffers.queue\"></plunker-channel>\r\n          <div class=\"status\">\r\n            <h4>Streaming enabled</h4>\r\n            Stream: <a ng-href=\"{{url.www}}/edit/?p=streamers={{stream.id}}\" target=\"_blank\" title=\"Link to this stream\"><code class=\"stream-id\" ng-bind=\"stream.id\"></code></a>\r\n            <button class=\"btn btn-mini btn-danger\" ng-click=\"stopStream()\" title=\"Disconnect from stream\">\r\n              <i class=\"icon-stop\"></i> Disconnect\r\n            </button>\r\n          </div>\r\n          <plunker-discussion room=\"stream.id\"></plunker-discussion>\r\n        </div>\r\n        <div ng-switch-default>\r\n          <h1>Streaming</h1>\r\n          <p>\r\n            Streaming enables real-time collaboraboration on Plunker. When you\r\n            join a stream, the contents of your editor are kept in sync with the\r\n            stream and reflect changes made by others in the same stream.\r\n          </p>\r\n          <form ng-submit=\"startStream(stream.id)\">\r\n            <input class=\"mediumtext\" ng-model=\"stream.id\" size=\"32\" />\r\n            <button class=\"btn btn-primary\" type=\"submit\">Stream</button>\r\n          </form>\r\n          <h4>What happens if I hit save?</h4>\r\n          <p>\r\n            The current contents of your plunk will be saved as if you had\r\n            made all the changes to the files yourself. No one else in the stream\r\n            will be affected at all by saving your state.\r\n          </p>\r\n          <h4>What happens if I load a template?</h4>\r\n          <p>\r\n            If you load a template, the resulting files will be sent to\r\n            everyone else in the stream as if you had made the changes yourself.\r\n            This is usually not what you want to do.\r\n          </p>\r\n        </div>\r\n      </div>\r\n    \"\"\"\r\n    getConnection: ->\r\n      location = window.location\r\n      @conn ||= new sharejs.Connection(\"#{location.protocol}//#{location.host}/channel\")\r\n    \r\n    getLocalState: ->\r\n      state =\r\n        description: scratch.plunk.description\r\n        tags: scratch.plunk.tags\r\n        files: {}\r\n      state\r\n      \r\n    join: (id = uid()) ->\r\n      self = @\r\n      deferred = $q.defer()\r\n      \r\n      @getConnection().open \"stream:#{id}\", \"json\", (err, doc) ->\r\n        if err then return deferred.reject \"Stream error: Unable to join stream\"\r\n        \r\n        stream.id = id\r\n        stream.doc = doc\r\n        stream.keep = doc.created is true\r\n        stream.streaming = \"streaming\"\r\n\r\n        if stream.keep\r\n          # Reset the channel to the current local state\r\n          doc.submitOp [ { p: [], od: doc.snapshot, oi: self.getLocalState() } ], (err) ->\r\n            self.scope.$apply ->\r\n              if err\r\n                doc.close()\r\n                deferred.reject(\"Stream error: Error setting initial state\")\r\n              else\r\n                deferred.resolve(stream)\r\n        else\r\n          self.scope.$apply -> synchro.handleRemoteEvent ->\r\n            deferred.resolve(stream)\r\n      \r\n      deferred.promise\r\n    \r\n    stop: ->\r\n      self = @\r\n      \r\n      if self.doc\r\n        self.scope.scratch = null\r\n\r\n        stream.doc.close()\r\n        stream.streaming = false\r\n        stream.doc = null\r\n        stream.id = uid()\r\n          \r\n      search = $location.search()\r\n      delete search.s\r\n      \r\n      scratch.unlock()\r\n      \r\n      $location.search(search).replace()\r\n      \r\n    \r\n    start: (stream) ->\r\n      self = @\r\n      self.doc = stream.doc\r\n      \r\n      resetScratch(scratch, stream.doc.get()) unless stream.keep\r\n      \r\n      scratch.lock(\"Connected to stream\")\r\n\r\n      # Assign the scratch to the local scope which will trigger creation of\r\n      # custom directives for each channel\r\n      self.scope.scratch = scratch\r\n      \r\n      files = @doc.at(\"files\")\r\n      \r\n      files.on \"insert\", (pos, data) ->\r\n        synchro.handleRemoteEvent ->\r\n          unless scratch.buffers.findBy(\"channel\", pos)\r\n            self.scope.$apply -> scratch.buffers.add angular.extend(data, channel: pos)\r\n      \r\n      files.on \"delete\", (pos, data) ->\r\n        synchro.handleRemoteEvent ->\r\n          self.scope.$apply -> scratch.buffers.remove(buffer) if buffer = scratch.buffers.findBy(\"channel\", pos)\r\n          \r\n      search = $location.search()\r\n      search.s = stream.id\r\n      \r\n      $location.search(search).replace()\r\n      \r\n    link: ($scope, el, attrs) ->\r\n      self = @\r\n      self.scope = $scope\r\n      \r\n      synchro.scope = $scope\r\n      \r\n      $scope.url = url\r\n      $scope.stream = stream\r\n      \r\n      $scope.startStream = (id) ->\r\n        scratch.loading = true\r\n        self.join(id).then (id, doc, keep) ->\r\n          self.start(id, doc, keep)\r\n          scratch.loading = false\r\n        , (error) ->\r\n          alert(error)\r\n          scratch.loading = false\r\n      \r\n      $scope.stopStream = ->\r\n        self.stop()\r\n      \r\n      if id = $location.search().s then $timeout ->\r\n        $scope.startStream(id)\r\n      , 500 #TODO: HACK!\r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n          \r\n    activate: ($scope, el, attrs) ->\r\n]\r\n\r\n# This is some utility code to connect an ace editor to a sharejs document.\r\n\r\nRange = require(\"ace/range\").Range\r\n\r\n# Convert an ace delta into an op understood by share.js\r\napplyToShareJS = (editorDoc, delta, doc) ->\r\n  # Get the start position of the range, in no. of characters\r\n  getStartOffsetPosition = (range) ->\r\n    # This is quite inefficient - getLines makes a copy of the entire\r\n    # lines array in the document. It would be nice if we could just\r\n    # access them directly.\r\n    lines = editorDoc.getLines 0, range.start.row\r\n      \r\n    offset = 0\r\n\r\n    for line, i in lines\r\n      offset += if i < range.start.row\r\n        line.length\r\n      else\r\n        range.start.column\r\n\r\n    # Add the row number to include newlines.\r\n    offset + range.start.row\r\n\r\n  pos = getStartOffsetPosition(delta.range)\r\n\r\n  switch delta.action\r\n    when 'insertText' then doc.insert pos, delta.text\r\n    when 'removeText' then doc.del pos, delta.text.length\r\n    \r\n    when 'insertLines'\r\n      text = delta.lines.join('\\n') + '\\n'\r\n      doc.insert pos, text\r\n      \r\n    when 'removeLines'\r\n      text = delta.lines.join('\\n') + '\\n'\r\n      doc.del pos, text.length\r\n\r\n    else throw new Error \"unknown action: #{delta.action}\"\r\n  \r\n  return\r\n\r\n# Attach an ace editor to the document. The editor's contents are replaced\r\n# with the document's contents unless keepEditorContents is true. (In which case the document's\r\n# contents are nuked and replaced with the editor's).\r\nwindow.sharejs.extendDoc 'attach_ace', (session, keepEditorContents) ->\r\n  doc = this\r\n  editorDoc = session.getDocument()\r\n  editorDoc.setNewLineMode 'unix'\r\n\r\n  check = ->\r\n    window.setTimeout ->\r\n        editorText = editorDoc.getValue()\r\n        otText = doc.getText()\r\n\r\n        if editorText != otText\r\n          console.error \"Text does not match!\"\r\n          console.error \"editor: #{editorText}\"\r\n          console.error \"ot:     #{otText}\"\r\n          # Should probably also replace the editor text with the doc snapshot.\r\n      , 0\r\n\r\n  # Not needed because we ALWAYS either create a new channel or keep the old one\r\n  #if keepEditorContents\r\n  #  doc.del 0, doc.getText().length\r\n  #  doc.insert 0, editorDoc.getValue()\r\n  #else\r\n    # Already done by custom code\r\n    # editorDoc.setValue doc.getText()\r\n\r\n  check()\r\n\r\n  # When we apply ops from sharejs, ace emits edit events. We need to ignore those\r\n  # to prevent an infinite typing loop.\r\n  suppress = false\r\n  \r\n  # Listen for edits in ace\r\n  editorListener = (change) ->\r\n    return if suppress\r\n    applyToShareJS editorDoc, change.data, doc\r\n\r\n    check()\r\n\r\n  session.on 'change', editorListener\r\n\r\n  # Horribly inefficient.\r\n  offsetToPos = (offset) ->\r\n    # Again, very inefficient.\r\n    lines = editorDoc.getAllLines()\r\n\r\n    row = 0\r\n    for line, row in lines\r\n      break if offset <= line.length\r\n\r\n      # +1 for the newline.\r\n      offset -= lines[row].length + 1\r\n\r\n    row:row, column:offset\r\n\r\n  doc.on 'insert', (pos, text) ->\r\n    suppress = true\r\n    editorDoc.insert offsetToPos(pos), text\r\n    suppress = false\r\n    check()\r\n\r\n  doc.on 'delete', (pos, text) ->\r\n    suppress = true\r\n    range = Range.fromPoints offsetToPos(pos), offsetToPos(pos + text.length)\r\n    editorDoc.remove range\r\n    suppress = false\r\n    check()\r\n\r\n  doc.detach_ace = ->\r\n    session.removeListener 'change', editorListener\r\n    delete doc.detach_ace\r\n\r\n  return"
  },
  {
    "path": "servers/www/assets/js/services/panes-dev/about.coffee",
    "content": "#= require ../../directives/card\r\n\r\n#= require ../../services/panels\r\n#= require ../../services/scratch\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.requires.push(\"plunker.card\", \"plunker.scratch\")\r\n\r\nmodule.run [ \"$location\", \"panels\", \"scratch\", ($location, panels, scratch) ->\r\n  panels.push new class\r\n    name: \"about\"\r\n    order: 99\r\n    size: 304\r\n    title: \"Information about the current plunk\"\r\n    icon: \"icon-info-sign\"\r\n    template: \"\"\"\r\n      <div id=\"panel-about\">\r\n        <h1>{{plunk.description}}</h1>\r\n        <p ng-show=\"plunk.user\">\r\n          <a href=\"/users/{{plunk.user.login}}\">\r\n            <img class=\"gravatar\" ng-src=\"http://www.gravatar.com/avatar/{{plunk.user.gravatar_id}}?s=18&d=mm\" />\r\n            {{plunk.user.login}}\r\n          </a>\r\n        </p>\r\n        <div ng-show=\"plunk.fork_of\">\r\n          <h3>Fork of</h3>\r\n          <ul class=\"thumbnails cards\"><card model=\"plunk.getForkOf()\"></card></ul>\r\n        </div>\r\n        <div ng-show=\"plunk.forks\">\r\n          <h3>Forks</h3>\r\n          <ul class=\"thumbnails cards\"><card model=\"plunk\" ng-repeat=\"plunk in plunk.getForks()\"></card></ul>\r\n        </div>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n      self = @\r\n      \r\n      $scope.$watch \"scratch.plunk\", (plunk) ->\r\n        $scope.plunk = plunk\r\n      \r\n      $scope.scratch = scratch\r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      \r\n      @enabled = false\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      \r\n      @enabled = true\r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/panes-dev/compiler.coffee",
    "content": "#= require ../../vendor/jquery\r\n#= require ../../vendor/angular\r\n\r\n#= require ../../services/panels\r\n#= require ../../services/scratch\r\n\r\ndebounce = (func, wait, immediate) ->\r\n  timeout = undefined\r\n  ->\r\n    context = @\r\n    args = arguments\r\n    later = ->\r\n      timeout = null\r\n      unless immediate then func.apply(context, args)\r\n    if immediate and not timeout then func.apply(context, args)\r\n    clearTimeout(timeout)\r\n    timeout = setTimeout(later, wait)\r\n\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.run [\"$http\", \"panels\", \"scratch\", \"url\", ($http, panels, scratch) ->\r\n  panels.push new class\r\n    name: \"compiler\"\r\n    order: 1\r\n    title: \"Show/hide the live compilation and linting pane\"\r\n    icon: \"icon-magic\"\r\n    template: \"\"\"\r\n      <div class=\"plnk-compiler\">\r\n        <h1>Live compilation and linting</h1>\r\n        <p>Coming soon...</p>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      \r\n      @enabled = false\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      \r\n      @enabled = true\r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/panes-dev/discussion.coffee",
    "content": "#= require ../../vendor/angular-ui\r\n#= require ../../vendor/showdown\r\n#= require ../../vendor/prettify\r\n#= require ../../vendor/jquery.timeago\r\n\r\n#= require ../../services/panels\r\n#= require ../../services/session\r\n#= require ../../services/scratch\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.requires.push(\"ngSanitize\")\r\nmodule.requires.push(\"ui.directives\")\r\n\r\nmodule.filter \"iso8601\", ->\r\n  (value) -> (new Date(value)).toISOString()\r\n  \r\nmodule.filter \"markdown\", ->\r\n  converter = new Showdown.converter()\r\n  (value) -> converter.makeHtml(value)\r\n\r\n\r\nmodule.directive \"chatMessage\", [\"$timeout\", ($timeout) ->\r\n  restrict: \"E\"\r\n  replace: true\r\n  template: \"\"\"\r\n    <li class=\"message\">\r\n      <div class=\"body\" ng-bind-html=\"message.body | markdown\"></div>\r\n      <div class=\"meta\">\r\n        <a href=\"javascript:void(0)\" ng-click=\"targetMessage(message.user)\" ng-show=\"message.user\" title=\"{{message.user.login}}\">\r\n          <img class=\"gravatar\" ng-src=\"http://www.gravatar.com/avatar/{{message.user.gravatar_id}}?s=18&d=mm\" />\r\n          <span class=\"username existing\">{{message.user.login}}</span>\r\n        </a>\r\n        <span ng-hide=\"message.user\" title=\"{{message.anonName || 'Anonymous'}}\">\r\n          <img class=\"gravatar\" ng-src=\"http://www.gravatar.com/avatar/0?s=18&d=mm\" />\r\n          <span class=\"username\">{{message.anonName || 'Anonymous'}}</span>\r\n        </span>\r\n        <abbr class=\"timeago posted_at\" title=\"{{message.posted_at | iso8601}}\">{{message.posted_at | date:'MM/dd/yyyy @ h:mma'}}</abbr>\r\n      </div>\r\n    </li>\r\n  \"\"\"\r\n  link: ($scope, $el, attrs) ->\r\n    converter = new Showdown.converter()\r\n    \r\n    $timeout ->\r\n      $(\".timeago\", $el).timeago()\r\n      prettyPrint()\r\n    \r\n    $scope.$watch \"message.body\", (body) ->\r\n      $scope.markdown = converter.makeHtml(body)\r\n]\r\n\r\nmodule.run [ \"$timeout\", \"$location\", \"panels\", \"session\", \"scratch\", ($timeout, $location, panels, session, scratch) ->\r\n  panels.push new class\r\n    name: \"comments\"\r\n    order: 2\r\n    size: 330\r\n    title: \"Live discussion\"\r\n    icon: \"icon-comments\"\r\n    template: \"\"\"\r\n      <div id=\"panel-discussion\" class=\"overthrow\">\r\n        <ul class=\"thumbnails\">\r\n          <li class=\"user\" ng-repeat=\"(public_id, user) in users\">\r\n            <a href=\"javascript:void(0)\" ng-click=\"targetMessage(user)\" class=\"thumbnail\" title=\"{{user.login || 'Anonymous'}}\">\r\n              <img ng-src=\"http://www.gravatar.com/avatar/{{user.gravatar_id}}?s=32&d=mm\" />\r\n              <span class=\"username\" title=\"{{user.login || 'Anonymous'}}\">{{user.login || \"Anonymous\"}}</span>\r\n            </a>\r\n          </li>\r\n        </ul>\r\n        <form ng-submit=\"postChatMessage()\">\r\n          <label>Discussion:</label>\r\n          <textarea ui-keypress=\"{'ctrl-enter':'postChatMessage()'}\" id=\"comments-message\" type=\"text\" placeholder=\"Enter message...\" class=\"span4\" ng-model=\"message\"></textarea>\r\n          <span class=\"help-block\">Comments are markdown formatted.</span>\r\n          <button class=\"btn btn-primary\" ng-click=\"postChatMessage()\">Comment</button>\r\n          <span ng-hide=\"session.user\">\r\n            Posting as <strong>{{anonName}}</strong>.\r\n            <a href=\"javascript:void(0)\" ng-click=\"changeAnonymousName()\">Change</a>.\r\n          </span>\r\n        </form>\r\n        <ul id=\"chat-messages\">\r\n          <chat-message message=\"message\" ng-repeat=\"message in messages | orderBy:'posted_at':true\"></chat-message>\r\n        </ul>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n      self = @\r\n      \r\n      plunkRef = null\r\n      chatRef = null\r\n      usersRef = null\r\n      presenceRef = null\r\n\r\n      $scope.session = session\r\n      $scope.message = \"\"\r\n      $scope.messages = []\r\n      $scope.users = {}\r\n      $scope.anonName = \"Anonymous\"\r\n      \r\n      self.new_events = 0\r\n      \r\n      setOwnPresence = (presenceRef) -> $timeout ->\r\n        presenceRef.removeOnDisconnect()\r\n        presenceRef.set\r\n          login: session.user?.login or $scope.anonName\r\n          gravatar_id: session.user?.gravatar_id or 0\r\n      \r\n      handlePresenceValue = (snapshot) ->\r\n        if snapshot.val() is null then setOwnPresence(presenceRef)\r\n      \r\n      handleUsersValue = (snapshot) ->\r\n        if (users = snapshot.val()) isnt null then $scope.$apply ->\r\n          angular.copy(users, $scope.users)\r\n      \r\n      $scope.$watch \"session.user\", (user) ->\r\n        setOwnPresence(presenceRef) if presenceRef\r\n      \r\n      handleChatAdded = (snapshot) -> $timeout ->\r\n        $scope.messages.push(snapshot.val())\r\n        \r\n        unless self.active\r\n          self.new_events += 1\r\n          \r\n          self.badge =\r\n            class: \"badge #{self.badge_class_prefix}\"\r\n            title: \"You have missed #{self.new_events} events(s)\"\r\n            value: self.new_events\r\n      \r\n      $scope.$watch ( -> $location.path().slice(1)), (id) ->\r\n        $scope.messages.length = 0\r\n        \r\n        if presenceRef\r\n          presenceRef.off \"value\", handlePresenceValue\r\n          usersRef.off \"value\", handleUsersValue\r\n          presenceRef.remove()\r\n          \r\n          self.badge = null\r\n        \r\n        plunkRef = null\r\n        chatRef = null\r\n        \r\n        return unless id\r\n\r\n        plunkRef = new Firebase(\"http://filearts.firebaseio.com/#{id}/\")\r\n        chatRef = plunkRef.child(\"messages\")\r\n        usersRef = plunkRef.child(\"editors\")\r\n        presenceRef = usersRef.child(session.public_id)\r\n        \r\n        setOwnPresence(presenceRef)\r\n          \r\n        chatRef.limit(50).on \"child_added\", handleChatAdded\r\n        \r\n        presenceRef.on \"value\", handlePresenceValue\r\n        usersRef.on \"value\", handleUsersValue\r\n      \r\n      $scope.changeAnonymousName = ->\r\n        if newAnonName = prompt(\"Please enter a new name for yourself:\")\r\n          $scope.anonName = newAnonName\r\n          setOwnPresence(presenceRef) if presenceRef\r\n          \r\n      \r\n      $scope.postChatMessage = ->\r\n        if chatRef and $scope.message\r\n          message =\r\n            body: $scope.message\r\n            posted_at: +new Date\r\n          \r\n          if session.user then message.user =\r\n            login: session.user.login\r\n            gravatar_id: session.user.gravatar_id\r\n          else message.anonName = $scope.anonName\r\n          \r\n          chatRef.push(message)\r\n          \r\n          $scope.message = \"\"\r\n      \r\n      $scope.targetMessage = (user) ->\r\n        unless $scope.message then $scope.message = \"@#{user.login} \"\r\n        \r\n        $(\"#comments-message\").focus()\r\n      \r\n      $scope.scratch = scratch\r\n      $scope.session = session\r\n            \r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      \r\n      @active = false\r\n      @new_events = 0\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      \r\n      @badge_class_prefix = \"badge-important\"\r\n      @active = true\r\n      @new_events = 0\r\n      @badge = null\r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/panes-dev/settings.coffee",
    "content": "#= require ../../vendor/jquery\r\n#= require ../../vendor/angular\r\n\r\n#= require ../../services/panels\r\n\r\nmodule = angular.module(\"plunker.panels\")\r\n\r\nmodule.run [ \"panels\", (panels) ->\r\n  panels.push new class\r\n    name: \"comments\"\r\n    order: 99\r\n    size: 280\r\n    title: \"Show/hide the settings pane\"\r\n    icon: \"icon-cogs\"\r\n    template: \"\"\"\r\n      <div class=\"plnk-settings row-fluid\">\r\n        <h1>Settings</h1>\r\n        <p>Coming soon...</p>\r\n      </div>\r\n    \"\"\"\r\n          \r\n    link: ($scope, el, attrs) ->\r\n      \r\n    deactivate: ($scope, el, attrs) ->\r\n      \r\n      @enabled = false\r\n      \r\n    activate: ($scope, el, attrs) ->\r\n      \r\n      @enabled = true\r\n]\r\n"
  },
  {
    "path": "servers/www/assets/js/services/plunks.coffee",
    "content": "#= require ../vendor/jquery.cookie\r\n\r\n#= require ../services/url\r\n\r\nmodule = angular.module(\"plunker.plunks\", [\"plunker.url\"])\r\n\r\nmodule.factory \"Plunk\", [\"$http\", \"$rootScope\", \"url\", ($http, $rootScope, url) ->\r\n  class window.Plunk\r\n    @defaults:\r\n      description: \"Untitled\"\r\n      tags: []\r\n      files:\r\n        \"index.html\": {filename: \"index.html\", content: \"\"}\r\n    @base_url: \"#{url.api}/plunks\"\r\n    @query: (source, success = angular.noop, error = angular.noop) ->\r\n      plunks = []\r\n      params = sessid: $.cookie(\"plnk_session\")\r\n      \r\n      unless angular.isObject(source)\r\n        source = \r\n          url: source\r\n          \r\n      source.url ||= \"#{url.api}/plunks\"\r\n      source.page and params.p = source.page\r\n      source.size and params.pp = source.sizeji\r\n      \r\n      request = $http\r\n        method: \"GET\"\r\n        params: params\r\n        url: source.url\r\n      \r\n      request.then (response) ->\r\n        if link = response.headers(\"link\")\r\n          plunks.pager = {}\r\n          \r\n          link.replace /<([^>]+)>;\\s*rel=\"(next|prev|first|last)\"/gi, (match, href, rel) ->\r\n            plunks.pager[rel] = href\r\n        \r\n        for plunk in response.data\r\n          plunks.push new Plunk angular.extend plunk,\r\n            html_url: \"/#{plunk.id}\"\r\n            edit_url: \"/edit/#{plunk.id}\"\r\n        \r\n        success(plunks)\r\n      , (error) ->\r\n        console.log \"Error\", error\r\n        \r\n      plunks\r\n      \r\n    @get: (json, success = angular.noop, error = angular.noop) ->\r\n      plunk = new Plunk(json)\r\n      plunk.fetch(success, error)\r\n      \r\n    @create: (json, success = angular.noop, error = angular.noop) ->\r\n      plunk = new Plunk(json)\r\n      plunk.save(success, error)\r\n\r\n\r\n    constructor: (attributes = {}) ->\r\n      @reset(attributes)\r\n      \r\n      @description ||= \"Untitled\"\r\n      @files ||= {}\r\n\r\n      \r\n    reset: (attributes = {}) -> angular.copy(attributes, @)\r\n    \r\n    getForkOf: ->\r\n      if @fork_of\r\n        if angular.isString(@fork_of)\r\n          @fork_of = new Plunk(id: @fork_of)\r\n        else unless @fork_of instanceof Plunk\r\n          @fork_of = new Plunk(@fork_of)\r\n        \r\n        @fork_of.fetch() unless @fork_of.url\r\n        @fork_of\r\n    \r\n    getForks: ->\r\n      if @forks\r\n        for fork, idx in @forks\r\n          if angular.isString(fork)\r\n            @forks[idx] = new Plunk(id: fork)\r\n            @forks[idx].fetch()\r\n          unless fork instanceof Plunk\r\n            @forks[idx] = new Plunk(fork)\r\n            @forks[idx].fetch() unless fork.url\r\n\r\n        @forks\r\n          \r\n    getEditUrl: -> \"/edit/#{@id}\" if @id\r\n    getHtmlUrl: -> \"/#{@id}\" if @id\r\n    getCommentsUrl: -> @getHtmlUrl() + \"/comments\"\r\n    \r\n    isOwner: -> !@id or !!@token\r\n    \r\n    addThumbsUp: (success = angular.noop, error = angular.noop) ->\r\n      plunk = @\r\n      \r\n      request = $http\r\n        method: \"POST\"\r\n        params: sessid: $.cookie(\"plnk_session\")\r\n        url: \"#{url.api}/plunks/#{plunk.id}/thumb\"\r\n      \r\n      request.then (response) ->\r\n        plunk.thumbs = response.data.thumbs\r\n        plunk.score = response.data.score\r\n        \r\n        plunk.thumbed = true\r\n        \r\n        success(plunk, response.headers)\r\n      , error\r\n    \r\n      @      \r\n    \r\n    removeThumbsUp: (success = angular.noop, error = angular.noop) ->\r\n      plunk = @\r\n      \r\n      request = $http\r\n        method: \"DELETE\"\r\n        params: sessid: $.cookie(\"plnk_session\")\r\n        url: \"#{url.api}/plunks/#{plunk.id}/thumb\"\r\n      \r\n      request.then (response) ->\r\n        plunk.thumbs = response.data.thumbs\r\n        plunk.score = response.data.score\r\n        \r\n        plunk.thumbed = false\r\n        \r\n        success(plunk, response.headers)\r\n      , error\r\n    \r\n      @ \r\n    \r\n    fetch: (success = angular.noop, error = angular.noop) ->\r\n      plunk = @\r\n      \r\n      return @ unless plunk.id\r\n      \r\n      request = $http\r\n        method: \"GET\"\r\n        params: sessid: $.cookie(\"plnk_session\")\r\n        url: \"#{url.api}/plunks/#{plunk.id}\"\r\n      \r\n      request.then (response) ->\r\n        angular.copy(response.data, plunk)\r\n        \r\n        success(plunk, response.headers)\r\n      , error\r\n    \r\n      @\r\n      \r\n    destroy: (success = angular.noop, error = angular.noop) ->\r\n      return error(\"Impossible to delete a plunk that is not saved\") unless @id\r\n      return error(\"Impossible to delete a plunk that you do not own\") unless @token\r\n      \r\n      self = @\r\n      \r\n      path = \"#{url.api}/plunks\"\r\n      path += \"/#{self.id}\" if self.id\r\n\r\n      request = $http\r\n        method: \"DELETE\"\r\n        params: sessid: $.cookie(\"plnk_session\")\r\n        url: path\r\n          \r\n      request.then (response) ->\r\n        angular.copy({}, self)\r\n        success()\r\n      , error\r\n      \r\n      self\r\n  \r\n    fork: (a0, a1, a2) ->\r\n      self = @\r\n      \r\n      switch arguments.length\r\n        when 3\r\n          attributes = a0\r\n          success = a1\r\n          error = a2\r\n        when 2\r\n          success = a0\r\n          error = a1\r\n        when 1\r\n          attributes = a0\r\n        \r\n      success ||= angular.noop\r\n      error ||= angular.noop\r\n      \r\n      if self.id\r\n        path = \"#{url.api}/plunks/#{self.id}/forks\"\r\n        \r\n        data = attributes or \r\n          description: self.description\r\n          files: self.files\r\n            \r\n        request = $http\r\n          method: \"POST\"\r\n          params: sessid: $.cookie(\"plnk_session\")\r\n          url: path\r\n          data: data\r\n            \r\n        request.then (response) ->\r\n          #TODO: Hack around AngularJS 1.0.1 bug\r\n          tags = self.tags\r\n          \r\n          angular.copy(response.data, self)\r\n          \r\n          if angular.equals(tags, self.tags)\r\n            self.tags = tags # Reset tags to the old reference to avoid ngList bug\r\n          \r\n          success(self, response.headers)\r\n        , error\r\n      else\r\n        error(\"Fork error: Plunk does not exist\")\r\n      \r\n      self\r\n    \r\n    save: (a0, a1, a2) ->\r\n      self = @\r\n      \r\n      switch arguments.length\r\n        when 3\r\n          attributes = a0\r\n          success = a1\r\n          error = a2\r\n        when 2\r\n          success = a0\r\n          error = a1\r\n        when 1\r\n          attributes = a0\r\n        \r\n      success ||= angular.noop\r\n      error ||= angular.noop\r\n      \r\n      path = \"#{url.api}/plunks\"\r\n      path += \"/#{self.id}\" if self.id\r\n      \r\n      data = attributes or \r\n        description: self.description\r\n        files: self.files\r\n          \r\n      request = $http\r\n        method: \"POST\"\r\n        params: sessid: $.cookie(\"plnk_session\")\r\n        url: path\r\n        data: data\r\n          \r\n      request.then (response) ->\r\n        #TODO: Hack around AngularJS 1.0.1 bug\r\n        tags = self.tags\r\n        \r\n        angular.copy(response.data, self)\r\n        \r\n        if angular.equals(tags, self.tags)\r\n          self.tags = tags # Reset tags to the old reference to avoid ngList bug\r\n        \r\n        success(self, response.headers)\r\n      , error\r\n      \r\n      self\r\n      \r\n]"
  },
  {
    "path": "servers/www/assets/js/services/scratch.coffee",
    "content": "#= require ../services/plunks\r\n#= require ../services/importer\r\n#= require ../services/session\r\n#= require ../services/notifier\r\n\r\n\r\n###\r\nService representing the transient state of the editor\r\n\r\nThis service holds the single source of truth for everything related to the\r\neditor's state. It holds a reference to the active plunk that it affects upon\r\nrequest.\r\n\r\nThe scratch is a 'smart' application specific layer on top of the dumb plunk\r\ndata service.\r\n\r\nIt is important to note that changes propagate one-way from the scratch to the\r\nplunk. Making changes to the plunk directly will probably not have the desired\r\neffect.\r\n\r\n###\r\nmodule = angular.module(\"plunker.scratch\", [\"plunker.plunks\", \"plunker.importer\", \"plunker.notifier\"])\r\n\r\nmodule.factory \"scratch\", [\"$location\", \"$q\", \"Plunk\", \"importer\", \"session\", \"notifier\", ($location, $q, Plunk, importer, session, notifier) ->\r\n  ###\r\n  Class to handle the list of active buffers\r\n  ###\r\n  class Buffers\r\n    constructor: ->\r\n      @queue = []\r\n    \r\n    at: (idx = 0) -> @queue[idx]\r\n    active: -> @at(0)\r\n    \r\n    activate: (active) ->\r\n      # Take it out and put it in the front\r\n      @remove(active)\r\n      @queue.unshift(active)\r\n      @\r\n    \r\n    findBy: (key, value) ->\r\n      return object for object in @queue when object[key] == value\r\n    \r\n    add: (add) ->\r\n      @queue.push(new Buffer(add))\r\n      @\r\n    \r\n    remove: (remove) ->\r\n      if (idx = @queue.indexOf(remove)) >= 0\r\n        @queue.splice(idx, 1)\r\n      @\r\n      \r\n    reset: (queue = []) ->\r\n      @queue.length = 0\r\n      @add(item) for item in queue\r\n      @\r\n    \r\n  ###\r\n  Class representing an active file in the editor\r\n  ###\r\n  class Buffer\r\n    nextID: do ->\r\n      counter = 1\r\n      -> \"Untitled#{counter++}\"\r\n      \r\n    constructor: (attributes = {}) ->\r\n      angular.copy(attributes, @)\r\n      \r\n      @content ||= \"\"\r\n      @filename ||= @nextID()\r\n      \r\n      @old_filename = @filename if @filename\r\n    \r\n    getDelta: (file) ->\r\n      delta = {}\r\n      delta.filename = @filename unless file.filename is @filename\r\n      delta.content = @content unless file.content is @content\r\n      \r\n      return delta if delta.filename? or delta.content?\r\n      \r\n  \r\n  new class Scratch\r\n    @defaultIndex: \"\"\"\r\n      <!DOCTYPE html>\r\n      <html>\r\n      \r\n        <head lang=\"en\">\r\n          <meta charset=\"utf-8\">\r\n          <title>Custom Plunker</title>\r\n        </head>\r\n        \r\n        <body></body>\r\n        \r\n      </html>\r\n    \"\"\"\r\n    @emptyPlunk:\r\n      description: \"\"\r\n      files: { \"index.html\": {filename: \"index.html\", content: @defaultIndex} }\r\n      'private': true\r\n      \r\n    constructor: ->\r\n      @description = \"\"\r\n      @tags = []\r\n      \r\n      @buffers = new Buffers\r\n      @plunk = new Plunk()\r\n      \r\n      @reset()\r\n      \r\n      @loading = false\r\n      @locked = false\r\n    \r\n    reset: (json = Scratch.emptyPlunk, options = {}) ->\r\n      # We introduce a locking concept for the scratch to prevent unwanted operations\r\n      # from destroying a stream.\r\n      if @locked and options.ignoreLock isnt true\r\n        notifier.warning \"The active session was not reset: '#{@locked}'\"\r\n        return\r\n      \r\n      # This is an ugly hack because $location changes triggered by resetting the path to \"/\"\r\n      # will only trigger on the next tick. As a result a @loadJson would otherwise fail to\r\n      # load the desired json.\r\n      if @skipNext\r\n        @skipNext = false\r\n        return\r\n      \r\n      json.private = (!!json.private and json.private != \"false\") # This may arrive as \"true\" instead of true\r\n      \r\n      @plunk.reset(angular.copy(json))\r\n\r\n      # Save a copy of the loaded json if the plunk belongs to this session\r\n      # There is no need for a saved state if the active user is not the owner\r\n      saved = @isSaved()\r\n      owned = @isOwned()\r\n\r\n      if saved and owned\r\n        @savedState ||= {}\r\n        angular.copy(json, @savedState)\r\n      else delete @savedState\r\n      \r\n      @buffers.reset(file for filename, file of json.files)\r\n      @buffers.activate(index) if index = @buffers.findBy(\"filename\", \"index.html\")\r\n      \r\n      @skipNext = !!options.skipNext\r\n      \r\n      @\r\n    \r\n    lock: (reason) -> @locked = reason or \"Unknown\"\r\n    unlock: -> @locked = false\r\n      \r\n    _doAsync: (fn) =>\r\n      self = @\r\n      self.loading = true\r\n\r\n      deferred = $q.defer()\r\n      deferred.promise.then ->\r\n        self.loading = false\r\n      , ->\r\n        self.loading = false\r\n        \r\n      fn.call(@, deferred)\r\n      \r\n      deferred.promise\r\n    \r\n    _getDeltaJSON: (savedState) ->\r\n      json =\r\n        description: @plunk.description or \"\"\r\n        files: {}\r\n      \r\n      delete json.description if angular.equals(@plunk.description, savedState.description)\r\n      \r\n      # Just in case the old schema was still used\r\n      @savedState.tags ||= []\r\n      \r\n      json.tags = {}\r\n      \r\n      # Add *new* tags\r\n      for tagname in @plunk.tags\r\n        json.tags[tagname] = true unless savedState.tags.indexOf(tagname) >= 0\r\n      \r\n      # Remove *old* tags no longer present\r\n      for tagname in savedState.tags\r\n        json.tags[tagname] = null unless @plunk.tags.indexOf(tagname) >= 0\r\n      \r\n      # Look for files that no longer exist and mark them for deletion\r\n      for filename, file of savedState.files\r\n        json.files[filename] = null unless @buffers.findBy(\"filename\", filename)\r\n    \r\n      # Look at existing files and add deltas\r\n      for buffer in @buffers.queue\r\n        key = buffer.old_filename or buffer.filename\r\n        \r\n        if old = savedState.files[key]\r\n          # Existing file; check delta\r\n          json.files[key] = delta if delta = buffer.getDelta(old)\r\n        else\r\n          # New file\r\n          json.files[key] = content: buffer.content\r\n          \r\n      tags = false\r\n      for tagname, add of json.tags\r\n        tags = true\r\n        break\r\n      \r\n      delete json.tags unless tags\r\n      \r\n      files = false\r\n      for filename, file of json.files\r\n        files = true\r\n        break\r\n      \r\n      delete json.files unless files\r\n      \r\n      json\r\n        \r\n\r\n    _getSaveJSON: ->\r\n      json =\r\n        description: @plunk.description\r\n        files: {}\r\n      for buffer in @buffers.queue\r\n        json.files[buffer.filename] =\r\n          filename: buffer.filename\r\n          content: buffer.content\r\n      \r\n      json.tags = @plunk.tags\r\n      json.private = !!@plunk.private\r\n      \r\n      json\r\n\r\n    toJSON: -> @_getSaveJSON()\r\n    \r\n    save: -> @_doAsync (deferred) ->\r\n      self = @\r\n      \r\n      @plunk.description ||= \"Untitled\"\r\n      \r\n      json = if @savedState then @_getDeltaJSON(@savedState) else @_getSaveJSON()\r\n      \r\n      count = 0\r\n      count++ for filename, file of json.files\r\n      \r\n      if count or json.description or json.tags\r\n        old_id = @plunk.id\r\n        \r\n        @plunk.save json, (plunk) ->\r\n          angular.copy(plunk, self.savedState ||= {})\r\n          buffer.old_filename = buffer.filename for buffer in self.buffers.queue\r\n          \r\n          $location.path(\"/#{plunk.id}\")\r\n          $location.replace() unless old_id and old_id != plunk.id\r\n          \r\n          deferred.resolve(arguments...)\r\n          \r\n          notifier.success \"Save succeeded\"\r\n        , ->\r\n          deferred.reject(arguments...)\r\n          \r\n          notifier.error\r\n            title: \"Save failed\"\r\n            text: arguments.join(\", \")\r\n      else\r\n        console.warn \"Save cancelled: No changes to save\"\r\n        deferred.reject(\"Save cancelled: No changes to save\")\r\n          \r\n        notifier.warning\r\n          title: \"Save cancelled\"\r\n          text: \"No changes made to the plunk.\"\r\n\r\n    fork: (options = {}) -> @_doAsync (deferred) ->\r\n      self = @\r\n      \r\n      @plunk.description ||= \"Untitled\"\r\n      \r\n      json = @_getSaveJSON()\r\n      json.private = options.private if options.private?\r\n      \r\n      count = 0\r\n      count++ for filename, file of json.files\r\n      \r\n      if count or json.description or json.tags\r\n        old_id = @plunk.id\r\n        \r\n        @plunk.fork json, (plunk) ->\r\n          angular.copy(plunk, self.savedState ||= {})\r\n          buffer.old_filename = buffer.filename for buffer in self.buffers.queue\r\n          \r\n          $location.path(\"/#{plunk.id}\")\r\n          $location.replace() unless old_id and old_id != plunk.id\r\n          \r\n          deferred.resolve(arguments...)\r\n          \r\n          notifier.success \"Fork succeeded\"\r\n        , ->\r\n          deferred.reject(arguments...)\r\n          \r\n          notifier.error\r\n            title: \"Fork failed\"\r\n            text: arguments.join(\", \")\r\n      else\r\n        deferred.reject(\"Fork cancelled: No changes to save\")\r\n          \r\n        notifier.warning\r\n          title: \"Fork cancelled\"\r\n          text: \"No changes made to the plunk.\"\r\n        \r\n    destroy: -> @_doAsync (deferred) ->\r\n      if @isSaved() and @isOwned()\r\n        @plunk.destroy ->\r\n          @savedState = null\r\n          \r\n          deferred.resolve(arguments...)\r\n          $location.path(\"/\")\r\n          \r\n          notifier.success \"Plunk deleted\"\r\n        , ->\r\n          deferred.reject(arguments...)\r\n          \r\n          notifier.error\r\n            title: \"Delete failed\"\r\n            text: \"Unable to delete the plunk.\"\r\n\r\n    loadFrom: (source) -> @_doAsync (deferred) ->\r\n      self = @\r\n\r\n      importer.import(source).then (json) ->\r\n        self.reset(json)\r\n        deferred.resolve(@)\r\n      , (msg) ->\r\n        $location.path(\"/\")\r\n        deferred.reject(\"Import failed: #{msg}\")\r\n        notifier.error(\"Import failed: #{msg}\")\r\n        \r\n    loadJson: (json = {}, options = {}) ->\r\n      $location.path(\"/\")\r\n      @reset(json, options)\r\n      @\r\n\r\n    addFile: (filename, content = \"\") ->\r\n      if @buffers.findBy(\"filename\", filename)\r\n        notifier.warning(\"File already exists: #{filename}\")\r\n        return @\r\n      \r\n      @buffers.add\r\n        filename: filename\r\n        content: content\r\n      \r\n      @\r\n\r\n    removeFile: (filename) ->\r\n      unless buffer = @buffers.findBy(\"filename\", filename)\r\n        notifier.warning(\"Attempt to remove a non-existing file: '#{filename}'\")\r\n        return @\r\n      \r\n      @buffers.remove(buffer)\r\n      \r\n      @\r\n    \r\n    renameFile: (filename, new_filename) ->\r\n      unless buffer = @buffers.findBy(\"filename\", filename)\r\n        notifier.warning(\"Attempt to rename a non-existing file: '#{filename}'\")\r\n        return @\r\n      \r\n      buffer.filename = new_filename\r\n      \r\n      @\r\n\r\n    getFile: (filename) -> @buffers.findBy(\"filename\", filename)\r\n\r\n    isOwned: -> not @isSaved() or !!@plunk.token\r\n    isSaved: -> !!@plunk.id\r\n    isImported: -> !!@plunk.source\r\n    \r\n    promptDestroy: ->\r\n      @destroy() if confirm(\"Are you sure that you would like to destroy this plunk?\")\r\n    \r\n    promptFileAdd: (new_filename) ->\r\n      if new_filename ||= prompt(\"Please enter the name for the new file:\")\r\n        if @getFile(new_filename) then alert(\"A file already exists called: '#{new_filename}'\")\r\n        else @addFile(new_filename)\r\n    \r\n    promptFileRemove: (filename) ->\r\n      if @getFile(filename) and confirm(\"Are you sure that you would like to remove the file '#{filename}'?\")\r\n        @removeFile(filename)\r\n        @addFile(\"index.html\") unless @buffers.queue.length > 0\r\n    \r\n    promptFileRename: (filename, new_filename) ->\r\n      if @getFile(filename) and (new_filename ||= prompt(\"Please enter the name for new name for the file:\"))\r\n        if @getFile(new_filename) then alert(\"A file already exists called '#{new_filename}'\")\r\n        else @renameFile(filename, new_filename)\r\n\r\n]"
  },
  {
    "path": "servers/www/assets/js/services/session.coffee",
    "content": "#= require ../vendor/jquery.cookie\r\n\r\n#= require ../vendor/postmessage\r\n\r\n#= require ../services/url\r\n\r\n\r\nmodule = angular.module(\"plunker.session\", [\"plunker.url\"])\r\n\r\nmodule.factory \"session\", [\"$http\", \"$rootScope\", \"url\", ($http, $rootScope, url) ->\r\n  new class Session\r\n    constructor: ->\r\n      angular.copy(_plunker.session, @) if _plunker and _plunker.session\r\n      \r\n      pm.bind \"oauth:success\", angular.bind(@, @handleAuth)\r\n      pm.bind \"oauth:error\", angular.bind(@, @handleError)\r\n      \r\n      $.cookie \"plnk_session\", @id,\r\n        expires: 14 # 14 days from now\r\n        path: \"/\"\r\n    \r\n    login: (width = 1000, height = 650) ->\r\n      screenHeight = screen.height\r\n      left = Math.round((screen.width / 2) - (width / 2))\r\n      top = 0\r\n      if (screenHeight > height)\r\n          top = Math.round((screenHeight / 2) - (height / 2))\r\n          \r\n      login = window.open \"#{url.www}/auth/github\", \"Sign in with Github\", \"\"\"\r\n        left=#{left},top=#{top},width=#{width},height=#{height},personalbar=0,toolbar=0,scrollbars=1,resizable=1\r\n      \"\"\"\r\n\r\n      if login then login.focus()\r\n    \r\n    logout: ->\r\n      self = @\r\n      \r\n      request = $http\r\n        url: @user_url\r\n        method: \"DELETE\"\r\n      \r\n      request.then (response) ->\r\n        angular.copy(response.data, self)\r\n      , (error) ->\r\n        console.error \"logout:error\", arguments...\r\n    \r\n    handleError: (error) ->\r\n      console.error \"oauth:error\", arguments...\r\n        \r\n    handleAuth: (auth) ->\r\n      self = @\r\n      \r\n      request = $http\r\n        url: @user_url\r\n        method: \"POST\"\r\n        data: { service: auth.service, token: auth.token }\r\n\r\n      request.then (response) ->\r\n        angular.copy(response.data, self)\r\n      , (error) ->\r\n        console.error \"login:error\", arguments...\r\n]"
  },
  {
    "path": "servers/www/assets/js/services/url.coffee",
    "content": "module = angular.module(\"plunker.url\", [])\n\nmodule.service \"url\", [ ->\n  if _plunker and _plunker.url then _plunker.url\n  else\n    www: \"\"\n    api: \"\"\n    raw: \"\"\n]"
  },
  {
    "path": "servers/www/assets/js/services/whitelist.coffee",
    "content": "module = angular.module(\"plunker.whitelist\", [])\r\n\r\nmodule.service \"whitelist\", [\"$rootScope\", \"$location\", \"$window\", ($rootScope, $location, $window) ->\r\n  whitelist = []\r\n  \r\n  $rootScope.$on \"$locationChangeStart\", (e) ->\r\n    for exception in whitelist\r\n      if $location.path().match(exception)\r\n        #TODO: $window service reacted too slowly. possible to accelerate?\r\n        window.location = $location.path()\r\n      \r\n  whitelist\r\n]"
  },
  {
    "path": "servers/www/assets/js/socialbuttons.js",
    "content": "function initSocialButtons() {        \r\n  /* Twitter */\r\n  !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");\r\n\r\n  /* G+ */\r\n  (function() {\r\n    var po = document.createElement('script');\r\n    po.type = 'text/javascript';\r\n    po.async = true;\r\n    po.src = 'https://apis.google.com/js/plusone.js';\r\n    var s = document.getElementsByTagName('script')[0];\r\n    s.parentNode.insertBefore(po, s);\r\n  })();\r\n}"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/ace.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (require, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"\";\n\nvar global = (function() {\n    return this;\n})();\n\n// take care of the case when requirejs is used and we just need to patch it a little bit\nif (!ACE_NAMESPACE && typeof requirejs !== \"undefined\") {\n\n    var define = global.define;\n    global.define = function(id, deps, callback) {\n        if (typeof callback !== \"function\")\n            return define.apply(this, arguments);\n\n        return define(id, deps, function(require, exports, module) {\n            if (deps[2] == \"module\")\n                module.packaged = true;\n            return callback.apply(this, arguments);\n        });\n    };\n    global.define.packaged = true;\n\n    return;\n}\n\n\nvar _define = function(module, deps, payload) {\n    if (typeof module !== 'string') {\n        if (_define.original)\n            _define.original.apply(window, arguments);\n        else {\n            console.error('dropping module because define wasn\\'t a string.');\n            console.trace();\n        }\n        return;\n    }\n\n    if (arguments.length == 2)\n        payload = deps;\n\n    if (!_define.modules)\n        _define.modules = {};\n\n    _define.modules[module] = payload;\n};\nvar _require = function(parentId, module, callback) {\n    if (Object.prototype.toString.call(module) === \"[object Array]\") {\n        var params = [];\n        for (var i = 0, l = module.length; i < l; ++i) {\n            var dep = lookup(parentId, module[i]);\n            if (!dep && _require.original)\n                return _require.original.apply(window, arguments);\n            params.push(dep);\n        }\n        if (callback) {\n            callback.apply(null, params);\n        }\n    }\n    else if (typeof module === 'string') {\n        var payload = lookup(parentId, module);\n        if (!payload && _require.original)\n            return _require.original.apply(window, arguments);\n\n        if (callback) {\n            callback();\n        }\n\n        return payload;\n    }\n    else {\n        if (_require.original)\n            return _require.original.apply(window, arguments);\n    }\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = base + \"/\" + moduleName;\n\n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n\n    return moduleName;\n};\nvar lookup = function(parentId, moduleName) {\n\n    moduleName = normalizeModule(parentId, moduleName);\n\n    var module = _define.modules[moduleName];\n    if (!module) {\n        return null;\n    }\n\n    if (typeof module === 'function') {\n        var exports = {};\n        var mod = {\n            id: moduleName,\n            uri: '',\n            exports: exports,\n            packaged: true\n        };\n\n        var req = function(module, callback) {\n            return _require(moduleName, module, callback);\n        };\n\n        var returnValue = module(req, exports, mod);\n        exports = returnValue || mod.exports;\n\n        // cache the resulting module object for next time\n        _define.modules[moduleName] = exports;\n        return exports;\n    }\n\n    return module;\n};\n\nfunction exportAce(ns) {\n    var require = function(module, callback) {\n        return _require(\"\", module, callback);\n    };    \n\n    var root = global;\n    if (ns) {\n        if (!global[ns])\n            global[ns] = {};\n        root = global[ns];\n    }\n\n    if (!root.define || !root.define.packaged) {\n        _define.original = root.define;\n        root.define = _define;\n        root.define.packaged = true;\n    }\n\n    if (!root.require || !root.require.packaged) {\n        _require.original = root.require;\n        root.require = require;\n        root.require.packaged = true;\n    }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\n/**\n * class Ace\n *\n * The main class required to set up an Ace instance in the browser.\n *\n *\n **/\n\ndefine('ace/ace', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/dom', 'ace/lib/event', 'ace/editor', 'ace/edit_session', 'ace/undomanager', 'ace/virtual_renderer', 'ace/multi_select', 'ace/worker/worker_client', 'ace/keyboard/hash_handler', 'ace/keyboard/state_handler', 'ace/placeholder', 'ace/config', 'ace/theme/textmate'], function(require, exports, module) {\n\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar Dom = require(\"./lib/dom\");\nvar Event = require(\"./lib/event\");\n\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nvar MultiSelect = require(\"./multi_select\").MultiSelect;\n\n// The following require()s are for inclusion in the built ace file\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./keyboard/state_handler\");\nrequire(\"./placeholder\");\nexports.config = require(\"./config\");\nexports.edit = function(el) {\n    if (typeof(el) == \"string\") {\n        var _id = el;\n        if (!(el = document.getElementById(el))) {\n          console.log(\"can't match div #\" + _id);\n        }\n    }\n\n    if (el.env && el.env.editor instanceof Editor)\n        return el.env.editor;\n\n    var doc = new EditSession(Dom.getInnerText(el));\n    doc.setUndoManager(new UndoManager());\n    el.innerHTML = '';\n\n    var editor = new Editor(new Renderer(el, require(\"./theme/textmate\")));\n    new MultiSelect(editor);\n    editor.setSession(doc);\n\n    var env = {};\n    env.document = doc;\n    env.editor = editor;\n    editor.resize();\n    Event.addListener(window, \"resize\", function() {\n        editor.resize();\n    });\n    el.env = env;\n    // Store env on editor such that it can be accessed later on from\n    // the returned object.\n    editor.env = env;\n    return editor;\n};\n\n});\n// vim:set ts=4 sts=4 sw=4 st:\n// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright(C) 2010 XXX No License Specified\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Irakli Gozalishvili Copyright (C) 2010 MIT License\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n \ndefine('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n\n    //---------------------------------\n    //  Overriden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n\n    // Don't override `test` if it won't change anything\n    if (!compliantLastIndexIncrement) {\n        // Fix browser bug in native method\n        RegExp.prototype.test = function (str) {\n            // Use the native `exec` to skip some processing overhead, even though the overriden\n            // `exec` would take care of the `lastIndex` fix\n            var match = real.exec.call(this, str);\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n// vim: ts=4 sts=4 sw=4 expandtab\n// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License\n// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License\n// -- kossnocorp Sasha Koss XXX TODO License or CLA\n// -- bryanforbes Bryan Forbes XXX TODO License or CLA\n// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence\n// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License\n// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License\n// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain)\n// -- iwyg XXX TODO License or CLA\n// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License\n// -- xavierm02 Montillet Xavier XXX TODO License or CLA\n// -- Raynos Raynos XXX TODO License or CLA\n// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License\n// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License\n// -- lexer Alexey Zakharov XXX TODO License or CLA\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n/*\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: http://es5.github.com/ (specific links below)\n * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n *\n * @module\n */\n\n/*whatsupdoc*/\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        // 1. Let Target be the this value.\n        var target = this;\n        // 2. If IsCallable(Target) is false, throw a TypeError exception.\n        if (typeof target != \"function\")\n            throw new TypeError(); // TODO message\n        // 3. Let A be a new (possibly empty) internal list of all of the\n        //   argument values provided after thisArg (arg1, arg2 etc), in order.\n        // XXX slicedArgs will stand in for \"A\" if used\n        var args = slice.call(arguments, 1); // for normal call\n        // 4. Let F be a new native ECMAScript object.\n        // 11. Set the [[Prototype]] internal property of F to the standard\n        //   built-in Function prototype object as specified in 15.3.3.1.\n        // 12. Set the [[Call]] internal property of F as described in\n        //   15.3.4.5.1.\n        // 13. Set the [[Construct]] internal property of F as described in\n        //   15.3.4.5.2.\n        // 14. Set the [[HasInstance]] internal property of F as described in\n        //   15.3.4.5.3.\n        var bound = function () {\n\n            if (this instanceof bound) {\n                // 15.3.4.5.2 [[Construct]]\n                // When the [[Construct]] internal method of a function object,\n                // F that was created using the bind function is called with a\n                // list of arguments ExtraArgs, the following steps are taken:\n                // 1. Let target be the value of F's [[TargetFunction]]\n                //   internal property.\n                // 2. If target has no [[Construct]] internal method, a\n                //   TypeError exception is thrown.\n                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Construct]] internal \n                //   method of target providing args as the arguments.\n\n                var F = function(){};\n                F.prototype = target.prototype;\n                var self = new F;\n\n                var result = target.apply(\n                    self,\n                    args.concat(slice.call(arguments))\n                );\n                if (result !== null && Object(result) === result)\n                    return result;\n                return self;\n\n            } else {\n                // 15.3.4.5.1 [[Call]]\n                // When the [[Call]] internal method of a function object, F,\n                // which was created using the bind function is called with a\n                // this value and a list of arguments ExtraArgs, the following\n                // steps are taken:\n                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                //   property.\n                // 3. Let target be the value of F's [[TargetFunction]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the \n                //   list boundArgs in the same order followed by the same \n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Call]] internal method \n                //   of target providing boundThis as the this value and \n                //   providing args as the arguments.\n\n                // equiv: target.call(this, ...boundArgs, ...args)\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        // XXX bound.length is never writable, so don't even try\n        //\n        // 15. If the [[Class]] internal property of Target is \"Function\", then\n        //     a. Let L be the length property of Target minus the length of A.\n        //     b. Set the length own property of F to either 0 or L, whichever is \n        //       larger.\n        // 16. Else set the length own property of F to 0.\n        // 17. Set the attributes of the length own property of F to the values\n        //   specified in 15.3.5.1.\n\n        // TODO\n        // 18. Set the [[Extensible]] internal property of F to true.\n        \n        // TODO\n        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n        // 20. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and \n        //   false.\n        // 21. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower, \n        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n        //   and false.\n\n        // TODO\n        // NOTE Function objects created using Function.prototype.bind do not \n        // have a prototype property or the [[Code]], [[FormalParameters]], and\n        // [[Scope]] internal properties.\n        // XXX can't delete prototype in pure-js.\n\n        // 22. Return F.\n        return bound;\n    };\n}\n\n// Shortcut to an often accessed properties, in order to avoid multiple\n// dereference that costs universally.\n// _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n// us it in defining shortcuts.\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\n\n// If JS engine supports accessors creating shortcuts.\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\n\n//\n// Array\n// =====\n//\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return toString(obj) == \"[object Array]\";\n    };\n}\n\n// The IsCallable() check in the Array functions\n// has been replaced with a strict check on the\n// internal class of the object to trap cases where\n// the provided function was actually a regular\n// expression literal, which in V8 and\n// JavaScriptCore is a typeof \"function\".  Only in\n// V8 are regular expression literals permitted as\n// reduce parameters, so it is desirable in the\n// general case for the shim to match the more\n// strict and common behavior of rejecting regular\n// expressions.\n\n// ES5 15.4.4.18\n// http://es5.github.com/#x15.4.4.18\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var self = toObject(this),\n            thisp = arguments[1],\n            i = 0,\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (i < length) {\n            if (i in self) {\n                // Invoke the callback function with call, passing arguments:\n                // context, property value, property key, thisArg object context\n                fun.call(thisp, self[i], i, self);\n            }\n            i++;\n        }\n    };\n}\n\n// ES5 15.4.4.19\n// http://es5.github.com/#x15.4.4.19\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, self);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.20\n// http://es5.github.com/#x15.4.4.20\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = [],\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                result.push(self[i]);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.16\n// http://es5.github.com/#x15.4.4.16\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, self))\n                return false;\n        }\n        return true;\n    };\n}\n\n// ES5 15.4.4.17\n// http://es5.github.com/#x15.4.4.17\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                return true;\n        }\n        return false;\n    };\n}\n\n// ES5 15.4.4.21\n// http://es5.github.com/#x15.4.4.21\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value and an empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (++i >= length)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self)\n                result = fun.call(void 0, result, self[i], i, self);\n        }\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.22\n// http://es5.github.com/#x15.4.4.22\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value, empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (--i < 0)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        do {\n            if (i in this)\n                result = fun.call(void 0, result, self[i], i, self);\n        } while (i--);\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n\n        var i = 0;\n        if (arguments.length > 1)\n            i = toInteger(arguments[1]);\n\n        // handle negative indices\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\n// ES5 15.4.4.15\n// http://es5.github.com/#x15.4.4.15\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\nif (!Array.prototype.lastIndexOf) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n        var i = length - 1;\n        if (arguments.length > 1)\n            i = Math.min(i, toInteger(arguments[1]));\n        // handle negative indices\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i])\n                return i;\n        }\n        return -1;\n    };\n}\n\n//\n// Object\n// ======\n//\n\n// ES5 15.2.3.2\n// http://es5.github.com/#x15.2.3.2\nif (!Object.getPrototypeOf) {\n    // https://github.com/kriskowal/es5-shim/issues#issue/2\n    // http://ejohn.org/blog/objectgetprototypeof/\n    // recommended by fschaefer on github\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\n\n// ES5 15.2.3.3\n// http://es5.github.com/#x15.2.3.3\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        // If object does not owns property return undefined immediately.\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n\n        // If object has a property then it's for sure both `enumerable` and\n        // `configurable`.\n        descriptor =  { enumerable: true, configurable: true };\n\n        // If JS engine supports accessor properties then property may be a\n        // getter or setter.\n        if (supportsAccessors) {\n            // Unfortunately `__lookupGetter__` will return a getter even\n            // if object has own non getter property along with a same named\n            // inherited getter. To avoid misbehavior we temporary remove\n            // `__proto__` so that `__lookupGetter__` will return getter only\n            // if it's owned by an object.\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n\n            // Once we have getter and setter we can put values back.\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n\n                // If it was accessor property we're done and return here\n                // in order to avoid adding `value` to the descriptor.\n                return descriptor;\n            }\n        }\n\n        // If we got this far we know that object has an own property that is\n        // not an accessor so we set it as a value and return descriptor.\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\n\n// ES5 15.2.3.4\n// http://es5.github.com/#x15.2.3.4\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\n\n// ES5 15.2.3.5\n// http://es5.github.com/#x15.2.3.5\nif (!Object.create) {\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = { \"__proto__\": null };\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            // IE has no built-in implementation of `Object.getPrototypeOf`\n            // neither `__proto__`, but this manually setting `__proto__` will\n            // guarantee that `Object.getPrototypeOf` will work as expected with\n            // objects created using `Object.create`\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\n// ES5 15.2.3.6\n// http://es5.github.com/#x15.2.3.6\n\n// Patch for WebKit and IE8 standard mode\n// Designed by hax <hax.github.com>\n// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5\n// IE8 Reference:\n//     http://msdn.microsoft.com/en-us/library/dd282900.aspx\n//     http://msdn.microsoft.com/en-us/library/dd229916.aspx\n// WebKit Bugs:\n//     https://bugs.webkit.org/show_bug.cgi?id=36423\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n        // returns falsy\n    }\n}\n\n// check whether defineProperty works if it's given. Otherwise,\n// shim partially.\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n\n        // make a valiant attempt to use the real defineProperty\n        // for I8's DOM elements.\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n                // try the shim if the real one doesn't work\n            }\n        }\n\n        // If it's a data property.\n        if (owns(descriptor, \"value\")) {\n            // fail silently if \"writable\", \"enumerable\", or \"configurable\"\n            // are requested but not supported\n            /*\n            // alternate approach:\n            if ( // can't implement these features; allow false but not true\n                !(owns(descriptor, \"writable\") ? descriptor.writable : true) ||\n                !(owns(descriptor, \"enumerable\") ? descriptor.enumerable : true) ||\n                !(owns(descriptor, \"configurable\") ? descriptor.configurable : true)\n            )\n                throw new RangeError(\n                    \"This implementation of Object.defineProperty does not \" +\n                    \"support configurable, enumerable, or writable.\"\n                );\n            */\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                // As accessors are supported only on engines implementing\n                // `__proto__` we can safely override `__proto__` while defining\n                // a property to make sure that we don't hit an inherited\n                // accessor.\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                // Deleting a property anyway since getter / setter may be\n                // defined on object itself.\n                delete object[property];\n                object[property] = descriptor.value;\n                // Setting original `__proto__` back now.\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            // If we got that far then getters and setters can be defined !!\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\n\n// ES5 15.2.3.7\n// http://es5.github.com/#x15.2.3.7\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\n\n// ES5 15.2.3.8\n// http://es5.github.com/#x15.2.3.8\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.9\n// http://es5.github.com/#x15.2.3.9\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// detect a Rhino bug and patch it\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\n\n// ES5 15.2.3.10\n// http://es5.github.com/#x15.2.3.10\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.11\n// http://es5.github.com/#x15.2.3.11\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.12\n// http://es5.github.com/#x15.2.3.12\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.13\n// http://es5.github.com/#x15.2.3.13\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        // 1. If Type(O) is not Object throw a TypeError exception.\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        // 2. Return the Boolean value of the [[Extensible]] internal property of O.\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\n\n// ES5 15.2.3.14\n// http://es5.github.com/#x15.2.3.14\nif (!Object.keys) {\n    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null})\n        hasDontEnumBug = false;\n\n    Object.keys = function keys(object) {\n\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(\"Object.keys called on a non-object\");\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n\n        return keys;\n    };\n\n}\n\n//\n// Date\n// ====\n//\n\n// ES5 15.9.5.43\n// http://es5.github.com/#x15.9.5.43\n// This function returns a String value represent the instance in time \n// represented by this Date object. The format of the String is the Date Time \n// string format defined in 15.9.1.15. All fields are present in the String. \n// The time zone is always UTC, denoted by the suffix Z. If the time value of \n// this object is not a finite Number a RangeError exception is thrown.\nif (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) {\n    Date.prototype.toISOString = function toISOString() {\n        var result, length, value, year;\n        if (!isFinite(this))\n            throw new RangeError;\n\n        // the date time string format is specified in 15.9.1.15.\n        result = [this.getUTCMonth() + 1, this.getUTCDate(),\n            this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];\n        year = this.getUTCFullYear();\n        year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6);\n\n        length = result.length;\n        while (length--) {\n            value = result[length];\n            // pad months, days, hours, minutes, and seconds to have two digits.\n            if (value < 10)\n                result[length] = \"0\" + value;\n        }\n        // pad milliseconds to have three digits.\n        return year + \"-\" + result.slice(0, 2).join(\"-\") + \"T\" + result.slice(2).join(\":\") + \".\" +\n            (\"000\" + this.getUTCMilliseconds()).slice(-3) + \"Z\";\n    }\n}\n\n// ES5 15.9.4.4\n// http://es5.github.com/#x15.9.4.4\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\n\n// ES5 15.9.5.44\n// http://es5.github.com/#x15.9.5.44\n// This function provides a String representation of a Date object for use by \n// JSON.stringify (15.12.3).\nif (!Date.prototype.toJSON) {\n    Date.prototype.toJSON = function toJSON(key) {\n        // When the toJSON method is called with argument key, the following \n        // steps are taken:\n\n        // 1.  Let O be the result of calling ToObject, giving it the this\n        // value as its argument.\n        // 2. Let tv be ToPrimitive(O, hint Number).\n        // 3. If tv is a Number and is not finite, return null.\n        // XXX\n        // 4. Let toISO be the result of calling the [[Get]] internal method of\n        // O with argument \"toISOString\".\n        // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n        if (typeof this.toISOString != \"function\")\n            throw new TypeError(); // TODO message\n        // 6. Return the result of calling the [[Call]] internal method of\n        //  toISO with O as the this value and an empty argument list.\n        return this.toISOString();\n\n        // NOTE 1 The argument is ignored.\n\n        // NOTE 2 The toJSON function is intentionally generic; it does not\n        // require that its this value be a Date object. Therefore, it can be\n        // transferred to other kinds of objects for use as a method. However,\n        // it does require that any such object have a toISOString method. An\n        // object is free to use the argument key to filter its\n        // stringification.\n    };\n}\n\n// ES5 15.9.4.2\n// http://es5.github.com/#x15.9.4.2\n// based on work shared by Daniel Friesen (dantman)\n// http://gist.github.com/303249\nif (Date.parse(\"+275760-09-13T00:00:00.000Z\") !== 8.64e15) {\n    // XXX global assignment won't work in embeddings that use\n    // an alternate object for the context.\n    Date = (function(NativeDate) {\n\n        // Date.length === 7\n        var Date = function Date(Y, M, D, h, m, s, ms) {\n            var length = arguments.length;\n            if (this instanceof NativeDate) {\n                var date = length == 1 && String(Y) === Y ? // isString(Y)\n                    // We explicitly pass it through parse:\n                    new NativeDate(Date.parse(Y)) :\n                    // We have to manually make calls depending on argument\n                    // length here\n                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\n                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\n                    length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                    length >= 4 ? new NativeDate(Y, M, D, h) :\n                    length >= 3 ? new NativeDate(Y, M, D) :\n                    length >= 2 ? new NativeDate(Y, M) :\n                    length >= 1 ? new NativeDate(Y) :\n                                  new NativeDate();\n                // Prevent mixups with unfixed Date object\n                date.constructor = Date;\n                return date;\n            }\n            return NativeDate.apply(this, arguments);\n        };\n\n        // 15.9.1.15 Date Time String Format.\n        var isoDateExpression = new RegExp(\"^\" +\n            \"(\\\\d{4}|[\\+\\-]\\\\d{6})\" + // four-digit year capture or sign + 6-digit extended year\n            \"(?:-(\\\\d{2})\" + // optional month capture\n            \"(?:-(\\\\d{2})\" + // optional day capture\n            \"(?:\" + // capture hours:minutes:seconds.milliseconds\n                \"T(\\\\d{2})\" + // hours capture\n                \":(\\\\d{2})\" + // minutes capture\n                \"(?:\" + // optional :seconds.milliseconds\n                    \":(\\\\d{2})\" + // seconds capture\n                    \"(?:\\\\.(\\\\d{3}))?\" + // milliseconds capture\n                \")?\" +\n            \"(?:\" + // capture UTC offset component\n                \"Z|\" + // UTC capture\n                \"(?:\" + // offset specifier +/-hours:minutes\n                    \"([-+])\" + // sign capture\n                    \"(\\\\d{2})\" + // hours offset capture\n                    \":(\\\\d{2})\" + // minutes offset capture\n                \")\" +\n            \")?)?)?)?\" +\n        \"$\");\n\n        // Copy any custom methods a 3rd party library may have added\n        for (var key in NativeDate)\n            Date[key] = NativeDate[key];\n\n        // Copy \"native\" methods explicitly; they may be non-enumerable\n        Date.now = NativeDate.now;\n        Date.UTC = NativeDate.UTC;\n        Date.prototype = NativeDate.prototype;\n        Date.prototype.constructor = Date;\n\n        // Upgrade Date.parse to handle simplified ISO 8601 strings\n        Date.parse = function parse(string) {\n            var match = isoDateExpression.exec(string);\n            if (match) {\n                match.shift(); // kill match[0], the full match\n                // parse months, days, hours, minutes, seconds, and milliseconds\n                for (var i = 1; i < 7; i++) {\n                    // provide default values if necessary\n                    match[i] = +(match[i] || (i < 3 ? 1 : 0));\n                    // match[1] is the month. Months are 0-11 in JavaScript\n                    // `Date` objects, but 1-12 in ISO notation, so we\n                    // decrement.\n                    if (i == 1)\n                        match[i]--;\n                }\n\n                // parse the UTC offset component\n                var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop();\n\n                // compute the explicit time zone offset if specified\n                var offset = 0;\n                if (sign) {\n                    // detect invalid offsets and return early\n                    if (hourOffset > 23 || minuteOffset > 59)\n                        return NaN;\n\n                    // express the provided time zone offset in minutes. The offset is\n                    // negative for time zones west of UTC; positive otherwise.\n                    offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == \"+\" ? -1 : 1);\n                }\n\n                // Date.UTC for years between 0 and 99 converts year to 1900 + year\n                // The Gregorian calendar has a 400-year cycle, so \n                // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...),\n                // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years\n                var year = +match[0];\n                if (0 <= year && year <= 99) {\n                    match[0] = year + 400;\n                    return NativeDate.UTC.apply(this, match) + offset - 12622780800000;\n                }\n\n                // compute a new UTC date value, accounting for the optional offset\n                return NativeDate.UTC.apply(this, match) + offset;\n            }\n            return NativeDate.parse.apply(this, arguments);\n        };\n\n        return Date;\n    })(Date);\n}\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.20\n// http://es5.github.com/#x15.5.4.20\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n    // http://perfectionkills.com/whitespace-deviations/\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\n//\n// Util\n// ======\n//\n\n// ES5 9.4\n// http://es5.github.com/#x9.4\n// http://jsperf.com/to-integer\nvar toInteger = function (n) {\n    n = +n;\n    if (n !== n) // isNaN\n        n = 0;\n    else if (n !== 0 && n !== (1/0) && n !== -(1/0))\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    return n;\n};\n\nvar prepareString = \"a\"[0] != \"a\",\n    // ES5 9.9\n    // http://es5.github.com/#x9.9\n    toObject = function (o) {\n        if (o == null) { // this matches both null and undefined\n            throw new TypeError(); // TODO message\n        }\n        // If the implementation doesn't support by-index access of\n        // string characters (ex. IE < 7), split the string\n        if (prepareString && typeof o == \"string\" && o) {\n            return o.split(\"\");\n        }\n        return Object(o);\n    };\n});\n\ndefine('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.createElement = function(tag, ns) {\n    return document.createElementNS ?\n           document.createElementNS(ns || XHTML_NS, tag) :\n           document.createElement(tag);\n};\n\nexports.setText = function(elem, text) {\n    if (elem.innerText !== undefined) {\n        elem.innerText = text;\n    }\n    if (elem.textContent !== undefined) {\n        elem.textContent = text;\n    }\n};\n\nexports.hasCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n    if (!exports.hasCssClass(el, name)) {\n        el.className += \" \" + name;\n    }\n};\nexports.removeCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        classes.splice(index, 1);\n    }\n    el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g), add = true;\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        add = false;\n        classes.splice(index, 1);\n    }\n    if(add)\n        classes.push(name);\n\n    el.className = classes.join(\" \");\n    return add;\n};\nexports.setCssClass = function(node, className, include) {\n    if (include) {\n        exports.addCssClass(node, className);\n    } else {\n        exports.removeCssClass(node, className);\n    }\n};\n\nexports.hasCssString = function(id, doc) {\n    var index = 0, sheets;\n    doc = doc || document;\n\n    if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n        while (index < sheets.length)\n            if (sheets[index++].owningElement.id === id) return true;\n    } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n        while (index < sheets.length)\n            if (sheets[index++].id === id) return true;\n    }\n\n    return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n    doc = doc || document;\n    // If style is already imported return immediately.\n    if (id && exports.hasCssString(id, doc))\n        return null;\n    \n    var style;\n    \n    if (doc.createStyleSheet) {\n        style = doc.createStyleSheet();\n        style.cssText = cssText;\n        if (id)\n            style.owningElement.id = id;\n    } else {\n        style = doc.createElementNS\n            ? doc.createElementNS(XHTML_NS, \"style\")\n            : doc.createElement(\"style\");\n\n        style.appendChild(doc.createTextNode(cssText));\n        if (id)\n            style.id = id;\n\n        var head = doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n        head.appendChild(style);\n    }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n    if (doc.createStyleSheet) {\n        doc.createStyleSheet(uri);\n    } else {\n        var link = exports.createElement('link');\n        link.rel = 'stylesheet';\n        link.href = uri;\n\n        var head = doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n        head.appendChild(link);\n    }\n};\n\nexports.getInnerWidth = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n        element.clientWidth\n    );\n};\n\nexports.getInnerHeight = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n        element.clientHeight\n    );\n};\n\nif (window.pageYOffset !== undefined) {\n    exports.getPageScrollTop = function() {\n        return window.pageYOffset;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return window.pageXOffset;\n    };\n}\nelse {\n    exports.getPageScrollTop = function() {\n        return document.body.scrollTop;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return document.body.scrollLeft;\n    };\n}\n\nif (window.getComputedStyle)\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n        return window.getComputedStyle(element, \"\") || {};\n    };\nelse\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return element.currentStyle[style];\n        return element.currentStyle;\n    };\n\nexports.scrollbarWidth = function(document) {\n\n    var inner = exports.createElement(\"p\");\n    inner.style.width = \"100%\";\n    inner.style.minWidth = \"0px\";\n    inner.style.height = \"200px\";\n\n    var outer = exports.createElement(\"div\");\n    var style = outer.style;\n\n    style.position = \"absolute\";\n    style.left = \"-10000px\";\n    style.overflow = \"hidden\";\n    style.width = \"200px\";\n    style.minWidth = \"0px\";\n    style.height = \"150px\";\n\n    outer.appendChild(inner);\n\n    var body = document.body || document.documentElement;\n    body.appendChild(outer);\n\n    var noScrollbar = inner.offsetWidth;\n\n    style.overflow = \"scroll\";\n    var withScrollbar = inner.offsetWidth;\n\n    if (noScrollbar == withScrollbar) {\n        withScrollbar = outer.clientWidth;\n    }\n\n    body.removeChild(outer);\n\n    return noScrollbar-withScrollbar;\n};\nexports.setInnerHtml = function(el, innerHtml) {\n    var element = el.cloneNode(false);//document.createElement(\"div\");\n    element.innerHTML = innerHtml;\n    el.parentNode.replaceChild(element, el);\n    return element;\n};\n\nexports.setInnerText = function(el, innerText) {\n    var document = el.ownerDocument;\n    if (document.body && \"textContent\" in document.body)\n        el.textContent = innerText;\n    else\n        el.innerText = innerText;\n\n};\n\nexports.getInnerText = function(el) {\n    var document = el.ownerDocument;\n    if (document.body && \"textContent\" in document.body)\n        return el.textContent;\n    else\n         return el.innerText || el.textContent || \"\";\n};\n\nexports.getParentWindow = function(document) {\n    return document.defaultView || document.parentWindow;\n};\n\n});\n\ndefine('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent', 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar keys = require(\"./keys\");\nvar useragent = require(\"./useragent\");\nvar dom = require(\"./dom\");\n\nexports.addListener = function(elem, type, callback) {\n    if (elem.addEventListener) {\n        return elem.addEventListener(type, callback, false);\n    }\n    if (elem.attachEvent) {\n        var wrapper = function() {\n            callback(window.event);\n        };\n        callback._wrapper = wrapper;\n        elem.attachEvent(\"on\" + type, wrapper);\n    }\n};\n\nexports.removeListener = function(elem, type, callback) {\n    if (elem.removeEventListener) {\n        return elem.removeEventListener(type, callback, false);\n    }\n    if (elem.detachEvent) {\n        elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n    }\n};\nexports.stopEvent = function(e) {\n    exports.stopPropagation(e);\n    exports.preventDefault(e);\n    return false;\n};\n\nexports.stopPropagation = function(e) {\n    if (e.stopPropagation)\n        e.stopPropagation();\n    else\n        e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n    if (e.preventDefault)\n        e.preventDefault();\n    else\n        e.returnValue = false;\n};\nexports.getButton = function(e) {\n    if (e.type == \"dblclick\")\n        return 0;\n    if (e.type == \"contextmenu\" || (e.ctrlKey && useragent.isMac))\n        return 2;\n\n    // DOM Event\n    if (e.preventDefault) {\n        return e.button;\n    }\n    // old IE\n    else {\n        return {1:0, 2:2, 4:1}[e.button];\n    }\n};\n\nif (document.documentElement.setCapture) {\n    exports.capture = function(el, eventHandler, releaseCaptureHandler) {\n        var called = false;\n        function onReleaseCapture(e) {\n            eventHandler(e);\n\n            if (!called) {\n                called = true;\n                releaseCaptureHandler(e);\n            }\n\n            exports.removeListener(el, \"mousemove\", eventHandler);\n            exports.removeListener(el, \"mouseup\", onReleaseCapture);\n            exports.removeListener(el, \"losecapture\", onReleaseCapture);\n\n            el.releaseCapture();\n        }\n\n        exports.addListener(el, \"mousemove\", eventHandler);\n        exports.addListener(el, \"mouseup\", onReleaseCapture);\n        exports.addListener(el, \"losecapture\", onReleaseCapture);\n        el.setCapture();\n    };\n}\nelse {\n    exports.capture = function(el, eventHandler, releaseCaptureHandler) {\n        function onMouseUp(e) {\n            eventHandler && eventHandler(e);\n            releaseCaptureHandler && releaseCaptureHandler(e);\n\n            document.removeEventListener(\"mousemove\", eventHandler, true);\n            document.removeEventListener(\"mouseup\", onMouseUp, true);\n\n            e.stopPropagation();\n        }\n\n        document.addEventListener(\"mousemove\", eventHandler, true);\n        document.addEventListener(\"mouseup\", onMouseUp, true);\n    };\n}\n\nexports.addMouseWheelListener = function(el, callback) {\n    var factor = 8;\n    var listener = function(e) {\n        if (e.wheelDelta !== undefined) {\n            if (e.wheelDeltaX !== undefined) {\n                e.wheelX = -e.wheelDeltaX / factor;\n                e.wheelY = -e.wheelDeltaY / factor;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = -e.wheelDelta / factor;\n            }\n        }\n        else {\n            if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n                e.wheelX = (e.detail || 0) * 5;\n                e.wheelY = 0;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = (e.detail || 0) * 5;\n            }\n        }\n        callback(e);\n    };\n    exports.addListener(el, \"DOMMouseScroll\", listener);\n    exports.addListener(el, \"mousewheel\", listener);\n};\n\nexports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) {\n    var clicks = 0;\n    var startX, startY, timer;\n    var eventNames = {\n        2: \"dblclick\",\n        3: \"tripleclick\",\n        4: \"quadclick\"\n    };\n\n    exports.addListener(el, \"mousedown\", function(e) {\n        if (exports.getButton(e) != 0) {\n            clicks = 0;\n        } else {\n            var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n\n            if (!timer || isNewClick)\n                clicks = 0;\n\n            clicks += 1;\n\n            if (timer)\n                clearTimeout(timer)\n            timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n        }\n        if (clicks == 1) {\n            startX = e.clientX;\n            startY = e.clientY;\n        }\n\n        eventHandler[callbackName](\"mousedown\", e);\n\n        if (clicks > 4)\n            clicks = 0;\n        else if (clicks > 1)\n            return eventHandler[callbackName](eventNames[clicks], e);\n    });\n\n    if (useragent.isOldIE) {\n        exports.addListener(el, \"dblclick\", function(e) {\n            clicks = 2;\n            if (timer)\n                clearTimeout(timer);\n            timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n            eventHandler[callbackName](\"mousedown\", e);\n            eventHandler[callbackName](eventNames[clicks], e);\n        });\n    }\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n    var hashId = 0;\n    if ((useragent.isOpera && !(\"KeyboardEvent\" in window)) && useragent.isMac) {\n        hashId = 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0)\n            | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n    } else {\n        hashId = 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0)\n            | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n    }\n\n    if (keyCode in keys.MODIFIER_KEYS) {\n        switch (keys.MODIFIER_KEYS[keyCode]) {\n            case \"Alt\":\n                hashId = 2;\n                break;\n            case \"Shift\":\n                hashId = 4;\n                break;\n            case \"Ctrl\":\n                hashId = 1;\n                break;\n            default:\n                hashId = 8;\n                break;\n        }\n        keyCode = 0;\n    }\n\n    if (hashId & 8 && (keyCode == 91 || keyCode == 93)) {\n        keyCode = 0;\n    }\n\n    // If there is no hashID and the keyCode is not a function key, then\n    // we don't call the callback as we don't handle a command key here\n    // (it's a normal key/character input).\n    if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n        return false;\n    }\n    return callback(e, hashId, keyCode);\n}\n\nexports.addCommandKeyListener = function(el, callback) {\n    var addListener = exports.addListener;\n    if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n        // Old versions of Gecko aka. Firefox < 4.0 didn't repeat the keydown\n        // event if the user pressed the key for a longer time. Instead, the\n        // keydown event was fired once and later on only the keypress event.\n        // To emulate the 'right' keydown behavior, the keyCode of the initial\n        // keyDown event is stored and in the following keypress events the\n        // stores keyCode is used to emulate a keyDown event.\n        var lastKeyDownKeyCode = null;\n        addListener(el, \"keydown\", function(e) {\n            lastKeyDownKeyCode = e.keyCode;\n        });\n        addListener(el, \"keypress\", function(e) {\n            return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n        });\n    } else {\n        var lastDown = null;\n\n        addListener(el, \"keydown\", function(e) {\n            lastDown = e.keyIdentifier || e.keyCode;\n            return normalizeCommandKeys(callback, e, e.keyCode);\n        });\n    }\n};\n\nif (window.postMessage && !useragent.isOldIE) {\n    var postMessageId = 1;\n    exports.nextTick = function(callback, win) {\n        win = win || window;\n        var messageName = \"zero-timeout-message-\" + postMessageId;            \n        exports.addListener(win, \"message\", function listener(e) {\n            if (e.data == messageName) {\n                exports.stopPropagation(e);\n                exports.removeListener(win, \"message\", listener);\n                callback();\n            }\n        });\n        win.postMessage(messageName, \"*\");\n    };\n}\nelse {\n    exports.nextTick = function(callback, win) {\n        win = win || window;\n        window.setTimeout(callback, 0);\n    };\n}\n\n});\n\n// Most of the following code is taken from SproutCore with a few changes.\n\ndefine('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n    var ret = {\n        MODIFIER_KEYS: {\n            16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n        },\n\n        KEY_MODS: {\n            \"ctrl\": 1, \"alt\": 2, \"option\" : 2,\n            \"shift\": 4, \"meta\": 8, \"command\": 8\n        },\n\n        FUNCTION_KEYS : {\n            8  : \"Backspace\",\n            9  : \"Tab\",\n            13 : \"Return\",\n            19 : \"Pause\",\n            27 : \"Esc\",\n            32 : \"Space\",\n            33 : \"PageUp\",\n            34 : \"PageDown\",\n            35 : \"End\",\n            36 : \"Home\",\n            37 : \"Left\",\n            38 : \"Up\",\n            39 : \"Right\",\n            40 : \"Down\",\n            44 : \"Print\",\n            45 : \"Insert\",\n            46 : \"Delete\",\n            96 : \"Numpad0\",\n            97 : \"Numpad1\",\n            98 : \"Numpad2\",\n            99 : \"Numpad3\",\n            100: \"Numpad4\",\n            101: \"Numpad5\",\n            102: \"Numpad6\",\n            103: \"Numpad7\",\n            104: \"Numpad8\",\n            105: \"Numpad9\",\n            112: \"F1\",\n            113: \"F2\",\n            114: \"F3\",\n            115: \"F4\",\n            116: \"F5\",\n            117: \"F6\",\n            118: \"F7\",\n            119: \"F8\",\n            120: \"F9\",\n            121: \"F10\",\n            122: \"F11\",\n            123: \"F12\",\n            144: \"Numlock\",\n            145: \"Scrolllock\"\n        },\n\n        PRINTABLE_KEYS: {\n           32: ' ',  48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',\n           54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',\n           66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',\n           73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',\n           80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',\n           87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',\n          188: ',', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\\\',\n          221: ']', 222: '\\''\n        }\n    };\n\n    // A reverse map of FUNCTION_KEYS\n    for (var i in ret.FUNCTION_KEYS) {\n        var name = ret.FUNCTION_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n\n    // Add the MODIFIER_KEYS, FUNCTION_KEYS and PRINTABLE_KEYS to the KEY\n    // variables as well.\n    oop.mixin(ret, ret.MODIFIER_KEYS);\n    oop.mixin(ret, ret.PRINTABLE_KEYS);\n    oop.mixin(ret, ret.FUNCTION_KEYS);\n\n    // aliases\n    ret.enter = ret[\"return\"];\n    ret.escape = ret.esc;\n    ret.del = ret[\"delete\"];\n    \n    // workaround for firefox bug\n    ret[173] = '-';\n\n    return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n    return (Keys[keyCode] || String.fromCharCode(keyCode)).toLowerCase();\n}\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var tempCtor = function() {};\n    return function(ctor, superCtor) {\n        tempCtor.prototype = superCtor.prototype;\n        ctor.super_ = superCtor.prototype;\n        ctor.prototype = new tempCtor();\n        ctor.prototype.constructor = ctor;\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\ndefine('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\n\n// Is the user using a browser that identifies itself as Windows\nexports.isWin = (os == \"win\");\n\n// Is the user using a browser that identifies itself as Mac OS\nexports.isMac = (os == \"mac\");\n\n// Is the user using a browser that identifies itself as Linux\nexports.isLinux = (os == \"linux\");\n\nexports.isIE = \n    navigator.appName == \"Microsoft Internet Explorer\"\n    && parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\\.0-9]+)/)[1]);\n    \nexports.isOldIE = exports.isIE && exports.isIE < 9;\n\n// Is this Firefox or related?\nexports.isGecko = exports.isMozilla = window.controllers && window.navigator.product === \"Gecko\";\n\n// oldGecko == rev < 2.0 \nexports.isOldGecko = exports.isGecko && parseInt((navigator.userAgent.match(/rv\\:(\\d+)/)||[])[1], 10) < 4;\n\n// Is this Opera \nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\n\n// Is the user using a browser that identifies itself as WebKit \nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isTouchPad = ua.indexOf(\"TouchPad\") >= 0;\nexports.OS = {\n    LINUX: \"LINUX\",\n    MAC: \"MAC\",\n    WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n    if (exports.isMac) {\n        return exports.OS.MAC;\n    } else if (exports.isLinux) {\n        return exports.OS.LINUX;\n    } else {\n        return exports.OS.WINDOWS;\n    }\n};\n\n});\n\ndefine('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands'], function(require, exports, module) {\n\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar useragent = require(\"./lib/useragent\");\nvar TextInput = require(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = require(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = require(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = require(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar Search = require(\"./search\").Search;\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = require(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = require(\"./commands/default_commands\").commands;\n\n/**\n * new Editor(renderer, session)\n * - renderer (VirtualRenderer): Associated `VirtualRenderer` that draws everything\n * - session (EditSession): The `EditSession` to refer to\n *\n * Creates a new `Editor` object.\n *\n **/\nvar Editor = function(renderer, session) {\n    var container = renderer.getContainerElement();\n    this.container = container;\n    this.renderer = renderer;\n\n    this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n    this.textInput  = new TextInput(renderer.getTextAreaContainer(), this);\n    this.renderer.textarea = this.textInput.getElement();\n    this.keyBinding = new KeyBinding(this);\n\n    // TODO detect touch event support\n    this.$mouseHandler = new MouseHandler(this);\n    new FoldHandler(this);\n\n    this.$blockScrolling = 0;\n    this.$search = new Search().set({\n        wrap: true\n    });\n\n    this.setSession(session || new EditSession(\"\"));\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n    this.setKeyboardHandler = function(keyboardHandler) {\n        this.keyBinding.setKeyboardHandler(keyboardHandler);\n    };\n    this.getKeyboardHandler = function() {\n        return this.keyBinding.getKeyboardHandler();\n    };\n    /**\n     * Editor@changeSession(e) \n     * - e (Object): An object with two properties, `oldSession` and `session`, that represent the old and new [[EditSession]]s.\n     *\n     * Emitted whenever the [[EditSession]] changes.\n     **/\n    this.setSession = function(session) {\n        if (this.session == session)\n            return;\n\n        if (this.session) {\n            var oldSession = this.session;\n            this.session.removeEventListener(\"change\", this.$onDocumentChange);\n            this.session.removeEventListener(\"changeMode\", this.$onChangeMode);\n            this.session.removeEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n            this.session.removeEventListener(\"changeTabSize\", this.$onChangeTabSize);\n            this.session.removeEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n            this.session.removeEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n            this.session.removeEventListener(\"onChangeFold\", this.$onChangeFold);\n            this.session.removeEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n            this.session.removeEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n            this.session.removeEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n            this.session.removeEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n            this.session.removeEventListener(\"changeOverwrite\", this.$onCursorChange);\n            this.session.removeEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n            this.session.removeEventListener(\"changeLeftTop\", this.$onScrollLeftChange);\n\n            var selection = this.session.getSelection();\n            selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n            selection.removeEventListener(\"changeSelection\", this.$onSelectionChange);\n        }\n\n        this.session = session;\n\n        this.$onDocumentChange = this.onDocumentChange.bind(this);\n        session.addEventListener(\"change\", this.$onDocumentChange);\n        this.renderer.setSession(session);\n\n        this.$onChangeMode = this.onChangeMode.bind(this);\n        session.addEventListener(\"changeMode\", this.$onChangeMode);\n\n        this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n        session.addEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n\n        this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n        session.addEventListener(\"changeTabSize\", this.$onChangeTabSize);\n\n        this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n        session.addEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n\n        this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n        session.addEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n\n        this.$onChangeFold = this.onChangeFold.bind(this);\n        session.addEventListener(\"changeFold\", this.$onChangeFold);\n\n        this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n        this.session.addEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n\n        this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n        this.session.addEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n\n        this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n        this.session.addEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n\n        this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n        this.session.addEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n\n        this.$onCursorChange = this.onCursorChange.bind(this);\n        this.session.addEventListener(\"changeOverwrite\", this.$onCursorChange);\n\n        this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n        this.session.addEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n\n        this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n        this.session.addEventListener(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n        this.selection = session.getSelection();\n        this.selection.addEventListener(\"changeCursor\", this.$onCursorChange);\n\n        this.$onSelectionChange = this.onSelectionChange.bind(this);\n        this.selection.addEventListener(\"changeSelection\", this.$onSelectionChange);\n\n        this.onChangeMode();\n\n        this.$blockScrolling += 1;\n        this.onCursorChange();\n        this.$blockScrolling -= 1;\n\n        this.onScrollTopChange();\n        this.onScrollLeftChange();\n        this.onSelectionChange();\n        this.onChangeFrontMarker();\n        this.onChangeBackMarker();\n        this.onChangeBreakpoint();\n        this.onChangeAnnotation();\n        this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n        this.renderer.updateFull();\n\n        this._emit(\"changeSession\", {\n            session: session,\n            oldSession: oldSession\n        });\n    };\n    this.getSession = function() {\n        return this.session;\n    };\n    this.setValue = function(val, cursorPos) {\n        this.session.doc.setValue(val);\n\n        if (!cursorPos)\n            this.selectAll();\n        else if (cursorPos == 1)\n            this.navigateFileEnd();\n        else if (cursorPos == -1)\n            this.navigateFileStart();\n\n        return val;\n    };\n    this.getValue = function() {\n        return this.session.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.resize = function(force) {\n        this.renderer.onResize(force);\n    };\n    this.setTheme = function(theme) {\n        this.renderer.setTheme(theme);\n    };\n    this.getTheme = function() {\n        return this.renderer.getTheme();\n    };\n    this.setStyle = function(style) {\n        this.renderer.setStyle(style);\n    };\n    this.unsetStyle = function(style) {\n        this.renderer.unsetStyle(style);\n    };\n    this.setFontSize = function(size) {\n        this.container.style.fontSize = size;\n        this.renderer.updateFontSize();\n    };\n    this.$highlightBrackets = function() {\n        if (this.session.$bracketHighlight) {\n            this.session.removeMarker(this.session.$bracketHighlight);\n            this.session.$bracketHighlight = null;\n        }\n\n        if (this.$highlightPending) {\n            return;\n        }\n\n        // perform highlight async to not block the browser during navigation\n        var self = this;\n        this.$highlightPending = true;\n        setTimeout(function() {\n            self.$highlightPending = false;\n\n            var pos = self.session.findMatchingBracket(self.getCursorPosition());\n            if (pos) {\n                var range = new Range(pos.row, pos.column, pos.row, pos.column+1);\n                self.session.$bracketHighlight = self.session.addMarker(range, \"ace_bracket\", \"text\");\n            }\n        }, 10);\n    };\n    this.focus = function() {\n        // Safari needs the timeout\n        // iOS and Firefox need it called immediately\n        // to be on the save side we do both\n        var _self = this;\n        setTimeout(function() {\n            _self.textInput.focus();\n        });\n        this.textInput.focus();\n    };\n    this.isFocused = function() {\n        return this.textInput.isFocused();\n    };\n    this.blur = function() {\n        this.textInput.blur();\n    };\n    this.onFocus = function() {\n        if (this.$isFocused)\n            return;\n        this.$isFocused = true;\n        this.renderer.showCursor();\n        this.renderer.visualizeFocus();\n        this._emit(\"focus\");\n    };\n    this.onBlur = function() {\n        if (!this.$isFocused)\n            return;\n        this.$isFocused = false;\n        this.renderer.hideCursor();\n        this.renderer.visualizeBlur();\n        this._emit(\"blur\");\n    };\n\n    this.$cursorChange = function() {\n        this.renderer.updateCursor();\n    };\n    this.onDocumentChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n        var lastRow;\n\n        if (range.start.row == range.end.row && delta.action != \"insertLines\" && delta.action != \"removeLines\")\n            lastRow = range.end.row;\n        else\n            lastRow = Infinity;\n        this.renderer.updateLines(range.start.row, lastRow);\n\n        this._emit(\"change\", e);\n\n        // update cursor because tab characters can influence the cursor position\n        this.$cursorChange();\n    };\n\n    this.onTokenizerUpdate = function(e) {\n        var rows = e.data;\n        this.renderer.updateLines(rows.first, rows.last);\n    };\n\n\n    this.onScrollTopChange = function() {\n        this.renderer.scrollToY(this.session.getScrollTop());\n    };\n    \n    this.onScrollLeftChange = function() {\n        this.renderer.scrollToX(this.session.getScrollLeft());\n    };\n    this.onCursorChange = function() {\n        this.$cursorChange();\n\n        if (!this.$blockScrolling) {\n            this.renderer.scrollCursorIntoView();\n        }\n\n        this.$highlightBrackets();\n        this.$updateHighlightActiveLine();\n        this._emit(\"changeSelection\");\n    };\n    this.$updateHighlightActiveLine = function() {\n        var session = this.getSession();\n\n        if (session.$highlightLineMarker)\n            session.removeMarker(session.$highlightLineMarker);\n\n        session.$highlightLineMarker = null;\n\n        if (this.$highlightActiveLine) {\n            var cursor = this.getCursorPosition();\n            var foldLine = this.session.getFoldLine(cursor.row);\n\n            if ((this.getSelectionStyle() != \"line\" || !this.selection.isMultiLine())) {\n                var range;\n                if (foldLine) {\n                    range = new Range(foldLine.start.row, 0, foldLine.end.row + 1, 0);\n                } else {\n                    range = new Range(cursor.row, 0, cursor.row+1, 0);\n                }\n                session.$highlightLineMarker = session.addMarker(range, \"ace_active_line\", \"background\");\n            }\n        }\n    };\n\n\n    this.onSelectionChange = function(e) {\n        var session = this.session;\n\n        if (session.$selectionMarker) {\n            session.removeMarker(session.$selectionMarker);\n        }\n        session.$selectionMarker = null;\n\n        if (!this.selection.isEmpty()) {\n            var range = this.selection.getRange();\n            var style = this.getSelectionStyle();\n            session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n        } else {\n            this.$updateHighlightActiveLine();\n        }\n\n        var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp()\n        this.session.highlight(re);\n        \n        this._emit(\"changeSelection\");\n    };\n\n    this.$getSelectionHighLightRegexp = function() {\n        var session = this.session;\n\n        var selection = this.getSelectionRange();\n        if (selection.isEmpty() || selection.isMultiLine())\n            return;\n\n        var startOuter = selection.start.column - 1;\n        var endOuter = selection.end.column + 1;\n        var line = session.getLine(selection.start.row);\n        var lineCols = line.length;\n        var needle = line.substring(Math.max(startOuter, 0),\n                                    Math.min(endOuter, lineCols));\n\n        // Make sure the outer characters are not part of the word.\n        if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n            (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n            return;\n\n        needle = line.substring(selection.start.column, selection.end.column);\n        if (!/^[\\w\\d]+$/.test(needle))\n            return;\n\n        var re = this.$search.$assembleRegExp({\n            wholeWord: true,\n            caseSensitive: true,\n            needle: needle\n        });\n\n        return re;\n    };\n\n\n    this.onChangeFrontMarker = function() {\n        this.renderer.updateFrontMarkers();\n    };\n\n    this.onChangeBackMarker = function() {\n        this.renderer.updateBackMarkers();\n    };\n\n\n    this.onChangeBreakpoint = function() {\n        this.renderer.updateBreakpoints();\n    };\n\n    this.onChangeAnnotation = function() {\n        this.renderer.setAnnotations(this.session.getAnnotations());\n    };\n\n\n    this.onChangeMode = function() {\n        this.renderer.updateText();\n    };\n\n\n    this.onChangeWrapLimit = function() {\n        this.renderer.updateFull();\n    };\n\n    this.onChangeWrapMode = function() {\n        this.renderer.onResize(true);\n    };\n\n\n    this.onChangeFold = function() {\n        // Update the active line marker as due to folding changes the current\n        // line range on the screen might have changed.\n        this.$updateHighlightActiveLine();\n        // TODO: This might be too much updating. Okay for now.\n        this.renderer.updateFull();\n    };\n    /**\n     * Editor@copy(text)\n     * - text (String): The copied text\n     *\n     * Emitted when text is copied.\n     **/\n    this.getCopyText = function() {\n        var text = \"\";\n        if (!this.selection.isEmpty())\n            text = this.session.getTextRange(this.getSelectionRange());\n\n        this._emit(\"copy\", text);\n        return text;\n    };\n    this.onCopy = function() {\n        this.commands.exec(\"copy\", this);\n    };\n    this.onCut = function() {\n        this.commands.exec(\"cut\", this);\n    };\n    /**\n     * Editor@paste(text)\n     * - text (String): The pasted text\n     *\n     * Emitted when text is pasted.\n     **/\n    this.onPaste = function(text) {\n        // todo this should change when paste becomes a command\n        if (this.$readOnly) \n            return;\n        this._emit(\"paste\", text);\n        this.insert(text);\n    };\n    this.insert = function(text) {\n        var session = this.session;\n        var mode = session.getMode();\n\n        var cursor = this.getCursorPosition();\n\n        if (this.getBehavioursEnabled()) {\n            // Get a transform if the current mode wants one.\n            var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n            if (transform)\n                text = transform.text;\n        }\n\n        text = text.replace(\"\\t\", this.session.getTabString());\n\n        // remove selected text\n        if (!this.selection.isEmpty()) {\n            cursor = this.session.remove(this.getSelectionRange());\n            this.clearSelection();\n        }\n        else if (this.session.getOverwrite()) {\n            var range = new Range.fromPoints(cursor, cursor);\n            range.end.column += text.length;\n            this.session.remove(range);\n        }\n\n        this.clearSelection();\n\n        var start = cursor.column;\n        var lineState = session.getState(cursor.row);\n        var shouldOutdent = mode.checkOutdent(lineState, session.getLine(cursor.row), text);\n        var line = session.getLine(cursor.row);\n        var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n        var end = session.insert(cursor, text);\n\n        if (transform && transform.selection) {\n            if (transform.selection.length == 2) { // Transform relative to the current column\n                this.selection.setSelectionRange(\n                    new Range(cursor.row, start + transform.selection[0],\n                              cursor.row, start + transform.selection[1]));\n            } else { // Transform relative to the current row.\n                this.selection.setSelectionRange(\n                    new Range(cursor.row + transform.selection[0],\n                              transform.selection[1],\n                              cursor.row + transform.selection[2],\n                              transform.selection[3]));\n            }\n        }\n\n        var lineState = session.getState(cursor.row);\n\n        // TODO disabled multiline auto indent\n        // possibly doing the indent before inserting the text\n        // if (cursor.row !== end.row) {\n        if (session.getDocument().isNewLine(text)) {\n            this.moveCursorTo(cursor.row+1, 0);\n\n            var size = session.getTabSize();\n            var minIndent = Number.MAX_VALUE;\n\n            for (var row = cursor.row + 1; row <= end.row; ++row) {\n                var indent = 0;\n\n                line = session.getLine(row);\n                for (var i = 0; i < line.length; ++i)\n                    if (line.charAt(i) == '\\t')\n                        indent += size;\n                    else if (line.charAt(i) == ' ')\n                        indent += 1;\n                    else\n                        break;\n                if (/[^\\s]/.test(line))\n                    minIndent = Math.min(indent, minIndent);\n            }\n\n            for (var row = cursor.row + 1; row <= end.row; ++row) {\n                var outdent = minIndent;\n\n                line = session.getLine(row);\n                for (var i = 0; i < line.length && outdent > 0; ++i)\n                    if (line.charAt(i) == '\\t')\n                        outdent -= size;\n                    else if (line.charAt(i) == ' ')\n                        outdent -= 1;\n                session.remove(new Range(row, 0, row, i));\n            }\n            session.indentRows(cursor.row + 1, end.row, lineIndent);\n        }\n        if (shouldOutdent)\n            mode.autoOutdent(lineState, session, cursor.row);\n    };\n\n    this.onTextInput = function(text) {\n        this.keyBinding.onTextInput(text);\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        this.keyBinding.onCommandKey(e, hashId, keyCode);\n    };\n    this.setOverwrite = function(overwrite) {\n        this.session.setOverwrite(overwrite);\n    };\n    this.getOverwrite = function() {\n        return this.session.getOverwrite();\n    };\n    this.toggleOverwrite = function() {\n        this.session.toggleOverwrite();\n    };\n    this.setScrollSpeed = function(speed) {\n        this.$mouseHandler.setScrollSpeed(speed);\n    };\n    this.getScrollSpeed = function() {\n        return this.$mouseHandler.getScrollSpeed();\n    };\n    this.setDragDelay = function(dragDelay) {\n        this.$mouseHandler.setDragDelay(dragDelay);\n    };\n    this.getDragDelay = function() {\n        return this.$mouseHandler.getDragDelay();\n    };\n\n    this.$selectionStyle = \"line\";\n    /**\n     * Editor@changeSelectionStyle(data) \n     * - data (Object): Contains one property, `data`, which indicates the new selection style\n     *\n     * Emitted when the selection style changes, via [[Editor.setSelectionStyle]].\n     * \n     **/\n    this.setSelectionStyle = function(style) {\n        if (this.$selectionStyle == style) return;\n\n        this.$selectionStyle = style;\n        this.onSelectionChange();\n        this._emit(\"changeSelectionStyle\", {data: style});\n    };\n    this.getSelectionStyle = function() {\n        return this.$selectionStyle;\n    };\n\n    this.$highlightActiveLine = true;\n    this.setHighlightActiveLine = function(shouldHighlight) {\n        if (this.$highlightActiveLine == shouldHighlight)\n            return;\n\n        this.$highlightActiveLine = shouldHighlight;\n        this.$updateHighlightActiveLine();\n    };\n    this.getHighlightActiveLine = function() {\n        return this.$highlightActiveLine;\n    };\n\n    this.$highlightGutterLine = true;\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        if (this.$highlightGutterLine == shouldHighlight)\n            return;\n\n        this.renderer.setHighlightGutterLine(shouldHighlight);\n        this.$highlightGutterLine = shouldHighlight;\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.$highlightGutterLine;\n    };\n\n    this.$highlightSelectedWord = true;\n    this.setHighlightSelectedWord = function(shouldHighlight) {\n        if (this.$highlightSelectedWord == shouldHighlight)\n            return;\n\n        this.$highlightSelectedWord = shouldHighlight;\n        this.$onSelectionChange();\n    };\n    this.getHighlightSelectedWord = function() {\n        return this.$highlightSelectedWord;\n    };\n\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.renderer.setAnimatedScroll(shouldAnimate);\n    };\n\n    this.getAnimatedScroll = function(){\n        return this.renderer.getAnimatedScroll();\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.renderer.setShowInvisibles(showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.renderer.getShowInvisibles();\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.renderer.setDisplayIndentGuides(display);\n    };\n\n    this.getDisplayIndentGuides = function() {\n        return this.renderer.getDisplayIndentGuides();\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.renderer.setShowPrintMargin(showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.renderer.getShowPrintMargin();\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.renderer.setPrintMarginColumn(showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.renderer.getPrintMarginColumn();\n    };\n\n    this.$readOnly = false;\n    this.setReadOnly = function(readOnly) {\n        this.$readOnly = readOnly;\n    };\n    this.getReadOnly = function() {\n        return this.$readOnly;\n    };\n\n    this.$modeBehaviours = true;\n    this.setBehavioursEnabled = function (enabled) {\n        this.$modeBehaviours = enabled;\n    };\n    this.getBehavioursEnabled = function () {\n        return this.$modeBehaviours;\n    };\n    this.setShowFoldWidgets = function(show) {\n        var gutter = this.renderer.$gutterLayer;\n        if (gutter.getShowFoldWidgets() == show)\n            return;\n\n        this.renderer.$gutterLayer.setShowFoldWidgets(show);\n        this.$showFoldWidgets = show;\n        this.renderer.updateFull();\n    };\n    this.getShowFoldWidgets = function() {\n        return this.renderer.$gutterLayer.getShowFoldWidgets();\n    };\n\n    this.setFadeFoldWidgets = function(show) {\n        this.renderer.setFadeFoldWidgets(show);\n    };\n\n    this.getFadeFoldWidgets = function() {\n        return this.renderer.getFadeFoldWidgets();\n    };\n    this.remove = function(dir) {\n        if (this.selection.isEmpty()){\n            if (dir == \"left\")\n                this.selection.selectLeft();\n            else\n                this.selection.selectRight();\n        }\n\n        var range = this.getSelectionRange();\n        if (this.getBehavioursEnabled()) {\n            var session = this.session;\n            var state = session.getState(range.start.row);\n            var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n            if (new_range)\n                range = new_range;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.removeWordRight = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordRight();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeWordLeft = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordLeft();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineStart = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineStart();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineEnd = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineEnd();\n\n        var range = this.getSelectionRange();\n        if (range.start.column == range.end.column && range.start.row == range.end.row) {\n            range.end.column = 0;\n            range.end.row++;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.splitLine = function() {\n        if (!this.selection.isEmpty()) {\n            this.session.remove(this.getSelectionRange());\n            this.clearSelection();\n        }\n\n        var cursor = this.getCursorPosition();\n        this.insert(\"\\n\");\n        this.moveCursorToPosition(cursor);\n    };\n    this.transposeLetters = function() {\n        if (!this.selection.isEmpty()) {\n            return;\n        }\n\n        var cursor = this.getCursorPosition();\n        var column = cursor.column;\n        if (column === 0)\n            return;\n\n        var line = this.session.getLine(cursor.row);\n        var swap, range;\n        if (column < line.length) {\n            swap = line.charAt(column) + line.charAt(column-1);\n            range = new Range(cursor.row, column-1, cursor.row, column+1);\n        }\n        else {\n            swap = line.charAt(column-1) + line.charAt(column-2);\n            range = new Range(cursor.row, column-2, cursor.row, column);\n        }\n        this.session.replace(range, swap);\n    };\n    this.toLowerCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toLowerCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.toUpperCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toUpperCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.indent = function() {\n        var session = this.session;\n        var range = this.getSelectionRange();\n\n        if (range.start.row < range.end.row || range.start.column < range.end.column) {\n            var rows = this.$getSelectedRows();\n            session.indentRows(rows.first, rows.last, \"\\t\");\n        } else {\n            var indentString;\n\n            if (this.session.getUseSoftTabs()) {\n                var size        = session.getTabSize(),\n                    position    = this.getCursorPosition(),\n                    column      = session.documentToScreenColumn(position.row, position.column),\n                    count       = (size - column % size);\n\n                indentString = lang.stringRepeat(\" \", count);\n            } else\n                indentString = \"\\t\";\n            return this.insert(indentString);\n        }\n    };\n    this.blockOutdent = function() {\n        var selection = this.session.getSelection();\n        this.session.outdentRows(selection.getRange());\n    };\n    this.toggleCommentLines = function() {\n        var state = this.session.getState(this.getCursorPosition().row);\n        var rows = this.$getSelectedRows();\n        this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n    };\n    this.removeLines = function() {\n        var rows = this.$getSelectedRows();\n        var range;\n        if (rows.first === 0 || rows.last+1 < this.session.getLength())\n            range = new Range(rows.first, 0, rows.last+1, 0);\n        else\n            range = new Range(\n                rows.first-1, this.session.getLine(rows.first-1).length,\n                rows.last, this.session.getLine(rows.last).length\n            );\n        this.session.remove(range);\n        this.clearSelection();\n    };\n\n    this.duplicateSelection = function() {\n        var sel = this.selection;\n\t\tvar doc = this.session;\n\t\tvar range = sel.getRange();\n\t\tif (range.isEmpty()) {\n\t\t\tvar row = range.start.row;\n\t\t\tdoc.duplicateLines(row, row);\n\t\t} else {\n\t\t\tvar reverse = sel.isBackwards()\n\t\t\tvar point = sel.isBackwards() ? range.start : range.end;\n\t\t\tvar endPoint = doc.insert(point, doc.getTextRange(range), false);\n\t\t\trange.start = point;\n\t\t\trange.end = endPoint;\n\t\t\t\n\t\t\tsel.setSelectionRange(range, reverse)\n\t\t}\n    };\n    this.moveLinesDown = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            return this.session.moveLinesDown(firstRow, lastRow);\n        });\n    };\n    this.moveLinesUp = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            return this.session.moveLinesUp(firstRow, lastRow);\n        });\n    };\n    this.moveText = function(range, toPosition) {\n        if (this.$readOnly)\n            return null;\n\n        return this.session.moveText(range, toPosition);\n    };\n    this.copyLinesUp = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            this.session.duplicateLines(firstRow, lastRow);\n            return 0;\n        });\n    };\n    this.copyLinesDown = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            return this.session.duplicateLines(firstRow, lastRow);\n        });\n    };\n    this.$moveLines = function(mover) {\n        var rows = this.$getSelectedRows();\n        var selection = this.selection;\n        if (!selection.isMultiLine()) {\n            var range = selection.getRange();\n            var reverse = selection.isBackwards();\n        }\n\n        var linesMoved = mover.call(this, rows.first, rows.last);\n\n        if (range) {\n            range.start.row += linesMoved;\n            range.end.row += linesMoved;\n            selection.setSelectionRange(range, reverse);\n        }\n        else {\n            selection.setSelectionAnchor(rows.last+linesMoved+1, 0);\n            selection.$moveSelection(function() {\n                selection.moveCursorTo(rows.first+linesMoved, 0);\n            });\n        }\n    };\n    this.$getSelectedRows = function() {\n        var range = this.getSelectionRange().collapseRows();\n\n        return {\n            first: range.start.row,\n            last: range.end.row\n        };\n    };\n\n    this.onCompositionStart = function(text) {\n        this.renderer.showComposition(this.getCursorPosition());\n    };\n\n    this.onCompositionUpdate = function(text) {\n        this.renderer.setCompositionText(text);\n    };\n\n    this.onCompositionEnd = function() {\n        this.renderer.hideComposition();\n    };\n    this.getFirstVisibleRow = function() {\n        return this.renderer.getFirstVisibleRow();\n    };\n    this.getLastVisibleRow = function() {\n        return this.renderer.getLastVisibleRow();\n    };\n    this.isRowVisible = function(row) {\n        return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n    };\n    this.isRowFullyVisible = function(row) {\n        return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n    };\n    this.$getVisibleRowCount = function() {\n        return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n    };\n\n    this.$moveByPage = function(dir, select) {\n        var renderer = this.renderer;\n        var config = this.renderer.layerConfig;\n        var rows = dir * Math.floor(config.height / config.lineHeight);\n\n        this.$blockScrolling++;\n        if (select == true) {\n            this.selection.$moveSelection(function(){\n                this.moveCursorBy(rows, 0);\n            });\n        } else if (select == false) {\n            this.selection.moveCursorBy(rows, 0);\n            this.selection.clearSelection();\n        }\n        this.$blockScrolling--;\n\n        var scrollTop = renderer.scrollTop;\n\n        renderer.scrollBy(0, rows * config.lineHeight);\n        if (select != null)\n            renderer.scrollCursorIntoView(null, 0.5);\n\n        renderer.animateScrolling(scrollTop);\n    };\n    this.selectPageDown = function() {\n        this.$moveByPage(1, true);\n    };\n    this.selectPageUp = function() {\n        this.$moveByPage(-1, true);\n    };\n    this.gotoPageDown = function() {\n       this.$moveByPage(1, false);\n    };\n    this.gotoPageUp = function() {\n        this.$moveByPage(-1, false);\n    };\n    this.scrollPageDown = function() {\n        this.$moveByPage(1);\n    };\n    this.scrollPageUp = function() {\n        this.$moveByPage(-1);\n    };\n    this.scrollToRow = function(row) {\n        this.renderer.scrollToRow(row);\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        this.renderer.scrollToLine(line, center, animate, callback);\n    };\n    this.centerSelection = function() {\n        var range = this.getSelectionRange();\n        var pos = {\n            row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n            column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n        }\n        this.renderer.alignCursor(pos, 0.5);\n    };\n    this.getCursorPosition = function() {\n        return this.selection.getCursor();\n    };\n    this.getCursorPositionScreen = function() {\n        return this.session.documentToScreenPosition(this.getCursorPosition());\n    };\n    this.getSelectionRange = function() {\n        return this.selection.getRange();\n    };\n    this.selectAll = function() {\n        this.$blockScrolling += 1;\n        this.selection.selectAll();\n        this.$blockScrolling -= 1;\n    };\n    this.clearSelection = function() {\n        this.selection.clearSelection();\n    };\n    this.moveCursorTo = function(row, column) {\n        this.selection.moveCursorTo(row, column);\n    };\n    this.moveCursorToPosition = function(pos) {\n        this.selection.moveCursorToPosition(pos);\n    };\n    this.jumpToMatching = function(select) {\n        var cursor = this.getCursorPosition();\n\n        var range = this.session.getBracketRange(cursor);\n        if (!range) {\n            range = this.find({\n                needle: /[{}()\\[\\]]/g,\n                preventScroll:true,\n                start: {row: cursor.row, column: cursor.column - 1}\n            });\n            if (!range)\n                return;\n            var pos = range.start;\n            if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)\n                range = this.session.getBracketRange(pos);\n        }\n        \n        pos = range && range.cursor || pos;\n        if (pos) {\n            if (select) {\n                if (range && range.isEqual(this.getSelectionRange()))\n                    this.clearSelection();\n                else\n                    this.selection.selectTo(pos.row, pos.column);\n            } else {\n                this.clearSelection();\n                this.moveCursorTo(pos.row, pos.column);\n            }\n        }\n    };\n    this.gotoLine = function(lineNumber, column, animate) {\n        this.selection.clearSelection();\n        this.session.unfold({row: lineNumber - 1, column: column || 0});\n\n        this.$blockScrolling += 1;\n        this.moveCursorTo(lineNumber - 1, column || 0);\n        this.$blockScrolling -= 1;\n\n        if (!this.isRowFullyVisible(lineNumber - 1))\n            this.scrollToLine(lineNumber - 1, true, animate);\n    };\n    this.navigateTo = function(row, column) {\n        this.clearSelection();\n        this.moveCursorTo(row, column);\n    };\n    this.navigateUp = function(times) {\n        this.selection.clearSelection();\n        times = times || 1;\n        this.selection.moveCursorBy(-times, 0);\n    };\n    this.navigateDown = function(times) {\n        this.selection.clearSelection();\n        times = times || 1;\n        this.selection.moveCursorBy(times, 0);\n    };\n    this.navigateLeft = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionStart = this.getSelectionRange().start;\n            this.moveCursorToPosition(selectionStart);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorLeft();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateRight = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionEnd = this.getSelectionRange().end;\n            this.moveCursorToPosition(selectionEnd);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorRight();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateLineStart = function() {\n        this.selection.moveCursorLineStart();\n        this.clearSelection();\n    };\n    this.navigateLineEnd = function() {\n        this.selection.moveCursorLineEnd();\n        this.clearSelection();\n    };\n    this.navigateFileEnd = function() {\n        var scrollTop = this.renderer.scrollTop;\n        this.selection.moveCursorFileEnd();\n        this.clearSelection();\n        this.renderer.animateScrolling(scrollTop);\n    };\n    this.navigateFileStart = function() {\n        var scrollTop = this.renderer.scrollTop;\n        this.selection.moveCursorFileStart();\n        this.clearSelection();\n        this.renderer.animateScrolling(scrollTop);\n    };\n    this.navigateWordRight = function() {\n        this.selection.moveCursorWordRight();\n        this.clearSelection();\n    };\n    this.navigateWordLeft = function() {\n        this.selection.moveCursorWordLeft();\n        this.clearSelection();\n    };\n    this.replace = function(replacement, options) {\n        if (options)\n            this.$search.set(options);\n\n        var range = this.$search.find(this.session);\n        var replaced = 0;\n        if (!range)\n            return replaced;\n\n        if (this.$tryReplace(range, replacement)) {\n            replaced = 1;\n        }\n        if (range !== null) {\n            this.selection.setSelectionRange(range);\n            this.renderer.scrollSelectionIntoView(range.start, range.end);\n        }\n\n        return replaced;\n    };\n    this.replaceAll = function(replacement, options) {\n        if (options) {\n            this.$search.set(options);\n        }\n\n        var ranges = this.$search.findAll(this.session);\n        var replaced = 0;\n        if (!ranges.length)\n            return replaced;\n\n        this.$blockScrolling += 1;\n\n        var selection = this.getSelectionRange();\n        this.clearSelection();\n        this.selection.moveCursorTo(0, 0);\n\n        for (var i = ranges.length - 1; i >= 0; --i) {\n            if(this.$tryReplace(ranges[i], replacement)) {\n                replaced++;\n            }\n        }\n\n        this.selection.setSelectionRange(selection);\n        this.$blockScrolling -= 1;\n\n        return replaced;\n    };\n\n    this.$tryReplace = function(range, replacement) {\n        var input = this.session.getTextRange(range);\n        replacement = this.$search.replace(input, replacement);\n        if (replacement !== null) {\n            range.end = this.session.replace(range, replacement);\n            return range;\n        } else {\n            return null;\n        }\n    };\n    this.getLastSearchOptions = function() {\n        return this.$search.getOptions();\n    };\n    this.find = function(needle, options, animate) {\n        if (!options)\n            options = {};\n\n        if (typeof needle == \"string\" || needle instanceof RegExp)\n            options.needle = needle;\n        else if (typeof needle == \"object\")\n            oop.mixin(options, needle);\n\n        var range = this.selection.getRange();\n        if (options.needle == null) {\n            needle = this.session.getTextRange(range)\n                || this.$search.$options.needle;\n            if (!needle) {\n                range = this.session.getWordRange(range.start.row, range.start.column);\n                needle = this.session.getTextRange(range);\n            }\n            this.$search.set({needle: needle});\n        }\n\n        this.$search.set(options);\n        if (!options.start)\n            this.$search.set({start: range});\n\n        var newRange = this.$search.find(this.session);\n        if (options.preventScroll)\n            return newRange;\n        if (newRange) {\n            this.revealRange(newRange, animate);\n            return newRange;\n        }\n        // clear selection if nothing is found\n        if (options.backwards)\n            range.start = range.end;\n        else\n            range.end = range.start;\n        this.selection.setRange(range);\n    };\n    this.findNext = function(options, animate) {\n        this.find({skipCurrent: true, backwards: false}, options, animate);\n    };\n    this.findPrevious = function(options, animate) {\n        this.find(options, {skipCurrent: true, backwards: true}, animate);\n    };\n\n    this.revealRange = function(range, animate) {\n        this.$blockScrolling += 1;\n        this.session.unfold(range);\n        this.selection.setSelectionRange(range);\n        this.$blockScrolling -= 1;\n\n        var scrollTop = this.renderer.scrollTop;\n        this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n        if (animate != false)\n            this.renderer.animateScrolling(scrollTop);\n    };\n    this.undo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().undo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.redo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().redo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.destroy = function() {\n        this.renderer.destroy();\n    };\n\n}).call(Editor.prototype);\n\n\nexports.Editor = Editor;\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n     return new Array(count + 1).join(string);\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj != \"object\") {\n        return obj;\n    }\n    \n    var copy = obj.constructor();\n    for (var key in obj) {\n        if (typeof obj[key] == \"object\") {\n            copy[key] = this.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\n\n\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n\n    return deferred;\n};\n\n});\n\ndefine('ace/keyboard/textinput', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar dom = require(\"../lib/dom\");\n\nvar TextInput = function(parentNode, host) {\n    var text = dom.createElement(\"textarea\");\n    if (useragent.isTouchPad)\n        text.setAttribute(\"x-palm-disable-auto-cap\", true);\n\n    text.setAttribute(\"wrap\", \"off\");\n\n    text.style.top = \"-2em\";\n    parentNode.insertBefore(text, parentNode.firstChild);\n\n    var PLACEHOLDER = useragent.isIE ? \"\\x01\" : \"\\x00\";\n    reset(true);\n    if (isFocused())\n        host.onFocus();\n\n    var inCompostion = false;\n    var copied = false;\n    var pasted = false;\n    var tempStyle = '';\n\n    function reset(full) {\n        try {\n            if (full) {\n                text.value = PLACEHOLDER;\n                text.selectionStart = 0;\n                text.selectionEnd = 1;\n            } else \n                text.select();\n        } catch (e) {}\n    }\n\n    function sendText(valueToSend) {\n        if (!copied) {\n            var value = valueToSend || text.value;\n            if (value) {\n                if (value.length > 1) {\n                    if (value.charAt(0) == PLACEHOLDER)\n                        value = value.substr(1);\n                    else if (value.charAt(value.length - 1) == PLACEHOLDER)\n                        value = value.slice(0, -1);\n                }\n\n                if (value && value != PLACEHOLDER) {\n                    if (pasted)\n                        host.onPaste(value);\n                    else\n                        host.onTextInput(value);\n                }\n            }\n        }\n\n        copied = false;\n        pasted = false;\n\n        // Safari doesn't fire copy events if no text is selected\n        reset(true);\n    }\n\n    var onTextInput = function(e) {\n        if (!inCompostion)\n            sendText(e.data);\n        setTimeout(function () {\n            if (!inCompostion)\n                reset(true);\n        }, 0);\n    };\n\n    var onPropertyChange = function(e) {\n        setTimeout(function() {\n            if (!inCompostion)\n                if(text.value != \"\") {\n                    sendText();\n                }\n        }, 0);\n    };\n\n    var onCompositionStart = function(e) {\n        inCompostion = true;\n        host.onCompositionStart();\n        setTimeout(onCompositionUpdate, 0);\n    };\n\n    var onCompositionUpdate = function() {\n        if (!inCompostion) return;\n        host.onCompositionUpdate(text.value);\n    };\n\n    var onCompositionEnd = function(e) {\n        inCompostion = false;\n        host.onCompositionEnd();\n    };\n\n    var onCopy = function(e) {\n        copied = true;\n        var copyText = host.getCopyText();\n        if(copyText)\n            text.value = copyText;\n        else\n            e.preventDefault();\n        reset();\n        setTimeout(function () {\n            sendText();\n        }, 0);\n    };\n\n    var onCut = function(e) {\n        copied = true;\n        var copyText = host.getCopyText();\n        if(copyText) {\n            text.value = copyText;\n            host.onCut();\n        } else\n            e.preventDefault();\n        reset();\n        setTimeout(function () {\n            sendText();\n        }, 0);\n    };\n\n    event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n    event.addListener(text, \"input\", onTextInput);\n    \n    if (useragent.isOldIE) {\n        var keytable = { 13:1, 27:1 };\n        event.addListener(text, \"keyup\", function (e) {\n            if (inCompostion && (!text.value || keytable[e.keyCode]))\n                setTimeout(onCompositionEnd, 0);\n            if ((text.value.charCodeAt(0)|0) < 129) {\n                return;\n            }\n            inCompostion ? onCompositionUpdate() : onCompositionStart();\n        });\n        \n        event.addListener(text, \"propertychange\", function() {\n            if (text.value != PLACEHOLDER)\n                setTimeout(sendText, 0);\n        });\n    }\n\n    event.addListener(text, \"paste\", function(e) {\n        // Mark that the next input text comes from past.\n        pasted = true;\n        // Some browsers support the event.clipboardData API. Use this to get\n        // the pasted content which increases speed if pasting a lot of lines.\n        if (e.clipboardData && e.clipboardData.getData) {\n            sendText(e.clipboardData.getData(\"text/plain\"));\n            e.preventDefault();\n        } \n        else {\n            // If a browser doesn't support any of the things above, use the regular\n            // method to detect the pasted input.\n            onPropertyChange();\n        }\n    });\n\n    if (\"onbeforecopy\" in text && typeof clipboardData !== \"undefined\") {\n        event.addListener(text, \"beforecopy\", function(e) {\n            if (tempStyle)\n                return; // without this text is copied when contextmenu is shown\n            var copyText = host.getCopyText();\n            if (copyText)\n                clipboardData.setData(\"Text\", copyText);\n            else\n                e.preventDefault();\n        });\n        event.addListener(parentNode, \"keydown\", function(e) {\n            if (e.ctrlKey && e.keyCode == 88) {\n                var copyText = host.getCopyText();\n                if (copyText) {\n                    clipboardData.setData(\"Text\", copyText);\n                    host.onCut();\n                }\n                event.preventDefault(e);\n            }\n        });\n        event.addListener(text, \"cut\", onCut); // for ie9 context menu\n    }\n    else if (useragent.isOpera && !(\"KeyboardEvent\" in window)) {\n        event.addListener(parentNode, \"keydown\", function(e) {\n            if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n                return;\n\n            if ((e.keyCode == 88 || e.keyCode == 67)) {\n                var copyText = host.getCopyText();\n                if (copyText) {\n                    text.value = copyText;\n                    text.select();\n                    if (e.keyCode == 88)\n                        host.onCut();\n                }\n            }\n        });\n    }\n    else {\n        event.addListener(text, \"copy\", onCopy);\n        event.addListener(text, \"cut\", onCut);\n    }\n\n    event.addListener(text, \"compositionstart\", onCompositionStart);\n    if (useragent.isGecko) {\n        event.addListener(text, \"text\", onCompositionUpdate);\n    }\n    if (useragent.isWebKit) {\n        event.addListener(text, \"keyup\", onCompositionUpdate);\n    }\n    event.addListener(text, \"compositionend\", onCompositionEnd);\n\n    event.addListener(text, \"blur\", function() {\n        host.onBlur();\n    });\n\n    event.addListener(text, \"focus\", function() {\n        host.onFocus();\n        reset();\n    });\n\n    this.focus = function() {\n        reset();\n        text.focus();\n    };\n\n    this.blur = function() {\n        text.blur();\n    };\n\n    function isFocused() {\n        return document.activeElement === text;\n    }\n    this.isFocused = isFocused;\n\n    this.getElement = function() {\n        return text;\n    };\n\n    this.onContextMenu = function(e) {\n        if (!tempStyle)\n            tempStyle = text.style.cssText;\n\n        text.style.cssText =\n            \"position:fixed; z-index:100000;\" + \n            (useragent.isIE ? \"background:rgba(0, 0, 0, 0.03); opacity:0.1;\" : \"\") + //\"background:rgba(250, 0, 0, 0.3); opacity:1;\" +\n            \"left:\" + (e.clientX - 2) + \"px; top:\" + (e.clientY - 2) + \"px;\";\n\n        if (host.selection.isEmpty())\n            text.value = \"\";\n        else\n            reset(true);\n\n        if (e.type != \"mousedown\")\n            return;\n\n        if (host.renderer.$keepTextAreaAtCursor)\n            host.renderer.$keepTextAreaAtCursor = null;\n\n        // on windows context menu is opened after mouseup\n        if (useragent.isWin && (useragent.isGecko || useragent.isIE))\n            event.capture(host.container, function(e) {\n                text.style.left = e.clientX - 2 + \"px\";\n                text.style.top = e.clientY - 2 + \"px\";\n            }, onContextMenuClose);\n    };\n\n    function onContextMenuClose() {\n        setTimeout(function () {\n            if (tempStyle) {\n                text.style.cssText = tempStyle;\n                tempStyle = '';\n            }\n            sendText();\n            if (host.renderer.$keepTextAreaAtCursor == null) {\n                host.renderer.$keepTextAreaAtCursor = true;\n                host.renderer.$moveTextAreaToCursor();\n            }\n        }, 0);\n    };\n    this.onContextMenuClose = onContextMenuClose;\n\n    // firefox fires contextmenu event after opening it\n    if (!useragent.isGecko)\n        event.addListener(text, \"contextmenu\", function(e) {\n            host.textInput.onContextMenu(e);\n            onContextMenuClose()\n        });\n};\n\nexports.TextInput = TextInput;\n});\n\ndefine('ace/mouse/mouse_handler', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/mouse/default_handlers', 'ace/mouse/default_gutter_handler', 'ace/mouse/mouse_event', 'ace/mouse/dragdrop'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar DefaultHandlers = require(\"./default_handlers\").DefaultHandlers;\nvar DefaultGutterHandler = require(\"./default_gutter_handler\").GutterHandler;\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar DragdropHandler = require(\"./dragdrop\").DragdropHandler;\n\nvar MouseHandler = function(editor) {\n    this.editor = editor;\n\n    new DefaultHandlers(this);\n    new DefaultGutterHandler(this);\n    new DragdropHandler(this);\n\n    event.addListener(editor.container, \"mousedown\", function(e) {\n        editor.focus();\n        return event.preventDefault(e);\n    });\n\n    var mouseTarget = editor.renderer.getMouseEventTarget();\n    event.addListener(mouseTarget, \"click\", this.onMouseEvent.bind(this, \"click\"));\n    event.addListener(mouseTarget, \"mousemove\", this.onMouseMove.bind(this, \"mousemove\"));\n    event.addMultiMouseDownListener(mouseTarget, [300, 300, 250], this, \"onMouseEvent\");\n    event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, \"mousewheel\"));\n\n    var gutterEl = editor.renderer.$gutter;\n    event.addListener(gutterEl, \"mousedown\", this.onMouseEvent.bind(this, \"guttermousedown\"));\n    event.addListener(gutterEl, \"click\", this.onMouseEvent.bind(this, \"gutterclick\"));\n    event.addListener(gutterEl, \"dblclick\", this.onMouseEvent.bind(this, \"gutterdblclick\"));\n    event.addListener(gutterEl, \"mousemove\", this.onMouseEvent.bind(this, \"guttermousemove\"));\n};\n\n(function() {\n\n    this.$scrollSpeed = 1;\n    this.setScrollSpeed = function(speed) {\n        this.$scrollSpeed = speed;\n    };\n\n    this.getScrollSpeed = function() {\n        return this.$scrollSpeed;\n    };\n\n    this.onMouseEvent = function(name, e) {\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.$dragDelay = 250;\n    this.setDragDelay = function(dragDelay) {\n        this.$dragDelay = dragDelay;\n    };\n\n    this.getDragDelay = function() {\n        return this.$dragDelay;\n    };\n\n    this.onMouseMove = function(name, e) {\n        // optimization, because mousemove doesn't have a default handler.\n        var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n        if (!listeners || !listeners.length)\n            return;\n\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseWheel = function(name, e) {\n        var mouseEvent = new MouseEvent(e, this.editor);\n        mouseEvent.speed = this.$scrollSpeed * 2;\n        mouseEvent.wheelX = e.wheelX;\n        mouseEvent.wheelY = e.wheelY;\n\n        this.editor._emit(name, mouseEvent);\n    };\n\n    this.setState = function(state) {\n        this.state = state;\n    };\n\n    this.captureMouse = function(ev, state) {\n        if (state)\n            this.setState(state);\n\n        this.x = ev.x;\n        this.y = ev.y;\n\n        // do not move textarea during selection\n        var renderer = this.editor.renderer;\n        if (renderer.$keepTextAreaAtCursor)\n            renderer.$keepTextAreaAtCursor = null;\n\n        var self = this;\n        var onMouseMove = function(e) {\n            self.x = e.clientX;\n            self.y = e.clientY;\n        };\n\n        var onCaptureEnd = function(e) {\n            clearInterval(timerId);\n            self[self.state + \"End\"] && self[self.state + \"End\"](e);\n            self.$clickSelection = null;\n            if (renderer.$keepTextAreaAtCursor == null) {\n                renderer.$keepTextAreaAtCursor = true;\n                renderer.$moveTextAreaToCursor();\n            }\n        };\n\n        var onCaptureInterval = function() {\n            self[self.state] && self[self.state]();\n        }\n        \n        if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n            setTimeout(function() {\n                onCaptureInterval();\n                onCaptureEnd(ev.domEvent);\n            });\n            return;\n        }\n\n        event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n        var timerId = setInterval(onCaptureInterval, 20);\n    };\n}).call(MouseHandler.prototype);\n\nexports.MouseHandler = MouseHandler;\n});\n\ndefine('ace/mouse/default_handlers', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 5; // pixels\n\nfunction DefaultHandlers(mouseHandler) {\n    mouseHandler.$clickSelection = null;\n\n    var editor = mouseHandler.editor;\n    editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n    editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n\n    var exports = [\"select\", \"startSelect\", \"drag\", \"dragEnd\", \"dragWait\",\n        \"dragWaitEnd\", \"startDrag\", \"focusWait\"];\n\n    exports.forEach(function(x) {\n        mouseHandler[x] = this[x];\n    }, this);\n\n    mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n    mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n\n    mouseHandler.$focusWaitTimout = 250;\n}\n\n(function() {\n\n    this.onMouseDown = function(ev) {\n        var inSelection = ev.inSelection();\n        var pos = ev.getDocumentPosition();\n        this.mousedownEvent = ev;\n        var editor = this.editor;\n\n        var button = ev.getButton();\n        if (button !== 0) {\n            var selectionRange = editor.getSelectionRange();\n            var selectionEmpty = selectionRange.isEmpty();\n\n            if (selectionEmpty) {\n                editor.moveCursorToPosition(pos);\n                editor.selection.clearSelection();\n            }\n\n            // 2: contextmenu, 1: linux paste\n            editor.textInput.onContextMenu(ev.domEvent);\n            return; // stopping event here breaks contextmenu on ff mac\n        }\n\n        // if this click caused the editor to be focused should not clear the\n        // selection\n        if (inSelection && !editor.isFocused()) {\n            editor.focus();\n            if (this.$focusWaitTimout && !this.$clickSelection) {\n                this.setState(\"focusWait\");\n                this.captureMouse(ev);\n                return ev.preventDefault();\n            }\n        }\n\n        if (!inSelection || this.$clickSelection || ev.getShiftKey()) {\n            // Directly pick STATE_SELECT, since the user is not clicking inside\n            // a selection.\n            this.startSelect(pos);\n        } else if (inSelection) {\n            this.mousedownEvent.time = (new Date()).getTime();\n            this.setState(\"dragWait\");\n        }\n\n        this.captureMouse(ev);\n        return ev.preventDefault();\n    };\n\n    this.startSelect = function(pos) {\n        pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n        if (this.mousedownEvent.getShiftKey()) {\n            this.editor.selection.selectToPosition(pos);\n        }\n        else if (!this.$clickSelection) {\n            this.editor.moveCursorToPosition(pos);\n            this.editor.selection.clearSelection();\n        }\n        this.setState(\"select\");\n    };\n\n    this.select = function() {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n\n        if (this.$clickSelection) {\n            var cmp = this.$clickSelection.comparePoint(cursor);\n\n            if (cmp == -1) {\n                anchor = this.$clickSelection.end;\n            } else if (cmp == 1) {\n                anchor = this.$clickSelection.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.extendSelectionBy = function(unitName) {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var range = editor.selection[unitName](cursor.row, cursor.column);\n\n        if (this.$clickSelection) {\n            var cmpStart = this.$clickSelection.comparePoint(range.start);\n            var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n            if (cmpStart == -1 && cmpEnd <= 0) {\n                anchor = this.$clickSelection.end;\n                if (range.end.row != cursor.row || range.end.column != cursor.column)\n                    cursor = range.start;\n            } else if (cmpEnd == 1 && cmpStart >= 0) {\n                anchor = this.$clickSelection.start;\n                if (range.start.row != cursor.row || range.start.column != cursor.column)\n                    cursor = range.end;\n            } else if (cmpStart == -1 && cmpEnd == 1) {\n                cursor = range.end;\n                anchor = range.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.startDrag = function() {\n        var editor = this.editor;\n        this.setState(\"drag\");\n        this.dragRange = editor.getSelectionRange();\n        var style = editor.getSelectionStyle();\n        this.dragSelectionMarker = editor.session.addMarker(this.dragRange, \"ace_selection\", style);\n        editor.clearSelection();\n        dom.addCssClass(editor.container, \"ace_dragging\");\n        if (!this.$dragKeybinding) {\n            this.$dragKeybinding = {\n                handleKeyboard: function(data, hashId, keyString, keyCode) {\n                    if (keyString == \"esc\")\n                        return {command: this.command};\n                },\n                command: {\n                    exec: function(editor) {\n                        var self = editor.$mouseHandler;\n                        self.dragCursor = null;\n                        self.dragEnd();\n                        self.startSelect();\n                    }\n                }\n            }\n        }\n\n        editor.keyBinding.addKeyboardHandler(this.$dragKeybinding);\n    };\n\n    this.focusWait = function() {\n        var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n        var time = (new Date()).getTime();\n\n        if (distance > DRAG_OFFSET ||time - this.mousedownEvent.time > this.$focusWaitTimout)\n            this.startSelect();\n    };\n\n    this.dragWait = function(e) {\n        var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n        var time = (new Date()).getTime();\n        var editor = this.editor;\n\n        if (distance > DRAG_OFFSET) {\n            this.startSelect(this.mousedownEvent.getDocumentPosition());\n        } else if (time - this.mousedownEvent.time > editor.getDragDelay()) {\n            this.startDrag();\n        }\n    };\n\n    this.dragWaitEnd = function(e) {\n        this.mousedownEvent.domEvent = e;\n        this.startSelect();\n    };\n\n    this.drag = function() {\n        var editor = this.editor;\n        this.dragCursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        editor.moveCursorToPosition(this.dragCursor);\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.dragEnd = function(e) {\n        var editor = this.editor;\n        var dragCursor = this.dragCursor;\n        var dragRange = this.dragRange;\n        dom.removeCssClass(editor.container, \"ace_dragging\");\n        editor.session.removeMarker(this.dragSelectionMarker);\n        editor.keyBinding.removeKeyboardHandler(this.$dragKeybinding);\n\n        if (!dragCursor)\n            return;\n\n        editor.clearSelection();\n        if (e && (e.ctrlKey || e.altKey)) {\n            var session = editor.session;\n            var newRange = dragRange;\n            newRange.end = session.insert(dragCursor, session.getTextRange(dragRange));\n            newRange.start = dragCursor;\n        } else if (dragRange.contains(dragCursor.row, dragCursor.column)) {\n            return;\n        } else {\n            var newRange = editor.moveText(dragRange, dragCursor);\n        }\n\n        if (!newRange)\n            return;\n\n        editor.selection.setSelectionRange(newRange);\n    };\n\n    this.onDoubleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n        var session = editor.session;\n\n        var range = session.getBracketRange(pos);\n        if (range) {\n            if (range.isEmpty()) {\n                range.start.column--;\n                range.end.column++;\n            }\n            this.$clickSelection = range;\n            this.setState(\"select\");\n            return;\n        }\n\n        this.$clickSelection = editor.selection.getWordRange(pos.row, pos.column);\n        this.setState(\"selectByWords\");\n    };\n\n    this.onTripleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n\n        this.setState(\"selectByLines\");\n        this.$clickSelection = editor.selection.getLineRange(pos.row);\n    };\n\n    this.onQuadClick = function(ev) {\n        var editor = this.editor;\n\n        editor.selectAll();\n        this.$clickSelection = editor.getSelectionRange();\n        this.setState(\"null\");\n    };\n\n    this.onMouseWheel = function(ev) {\n        if (ev.getShiftKey() || ev.getAccelKey()){\n            return;\n        }\n        var editor = this.editor;\n        var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n        if (isScrolable) {\n            this.$passScrollEvent = false;\n        } else {\n            if (this.$passScrollEvent)\n                return;\n\n            if (!this.$scrollStopTimeout) {\n                var self = this;\n                this.$scrollStopTimeout = setTimeout(function() {\n                    self.$passScrollEvent = true;\n                    self.$scrollStopTimeout = null;\n                }, 200);\n            }\n        }\n\n        editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n        return ev.preventDefault();\n    };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n    if (range.start.row == range.end.row)\n        var cmp = 2 * cursor.column - range.start.column - range.end.column;\n    else\n        var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n    if (cmp < 0)\n        return {cursor: range.start, anchor: range.end};\n    else\n        return {cursor: range.end, anchor: range.start};\n}\n\n});\n\ndefine('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event'], function(require, exports, module) {\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\n\nfunction GutterHandler(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var gutter = editor.renderer.$gutterLayer;\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n        if (!editor.isFocused())\n            return;\n        var gutterRegion = gutter.getRegion(e);\n\n        if (gutterRegion)\n            return;\n\n        var row = e.getDocumentPosition().row;\n        var selection = editor.session.selection;\n\n        if (e.getShiftKey())\n            selection.selectTo(row, 0);\n        else\n            mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n\n        mouseHandler.captureMouse(e, \"selectByLines\");\n        return e.preventDefault();\n    });\n\n\n    var tooltipTimeout, mouseEvent, tooltip, tooltipAnnotation;\n    function createTooltip() {\n        tooltip = dom.createElement(\"div\");\n        tooltip.className = \"ace_gutter_tooltip\";\n        tooltip.style.maxWidth = \"500px\";\n        tooltip.style.display = \"none\";\n        editor.container.appendChild(tooltip);\n    }\n\n    function showTooltip() {\n        if (!tooltip) {\n            createTooltip();\n        }\n        var row = mouseEvent.getDocumentPosition().row;\n        var annotation = gutter.$annotations[row];\n        if (!annotation)\n            return hideTooltip();\n\n        var maxRow = editor.session.getLength();\n        if (row == maxRow) {\n            var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n            var pos = mouseEvent.$pos;\n            if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n                return hideTooltip();\n        }\n\n        if (tooltipAnnotation == annotation)\n            return;\n        tooltipAnnotation = annotation.text.join(\"\\n\");\n\n        tooltip.style.display = \"block\";\n        tooltip.innerHTML = tooltipAnnotation;\n        editor.on(\"mousewheel\", hideTooltip);\n\n        moveTooltip(mouseEvent);\n    }\n\n    function hideTooltip() {\n        if (tooltipTimeout)\n            tooltipTimeout = clearTimeout(tooltipTimeout);\n        if (tooltipAnnotation) {\n            tooltip.style.display = \"none\";\n            tooltipAnnotation = null;\n            editor.removeEventListener(\"mousewheel\", hideTooltip);\n        }\n    }\n\n    function moveTooltip(e) {\n        var rect = editor.renderer.$gutter.getBoundingClientRect();\n        tooltip.style.left = e.x - rect.left + 15 + \"px\";\n        if (e.y + 3 * editor.renderer.lineHeight + 15 < rect.bottom) {\n            tooltip.style.bottom =  \"\";\n            tooltip.style.top =  e.y - rect.top + 15 + \"px\";\n        } else {\n            tooltip.style.top =  \"\";\n            tooltip.style.bottom = rect.bottom - e.y + 5 + \"px\";\n        }\n    }\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n        var target = e.domEvent.target || e.domEvent.srcElement;\n        if (dom.hasCssClass(target, \"ace_fold-widget\"))\n            return hideTooltip();\n\n        if (tooltipAnnotation)\n            moveTooltip(e);\n\n        mouseEvent = e;\n        if (tooltipTimeout)\n            return;\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            if (mouseEvent)\n                showTooltip();\n            else\n                hideTooltip();\n        }, 50);\n    });\n\n    event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n        mouseEvent = null;\n        if (!tooltipAnnotation || tooltipTimeout)\n            return;\n\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            hideTooltip();\n        }, 50);\n    });\n\n}\n\nexports.GutterHandler = GutterHandler;\n\n});\n\ndefine('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n    this.domEvent = domEvent;\n    this.editor = editor;\n    \n    this.x = this.clientX = domEvent.clientX;\n    this.y = this.clientY = domEvent.clientY;\n\n    this.$pos = null;\n    this.$inSelection = null;\n    \n    this.propagationStopped = false;\n    this.defaultPrevented = false;\n};\n\n(function() {  \n    \n    this.stopPropagation = function() {\n        event.stopPropagation(this.domEvent);\n        this.propagationStopped = true;\n    };\n    \n    this.preventDefault = function() {\n        event.preventDefault(this.domEvent);\n        this.defaultPrevented = true;\n    };\n    \n    this.stop = function() {\n        this.stopPropagation();\n        this.preventDefault();\n    };\n    this.getDocumentPosition = function() {\n        if (this.$pos)\n            return this.$pos;\n        \n        this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n        return this.$pos;\n    };\n    this.inSelection = function() {\n        if (this.$inSelection !== null)\n            return this.$inSelection;\n            \n        var editor = this.editor;\n        \n        if (editor.getReadOnly()) {\n            this.$inSelection = false;\n        }\n        else {\n            var selectionRange = editor.getSelectionRange();\n            if (selectionRange.isEmpty())\n                this.$inSelection = false;\n            else {\n                var pos = this.getDocumentPosition();\n                this.$inSelection = selectionRange.contains(pos.row, pos.column);\n            }\n        }\n        return this.$inSelection;\n    };\n    this.getButton = function() {\n        return event.getButton(this.domEvent);\n    };\n    this.getShiftKey = function() {\n        return this.domEvent.shiftKey;\n    };\n    \n    this.getAccelKey = useragent.isMac\n        ? function() { return this.domEvent.metaKey; }\n        : function() { return this.domEvent.ctrlKey; };\n    \n}).call(MouseEvent.prototype);\n\n});\n\ndefine('ace/mouse/dragdrop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\n\nvar DragdropHandler = function(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var dragSelectionMarker, x, y;\n    var timerId, range, isBackwards;\n    var dragCursor, counter = 0;\n\n    var mouseTarget = editor.container;\n    event.addListener(mouseTarget, \"dragenter\", function(e) {\n        counter++;\n        if (!dragSelectionMarker) {\n            range = editor.getSelectionRange();\n            isBackwards = editor.selection.isBackwards();\n            var style = editor.getSelectionStyle();\n            dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", style);\n            editor.clearSelection();\n            clearInterval(timerId);\n            timerId = setInterval(onDragInterval, 20);\n        }\n        return event.preventDefault(e);\n    });\n\n    event.addListener(mouseTarget, \"dragover\", function(e) {\n        x = e.clientX;\n        y = e.clientY;\n        return event.preventDefault(e);\n    });\n    \n    var onDragInterval =  function() {\n        dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n        editor.moveCursorToPosition(dragCursor);\n        editor.renderer.scrollCursorIntoView();\n    };\n    \n    event.addListener(mouseTarget, \"dragleave\", function(e) {\n        counter--;\n        if (counter > 0)\n            return;\n        console.log(e.type, counter,e.target);\n        clearInterval(timerId);\n        editor.session.removeMarker(dragSelectionMarker);\n        dragSelectionMarker = null;\n        editor.selection.setSelectionRange(range, isBackwards);\n        return event.preventDefault(e);\n    });\n    \n    event.addListener(mouseTarget, \"drop\", function(e) {\n        console.log(e.type, counter,e.target);\n        counter = 0;\n        clearInterval(timerId);\n        editor.session.removeMarker(dragSelectionMarker);\n        dragSelectionMarker = null;\n\n        range.end = editor.session.insert(dragCursor, e.dataTransfer.getData('Text'));\n        range.start = dragCursor;\n        editor.focus();\n        editor.selection.setSelectionRange(range);\n        return event.preventDefault(e);\n    });\n\n};\n\nexports.DragdropHandler = DragdropHandler;\n});\n\ndefine('ace/mouse/fold_handler', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction FoldHandler(editor) {\n    \n    editor.on(\"click\", function(e) {\n        var position = e.getDocumentPosition();\n        var session = editor.session;\n        \n        // If the user clicked on a fold, then expand it.\n        var fold = session.getFoldAt(position.row, position.column, 1);\n        if (fold) {\n            if (e.getAccelKey())\n                session.removeFold(fold);\n            else\n                session.expandFold(fold);\n                \n            e.stop();\n        }\n    });\n    \n    editor.on(\"gutterclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            if (session.foldWidgets && session.foldWidgets[row])\n                editor.session.onFoldWidgetClick(row, e);\n            e.stop();\n        }\n    });\n}\n\nexports.FoldHandler = FoldHandler;\n\n});\n\ndefine('ace/keyboard/keybinding', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/event'], function(require, exports, module) {\n\n\nvar keyUtil  = require(\"../lib/keys\");\nvar event = require(\"../lib/event\");\n\nvar KeyBinding = function(editor) {\n    this.$editor = editor;\n    this.$data = { };\n    this.$handlers = [];\n    this.setDefaultHandler(editor.commands);\n};\n\n(function() {\n    this.setDefaultHandler = function(kb) {\n        this.removeKeyboardHandler(this.$defaultHandler);\n        this.$defaultHandler = kb;\n        this.addKeyboardHandler(kb, 0);\n        this.$data = {editor: this.$editor};\n    };\n\n    this.setKeyboardHandler = function(kb) {\n        if (this.$handlers[this.$handlers.length - 1] == kb)\n            return;\n\n        while (this.$handlers[1])\n            this.removeKeyboardHandler(this.$handlers[1]);\n\n        this.addKeyboardHandler(kb, 1);\n    };\n\n    this.addKeyboardHandler = function(kb, pos) {\n        if (!kb)\n            return;\n        var i = this.$handlers.indexOf(kb);\n        if (i != -1)\n            this.$handlers.splice(i, 1);\n\n        if (pos == undefined)\n            this.$handlers.push(kb);\n        else\n            this.$handlers.splice(pos, 0, kb);\n\n        if (i == -1 && kb.attach)\n            kb.attach(this.$editor);\n    };\n\n    this.removeKeyboardHandler = function(kb) {\n        var i = this.$handlers.indexOf(kb);\n        if (i == -1)\n            return false;\n        this.$handlers.splice(i, 1);\n        kb.detach && kb.detach(this.$editor);\n        return true;\n    };\n\n    this.getKeyboardHandler = function() {\n        return this.$handlers[this.$handlers.length - 1];\n    };\n\n    this.$callKeyboardHandlers = function (hashId, keyString, keyCode, e) {\n        var toExecute;\n        for (var i = this.$handlers.length; i--;) {\n            toExecute = this.$handlers[i].handleKeyboard(\n                this.$data, hashId, keyString, keyCode, e\n            );\n            if (toExecute && toExecute.command)\n                break;\n        }\n\n        if (!toExecute || !toExecute.command)\n            return false;\n\n        var success = false;\n        var commands = this.$editor.commands;\n\n        // allow keyboardHandler to consume keys\n        if (toExecute.command != \"null\")\n            success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);\n        else\n            success = toExecute.passEvent != true;\n\n        // do not stop input events to not break repeating\n        if (success && e && hashId != -1)\n            event.stopEvent(e);\n\n        return success;\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        var keyString = keyUtil.keyCodeToString(keyCode);\n        this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n    };\n\n    this.onTextInput = function(text) {\n        var success = this.$callKeyboardHandlers(-1, text);\n        if (!success)\n            this.$editor.commands.exec(\"insertstring\", this.$editor, text);\n    };\n\n}).call(KeyBinding.prototype);\n\nexports.KeyBinding = KeyBinding;\n});\n\ndefine('ace/edit_session', ['require', 'exports', 'module' , 'ace/config', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/net', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/search_highlight', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {\n\n\nvar config = require(\"./config\");\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar net = require(\"./lib/net\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Selection = require(\"./selection\").Selection;\nvar TextMode = require(\"./mode/text\").Mode;\nvar Range = require(\"./range\").Range;\nvar Document = require(\"./document\").Document;\nvar BackgroundTokenizer = require(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\n\n// events \n/**\n * EditSession@change(e)\n * - e (Object): An object containing a `delta` of information about the change.\n *\n * Emitted when the document changes.\n **/\n/**\n * EditSession@changeTabSize()\n *\n * Emitted when the tab size changes, via [[EditSession.setTabSize]].\n **/\n/**\n * EditSession@changeOverwrite()\n *\n * Emitted when the ability to overwrite text changes, via [[EditSession.setOverwrite]].\n **/\n/**\n * EditSession@changeBreakpoint()\n *\n * Emitted when the gutter changes, either by setting or removing breakpoints, or when the gutter decorations change.\n **/\n/**\n * EditSession@changeFrontMarker()\n *\n * Emitted when a front marker changes.\n **/\n/**\n * EditSession@changeBackMarker()\n *\n * Emitted when a back marker changes.\n **/\n/**\n * EditSession@changeAnnotation()\n *\n * Emitted when an annotation changes, like through [[EditSession.setAnnotations]].\n **/\n/**\n * EditSession@tokenizerUpdate(e)\n * - e (Object): An object containing one property, `\"data\"`, that contains information about the changing rows\n *\n * Emitted when a background tokenizer asynchronously processes new rows.\n *\n **/\n/** hide\n * EditSession@loadMode(e)\n * \n *\n *\n **/\n/** \n * EditSession@changeMode()\n * \n * Emitted when the current mode changes.\n *\n **/\n/** \n * EditSession@changeWrapMode()\n * \n * Emitted when the wrap mode changes.\n *\n **/\n/** \n * EditSession@changeWrapLimit()\n * \n * Emitted when the wrapping limit changes.\n *\n **/\n/**\n * EditSession@changeFold(e)\n *\n * Emitted when a code fold is added or removed.\n *\n **/\n /**\n * EditSession@changeScrollTop(scrollTop) \n * - scrollTop (Number): The new scroll top value\n *\n * Emitted when the scroll top changes.\n **/\n/**\n * EditSession@changeScrollLeft(scrollLeft) \n * - scrollLeft (Number): The new scroll left value\n *\n * Emitted when the scroll left changes.\n **/\n     \n     \n/**\n * new EditSession(text, mode)\n * - text (Document | String): If `text` is a `Document`, it associates the `EditSession` with it. Otherwise, a new `Document` is created, with the initial text\n * - mode (TextMode): The inital language mode to use for the document\n *\n * Sets up a new `EditSession` and associates it with the given `Document` and `TextMode`.\n *\n **/\n\nvar EditSession = function(text, mode) {\n    this.$modified = true;\n    this.$breakpoints = [];\n    this.$decorations = [];\n    this.$frontMarkers = {};\n    this.$backMarkers = {};\n    this.$markerId = 1;\n    this.$resetRowCache(0);\n    this.$wrapData = [];\n    this.$foldData = [];\n    this.$rowLengthCache = [];\n    this.$undoSelect = true;\n    this.$foldData.toString = function() {\n        var str = \"\";\n        this.forEach(function(foldLine) {\n            str += \"\\n\" + foldLine.toString();\n        });\n        return str;\n    }\n\n    if (typeof text == \"object\" && text.getLine) {\n        this.setDocument(text);\n    } else {\n        this.setDocument(new Document(text));\n    }\n\n    this.selection = new Selection(this);\n    this.setMode(mode);\n};\n\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setDocument = function(doc) {\n        if (this.doc)\n            throw new Error(\"Document is already set\");\n\n        this.doc = doc;\n        doc.on(\"change\", this.onChange.bind(this));\n        this.on(\"changeFold\", this.onChangeFold.bind(this));\n\n        if (this.bgTokenizer) {\n            this.bgTokenizer.setDocument(this.getDocument());\n            this.bgTokenizer.start(0);\n        }\n    };\n    this.getDocument = function() {\n        return this.doc;\n    };\n    this.$resetRowCache = function(docRow) {\n        if (!docRow) {\n            this.$docRowCache = [];\n            this.$screenRowCache = [];\n            return;\n        }\n\n        var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n        var l = this.$docRowCache.length;\n        this.$docRowCache.splice(i, l);\n        this.$screenRowCache.splice(i, l);\n\n    };\n\n    this.$getRowCacheIndex = function(cacheArray, val) {\n        var low = 0;\n        var hi = cacheArray.length - 1;\n\n        while (low <= hi) {\n            var mid = (low + hi) >> 1;\n            var c = cacheArray[mid];\n\n            if (val > c)\n                low = mid + 1;\n            else if (val < c)\n                hi = mid - 1;\n            else\n                return mid;\n        }\n\n        return low && low -1;\n    };\n\n    this.onChangeFold = function(e) {\n        var fold = e.data;\n        this.$resetRowCache(fold.start.row);\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        this.$modified = true;\n\n        this.$resetRowCache(delta.range.start.row);\n\n        var removedFolds = this.$updateInternalDataOnChange(e);\n        if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n            this.$deltasDoc.push(delta);\n            if (removedFolds && removedFolds.length != 0) {\n                this.$deltasFold.push({\n                    action: \"removeFolds\",\n                    folds:  removedFolds\n                });\n            }\n\n            this.$informUndoManager.schedule();\n        }\n\n        this.bgTokenizer.$updateOnChange(delta);\n        this._emit(\"change\", e);\n    };\n    this.setValue = function(text) {\n        this.doc.setValue(text);\n        this.selection.moveCursorTo(0, 0);\n        this.selection.clearSelection();\n\n        this.$resetRowCache(0);\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n        this.getUndoManager().reset();\n    };\n    /** alias of: EditSession.getValue\n    * EditSession.toString() -> String\n    *\n    * Returns the current [[Document `Document`]] as a string.\n    *\n    **/\n    this.getValue =\n    this.toString = function() {\n        return this.doc.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.getState = function(row) {\n        return this.bgTokenizer.getState(row);\n    };\n    this.getTokens = function(row) {\n        return this.bgTokenizer.getTokens(row);\n    };\n    this.getTokenAt = function(row, column) {\n        var tokens = this.bgTokenizer.getTokens(row);\n        var token, c = 0;\n        if (column == null) {\n            i = tokens.length - 1;\n            c = this.getLine(row).length;\n        } else {\n            for (var i = 0; i < tokens.length; i++) {\n                c += tokens[i].value.length;\n                if (c >= column)\n                    break;\n            }\n        }\n        token = tokens[i];\n        if (!token)\n            return null;\n        token.index = i;\n        token.start = c - token.value.length;\n        return token;\n    };\n\n    this.highlight = function(re) {\n        if (!this.$searchHighlight) {\n            var highlight = new SearchHighlight(null, \"ace_selected_word\", \"text\");\n            this.$searchHighlight = this.addDynamicMarker(highlight);\n        }\n        this.$searchHighlight.setRegexp(re);\n    }\n    /**\n    * EditSession.setUndoManager(undoManager)\n    * - undoManager (UndoManager): The new undo manager\n    *\n    * Sets the undo manager.\n    **/\n    this.setUndoManager = function(undoManager) {\n        this.$undoManager = undoManager;\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n\n        if (this.$informUndoManager)\n            this.$informUndoManager.cancel();\n\n        if (undoManager) {\n            var self = this;\n            this.$syncInformUndoManager = function() {\n                self.$informUndoManager.cancel();\n\n                if (self.$deltasFold.length) {\n                    self.$deltas.push({\n                        group: \"fold\",\n                        deltas: self.$deltasFold\n                    });\n                    self.$deltasFold = [];\n                }\n\n                if (self.$deltasDoc.length) {\n                    self.$deltas.push({\n                        group: \"doc\",\n                        deltas: self.$deltasDoc\n                    });\n                    self.$deltasDoc = [];\n                }\n\n                if (self.$deltas.length > 0) {\n                    undoManager.execute({\n                        action: \"aceupdate\",\n                        args: [self.$deltas, self]\n                    });\n                }\n\n                self.$deltas = [];\n            }\n            this.$informUndoManager =\n                lang.deferredCall(this.$syncInformUndoManager);\n        }\n    };\n\n    this.$defaultUndoManager = {\n        undo: function() {},\n        redo: function() {},\n        reset: function() {}\n    };\n    this.getUndoManager = function() {\n        return this.$undoManager || this.$defaultUndoManager;\n    },\n\n    /**\n    * EditSession.getTabString() -> String\n    *\n    * Returns the current value for tabs. If the user is using soft tabs, this will be a series of spaces (defined by [[EditSession.getTabSize `getTabSize()`]]); otherwise it's simply `'\\t'`.\n    **/\n    this.getTabString = function() {\n        if (this.getUseSoftTabs()) {\n            return lang.stringRepeat(\" \", this.getTabSize());\n        } else {\n            return \"\\t\";\n        }\n    };\n\n    this.$useSoftTabs = true;\n    this.setUseSoftTabs = function(useSoftTabs) {\n        if (this.$useSoftTabs === useSoftTabs) return;\n\n        this.$useSoftTabs = useSoftTabs;\n    };\n    this.getUseSoftTabs = function() {\n        return this.$useSoftTabs;\n    };\n\n    this.$tabSize = 4;\n    this.setTabSize = function(tabSize) {\n        if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n        this.$modified = true;\n        this.$rowLengthCache = [];\n        this.$tabSize = tabSize;\n        this._emit(\"changeTabSize\");\n    };\n    this.getTabSize = function() {\n        return this.$tabSize;\n    };\n    this.isTabStop = function(position) {\n        return this.$useSoftTabs && (position.column % this.$tabSize == 0);\n    };\n\n    this.$overwrite = false;\n    this.setOverwrite = function(overwrite) {\n        if (this.$overwrite == overwrite) return;\n\n        this.$overwrite = overwrite;\n        this._emit(\"changeOverwrite\");\n    };\n    this.getOverwrite = function() {\n        return this.$overwrite;\n    };\n    this.toggleOverwrite = function() {\n        this.setOverwrite(!this.$overwrite);\n    };\n    this.addGutterDecoration = function(row, className) {\n        if (!this.$decorations[row])\n            this.$decorations[row] = \"\";\n        this.$decorations[row] += \" \" + className;\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.removeGutterDecoration = function(row, className) {\n        this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.getBreakpoints = function() {\n        return this.$breakpoints;\n    };\n    this.setBreakpoints = function(rows) {\n        this.$breakpoints = [];\n        for (var i=0; i<rows.length; i++) {\n            this.$breakpoints[rows[i]] = \"ace_breakpoint\";\n        }\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoints = function() {\n        this.$breakpoints = [];\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.setBreakpoint = function(row, className) {\n        if (className === undefined)\n            className = \"ace_breakpoint\";\n        if (className)\n            this.$breakpoints[row] = className;\n        else\n            delete this.$breakpoints[row];\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoint = function(row) {\n        delete this.$breakpoints[row];\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.addMarker = function(range, clazz, type, inFront) {\n        var id = this.$markerId++;\n\n        var marker = {\n            range : range,\n            type : type || \"line\",\n            renderer: typeof type == \"function\" ? type : null,\n            clazz : clazz,\n            inFront: !!inFront,\n            id: id\n        }\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._emit(\"changeFrontMarker\")\n        } else {\n            this.$backMarkers[id] = marker;\n            this._emit(\"changeBackMarker\")\n        }\n\n        return id;\n    };\n    this.addDynamicMarker = function(marker, inFront) {\n        if (!marker.update)\n            return;\n        var id = this.$markerId++;\n        marker.id = id;\n        marker.inFront = !!inFront;\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._emit(\"changeFrontMarker\")\n        } else {\n            this.$backMarkers[id] = marker;\n            this._emit(\"changeBackMarker\")\n        }\n\n        return marker;\n    };\n    this.removeMarker = function(markerId) {\n        var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];\n        if (!marker)\n            return;\n\n        var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;\n        if (marker) {\n            delete (markers[markerId]);\n            this._emit(marker.inFront ? \"changeFrontMarker\" : \"changeBackMarker\");\n        }\n    };\n    this.getMarkers = function(inFront) {\n        return inFront ? this.$frontMarkers : this.$backMarkers;\n    };\n    /**\n    * EditSession.setAnnotations(annotations)\n    * - annotations (Array): A list of annotations\n    *\n    * Sets annotations for the `EditSession`. This functions emits the `'changeAnnotation'` event.\n    **/\n    this.setAnnotations = function(annotations) {\n        this.$annotations = {};\n        for (var i=0; i<annotations.length; i++) {\n            var annotation = annotations[i];\n            var row = annotation.row;\n            if (this.$annotations[row])\n                this.$annotations[row].push(annotation);\n            else\n                this.$annotations[row] = [annotation];\n        }\n        this._emit(\"changeAnnotation\", {});\n    };\n    this.getAnnotations = function() {\n        return this.$annotations || {};\n    };\n    this.clearAnnotations = function() {\n        this.$annotations = {};\n        this._emit(\"changeAnnotation\", {});\n    };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r?\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getWordRange = function(row, column) {\n        var line = this.getLine(row);\n\n        var inToken = false;\n        if (column > 0)\n            inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n        if (!inToken)\n            inToken = !!line.charAt(column).match(this.tokenRe);\n        \n        if (inToken)\n            var re = this.tokenRe;\n        else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n            var re = /\\s/;\n        else\n            var re = this.nonTokenRe;\n\n        var start = column;\n        if (start > 0) {\n            do {\n                start--;\n            }\n            while (start >= 0 && line.charAt(start).match(re));\n            start++;\n        }\n\n        var end = column;\n        while (end < line.length && line.charAt(end).match(re)) {\n            end++;\n        }\n\n        return new Range(row, start, row, end);\n    };\n    this.getAWordRange = function(row, column) {\n        var wordRange = this.getWordRange(row, column);\n        var line = this.getLine(wordRange.end.row);\n\n        while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n            wordRange.end.column += 1;\n        }\n        return wordRange;\n    };\n    this.setNewLineMode = function(newLineMode) {\n        this.doc.setNewLineMode(newLineMode);\n    };\n    this.getNewLineMode = function() {\n        return this.doc.getNewLineMode();\n    };\n\n    this.$useWorker = true;\n    this.setUseWorker = function(useWorker) {\n        if (this.$useWorker == useWorker)\n            return;\n\n        this.$useWorker = useWorker;\n\n        this.$stopWorker();\n        if (useWorker)\n            this.$startWorker();\n    };\n    this.getUseWorker = function() {\n        return this.$useWorker;\n    };\n    this.onReloadTokenizer = function(e) {\n        var rows = e.data;\n        this.bgTokenizer.start(rows.first);\n        this._emit(\"tokenizerUpdate\", e);\n    };\n\n    this.$modes = {};\n    this._loadMode = function(mode, callback) {\n        if (!this.$modes[\"null\"])\n            this.$modes[\"null\"] = this.$modes[\"ace/mode/text\"] = new TextMode();\n\n        if (this.$modes[mode])\n            return callback(this.$modes[mode]);\n\n        var _self = this;\n        var module;\n        try {\n            module = require(mode);\n        } catch (e) {};\n        // sometimes require returns empty object (this bug is present in requirejs 2 as well)\n        if (module && module.Mode)\n            return done(module);\n\n        // set mode to text until loading is finished\n        if (!this.$mode)\n            this.$setModePlaceholder();\n\n        fetch(mode, function() {\n            require([mode], done);\n        });\n\n        function done(module) {\n            if (_self.$modes[mode])\n                return callback(_self.$modes[mode]);\n\n            _self.$modes[mode] = new module.Mode();\n            _self.$modes[mode].$id = mode;\n            _self._emit(\"loadmode\", {\n                name: mode,\n                mode: _self.$modes[mode]\n            });\n            callback(_self.$modes[mode]);\n        }\n\n        function fetch(name, callback) {\n            if (!config.get(\"packaged\"))\n                return callback();\n\n            net.loadScript(config.moduleUrl(name, \"mode\"), callback);\n        }\n    };\n\n    this.$setModePlaceholder = function() {\n        this.$mode = this.$modes[\"null\"];\n        var tokenizer = this.$mode.getTokenizer();\n\n        if (!this.bgTokenizer) {\n            this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n            var _self = this;\n            this.bgTokenizer.addEventListener(\"update\", function(e) {\n                _self._emit(\"tokenizerUpdate\", e);\n            });\n        } else {\n            this.bgTokenizer.setTokenizer(tokenizer);\n        }\n        this.bgTokenizer.setDocument(this.getDocument());\n\n        this.tokenRe = this.$mode.tokenRe;\n        this.nonTokenRe = this.$mode.nonTokenRe;\n    };\n    this.$mode = null;\n    this.$modeId = null;\n    this.setMode = function(mode) {\n        mode = mode || \"null\";\n        // load on demand\n        if (typeof mode === \"string\") {\n            if (this.$modeId == mode)\n                return;\n\n            this.$modeId = mode;\n            var _self = this;\n            this._loadMode(mode, function(module) {\n                if (_self.$modeId !== mode)\n                    return;\n\n                _self.setMode(module);\n            });\n            return;\n        }\n\n        if (this.$mode === mode) return;\n        this.$mode = mode;\n        this.$modeId = mode.$id;\n\n        this.$stopWorker();\n\n        if (this.$useWorker)\n            this.$startWorker();\n\n        var tokenizer = mode.getTokenizer();\n\n        if(tokenizer.addEventListener !== undefined) {\n            var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n            tokenizer.addEventListener(\"update\", onReloadTokenizer);\n        }\n\n        if (!this.bgTokenizer) {\n            this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n            var _self = this;\n            this.bgTokenizer.addEventListener(\"update\", function(e) {\n                _self._emit(\"tokenizerUpdate\", e);\n            });\n        } else {\n            this.bgTokenizer.setTokenizer(tokenizer);\n        }\n\n        this.bgTokenizer.setDocument(this.getDocument());\n        this.bgTokenizer.start(0);\n\n        this.tokenRe = mode.tokenRe;\n        this.nonTokenRe = mode.nonTokenRe;\n\n        this.$setFolding(mode.foldingRules);\n\n        this._emit(\"changeMode\");\n    };\n    this.$stopWorker = function() {\n        if (this.$worker)\n            this.$worker.terminate();\n\n        this.$worker = null;\n    };\n    this.$startWorker = function() {\n        if (typeof Worker !== \"undefined\" && !require.noWorker) {\n            try {\n                this.$worker = this.$mode.createWorker(this);\n            } catch (e) {\n                console.log(\"Could not load worker\");\n                console.log(e);\n                this.$worker = null;\n            }\n        }\n        else\n            this.$worker = null;\n    };\n    this.getMode = function() {\n        return this.$mode;\n    };\n\n    this.$scrollTop = 0;\n    this.setScrollTop = function(scrollTop) {\n        scrollTop = Math.round(Math.max(0, scrollTop));\n        if (this.$scrollTop === scrollTop)\n            return;\n\n        this.$scrollTop = scrollTop;\n        this._emit(\"changeScrollTop\", scrollTop);\n    };\n    this.getScrollTop = function() {\n        return this.$scrollTop;\n    };\n\n    this.$scrollLeft = 0;\n    this.setScrollLeft = function(scrollLeft) {\n        scrollLeft = Math.round(Math.max(0, scrollLeft));\n        if (this.$scrollLeft === scrollLeft)\n            return;\n\n        this.$scrollLeft = scrollLeft;\n        this._emit(\"changeScrollLeft\", scrollLeft);\n    };\n    this.getScrollLeft = function() {\n        return this.$scrollLeft;\n    };\n    this.getScreenWidth = function() {\n        this.$computeWidth();\n        return this.screenWidth;\n    };\n\n    this.$computeWidth = function(force) {\n        if (this.$modified || force) {\n            this.$modified = false;\n\n            if (this.$useWrapMode)\n                return this.screenWidth = this.$wrapLimit;\n\n            var lines = this.doc.getAllLines();\n            var cache = this.$rowLengthCache;\n            var longestScreenLine = 0;\n            var foldIndex = 0;\n            var foldLine = this.$foldData[foldIndex];\n            var foldStart = foldLine ? foldLine.start.row : Infinity;\n            var len = lines.length;\n\n            for (var i = 0; i < len; i++) {\n                if (i > foldStart) {\n                    i = foldLine.end.row + 1;\n                    if (i >= len)\n                        break;\n                    foldLine = this.$foldData[foldIndex++];\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n\n                if (cache[i] == null)\n                    cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n                if (cache[i] > longestScreenLine)\n                    longestScreenLine = cache[i];\n            }\n            this.screenWidth = longestScreenLine;\n        }\n    };\n    this.getLine = function(row) {\n        return this.doc.getLine(row);\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.doc.getLines(firstRow, lastRow);\n    };\n    this.getLength = function() {\n        return this.doc.getLength();\n    };\n    this.getTextRange = function(range) {\n        return this.doc.getTextRange(range || this.selection.getRange());\n    };\n    this.insert = function(position, text) {\n        return this.doc.insert(position, text);\n    };\n    this.remove = function(range) {\n        return this.doc.remove(range);\n    };\n    this.undoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = deltas.length - 1; i != -1; i--) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.revertDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n            } else {\n                delta.deltas.forEach(function(foldDelta) {\n                    this.addFolds(foldDelta.folds);\n                }, this);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.redoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = 0; i < deltas.length; i++) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.applyDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.setUndoSelect = function(enable) {\n        this.$undoSelect = enable;\n    };\n    this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n        function isInsert(delta) {\n            var insert =\n                delta.action == \"insertText\" || delta.action == \"insertLines\";\n            return isUndo ? !insert : insert;\n        }\n\n        var delta = deltas[0];\n        var range, point;\n        var lastDeltaIsInsert = false;\n        if (isInsert(delta)) {\n            range = delta.range.clone();\n            lastDeltaIsInsert = true;\n        } else {\n            range = Range.fromPoints(delta.range.start, delta.range.start);\n            lastDeltaIsInsert = false;\n        }\n\n        for (var i = 1; i < deltas.length; i++) {\n            delta = deltas[i];\n            if (isInsert(delta)) {\n                point = delta.range.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range.setStart(delta.range.start);\n                }\n                point = delta.range.end;\n                if (range.compare(point.row, point.column) == 1) {\n                    range.setEnd(delta.range.end);\n                }\n                lastDeltaIsInsert = true;\n            } else {\n                point = delta.range.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range =\n                        Range.fromPoints(delta.range.start, delta.range.start);\n                }\n                lastDeltaIsInsert = false;\n            }\n        }\n\n        // Check if this range and the last undo range has something in common.\n        // If true, merge the ranges.\n        if (lastUndoRange != null) {\n            var cmp = lastUndoRange.compareRange(range);\n            if (cmp == 1) {\n                range.setStart(lastUndoRange.start);\n            } else if (cmp == -1) {\n                range.setEnd(lastUndoRange.end);\n            }\n        }\n\n        return range;\n    },\n\n    /** related to: Document.replace\n    * EditSession.replace(range, text) -> Object\n    * - range (Range): A specified Range to replace\n    * - text (String): The new text to use as a replacement\n    * + (Object): Returns an object containing the final row and column, like this:<br/>\n    * ```{row: endRow, column: 0}```<br/>\n    * If the text and range are empty, this function returns an object containing the current `range.start` value.<br/>\n    * If the text is the exact same as what currently exists, this function returns an object containing the current `range.end` value.\n    *\n    * Replaces a range in the document with the new `text`.\n    *\n    *\n    *\n    **/\n    this.replace = function(range, text) {\n        return this.doc.replace(range, text);\n    };\n    this.moveText = function(fromRange, toPosition) {\n        var text = this.getTextRange(fromRange);\n        this.remove(fromRange);\n\n        var toRow = toPosition.row;\n        var toColumn = toPosition.column;\n\n        // Make sure to update the insert location, when text is removed in\n        // front of the chosen point of insertion.\n        if (!fromRange.isMultiLine() && fromRange.start.row == toRow &&\n            fromRange.end.column < toColumn)\n            toColumn -= text.length;\n\n        if (fromRange.isMultiLine() && fromRange.end.row < toRow) {\n            var lines = this.doc.$split(text);\n            toRow -= lines.length - 1;\n        }\n\n        var endRow = toRow + fromRange.end.row - fromRange.start.row;\n        var endColumn = fromRange.isMultiLine() ?\n                        fromRange.end.column :\n                        toColumn + fromRange.end.column - fromRange.start.column;\n\n        var toRange = new Range(toRow, toColumn, endRow, endColumn);\n\n        this.insert(toRange.start, text);\n\n        return toRange;\n    };\n    this.indentRows = function(startRow, endRow, indentString) {\n        indentString = indentString.replace(/\\t/g, this.getTabString());\n        for (var row=startRow; row<=endRow; row++)\n            this.insert({row: row, column:0}, indentString);\n    };\n    this.outdentRows = function (range) {\n        var rowRange = range.collapseRows();\n        var deleteRange = new Range(0, 0, 0, 0);\n        var size = this.getTabSize();\n\n        for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n            var line = this.getLine(i);\n\n            deleteRange.start.row = i;\n            deleteRange.end.row = i;\n            for (var j = 0; j < size; ++j)\n                if (line.charAt(j) != ' ')\n                    break;\n            if (j < size && line.charAt(j) == '\\t') {\n                deleteRange.start.column = j;\n                deleteRange.end.column = j + 1;\n            } else {\n                deleteRange.start.column = 0;\n                deleteRange.end.column = j;\n            }\n            this.remove(deleteRange);\n        }\n    };\n    this.moveLinesUp = function(firstRow, lastRow) {\n        if (firstRow <= 0) return 0;\n\n        var removed = this.doc.removeLines(firstRow, lastRow);\n        this.doc.insertLines(firstRow - 1, removed);\n        return -1;\n    };\n    this.moveLinesDown = function(firstRow, lastRow) {\n        if (lastRow >= this.doc.getLength()-1) return 0;\n\n        var removed = this.doc.removeLines(firstRow, lastRow);\n        this.doc.insertLines(firstRow+1, removed);\n        return 1;\n    };\n    this.duplicateLines = function(firstRow, lastRow) {\n        var firstRow = this.$clipRowToDocument(firstRow);\n        var lastRow = this.$clipRowToDocument(lastRow);\n\n        var lines = this.getLines(firstRow, lastRow);\n        this.doc.insertLines(firstRow, lines);\n\n        var addedRows = lastRow - firstRow + 1;\n        return addedRows;\n    };\n\n\n    this.$clipRowToDocument = function(row) {\n        return Math.max(0, Math.min(row, this.doc.getLength()-1));\n    };\n\n    this.$clipColumnToRow = function(row, column) {\n        if (column < 0)\n            return 0;\n        return Math.min(this.doc.getLine(row).length, column);\n    };\n\n\n    this.$clipPositionToDocument = function(row, column) {\n        column = Math.max(0, column);\n\n        if (row < 0) {\n            row = 0;\n            column = 0;\n        } else {\n            var len = this.doc.getLength();\n            if (row >= len) {\n                row = len - 1;\n                column = this.doc.getLine(len-1).length;\n            } else {\n                column = Math.min(this.doc.getLine(row).length, column);\n            }\n        }\n\n        return {\n            row: row,\n            column: column\n        };\n    };\n\n    this.$clipRangeToDocument = function(range) {\n        if (range.start.row < 0) {\n            range.start.row = 0;\n            range.start.column = 0;\n        } else {\n            range.start.column = this.$clipColumnToRow(\n                range.start.row,\n                range.start.column\n            );\n        }\n\n        var len = this.doc.getLength() - 1;\n        if (range.end.row > len) {\n            range.end.row = len;\n            range.end.column = this.doc.getLine(len).length;\n        } else {\n            range.end.column = this.$clipColumnToRow(\n                range.end.row,\n                range.end.column\n            );\n        }\n        return range;\n    };\n\n    // WRAPMODE\n    this.$wrapLimit = 80;\n    this.$useWrapMode = false;\n    this.$wrapLimitRange = {\n        min : null,\n        max : null\n    };\n    this.setUseWrapMode = function(useWrapMode) {\n        if (useWrapMode != this.$useWrapMode) {\n            this.$useWrapMode = useWrapMode;\n            this.$modified = true;\n            this.$resetRowCache(0);\n\n            // If wrapMode is activaed, the wrapData array has to be initialized.\n            if (useWrapMode) {\n                var len = this.getLength();\n                this.$wrapData = [];\n                for (var i = 0; i < len; i++) {\n                    this.$wrapData.push([]);\n                }\n                this.$updateWrapData(0, len - 1);\n            }\n\n            this._emit(\"changeWrapMode\");\n        }\n    };\n    this.getUseWrapMode = function() {\n        return this.$useWrapMode;\n    };\n\n    // Allow the wrap limit to move freely between min and max. Either\n    // parameter can be null to allow the wrap limit to be unconstrained\n    // in that direction. Or set both parameters to the same number to pin\n    // the limit to that value.\n    /**\n    * EditSession.setWrapLimitRange(min, max)\n    * - min (Number): The minimum wrap value (the left side wrap)\n    * - max (Number): The maximum wrap value (the right side wrap)\n    *\n    * Sets the boundaries of wrap. Either value can be `null` to have an unconstrained wrap, or, they can be the same number to pin the limit. If the wrap limits for `min` or `max` are different, this method also emits the `'changeWrapMode'` event.\n    **/\n    this.setWrapLimitRange = function(min, max) {\n        if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n            this.$wrapLimitRange.min = min;\n            this.$wrapLimitRange.max = max;\n            this.$modified = true;\n            // This will force a recalculation of the wrap limit\n            this._emit(\"changeWrapMode\");\n        }\n    };\n    this.adjustWrapLimit = function(desiredLimit) {\n        var wrapLimit = this.$constrainWrapLimit(desiredLimit);\n        if (wrapLimit != this.$wrapLimit && wrapLimit > 0) {\n            this.$wrapLimit = wrapLimit;\n            this.$modified = true;\n            if (this.$useWrapMode) {\n                this.$updateWrapData(0, this.getLength() - 1);\n                this.$resetRowCache(0);\n                this._emit(\"changeWrapLimit\");\n            }\n            return true;\n        }\n        return false;\n    };\n    this.$constrainWrapLimit = function(wrapLimit) {\n        var min = this.$wrapLimitRange.min;\n        if (min)\n            wrapLimit = Math.max(min, wrapLimit);\n\n        var max = this.$wrapLimitRange.max;\n        if (max)\n            wrapLimit = Math.min(max, wrapLimit);\n\n        // What would a limit of 0 even mean?\n        return Math.max(1, wrapLimit);\n    };\n    this.getWrapLimit = function() {\n        return this.$wrapLimit;\n    };\n    this.getWrapLimitRange = function() {\n        // Avoid unexpected mutation by returning a copy\n        return {\n            min : this.$wrapLimitRange.min,\n            max : this.$wrapLimitRange.max\n        };\n    };\n    this.$updateInternalDataOnChange = function(e) {\n        var useWrapMode = this.$useWrapMode;\n        var len;\n        var action = e.data.action;\n        var firstRow = e.data.range.start.row;\n        var lastRow = e.data.range.end.row;\n        var start = e.data.range.start;\n        var end = e.data.range.end;\n        var removedFolds = null;\n\n        if (action.indexOf(\"Lines\") != -1) {\n            if (action == \"insertLines\") {\n                lastRow = firstRow + (e.data.lines.length);\n            } else {\n                lastRow = firstRow;\n            }\n            len = e.data.lines ? e.data.lines.length : lastRow - firstRow;\n        } else {\n            len = lastRow - firstRow;\n        }\n\n        if (len != 0) {\n            if (action.indexOf(\"remove\") != -1) {\n                this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n                var foldLines = this.$foldData;\n                removedFolds = this.getFoldsInRange(e.data.range);\n                this.removeFolds(removedFolds);\n\n                var foldLine = this.getFoldLine(end.row);\n                var idx = 0;\n                if (foldLine) {\n                    foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n                    foldLine.shiftRow(-len);\n\n                    var foldLineBefore = this.getFoldLine(firstRow);\n                    if (foldLineBefore && foldLineBefore !== foldLine) {\n                        foldLineBefore.merge(foldLine);\n                        foldLine = foldLineBefore;\n                    }\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= end.row) {\n                        foldLine.shiftRow(-len);\n                    }\n                }\n\n                lastRow = firstRow;\n            } else {\n                var args;\n                if (useWrapMode) {\n                    args = [firstRow, 0];\n                    for (var i = 0; i < len; i++) args.push([]);\n                    this.$wrapData.splice.apply(this.$wrapData, args);\n                } else {\n                    args = Array(len);\n                    args.unshift(firstRow, 0);\n                    this.$rowLengthCache.splice.apply(this.$rowLengthCache, args);\n                }\n\n                // If some new line is added inside of a foldLine, then split\n                // the fold line up.\n                var foldLines = this.$foldData;\n                var foldLine = this.getFoldLine(firstRow);\n                var idx = 0;\n                if (foldLine) {\n                    var cmp = foldLine.range.compareInside(start.row, start.column)\n                    // Inside of the foldLine range. Need to split stuff up.\n                    if (cmp == 0) {\n                        foldLine = foldLine.split(start.row, start.column);\n                        foldLine.shiftRow(len);\n                        foldLine.addRemoveChars(\n                            lastRow, 0, end.column - start.column);\n                    } else\n                    // Infront of the foldLine but same row. Need to shift column.\n                    if (cmp == -1) {\n                        foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n                        foldLine.shiftRow(len);\n                    }\n                    // Nothing to do if the insert is after the foldLine.\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= firstRow) {\n                        foldLine.shiftRow(len);\n                    }\n                }\n            }\n        } else {\n            // Realign folds. E.g. if you add some new chars before a fold, the\n            // fold should \"move\" to the right.\n            len = Math.abs(e.data.range.start.column - e.data.range.end.column);\n            if (action.indexOf(\"remove\") != -1) {\n                // Get all the folds in the change range and remove them.\n                removedFolds = this.getFoldsInRange(e.data.range);\n                this.removeFolds(removedFolds);\n\n                len = -len;\n            }\n            var foldLine = this.getFoldLine(firstRow);\n            if (foldLine) {\n                foldLine.addRemoveChars(firstRow, start.column, len);\n            }\n        }\n\n        if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n            console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n        }\n\n        if (useWrapMode)\n            this.$updateWrapData(firstRow, lastRow);\n        else\n            this.$updateRowLengthCache(firstRow, lastRow);\n\n        return removedFolds;\n    };\n\n    this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n        this.$rowLengthCache[firstRow] = null;\n        this.$rowLengthCache[lastRow] = null;\n    };\n    this.$updateWrapData = function(firstRow, lastRow) {\n        var lines = this.doc.getAllLines();\n        var tabSize = this.getTabSize();\n        var wrapData = this.$wrapData;\n        var wrapLimit = this.$wrapLimit;\n        var tokens;\n        var foldLine;\n\n        var row = firstRow;\n        lastRow = Math.min(lastRow, lines.length - 1);\n        while (row <= lastRow) {\n            foldLine = this.getFoldLine(row, foldLine);\n            if (!foldLine) {\n                tokens = this.$getDisplayTokens(lang.stringTrimRight(lines[row]));\n                wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row ++;\n            } else {\n                tokens = [];\n                foldLine.walk(\n                    function(placeholder, row, column, lastColumn) {\n                        var walkTokens;\n                        if (placeholder) {\n                            walkTokens = this.$getDisplayTokens(\n                                            placeholder, tokens.length);\n                            walkTokens[0] = PLACEHOLDER_START;\n                            for (var i = 1; i < walkTokens.length; i++) {\n                                walkTokens[i] = PLACEHOLDER_BODY;\n                            }\n                        } else {\n                            walkTokens = this.$getDisplayTokens(\n                                lines[row].substring(lastColumn, column),\n                                tokens.length);\n                        }\n                        tokens = tokens.concat(walkTokens);\n                    }.bind(this),\n                    foldLine.end.row,\n                    lines[foldLine.end.row].length + 1\n                );\n                // Remove spaces/tabs from the back of the token array.\n                while (tokens.length != 0 && tokens[tokens.length - 1] >= SPACE)\n                    tokens.pop();\n\n                wrapData[foldLine.start.row]\n                    = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row = foldLine.end.row + 1;\n            }\n        }\n    };\n\n    // \"Tokens\"\n    var CHAR = 1,\n        CHAR_EXT = 2,\n        PLACEHOLDER_START = 3,\n        PLACEHOLDER_BODY =  4,\n        PUNCTUATION = 9,\n        SPACE = 10,\n        TAB = 11,\n        TAB_SPACE = 12;\n    this.$computeWrapSplits = function(tokens, wrapLimit) {\n        if (tokens.length == 0) {\n            return [];\n        }\n\n        var splits = [];\n        var displayLength = tokens.length;\n        var lastSplit = 0, lastDocSplit = 0;\n\n        function addSplit(screenPos) {\n            var displayed = tokens.slice(lastSplit, screenPos);\n\n            // The document size is the current size - the extra width for tabs\n            // and multipleWidth characters.\n            var len = displayed.length;\n            displayed.join(\"\").\n                // Get all the TAB_SPACEs.\n                replace(/12/g, function() {\n                    len -= 1;\n                }).\n                // Get all the CHAR_EXT/multipleWidth characters.\n                replace(/2/g, function() {\n                    len -= 1;\n                });\n\n            lastDocSplit += len;\n            splits.push(lastDocSplit);\n            lastSplit = screenPos;\n        }\n\n        while (displayLength - lastSplit > wrapLimit) {\n            // This is, where the split should be.\n            var split = lastSplit + wrapLimit;\n\n            // If there is a space or tab at this split position, then making\n            // a split is simple.\n            if (tokens[split] >= SPACE) {\n                // Include all following spaces + tabs in this split as well.\n                while (tokens[split] >= SPACE) {\n                    split ++;\n                }\n                addSplit(split);\n                continue;\n            }\n\n            // === ELSE ===\n            // Check if split is inside of a placeholder. Placeholder are\n            // not splitable. Therefore, seek the beginning of the placeholder\n            // and try to place the split beofre the placeholder's start.\n            if (tokens[split] == PLACEHOLDER_START\n                || tokens[split] == PLACEHOLDER_BODY)\n            {\n                // Seek the start of the placeholder and do the split\n                // before the placeholder. By definition there always\n                // a PLACEHOLDER_START between split and lastSplit.\n                for (split; split != lastSplit - 1; split--) {\n                    if (tokens[split] == PLACEHOLDER_START) {\n                        // split++; << No incremental here as we want to\n                        //  have the position before the Placeholder.\n                        break;\n                    }\n                }\n\n                // If the PLACEHOLDER_START is not the index of the\n                // last split, then we can do the split\n                if (split > lastSplit) {\n                    addSplit(split);\n                    continue;\n                }\n\n                // If the PLACEHOLDER_START IS the index of the last\n                // split, then we have to place the split after the\n                // placeholder. So, let's seek for the end of the placeholder.\n                split = lastSplit + wrapLimit;\n                for (split; split < tokens.length; split++) {\n                    if (tokens[split] != PLACEHOLDER_BODY)\n                    {\n                        break;\n                    }\n                }\n\n                // If spilt == tokens.length, then the placeholder is the last\n                // thing in the line and adding a new split doesn't make sense.\n                if (split == tokens.length) {\n                    break;  // Breaks the while-loop.\n                }\n\n                // Finally, add the split...\n                addSplit(split);\n                continue;\n            }\n\n            // === ELSE ===\n            // Search for the first non space/tab/placeholder/punctuation token backwards.\n            var minSplit = Math.max(split - 10, lastSplit - 1);\n            while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n                split --;\n            }\n            while (split > minSplit && tokens[split] == PUNCTUATION) {\n                split --;\n            }\n            // If we found one, then add the split.\n            if (split > minSplit) {\n                addSplit(++split);\n                continue;\n            }\n\n            // === ELSE ===\n            split = lastSplit + wrapLimit;\n            // The split is inside of a CHAR or CHAR_EXT token and no space\n            // around -> force a split.\n            addSplit(split);\n        }\n        return splits;\n    };\n    this.$getDisplayTokens = function(str, offset) {\n        var arr = [];\n        var tabSize;\n        offset = offset || 0;\n\n        for (var i = 0; i < str.length; i++) {\n            var c = str.charCodeAt(i);\n            // Tab\n            if (c == 9) {\n                tabSize = this.getScreenTabSize(arr.length + offset);\n                arr.push(TAB);\n                for (var n = 1; n < tabSize; n++) {\n                    arr.push(TAB_SPACE);\n                }\n            }\n            // Space\n            else if (c == 32) {\n                arr.push(SPACE);\n            } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n                arr.push(PUNCTUATION);\n            }\n            // full width characters\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                arr.push(CHAR, CHAR_EXT);\n            } else {\n                arr.push(CHAR);\n            }\n        }\n        return arr;\n    };\n    this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n        if (maxScreenColumn == 0)\n            return [0, 0];\n        if (maxScreenColumn == null)\n            maxScreenColumn = Infinity;\n        screenColumn = screenColumn || 0;\n\n        var c, column;\n        for (column = 0; column < str.length; column++) {\n            c = str.charCodeAt(column);\n            // tab\n            if (c == 9) {\n                screenColumn += this.getScreenTabSize(screenColumn);\n            }\n            // full width characters\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                screenColumn += 2;\n            } else {\n                screenColumn += 1;\n            }\n            if (screenColumn > maxScreenColumn) {\n                break;\n            }\n        }\n\n        return [screenColumn, column];\n    };\n    this.getRowLength = function(row) {\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1;\n        } else {\n            return this.$wrapData[row].length + 1;\n        }\n    };\n    this.getScreenLastRowColumn = function(screenRow) {\n        var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n        return this.documentToScreenColumn(pos.row, pos.column);\n    };\n    this.getDocumentLastRowColumn = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.getScreenLastRowColumn(screenRow);\n    };\n    this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n    };\n    this.getRowSplitData = function(row) {\n        if (!this.$useWrapMode) {\n            return undefined;\n        } else {\n            return this.$wrapData[row];\n        }\n    };\n    this.getScreenTabSize = function(screenColumn) {\n        return this.$tabSize - screenColumn % this.$tabSize;\n    };\n    this.screenToDocumentRow = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).row;\n    };\n    this.screenToDocumentColumn = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).column;\n    };\n    this.screenToDocumentPosition = function(screenRow, screenColumn) {\n        if (screenRow < 0)\n            return {row: 0, column: 0};\n\n        var line;\n        var docRow = 0;\n        var docColumn = 0;\n        var column;\n        var row = 0;\n        var rowLength = 0;\n\n        var rowCache = this.$screenRowCache;\n        var i = this.$getRowCacheIndex(rowCache, screenRow);\n        if (0 < i && i < rowCache.length) {\n            var row = rowCache[i];\n            var docRow = this.$docRowCache[i];\n            var doCache = screenRow > row || (screenRow == row && i == rowCache.length - 1);\n        } else {\n            var doCache = i != 0 || !rowCache.length;\n        }\n\n        var maxRow = this.getLength() - 1;\n        var foldLine = this.getNextFoldLine(docRow);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (row <= screenRow) {\n            rowLength = this.getRowLength(docRow);\n            if (row + rowLength - 1 >= screenRow || docRow >= maxRow) {\n                break;\n            } else {\n                row += rowLength;\n                docRow++;\n                if (docRow > foldStart) {\n                    docRow = foldLine.end.row+1;\n                    foldLine = this.getNextFoldLine(docRow, foldLine);\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n            }\n            if (doCache) {\n                this.$docRowCache.push(docRow);\n                this.$screenRowCache.push(row);\n            }\n        }\n\n        if (foldLine && foldLine.start.row <= docRow) {\n            line = this.getFoldDisplayLine(foldLine);\n            docRow = foldLine.start.row;\n        } else if (row + rowLength <= screenRow || docRow > maxRow) {\n            // clip at the end of the document\n            return {\n                row: maxRow,\n                column: this.getLine(maxRow).length\n            }\n        } else {\n            line = this.getLine(docRow);\n            foldLine = null;\n        }\n\n        if (this.$useWrapMode) {\n            var splits = this.$wrapData[docRow];\n            if (splits) {\n                column = splits[screenRow - row];\n                if(screenRow > row && splits.length) {\n                    docColumn = splits[screenRow - row - 1] || splits[splits.length - 1];\n                    line = line.substring(docColumn);\n                }\n            }\n        }\n\n        docColumn += this.$getStringScreenWidth(line, screenColumn)[1];\n\n        // We remove one character at the end so that the docColumn\n        // position returned is not associated to the next row on the screen.\n        if (this.$useWrapMode && docColumn >= column)\n            docColumn = column - 1;\n\n        if (foldLine)\n            return foldLine.idxToPosition(docColumn);\n\n        return {row: docRow, column: docColumn};\n    };\n    this.documentToScreenPosition = function(docRow, docColumn) {\n        // Normalize the passed in arguments.\n        if (typeof docColumn === \"undefined\")\n            var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n        else\n            pos = this.$clipPositionToDocument(docRow, docColumn);\n\n        docRow = pos.row;\n        docColumn = pos.column;\n\n        var screenRow = 0;\n        var foldStartRow = null;\n        var fold = null;\n\n        // Clamp the docRow position in case it's inside of a folded block.\n        fold = this.getFoldAt(docRow, docColumn, 1);\n        if (fold) {\n            docRow = fold.start.row;\n            docColumn = fold.start.column;\n        }\n\n        var rowEnd, row = 0;\n\n\n        var rowCache = this.$docRowCache;\n        var i = this.$getRowCacheIndex(rowCache, docRow);\n        if (0 < i && i < rowCache.length) {\n            var row = rowCache[i];\n            var screenRow = this.$screenRowCache[i];\n            var doCache = docRow > row || (docRow == row && i == rowCache.length - 1);\n        } else {\n            var doCache = i != 0 || !rowCache.length;\n        }\n\n        var foldLine = this.getNextFoldLine(row);\n        var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n        while (row < docRow) {\n            if (row >= foldStart) {\n                rowEnd = foldLine.end.row + 1;\n                if (rowEnd > docRow)\n                    break;\n                foldLine = this.getNextFoldLine(rowEnd, foldLine);\n                foldStart = foldLine ?foldLine.start.row :Infinity;\n            }\n            else {\n                rowEnd = row + 1;\n            }\n\n            screenRow += this.getRowLength(row);\n            row = rowEnd;\n\n            if (doCache) {\n                this.$docRowCache.push(row);\n                this.$screenRowCache.push(screenRow);\n            }\n        }\n\n        // Calculate the text line that is displayed in docRow on the screen.\n        var textLine = \"\";\n        // Check if the final row we want to reach is inside of a fold.\n        if (foldLine && row >= foldStart) {\n            textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n            foldStartRow = foldLine.start.row;\n        } else {\n            textLine = this.getLine(docRow).substring(0, docColumn);\n            foldStartRow = docRow;\n        }\n        // Clamp textLine if in wrapMode.\n        if (this.$useWrapMode) {\n            var wrapRow = this.$wrapData[foldStartRow];\n            var screenRowOffset = 0;\n            while (textLine.length >= wrapRow[screenRowOffset]) {\n                screenRow ++;\n                screenRowOffset++;\n            }\n            textLine = textLine.substring(\n                wrapRow[screenRowOffset - 1] || 0, textLine.length\n            );\n        }\n\n        return {\n            row: screenRow,\n            column: this.$getStringScreenWidth(textLine)[0]\n        };\n    };\n    this.documentToScreenColumn = function(row, docColumn) {\n        return this.documentToScreenPosition(row, docColumn).column;\n    };\n    this.documentToScreenRow = function(docRow, docColumn) {\n        return this.documentToScreenPosition(docRow, docColumn).row;\n    };\n    this.getScreenLength = function() {\n        var screenRows = 0;\n        var fold = null;\n        if (!this.$useWrapMode) {\n            screenRows = this.getLength();\n\n            // Remove the folded lines again.\n            var foldData = this.$foldData;\n            for (var i = 0; i < foldData.length; i++) {\n                fold = foldData[i];\n                screenRows -= fold.end.row - fold.start.row;\n            }\n        } else {\n            var lastRow = this.$wrapData.length;\n            var row = 0, i = 0;\n            var fold = this.$foldData[i++];\n            var foldStart = fold ? fold.start.row :Infinity;\n\n            while (row < lastRow) {\n                screenRows += this.$wrapData[row].length + 1;\n                row ++;\n                if (row > foldStart) {\n                    row = fold.end.row+1;\n                    fold = this.$foldData[i++];\n                    foldStart = fold ?fold.start.row :Infinity;\n                }\n            }\n        }\n\n        return screenRows;\n    }\n\n    // For every keystroke this gets called once per char in the whole doc!!\n    // Wouldn't hurt to make it a bit faster for c >= 0x1100\n    function isFullWidth(c) {\n        if (c < 0x1100)\n            return false;\n        return c >= 0x1100 && c <= 0x115F ||\n               c >= 0x11A3 && c <= 0x11A7 ||\n               c >= 0x11FA && c <= 0x11FF ||\n               c >= 0x2329 && c <= 0x232A ||\n               c >= 0x2E80 && c <= 0x2E99 ||\n               c >= 0x2E9B && c <= 0x2EF3 ||\n               c >= 0x2F00 && c <= 0x2FD5 ||\n               c >= 0x2FF0 && c <= 0x2FFB ||\n               c >= 0x3000 && c <= 0x303E ||\n               c >= 0x3041 && c <= 0x3096 ||\n               c >= 0x3099 && c <= 0x30FF ||\n               c >= 0x3105 && c <= 0x312D ||\n               c >= 0x3131 && c <= 0x318E ||\n               c >= 0x3190 && c <= 0x31BA ||\n               c >= 0x31C0 && c <= 0x31E3 ||\n               c >= 0x31F0 && c <= 0x321E ||\n               c >= 0x3220 && c <= 0x3247 ||\n               c >= 0x3250 && c <= 0x32FE ||\n               c >= 0x3300 && c <= 0x4DBF ||\n               c >= 0x4E00 && c <= 0xA48C ||\n               c >= 0xA490 && c <= 0xA4C6 ||\n               c >= 0xA960 && c <= 0xA97C ||\n               c >= 0xAC00 && c <= 0xD7A3 ||\n               c >= 0xD7B0 && c <= 0xD7C6 ||\n               c >= 0xD7CB && c <= 0xD7FB ||\n               c >= 0xF900 && c <= 0xFAFF ||\n               c >= 0xFE10 && c <= 0xFE19 ||\n               c >= 0xFE30 && c <= 0xFE52 ||\n               c >= 0xFE54 && c <= 0xFE66 ||\n               c >= 0xFE68 && c <= 0xFE6B ||\n               c >= 0xFF01 && c <= 0xFF60 ||\n               c >= 0xFFE0 && c <= 0xFFE6;\n    };\n\n}).call(EditSession.prototype);\n\nrequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nrequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\nexports.EditSession = EditSession;\n});\n\ndefine('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {\n\"no use strict\";\n\nvar lang = require(\"./lib/lang\");\n\nvar global = (function() {\n    return this;\n})();\n\nvar options = {\n    packaged: false,\n    workerPath: \"\",\n    modePath: \"\",\n    themePath: \"\",\n    suffix: \".js\",\n    $moduleUrls: {}\n};\n\nexports.get = function(key) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    return options[key];\n};\n\nexports.set = function(key, value) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    options[key] = value;\n};\n\nexports.all = function() {\n    return lang.copyObject(options);\n};\n\nexports.moduleUrl = function(name, component) {\n    if (options.$moduleUrls[name])\n        return options.$moduleUrls[name];\n\n    var parts = name.split(\"/\");\n    component = component || parts[parts.length - 2] || \"\";\n    var base = parts[parts.length - 1].replace(component, \"\").replace(/(^[\\-_])|([\\-_]$)/, \"\");\n\n    if (!base && parts.length > 1)\n        base = parts[parts.length - 2];\n    return this.get(component + \"Path\") + \"/\" + component + \"-\" + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n    return options.$moduleUrls[name] = subst;\n};\n\nexports.init = function() {\n    options.packaged = require.packaged || module.packaged || (global.define && define.packaged);\n\n    if (!global.document)\n        return \"\";\n\n    var scriptOptions = {};\n    var scriptUrl = \"\";\n\n    var scripts = document.getElementsByTagName(\"script\");\n    for (var i=0; i<scripts.length; i++) {\n        var script = scripts[i];\n\n        var src = script.src || script.getAttribute(\"src\");\n        if (!src) {\n            continue;\n        }\n\n        var attributes = script.attributes;\n        for (var j=0, l=attributes.length; j < l; j++) {\n            var attr = attributes[j];\n            if (attr.name.indexOf(\"data-ace-\") === 0) {\n                scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, \"\"))] = attr.value;\n            }\n        }\n\n        var m = src.match(/^(.*)\\/ace(\\-\\w+)?\\.js(\\?|$)/);\n        if (m)\n            scriptUrl = m[1];\n    }\n\n    if (scriptUrl) {\n        scriptOptions.base = scriptOptions.base || scriptUrl;\n        scriptOptions.packaged = true;\n    }\n\n    scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;\n    scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;\n    scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;\n    delete scriptOptions.base;\n\n    for (var key in scriptOptions)\n        if (typeof scriptOptions[key] !== \"undefined\")\n            exports.set(key, scriptOptions[key]);\n};\n\nfunction deHyphenate(str) {\n    return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); });\n}\n\n});\ndefine('ace/lib/net', ['require', 'exports', 'module' , 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar useragent = require(\"./useragent\");\n\nexports.get = function (url, callback) {\n    var xhr = exports.createXhr();\n    xhr.open('GET', url, true);\n    xhr.onreadystatechange = function (evt) {\n        //Do not explicitly handle errors, those should be\n        //visible via console output in the browser.\n        if (xhr.readyState === 4) {\n            callback(xhr.responseText);\n        }\n    };\n    xhr.send(null);\n};\n\nvar progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];\n\nexports.createXhr = function() {\n    //Would love to dump the ActiveX crap in here. Need IE 6 to die first.\n    var xhr, i, progId;\n    if (typeof XMLHttpRequest !== \"undefined\") {\n        return new XMLHttpRequest();\n    } else {\n        for (i = 0; i < 3; i++) {\n            progId = progIds[i];\n            try {\n                xhr = new ActiveXObject(progId);\n            } catch (e) {}\n\n            if (xhr) {\n                progIds = [progId];  // so faster next time\n                break;\n            }\n        }\n    }\n\n    if (!xhr) {\n        throw new Error(\"createXhr(): XMLHttpRequest not available\");\n    }\n\n    return xhr;\n};\n\nexports.loadScript = function(path, callback) {\n    var head = document.getElementsByTagName('head')[0];\n    var s = document.createElement('script');\n\n    s.src = path;\n    head.appendChild(s);\n\n    if (useragent.isOldIE)\n        s.onreadystatechange = function () {\n            this.readyState == 'loaded' && callback();\n        };\n    else\n        s.onload = callback;\n};\n\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry = this._eventRegistry || {};\n    this._defaultHandlers = this._defaultHandlers || {};\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    \n    if (!e.stopPropagation) {\n        e.stopPropagation = function() {\n            this.propagationStopped = true;\n        };\n    }\n    \n    if (!e.preventDefault) {\n        e.preventDefault = function() {\n            this.defaultPrevented = true;\n        };\n    }\n\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e);\n};\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    this._defaultHandlers = this._defaultHandlers || {};\n    \n    if (this._defaultHandlers[eventName])\n        throw new Error(\"The default handler for '\" + eventName + \"' is already set\");\n        \n    this._defaultHandlers[eventName] = callback;\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners.push(callback);\n};\n\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\n\n/**\n * new Selection(session)\n * - session (EditSession): The session to use\n *\n * Creates a new `Selection` object.\n *\n**/\n/**\n * Selection@changeCursor()\n *\n * Emitted when the cursor position changes.\n *\n**/\n/**\n * Selection@changeSelection()\n *\n * Emitted when the cursor selection changes.\n *\n**/\nvar Selection = function(session) {\n    this.session = session;\n    this.doc = session.getDocument();\n\n    this.clearSelection();\n    this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n    this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n    var self = this;\n    this.lead.on(\"change\", function(e) {\n        self._emit(\"changeCursor\");\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n        if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n            self.$desiredColumn = null;\n    });\n\n    this.selectionAnchor.on(\"change\", function() {\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n    });\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.isEmpty = function() {\n        return (this.$isEmpty || (\n            this.anchor.row == this.lead.row &&\n            this.anchor.column == this.lead.column\n        ));\n    };\n    this.isMultiLine = function() {\n        if (this.isEmpty()) {\n            return false;\n        }\n\n        return this.getRange().isMultiLine();\n    };\n    this.getCursor = function() {\n        return this.lead.getPosition();\n    };\n    this.setSelectionAnchor = function(row, column) {\n        this.anchor.setPosition(row, column);\n\n        if (this.$isEmpty) {\n            this.$isEmpty = false;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.getSelectionAnchor = function() {\n        if (this.$isEmpty)\n            return this.getSelectionLead()\n        else\n            return this.anchor.getPosition();\n    };\n    this.getSelectionLead = function() {\n        return this.lead.getPosition();\n    };\n    this.shiftSelection = function(columns) {\n        if (this.$isEmpty) {\n            this.moveCursorTo(this.lead.row, this.lead.column + columns);\n            return;\n        };\n\n        var anchor = this.getSelectionAnchor();\n        var lead = this.getSelectionLead();\n\n        var isBackwards = this.isBackwards();\n\n        if (!isBackwards || anchor.column !== 0)\n            this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n        if (isBackwards || lead.column !== 0) {\n            this.$moveSelection(function() {\n                this.moveCursorTo(lead.row, lead.column + columns);\n            });\n        }\n    };\n    this.isBackwards = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n        return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n    };\n    this.getRange = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n\n        if (this.isEmpty())\n            return Range.fromPoints(lead, lead);\n\n        if (this.isBackwards()) {\n            return Range.fromPoints(lead, anchor);\n        }\n        else {\n            return Range.fromPoints(anchor, lead);\n        }\n    };\n    this.clearSelection = function() {\n        if (!this.$isEmpty) {\n            this.$isEmpty = true;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.selectAll = function() {\n        var lastRow = this.doc.getLength() - 1;\n        this.setSelectionAnchor(0, 0);\n        this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n    };\n    this.setRange =\n    this.setSelectionRange = function(range, reverse) {\n        if (reverse) {\n            this.setSelectionAnchor(range.end.row, range.end.column);\n            this.selectTo(range.start.row, range.start.column);\n        } else {\n            this.setSelectionAnchor(range.start.row, range.start.column);\n            this.selectTo(range.end.row, range.end.column);\n        }\n        this.$desiredColumn = null;\n    };\n\n    this.$moveSelection = function(mover) {\n        var lead = this.lead;\n        if (this.$isEmpty)\n            this.setSelectionAnchor(lead.row, lead.column);\n\n        mover.call(this);\n    };\n    this.selectTo = function(row, column) {\n        this.$moveSelection(function() {\n            this.moveCursorTo(row, column);\n        });\n    };\n    this.selectToPosition = function(pos) {\n        this.$moveSelection(function() {\n            this.moveCursorToPosition(pos);\n        });\n    };\n    this.selectUp = function() {\n        this.$moveSelection(this.moveCursorUp);\n    };\n    this.selectDown = function() {\n        this.$moveSelection(this.moveCursorDown);\n    };\n    this.selectRight = function() {\n        this.$moveSelection(this.moveCursorRight);\n    };\n    this.selectLeft = function() {\n        this.$moveSelection(this.moveCursorLeft);\n    };\n    this.selectLineStart = function() {\n        this.$moveSelection(this.moveCursorLineStart);\n    };\n    this.selectLineEnd = function() {\n        this.$moveSelection(this.moveCursorLineEnd);\n    };\n    this.selectFileEnd = function() {\n        this.$moveSelection(this.moveCursorFileEnd);\n    };\n    this.selectFileStart = function() {\n        this.$moveSelection(this.moveCursorFileStart);\n    };\n    this.selectWordRight = function() {\n        this.$moveSelection(this.moveCursorWordRight);\n    };\n    this.selectWordLeft = function() {\n        this.$moveSelection(this.moveCursorWordLeft);\n    };\n    this.getWordRange = function(row, column) {\n        if (typeof column == \"undefined\") {\n            var cursor = row || this.lead;\n            row = cursor.row;\n            column = cursor.column;\n        }\n        return this.session.getWordRange(row, column);\n    };\n\n    this.selectWord = function() {\n        this.setSelectionRange(this.getWordRange());\n    };\n    this.selectAWord = function() {\n        var cursor = this.getCursor();\n        var range = this.session.getAWordRange(cursor.row, cursor.column);\n        this.setSelectionRange(range);\n    };\n\n    this.getLineRange = function(row, excludeLastChar) {\n        var rowStart = typeof row == \"number\" ? row : this.lead.row;\n        var rowEnd;\n\n        var foldLine = this.session.getFoldLine(rowStart);\n        if (foldLine) {\n            rowStart = foldLine.start.row;\n            rowEnd = foldLine.end.row;\n        } else {\n            rowEnd = rowStart;\n        }\n        if (excludeLastChar)\n            return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n        else\n            return new Range(rowStart, 0, rowEnd + 1, 0);\n    };\n    this.selectLine = function() {\n        this.setSelectionRange(this.getLineRange());\n    };\n    this.moveCursorUp = function() {\n        this.moveCursorBy(-1, 0);\n    };\n    this.moveCursorDown = function() {\n        this.moveCursorBy(1, 0);\n    };\n    this.moveCursorLeft = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n        } else if (cursor.column == 0) {\n            // cursor is a line (start\n            if (cursor.row > 0) {\n                this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, -tabSize);\n            else\n                this.moveCursorBy(0, -1);\n        }\n    };\n    this.moveCursorRight = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n        }\n        else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n            if (this.lead.row < this.doc.getLength() - 1) {\n                this.moveCursorTo(this.lead.row + 1, 0);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            var cursor = this.lead;\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, tabSize);\n            else\n                this.moveCursorBy(0, 1);\n        }\n    };\n    this.moveCursorLineStart = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var screenRow = this.session.documentToScreenRow(row, column);\n\n        // Determ the doc-position of the first character at the screen line.\n        var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n\n        // Determ the line\n        var beforeCursor = this.session.getDisplayLine(\n            row, null, firstColumnPosition.row,\n            firstColumnPosition.column\n        );\n\n        var leadingSpace = beforeCursor.match(/^\\s*/);\n        if (leadingSpace[0].length == column) {\n            this.moveCursorTo(\n                firstColumnPosition.row, firstColumnPosition.column\n            );\n        }\n        else {\n            this.moveCursorTo(\n                firstColumnPosition.row,\n                firstColumnPosition.column + leadingSpace[0].length\n            );\n        }\n    };\n    this.moveCursorLineEnd = function() {\n        var lead = this.lead;\n        var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n        if (this.lead.column == lineEnd.column) {\n            var line = this.session.getLine(lineEnd.row);\n            if (lineEnd.column == line.length) {\n                var textEnd = line.search(/\\s+$/);\n                if (textEnd > 0)\n                    lineEnd.column = textEnd;\n            }\n        }\n\n        this.moveCursorTo(lineEnd.row, lineEnd.column);\n    };\n    this.moveCursorFileEnd = function() {\n        var row = this.doc.getLength() - 1;\n        var column = this.doc.getLine(row).length;\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorFileStart = function() {\n        this.moveCursorTo(0, 0);\n    };\n    this.moveCursorLongWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n\n        // skip folds\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n            return;\n        }\n\n        // first skip space\n        if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n            column += this.session.nonTokenRe.lastIndex;\n            this.session.nonTokenRe.lastIndex = 0;\n            rightOfCursor = line.substring(column);\n        }\n\n        // if at line end proceed with next line\n        if (column >= line.length) {\n            this.moveCursorTo(row, line.length);\n            this.moveCursorRight();\n            if (row < this.doc.getLength() - 1)\n                this.moveCursorWordRight();\n            return;\n        }\n\n        // advance to the end of the next token\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            column += this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorLongWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n\n        // skip folds\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n            return;\n        }\n\n        var str = this.session.getFoldStringAt(row, column, -1);\n        if (str == null) {\n            str = this.doc.getLine(row).substring(0, column)\n        }\n\n        var leftOfCursor = lang.stringReverse(str);\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n\n        // skip whitespace\n        if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n            column -= this.session.nonTokenRe.lastIndex;\n            leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n            this.session.nonTokenRe.lastIndex = 0;\n        }\n\n        // if at begin of the line proceed in line above\n        if (column <= 0) {\n            this.moveCursorTo(row, 0);\n            this.moveCursorLeft();\n            if (row > 0)\n                this.moveCursorWordLeft();\n            return;\n        }\n\n        // move to the begin of the word\n        if (match = this.session.tokenRe.exec(leftOfCursor)) {\n            column -= this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n\n    this.$shortWordEndIndex = function(rightOfCursor) {\n        var match, index = 0, ch;\n        var whitespaceRe = /\\s/;\n        var tokenRe = this.session.tokenRe;\n\n        tokenRe.lastIndex = 0;\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            index = this.session.tokenRe.lastIndex;\n        } else {\n            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                index ++;\n\n            if (index <= 1) {\n                tokenRe.lastIndex = 0;\n                 while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n                    tokenRe.lastIndex = 0;\n                    index ++;\n                    if (whitespaceRe.test(ch)) {\n                        if (index > 2) {\n                            index--\n                            break;\n                        } else {\n                            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                                index ++;\n                            if (index > 2)\n                                break\n                        }\n                    }\n                }\n            }\n        }\n        tokenRe.lastIndex = 0;\n\n        return index;\n    };\n\n    this.moveCursorShortWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold)\n            return this.moveCursorTo(fold.end.row, fold.end.column);\n\n        if (column == line.length) {\n            var l = this.doc.getLength();\n            do {    \n                row++;\n                rightOfCursor = this.doc.getLine(row)\n            } while (row < l && /^\\s*$/.test(rightOfCursor))\n            \n            if (!/^\\s+/.test(rightOfCursor))\n                rightOfCursor = \"\"\n            column = 0;\n        }\n\n        var index = this.$shortWordEndIndex(rightOfCursor);\n\n        this.moveCursorTo(row, column + index);\n    };\n\n    this.moveCursorShortWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1))\n            return this.moveCursorTo(fold.start.row, fold.start.column);\n\n        var line = this.session.getLine(row).substring(0, column);\n        if (column == 0) {\n            do {    \n                row--;\n                line = this.doc.getLine(row);\n            } while (row > 0 && /^\\s*$/.test(line))\n            \n            column = line.length;\n            if (!/\\s+$/.test(line))\n                line = \"\"\n        }\n\n        var leftOfCursor = lang.stringReverse(line);\n        var index = this.$shortWordEndIndex(leftOfCursor);\n\n        return this.moveCursorTo(row, column - index);\n    };\n\n    this.moveCursorWordRight = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordRight();\n        else\n            this.moveCursorShortWordRight();\n    };\n\n    this.moveCursorWordLeft = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordLeft();\n        else\n            this.moveCursorShortWordLeft();\n    };\n    this.moveCursorBy = function(rows, chars) {\n        var screenPos = this.session.documentToScreenPosition(\n            this.lead.row,\n            this.lead.column\n        );\n\n        if (chars === 0) {\n            if (this.$desiredColumn)\n                screenPos.column = this.$desiredColumn;\n            else\n                this.$desiredColumn = screenPos.column;\n        }\n\n        var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);\n\n        // move the cursor and update the desired column\n        this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n    };\n    this.moveCursorToPosition = function(position) {\n        this.moveCursorTo(position.row, position.column);\n    };\n    this.moveCursorTo = function(row, column, keepDesiredColumn) {\n        // Ensure the row/column is not inside of a fold.\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            row = fold.start.row;\n            column = fold.start.column;\n        }\n\n        this.$keepDesiredColumnOnChange = true;\n        this.lead.setPosition(row, column);\n        this.$keepDesiredColumnOnChange = false;\n\n        if (!keepDesiredColumn)\n            this.$desiredColumn = null;\n    };\n    this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n        var pos = this.session.screenToDocumentPosition(row, column);\n        this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n    };\n\n    // remove listeners from document\n    this.detach = function() {\n        this.lead.detach();\n        this.anchor.detach();\n        this.session = this.doc = null;\n    }\n\n    this.fromOrientedRange = function(range) {\n        this.setSelectionRange(range, range.cursor == range.start);\n        this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n    }\n\n    this.toOrientedRange = function(range) {\n        var r = this.getRange();\n        if (range) {\n            range.start.column = r.start.column;\n            range.start.row = r.start.row;\n            range.end.column = r.end.column;\n            range.end.row = r.end.row;\n        } else {\n            range = r;\n        }\n\n        range.cursor = this.isBackwards() ? range.start : range.end;\n        range.desiredColumn = this.$desiredColumn;\n        return range;\n    }\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Range\n *\n * This object is used in various places to indicate a region within the editor. To better visualize how this works, imagine a rectangle. Each quadrant of the rectangle is analogus to a range, as ranges contain a starting row and starting column, and an ending row, and ending column.\n *\n **/\n\n/**\n * new Range(startRow, startColumn, endRow, endColumn)\n * - startRow (Number): The starting row\n * - startColumn (Number): The starting column\n * - endRow (Number): The ending row\n * - endColumn (Number): The ending column\n *\n * Creates a new `Range` object with the given starting and ending row and column points.\n *\n **/\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    /**\n     * Range.isEqual(range) -> Boolean\n     * - range (Range): A range to check against\n     *\n     * Returns `true` if and only if the starting row and column, and ending tow and column, are equivalent to those given by `range`.\n     *\n     **/ \n    this.isEqual = function(range) {\n        return this.start.row == range.start.row &&\n            this.end.row == range.end.row &&\n            this.start.column == range.start.column &&\n            this.end.column == range.end.column\n    }; \n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    }; \n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    }; \n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.comparePoint(p) -> Number\n     * - p (Range): A point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1<br/>\n     *\n     * Checks the row and column points of `p` with the row and column points of the calling range.\n     *\n     * \n     *\n     **/ \n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    }\n\n    /** related to: Range.comparePoint\n     * Range.containsRange(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Checks the start and end points of `range` and compares them to the calling range. Returns `true` if the `range` is contained within the caller's range.\n     *\n     **/ \n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    }\n\n    /**\n     * Range.intersects(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Returns `true` if passed in `range` intersects with the one calling this method.\n     *\n     **/\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    }\n\n    /**\n     * Range.isEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's ending row point is the same as `row`, and if the caller's ending column is the same as `column`.\n     *\n     **/\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    }\n\n    /**\n     * Range.isStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's starting row point is the same as `row`, and if the caller's starting column is the same as `column`.\n     *\n     **/ \n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    }\n\n    /**\n     * Range.setStart(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    }\n\n    /**\n     * Range.setEnd(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.inside(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range.\n     *\n     **/ \n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's starting points.\n     *\n     **/ \n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's ending points.\n     *\n     **/ \n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** \n     * Range.compare(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal <br/>\n     * * `-1` if `p.row` is less then the calling range <br/>\n     * * `1` if `p.row` is greater than the calling range <br/>\n     *  <br/>\n     * If the starting row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     * <br/>\n     * If the ending row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0` <br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /**\n     * Range.compareEnd(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range, or if `isEnd` is `true.<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.compareInside(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `1` if the ending row of the calling range is equal to `row`, and the ending column of the calling range is equal to `column`<br/>\n     * * `-1` if the starting row of the calling range is equal to `row`, and the starting column of the calling range is equal to `column`<br/>\n     * <br/>\n     * Otherwise, it returns the value after calling [[Range.compare `compare()`]].\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     *\n     **/\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.clipRows(firstRow, lastRow) -> Range\n     * - firstRow (Number): The starting row\n     * - lastRow (Number): The ending row\n     *\n     * Returns the part of the current `Range` that occurs within the boundaries of `firstRow` and `lastRow` as a new `Range` object.\n     *\n    **/\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow) {\n            var end = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row > lastRow) {\n            var start = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row < firstRow) {\n            var start = {\n                row: firstRow,\n                column: 0\n            };\n        }\n\n        if (this.end.row < firstRow) {\n            var end = {\n                row: firstRow,\n                column: 0\n            };\n        }\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row == this.end.row && this.start.column == this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart =\n            session.documentToScreenPosition(this.start);\n        var screenPosEnd =\n            session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\n\nexports.Range = Range;\n});\n\ndefine('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode'], function(require, exports, module) {\n\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar Behaviour = require(\"./behaviour\").Behaviour;\nvar unicode = require(\"../unicode\");\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new TextHighlightRules().getRules());\n    this.$behaviour = new Behaviour();\n};\n\n(function() {\n\n    this.tokenRe = new RegExp(\"^[\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n    );\n    \n    this.nonTokenRe = new RegExp(\"^(?:[^\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]|\\s])+\", \"g\"\n    );\n\n    this.getTokenizer = function() {\n        return this.$tokenizer;\n    };\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return \"\";\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n    \n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.createModeDelegates = function (mapping) {\n        if (!this.$embeds) {\n            return;\n        }\n        this.$modes = {};\n        for (var i = 0; i < this.$embeds.length; i++) {\n            if (mapping[this.$embeds[i]]) {\n                this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]]();\n            }\n        }\n        \n        var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformAction'];\n\n        for (var i = 0; i < delegations.length; i++) {\n            (function(scope) {\n              var functionName = delegations[i];\n              var defaultHandler = scope[functionName];\n              scope[delegations[i]] = function() {\n                  return this.$delegator(functionName, arguments, defaultHandler);\n              }\n            } (this));\n        }\n    }\n    \n    this.$delegator = function(method, args, defaultHandler) {\n        var state = args[0];\n        \n        for (var i = 0; i < this.$embeds.length; i++) {\n            if (!this.$modes[this.$embeds[i]]) continue;\n            \n            var split = state.split(this.$embeds[i]);\n            if (!split[0] && split[1]) {\n                args[0] = split[1];\n                var mode = this.$modes[this.$embeds[i]];\n                return mode[method].apply(mode, args);\n            }\n        }\n        var ret = defaultHandler.apply(this, args);\n        return defaultHandler ? ret : undefined;\n    };\n    \n    this.transformAction = function(state, action, editor, session, param) {\n        if (this.$behaviour) {\n            var behaviours = this.$behaviour.getBehaviours();\n            for (var key in behaviours) {\n                if (behaviours[key][action]) {\n                    var ret = behaviours[key][action].apply(this, arguments);\n                    if (ret) {\n                        return ret;\n                    }\n                }\n            }\n        }\n    }\n    \n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Tokenizer\n *\n * This class takes a set of highlighting rules, and creates a tokenizer out of them. For more information, see [the wiki on extending highlighters](https://github.com/ajaxorg/ace/wiki/Creating-or-Extending-an-Edit-Mode#wiki-extendingTheHighlighter).\n *\n **/\n\n/**\n * new Tokenizer(rules, flag)\n * - rules (Object): The highlighting rules\n * - flag (String): Any additional regular expression flags to pass (like \"i\" for case insensitive)\n *\n * Constructs a new tokenizer based on the given rules and flags.\n *\n **/\nvar Tokenizer = function(rules, flag) {\n    flag = flag ? \"g\" + flag : \"g\";\n    this.rules = rules;\n\n    this.regExps = {};\n    this.matchMappings = {};\n    for ( var key in this.rules) {\n        var rule = this.rules[key];\n        var state = rule;\n        var ruleRegExps = [];\n        var matchTotal = 0;\n        var mapping = this.matchMappings[key] = {};\n\n        for ( var i = 0; i < state.length; i++) {\n\n            if (state[i].regex instanceof RegExp)\n                state[i].regex = state[i].regex.toString().slice(1, -1);\n\n            // Count number of matching groups. 2 extra groups from the full match\n            // And the catch-all on the end (used to force a match);\n            var matchcount = new RegExp(\"(?:(\" + state[i].regex + \")|(.))\").exec(\"a\").length - 2;\n\n            // Replace any backreferences and offset appropriately.\n            var adjustedregex = state[i].regex.replace(/\\\\([0-9]+)/g, function (match, digit) {\n                return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n            });\n\n            if (matchcount > 1 && state[i].token.length !== matchcount-1)\n                throw new Error(\"For \" + state[i].regex + \" the matching groups and length of the token array don't match (rule #\" + i + \" of state \" + key + \")\");\n\n            mapping[matchTotal] = {\n                rule: i,\n                len: matchcount\n            };\n            matchTotal += matchcount;\n\n            ruleRegExps.push(adjustedregex);\n        }\n\n        this.regExps[key] = new RegExp(\"(?:(\" + ruleRegExps.join(\")|(\") + \")|(.))\", flag);\n    }\n};\n\n(function() {\n\n    /**\n    * Tokenizer.getLineTokens() -> Object\n    *\n    * Returns an object containing two properties: `tokens`, which contains all the tokens; and `state`, the current state.\n    **/\n    this.getLineTokens = function(line, startState) {\n        var currentState = startState || \"start\";\n        var state = this.rules[currentState];\n        var mapping = this.matchMappings[currentState];\n        var re = this.regExps[currentState];\n        re.lastIndex = 0;\n\n        var match, tokens = [];\n\n        var lastIndex = 0;\n\n        var token = {\n            type: null,\n            value: \"\"\n        };\n\n        while (match = re.exec(line)) {\n            var type = \"text\";\n            var rule = null;\n            var value = [match[0]];\n\n            for (var i = 0; i < match.length-2; i++) {\n                if (match[i + 1] === undefined)\n                    continue;\n\n                rule = state[mapping[i].rule];\n\n                if (mapping[i].len > 1)\n                    value = match.slice(i+2, i+1+mapping[i].len);\n\n                // compute token type\n                if (typeof rule.token == \"function\")\n                    type = rule.token.apply(this, value);\n                else\n                    type = rule.token;\n\n                if (rule.next) {\n                    currentState = rule.next;\n                    state = this.rules[currentState];\n                    mapping = this.matchMappings[currentState];\n                    lastIndex = re.lastIndex;\n\n                    re = this.regExps[currentState];\n\n                    if (re === undefined) {\n                         throw new Error(\"You indicated a state of \" + rule.next + \" to go to, but it doesn't exist!\");\n                    }\n\n                    re.lastIndex = lastIndex;\n                }\n                break;\n            }\n\n            if (value[0]) {\n                if (typeof type == \"string\") {\n                    value = [value.join(\"\")];\n                    type = [type];\n                }\n                for (var i = 0; i < value.length; i++) {\n                    if (!value[i])\n                        continue;\n\n                    if ((!rule || rule.merge || type[i] === \"text\") && token.type === type[i]) {\n                        token.value += value[i];\n                    } else {\n                        if (token.type)\n                            tokens.push(token);\n\n                        token = {\n                            type: type[i],\n                            value: value[i]\n                        };\n                    }\n                }\n            }\n\n            if (lastIndex == line.length)\n                break;\n\n            lastIndex = re.lastIndex;\n        }\n\n        if (token.type)\n            tokens.push(token);\n\n        return {\n            tokens : tokens,\n            state : currentState\n        };\n    };\n\n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\ndefine('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar lang = require(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"empty_line\",\n            regex : '^$'\n        }, {\n            token : \"text\",\n            regex : \".+\"\n        }]\n    };\n};\n\n(function() {\n\n    this.addRules = function(rules, prefix) {\n        for (var key in rules) {\n            var state = rules[key];\n            for (var i=0; i<state.length; i++) {\n                var rule = state[i];\n                if (rule.next) {\n                    rule.next = prefix + rule.next;\n                }\n            }\n            this.$rules[prefix + key] = state;\n        }\n    };\n\n    this.getRules = function() {\n        return this.$rules;\n    };\n\n    this.embedRules = function (HighlightRules, prefix, escapeRules, states) {\n        var embedRules = new HighlightRules().getRules();\n        if (states) {\n            for (var i = 0; i < states.length; i++) {\n                states[i] = prefix + states[i];\n            }\n        } else {\n            states = [];\n            for (var key in embedRules) {\n                states.push(prefix + key);\n            }\n        }\n        this.addRules(embedRules, prefix);\n\n        for (var i = 0; i < states.length; i++) {\n            Array.prototype.unshift.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n        }\n\n        if (!this.$embeds) {\n            this.$embeds = [];\n        }\n        this.$embeds.push(prefix);\n    }\n\n    this.getEmbeds = function() {\n        return this.$embeds;\n    }\n\n    this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n        var keywords = Object.create(null);\n        Object.keys(map).forEach(function(className) {\n            var list = map[className].split(splitChar || \"|\");\n            for (var i = list.length; i--; )\n                keywords[list[i]] = className;\n        });\n        map = null;\n        return ignoreCase\n            ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n            : function(value) {return keywords[value] || defaultToken };\n    }\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\ndefine('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar Behaviour = function() {\n   this.$behaviours = {};\n};\n\n(function () {\n\n    this.add = function (name, action, callback) {\n        switch (undefined) {\n          case this.$behaviours:\n              this.$behaviours = {};\n          case this.$behaviours[name]:\n              this.$behaviours[name] = {};\n        }\n        this.$behaviours[name][action] = callback;\n    }\n    \n    this.addBehaviours = function (behaviours) {\n        for (var key in behaviours) {\n            for (var action in behaviours[key]) {\n                this.add(key, action, behaviours[key][action]);\n            }\n        }\n    }\n    \n    this.remove = function (name) {\n        if (this.$behaviours && this.$behaviours[name]) {\n            delete this.$behaviours[name];\n        }\n    }\n    \n    this.inherit = function (mode, filter) {\n        if (typeof mode === \"function\") {\n            var behaviours = new mode().getBehaviours(filter);\n        } else {\n            var behaviours = mode.getBehaviours(filter);\n        }\n        this.addBehaviours(behaviours);\n    }\n    \n    this.getBehaviours = function (filter) {\n        if (!filter) {\n            return this.$behaviours;\n        } else {\n            var ret = {}\n            for (var i = 0; i < filter.length; i++) {\n                if (this.$behaviours[filter[i]]) {\n                    ret[filter[i]] = this.$behaviours[filter[i]];\n                }\n            }\n            return ret;\n        }\n    }\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\ndefine('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/*\nXRegExp Unicode plugin pack: Categories 1.0\n(c) 2010 Steven Levithan\nMIT License\n<http://xregexp.com>\nUses the Unicode 5.2 character database\n\nThis package for the XRegExp Unicode plugin enables the following Unicode categories (aka properties):\n\nL - Letter (the top-level Letter category is included in the Unicode plugin base script)\n    Ll - Lowercase letter\n    Lu - Uppercase letter\n    Lt - Titlecase letter\n    Lm - Modifier letter\n    Lo - Letter without case\nM - Mark\n    Mn - Non-spacing mark\n    Mc - Spacing combining mark\n    Me - Enclosing mark\nN - Number\n    Nd - Decimal digit\n    Nl - Letter number\n    No -  Other number\nP - Punctuation\n    Pd - Dash punctuation\n    Ps - Open punctuation\n    Pe - Close punctuation\n    Pi - Initial punctuation\n    Pf - Final punctuation\n    Pc - Connector punctuation\n    Po - Other punctuation\nS - Symbol\n    Sm - Math symbol\n    Sc - Currency symbol\n    Sk - Modifier symbol\n    So - Other symbol\nZ - Separator\n    Zs - Space separator\n    Zl - Line separator\n    Zp - Paragraph separator\nC - Other\n    Cc - Control\n    Cf - Format\n    Co - Private use\n    Cs - Surrogate\n    Cn - Unassigned\n\nExample usage:\n\n    \\p{N}\n    \\p{Cn}\n*/\n\n\n// will be populated by addUnicodePackage\nexports.packages = {};\n\naddUnicodePackage({\n    L:  \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n    Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n    Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n    Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n    Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    M:  \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n    Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n    Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n    Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n    N:  \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n    No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n    P:  \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n    Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n    Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n    Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n    Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n    Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n    Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n    Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n    S:  \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n    Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n    Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n    Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n    So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n    Z:  \"002000A01680180E2000-200A20282029202F205F3000\",\n    Zs: \"002000A01680180E2000-200A202F205F3000\",\n    Zl: \"2028\",\n    Zp: \"2029\",\n    C:  \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n    Cc: \"0000-001F007F-009F\",\n    Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n    Co: \"E000-F8FF\",\n    Cs: \"D800-DFFF\",\n    Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n    var codePoint = /\\w{4}/g;\n    for (var name in pack)\n        exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n};\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\n /**\n * new Document([text])\n * - text (String | Array): The starting text\n *\n * Creates a new `Document`. If `text` is included, the `Document` contains those strings; otherwise, it's empty.\n *\n **/\n\nvar Document = function(text) {\n    this.$lines = [];\n\n    // There has to be one line at least in the document. If you pass an empty\n    // string to the insert function, nothing will happen. Workaround.\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this.insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n\n    // check for IE split bug\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getNewLineCharacter = function() {\n      switch (this.$newLineMode) {\n          case \"windows\":\n              return \"\\r\\n\";\n\n          case \"unix\":\n              return \"\\n\";\n\n          case \"auto\":\n              return this.$autoNewLine;\n      }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.$lines[range.start.row].substring(range.start.column,\n                                                         range.end.column);\n        }\n        else {\n            var lines = this.getLines(range.start.row+1, range.end.row-1);\n            lines.unshift((this.$lines[range.start.row] || \"\").substring(range.start.column));\n            lines.push((this.$lines[range.end.row] || \"\").substring(0, range.end.column));\n            return lines.join(this.getNewLineCharacter());\n        }\n    };\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        }\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n\n        // only detect new lines if the document has no line break yet\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this.insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    /**\n     * Document@change(e)\n     * - e (Object): Contains at least one property called `\"action\"`. `\"action\"` indicates the action that triggered the change. Each action also has a set of additional properties.\n     *\n     * Fires whenever the document changes.\n     *\n     * Several methods trigger different `\"change\"` events. Below is a list of each action type, followed by each property that's also available:\n     *\n     *  * `\"insertLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that are changing\n     *  * `\"insertText\"` (emitted by [[Document.insertNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being added\n     *  * `\"removeLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that were removed\n     *    * `nl`: the new line character (as defined by [[Document.getNewLineCharacter]])\n     *  * `\"removeText\"` (emitted by [[Document.removeInLine]] and [[Document.removeNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being removed\n     *\n     **/\n    this.insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n\n        // apply doesn't work for big arrays (smallest threshold is on safari 0xFFFF)\n        // to circumvent that we have to break huge inserts into smaller chunks here\n        if (lines.length > 0xFFFF) {\n            var end = this.insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        // clip to document\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this.removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n\n        // Shortcut: If the text we want to insert is the same as it is already\n        // in the document, we don't have to replace anything.\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n/**\n * new Anchor(doc, row, column)\n * - doc (Document): The document to associate with the anchor\n * - row (Number): The starting row position\n * - column (Number): The starting column position\n *\n * Creates a new `Anchor` and associates it with a document.\n *\n **/\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.document = doc;\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n\n    this.$onChange = this.onChange.bind(this);\n    doc.on(\"change\", this.$onChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n        \n    this.getDocument = function() {\n        return this.document;\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n            \n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n            \n        if (range.start.row > this.row)\n            return;\n            \n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n    \n        var row = this.row;\n        var column = this.column;\n        \n        if (delta.action === \"insertText\") {\n            if (range.start.row === row && range.start.column <= column) {\n                if (range.start.row === range.end.row) {\n                    column += range.end.column - range.start.column;\n                }\n                else {\n                    column -= range.start.column;\n                    row += range.end.row - range.start.row;\n                }\n            }\n            else if (range.start.row !== range.end.row && range.start.row < row) {\n                row += range.end.row - range.start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (range.start.row <= row) {\n                row += range.end.row - range.start.row;\n            }\n        }\n        else if (delta.action == \"removeText\") {\n            if (range.start.row == row && range.start.column < column) {\n                if (range.end.column >= column)\n                    column = range.start.column;\n                else\n                    column = Math.max(0, column - (range.end.column - range.start.column));\n                \n            } else if (range.start.row !== range.end.row && range.start.row < row) {\n                if (range.end.row == row) {\n                    column = Math.max(0, column - range.end.column) + range.start.column;\n                }\n                row -= (range.end.row - range.start.row);\n            }\n            else if (range.end.row == row) {\n                row -= range.end.row - range.start.row;\n                column = Math.max(0, column - range.end.column) + range.start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (range.start.row <= row) {\n                if (range.end.row <= row)\n                    row -= range.end.row - range.start.row;\n                else {\n                    row = range.start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        }\n        else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n        \n        if (this.row == pos.row && this.column == pos.column)\n            return;\n            \n        var old = {\n            row: this.row,\n            column: this.column\n        };\n        \n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n    \n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n        \n        if (column < 0)\n            pos.column = 0;\n            \n        return pos;\n    };\n    \n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n// tokenizing lines longer than this makes editor very slow\nvar MAX_LINE_LENGTH = 5000;\n\n/**\n * new BackgroundTokenizer(tokenizer, editor)\n * - tokenizer (Tokenizer): The tokenizer to use\n * - editor (Editor): The editor to associate with\n *\n * Creates a new `BackgroundTokenizer` object.\n *\n *\n **/\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n    this.running = false;\n    this.lines = [];\n    this.states = [];\n    this.currentLine = 0;\n    this.tokenizer = tokenizer;\n\n    var self = this;\n\n    this.$worker = function() {\n        if (!self.running) { return; }\n\n        var workerStart = new Date();\n        var startLine = self.currentLine;\n        var doc = self.doc;\n\n        var processedLines = 0;\n\n        var len = doc.getLength();\n        while (self.currentLine < len) {\n            self.$tokenizeRow(self.currentLine);\n            while (self.lines[self.currentLine])\n                self.currentLine++;\n\n            // only check every 5 lines\n            processedLines ++;\n            if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) {\n                self.fireUpdateEvent(startLine, self.currentLine-1);\n                self.running = setTimeout(self.$worker, 20);\n                return;\n            }\n        }\n\n        self.running = false;\n\n        self.fireUpdateEvent(startLine, len - 1);\n    };\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n    this.setTokenizer = function(tokenizer) {\n        this.tokenizer = tokenizer;\n        this.lines = [];\n        this.states = [];\n\n        this.start(0);\n    };\n    this.setDocument = function(doc) {\n        this.doc = doc;\n        this.lines = [];\n        this.states = [];\n\n        this.stop();\n    };\n     /**\n     * BackgroundTokenizer@update(e)\n     * - e (Object): An object containing two properties, `first` and `last`, which indicate the rows of the region being updated.\n     *\n     * Fires whenever the background tokeniziers between a range of rows are going to be updated.\n     *\n     **/\n    this.fireUpdateEvent = function(firstRow, lastRow) {\n        var data = {\n            first: firstRow,\n            last: lastRow\n        };\n        this._emit(\"update\", {data: data});\n    };\n    this.start = function(startRow) {\n        this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n\n        // remove all cached items below this line\n        this.lines.splice(this.currentLine, this.lines.length);\n        this.states.splice(this.currentLine, this.states.length);\n\n        this.stop();\n        // pretty long delay to prevent the tokenizer from interfering with the user\n        this.running = setTimeout(this.$worker, 700);\n    };\n\n    this.$updateOnChange = function(delta) {\n        var range = delta.range;\n        var startRow = range.start.row;\n        var len = range.end.row - startRow;\n\n        if (len === 0) {\n            this.lines[startRow] = null;\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.lines.splice(startRow, len + 1, null);\n            this.states.splice(startRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(startRow, 1);\n            this.lines.splice.apply(this.lines, args);\n            this.states.splice.apply(this.states, args);\n        }\n\n        this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n        this.stop();\n        // pretty long delay to prevent the tokenizer from interfering with the user\n        this.running = setTimeout(this.$worker, 700);\n    };\n    this.stop = function() {\n        if (this.running)\n            clearTimeout(this.running);\n        this.running = false;\n    };\n    this.getTokens = function(row) {\n        return this.lines[row] || this.$tokenizeRow(row);\n    };\n    this.getState = function(row) {\n        if (this.currentLine == row)\n            this.$tokenizeRow(row);\n        return this.states[row] || \"start\";\n    };\n\n    this.$tokenizeRow = function(row) {\n        var line = this.doc.getLine(row);\n        var state = this.states[row - 1];\n\n        if (line.length > MAX_LINE_LENGTH) {\n            var overflow = {value: line.substr(MAX_LINE_LENGTH), type: \"text\"};\n            line = line.slice(0, MAX_LINE_LENGTH);\n        }\n        var data = this.tokenizer.getLineTokens(line, state);\n        if (overflow) {\n            data.tokens.push(overflow);\n            data.state = \"start\";\n        }\n\n        if (this.states[row] !== data.state) {\n            this.states[row] = data.state;\n            this.lines[row + 1] = null;\n            if (this.currentLine > row + 1)\n                this.currentLine = row + 1;\n        } else if (this.currentLine == row) {\n            this.currentLine = row + 1;\n        }\n\n        return this.lines[row] = data.tokens;\n    };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\ndefine('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {\n\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n    this.setRegexp(regExp);\n    this.clazz = clazz;\n    this.type = type || \"text\";\n};\n\n(function() {\n    this.setRegexp = function(regExp) {\n        if (this.regExp+\"\" == regExp+\"\")\n            return;\n        this.regExp = regExp;\n        this.cache = [];\n    };\n\n    this.update = function(html, markerLayer, session, config) {\n        if (!this.regExp)\n            return;\n        var start = config.firstRow, end = config.lastRow;\n\n        for (var i = start; i <= end; i++) {\n            var ranges = this.cache[i];\n            if (ranges == null) {\n                ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n                ranges = ranges.map(function(match) {\n                    return new Range(i, match.offset, i, match.offset + match.length);\n                });\n                this.cache[i] = ranges.length ? ranges : \"\";\n            }\n\n            for (var j = ranges.length; j --; ) {\n                markerLayer.drawSingleLineMarker(\n                    html, ranges[j].toScreenRange(session), this.clazz, config,\n                    null, this.type\n                );\n            }\n        }\n    };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\ndefine('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar FoldLine = require(\"./fold_line\").FoldLine;\nvar Fold = require(\"./fold\").Fold;\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n    /*\n     * Looks up a fold at a given row/column. Possible values for side:\n     *   -1: ignore a fold if fold.start = row/column\n     *   +1: ignore a fold if fold.end = row/column\n     */\n    this.getFoldAt = function(row, column, side) {\n        var foldLine = this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var folds = foldLine.folds;\n        for (var i = 0; i < folds.length; i++) {\n            var fold = folds[i];\n            if (fold.range.contains(row, column)) {\n                if (side == 1 && fold.range.isEnd(row, column)) {\n                    continue;\n                } else if (side == -1 && fold.range.isStart(row, column)) {\n                    continue;\n                }\n                return fold;\n            }\n        }\n    };\n    this.getFoldsInRange = function(range) {\n        range = range.clone();\n        var start = range.start;\n        var end = range.end;\n        var foldLines = this.$foldData;\n        var foundFolds = [];\n\n        start.column += 1;\n        end.column -= 1;\n\n        for (var i = 0; i < foldLines.length; i++) {\n            var cmp = foldLines[i].range.compareRange(range);\n            if (cmp == 2) {\n                // Range is before foldLine. No intersection. This means,\n                // there might be other foldLines that intersect.\n                continue;\n            }\n            else if (cmp == -2) {\n                // Range is after foldLine. There can't be any other foldLines then,\n                // so let's give up.\n                break;\n            }\n\n            var folds = foldLines[i].folds;\n            for (var j = 0; j < folds.length; j++) {\n                var fold = folds[j];\n                cmp = fold.range.compareRange(range);\n                if (cmp == -2) {\n                    break;\n                } else if (cmp == 2) {\n                    continue;\n                } else\n                // WTF-state: Can happen due to -1/+1 to start/end column.\n                if (cmp == 42) {\n                    break;\n                }\n                foundFolds.push(fold);\n            }\n        }\n        return foundFolds;\n    };\n    this.getAllFolds = function() {\n        var folds = [];\n        var foldLines = this.$foldData;\n        \n        function addFold(fold) {\n            folds.push(fold);\n            if (!fold.subFolds)\n                return;\n                \n            for (var i = 0; i < fold.subFolds.length; i++)\n                addFold(fold.subFolds[i]);\n        }\n        \n        for (var i = 0; i < foldLines.length; i++)\n            for (var j = 0; j < foldLines[i].folds.length; j++)\n                addFold(foldLines[i].folds[j]);\n\n        return folds;\n    };\n    this.getFoldStringAt = function(row, column, trim, foldLine) {\n        foldLine = foldLine || this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var lastFold = {\n            end: { column: 0 }\n        };\n        // TODO: Refactor to use getNextFoldTo function.\n        var str, fold;\n        for (var i = 0; i < foldLine.folds.length; i++) {\n            fold = foldLine.folds[i];\n            var cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                str = this\n                    .getLine(fold.start.row)\n                    .substring(lastFold.end.column, fold.start.column);\n                break;\n            }\n            else if (cmp === 0) {\n                return null;\n            }\n            lastFold = fold;\n        }\n        if (!str)\n            str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n        if (trim == -1)\n            return str.substring(0, column - lastFold.end.column);\n        else if (trim == 1)\n            return str.substring(column - lastFold.end.column);\n        else\n            return str;\n    };\n\n    this.getFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n                return foldLine;\n            } else if (foldLine.end.row > docRow) {\n                return null;\n            }\n        }\n        return null;\n    };\n\n    // returns the fold which starts after or contains docRow\n    this.getNextFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.end.row >= docRow) {\n                return foldLine;\n            }\n        }\n        return null;\n    };\n\n    this.getFoldedRowCount = function(first, last) {\n        var foldData = this.$foldData, rowCount = last-first+1;\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i],\n                end = foldLine.end.row,\n                start = foldLine.start.row;\n            if (end >= last) {\n                if(start < last) {\n                    if(start >= first)\n                        rowCount -= last-start;\n                    else\n                        rowCount = 0;//in one fold\n                }\n                break;\n            } else if(end >= first){\n                if (start >= first) //fold inside range\n                    rowCount -=  end-start;\n                else\n                    rowCount -=  end-first+1;\n            }\n        }\n        return rowCount;\n    };\n\n    this.$addFoldLine = function(foldLine) {\n        this.$foldData.push(foldLine);\n        this.$foldData.sort(function(a, b) {\n            return a.start.row - b.start.row;\n        });\n        return foldLine;\n    };\n    this.addFold = function(placeholder, range) {\n        var foldData = this.$foldData;\n        var added = false;\n        var fold;\n        \n        if (placeholder instanceof Fold)\n            fold = placeholder;\n        else\n            fold = new Fold(range, placeholder);\n\n        this.$clipRangeToDocument(fold.range);\n\n        var startRow = fold.start.row;\n        var startColumn = fold.start.column;\n        var endRow = fold.end.row;\n        var endColumn = fold.end.column;\n\n        // --- Some checking ---\n        if (fold.placeholder.length < 2)\n            throw \"Placeholder has to be at least 2 characters\";\n\n        if (startRow == endRow && endColumn - startColumn < 2)\n            throw \"The range has to be at least 2 characters width\";\n\n        var startFold = this.getFoldAt(startRow, startColumn, 1);\n        var endFold = this.getFoldAt(endRow, endColumn, -1);\n        if (startFold && endFold == startFold)\n            return startFold.addSubFold(fold);\n\n        if (\n            (startFold && !startFold.range.isStart(startRow, startColumn))\n            || (endFold && !endFold.range.isEnd(endRow, endColumn))\n        ) {\n            throw \"A fold can't intersect already existing fold\" + fold.range + startFold.range;\n        }\n\n        // Check if there are folds in the range we create the new fold for.\n        var folds = this.getFoldsInRange(fold.range);\n        if (folds.length > 0) {\n            // Remove the folds from fold data.\n            this.removeFolds(folds);\n            // Add the removed folds as subfolds on the new fold.\n            fold.subFolds = folds;\n        }\n\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (endRow == foldLine.start.row) {\n                foldLine.addFold(fold);\n                added = true;\n                break;\n            }\n            else if (startRow == foldLine.end.row) {\n                foldLine.addFold(fold);\n                added = true;\n                if (!fold.sameRow) {\n                    // Check if we might have to merge two FoldLines.\n                    var foldLineNext = foldData[i + 1];\n                    if (foldLineNext && foldLineNext.start.row == endRow) {\n                        // We need to merge!\n                        foldLine.merge(foldLineNext);\n                        break;\n                    }\n                }\n                break;\n            }\n            else if (endRow <= foldLine.start.row) {\n                break;\n            }\n        }\n\n        if (!added)\n            foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n        if (this.$useWrapMode)\n            this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n        else\n            this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n\n        // Notify that fold data has changed.\n        this.$modified = true;\n        this._emit(\"changeFold\", { data: fold });\n\n        return fold;\n    };\n\n    this.addFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.addFold(fold);\n        }, this);\n    };\n\n    this.removeFold = function(fold) {\n        var foldLine = fold.foldLine;\n        var startRow = foldLine.start.row;\n        var endRow = foldLine.end.row;\n\n        var foldLines = this.$foldData;\n        var folds = foldLine.folds;\n        // Simple case where there is only one fold in the FoldLine such that\n        // the entire fold line can get removed directly.\n        if (folds.length == 1) {\n            foldLines.splice(foldLines.indexOf(foldLine), 1);\n        } else\n        // If the fold is the last fold of the foldLine, just remove it.\n        if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n            folds.pop();\n            foldLine.end.row = folds[folds.length - 1].end.row;\n            foldLine.end.column = folds[folds.length - 1].end.column;\n        } else\n        // If the fold is the first fold of the foldLine, just remove it.\n        if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n            folds.shift();\n            foldLine.start.row = folds[0].start.row;\n            foldLine.start.column = folds[0].start.column;\n        } else\n        // We know there are more then 2 folds and the fold is not at the edge.\n        // This means, the fold is somewhere in between.\n        //\n        // If the fold is in one row, we just can remove it.\n        if (fold.sameRow) {\n            folds.splice(folds.indexOf(fold), 1);\n        } else\n        // The fold goes over more then one row. This means remvoing this fold\n        // will cause the fold line to get splitted up. newFoldLine is the second part\n        {\n            var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n            folds = newFoldLine.folds;\n            folds.shift();\n            newFoldLine.start.row = folds[0].start.row;\n            newFoldLine.start.column = folds[0].start.column;\n        }\n\n        if (this.$useWrapMode)\n            this.$updateWrapData(startRow, endRow);\n        else\n            this.$updateRowLengthCache(startRow, endRow);\n\n        // Notify that fold data has changed.\n        this.$modified = true;\n        this._emit(\"changeFold\", { data: fold });\n    };\n\n    this.removeFolds = function(folds) {\n        // We need to clone the folds array passed in as it might be the folds\n        // array of a fold line and as we call this.removeFold(fold), folds\n        // are removed from folds and changes the current index.\n        var cloneFolds = [];\n        for (var i = 0; i < folds.length; i++) {\n            cloneFolds.push(folds[i]);\n        }\n\n        cloneFolds.forEach(function(fold) {\n            this.removeFold(fold);\n        }, this);\n        this.$modified = true;\n    };\n\n    this.expandFold = function(fold) {\n        this.removeFold(fold);\n        fold.subFolds.forEach(function(fold) {\n            this.addFold(fold);\n        }, this);\n        fold.subFolds = [];\n    };\n\n    this.expandFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.expandFold(fold);\n        }, this);\n    };\n\n    this.unfold = function(location, expandInner) {\n        var range, folds;\n        if (location == null)\n            range = new Range(0, 0, this.getLength(), 0);\n        else if (typeof location == \"number\")\n            range = new Range(location, 0, location, this.getLine(location).length);\n        else if (\"row\" in location)\n            range = Range.fromPoints(location, location);\n        else\n            range = location;\n\n        folds = this.getFoldsInRange(range);\n        if (expandInner) {\n            this.removeFolds(folds);\n        } else {\n            // TODO: might need to remove and add folds in one go instead of using\n            // expandFolds several times.\n            while (folds.length) {\n                this.expandFolds(folds);\n                folds = this.getFoldsInRange(range);\n            }\n        }\n    };\n    this.isRowFolded = function(docRow, startFoldRow) {\n        return !!this.getFoldLine(docRow, startFoldRow);\n    };\n\n    this.getRowFoldEnd = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.end.row : docRow;\n    };\n\n    this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n        if (startRow == null) {\n            startRow = foldLine.start.row;\n            startColumn = 0;\n        }\n\n        if (endRow == null) {\n            endRow = foldLine.end.row;\n            endColumn = this.getLine(endRow).length;\n        }\n\n        // Build the textline using the FoldLine walker.\n        var doc = this.doc;\n        var textLine = \"\";\n\n        foldLine.walk(function(placeholder, row, column, lastColumn) {\n            if (row < startRow) {\n                return;\n            } else if (row == startRow) {\n                if (column < startColumn) {\n                    return;\n                }\n                lastColumn = Math.max(startColumn, lastColumn);\n            }\n            if (placeholder) {\n                textLine += placeholder;\n            } else {\n                textLine += doc.getLine(row).substring(lastColumn, column);\n            }\n        }.bind(this), endRow, endColumn);\n        return textLine;\n    };\n\n    this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n        var foldLine = this.getFoldLine(row);\n\n        if (!foldLine) {\n            var line;\n            line = this.doc.getLine(row);\n            return line.substring(startColumn || 0, endColumn || line.length);\n        } else {\n            return this.getFoldDisplayLine(\n                foldLine, row, endColumn, startRow, startColumn);\n        }\n    };\n\n    this.$cloneFoldData = function() {\n        var fd = [];\n        fd = this.$foldData.map(function(foldLine) {\n            var folds = foldLine.folds.map(function(fold) {\n                return fold.clone();\n            });\n            return new FoldLine(fd, folds);\n        });\n\n        return fd;\n    };\n\n    this.toggleFold = function(tryToUnfold) {\n        var selection = this.selection;\n        var range = selection.getRange();\n        var fold;\n        var bracketPos;\n\n        if (range.isEmpty()) {\n            var cursor = range.start;\n            fold = this.getFoldAt(cursor.row, cursor.column);\n\n            if (fold) {\n                this.expandFold(fold);\n                return;\n            }\n            else if (bracketPos = this.findMatchingBracket(cursor)) {\n                if (range.comparePoint(bracketPos) == 1) {\n                    range.end = bracketPos;\n                } \n                else {\n                    range.start = bracketPos;\n                    range.start.column++;\n                    range.end.column--;\n                }\n            }\n            else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n                if (range.comparePoint(bracketPos) == 1)\n                    range.end = bracketPos;\n                else\n                    range.start = bracketPos;\n\n                range.start.column++;\n            }\n            else {\n                range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n            }\n        } else {\n            var folds = this.getFoldsInRange(range);\n            if (tryToUnfold && folds.length) {\n                this.expandFolds(folds);\n                return;\n            } \n            else if (folds.length == 1 ) {\n                fold = folds[0];\n            }\n        }\n\n        if (!fold)\n            fold = this.getFoldAt(range.start.row, range.start.column);\n\n        if (fold && fold.range.toString() == range.toString()) {\n            this.expandFold(fold);\n            return;\n        }\n\n        var placeholder = \"...\";\n        if (!range.isMultiLine()) {\n            placeholder = this.getTextRange(range);\n            if(placeholder.length < 4)\n                return;\n            placeholder = placeholder.trim().substring(0, 2) + \"..\";\n        }\n\n        this.addFold(placeholder, range);\n    };\n\n    this.getCommentFoldRange = function(row, column) {\n        var iterator = new TokenIterator(this, row, column);\n        var token = iterator.getCurrentToken();\n        if (token && /^comment|string/.test(token.type)) {\n            var range = new Range();\n            var re = new RegExp(token.type.replace(/\\..*/, \"\\\\.\"));\n            do {\n                token = iterator.stepBackward();\n            } while(token && re.test(token.type));\n\n            iterator.stepForward();\n            range.start.row = iterator.getCurrentTokenRow();\n            range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n            iterator = new TokenIterator(this, row, column);\n\n            do {\n                token = iterator.stepForward();\n            } while(token && re.test(token.type));\n            \n            token = iterator.stepBackward();\n\n            range.end.row = iterator.getCurrentTokenRow();\n            range.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            return range;\n        }\n    };\n\n    this.foldAll = function(startRow, endRow) {\n        var foldWidgets = this.foldWidgets;\n        endRow = endRow || this.getLength();\n        for (var row = startRow || 0; row < endRow; row++) {\n            if (foldWidgets[row] == null)\n                foldWidgets[row] = this.getFoldWidget(row);\n            if (foldWidgets[row] != \"start\")\n                continue;\n\n            var range = this.getFoldWidgetRange(row);\n            // sometimes range can be incompatible with existing fold\n            // wouldn't it be better for addFold to return null istead of throwing?\n            if (range && range.end.row < endRow) try {\n                this.addFold(\"...\", range);\n            } catch(e) {}\n        }\n    };\n    \n    this.$foldStyles = {\n        \"manual\": 1,\n        \"markbegin\": 1,\n        \"markbeginend\": 1\n    };\n    this.$foldStyle = \"markbegin\";\n    this.setFoldStyle = function(style) {\n        if (!this.$foldStyles[style])\n            throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n        \n        if (this.$foldStyle == style)\n            return;\n\n        this.$foldStyle = style;\n        \n        if (style == \"manual\")\n            this.unfold();\n        \n        // reset folding\n        var mode = this.$foldMode;\n        this.$setFolding(null);\n        this.$setFolding(mode);\n    };\n\n    // structured folding\n    this.$setFolding = function(foldMode) {\n        if (this.$foldMode == foldMode)\n            return;\n            \n        this.$foldMode = foldMode;\n        \n        this.removeListener('change', this.$updateFoldWidgets);\n        this._emit(\"changeAnnotation\");\n        \n        if (!foldMode || this.$foldStyle == \"manual\") {\n            this.foldWidgets = null;\n            return;\n        }\n        \n        this.foldWidgets = [];\n        this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n        this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n        \n        this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n        this.on('change', this.$updateFoldWidgets);\n        \n    };\n\n    this.onFoldWidgetClick = function(row, e) {\n        var type = this.getFoldWidget(row);\n        var line = this.getLine(row);\n        var onlySubfolds = e.shiftKey;\n        var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey;\n        var fold;\n\n        if (type == \"end\")\n            fold = this.getFoldAt(row, 0, -1);\n        else\n            fold = this.getFoldAt(row, line.length, 1);\n\n        if (fold) {\n            if (addSubfolds)\n                this.removeFold(fold);\n            else\n                this.expandFold(fold);\n            return;\n        }\n\n        var range = this.getFoldWidgetRange(row);\n        if (range) {\n            // sometimes singleline folds can be missed by the code above\n            if (!range.isMultiLine()) {\n                fold = this.getFoldAt(range.start.row, range.start.column, 1);\n                if (fold && range.isEqual(fold.range)) {\n                    this.removeFold(fold);\n                    return;\n                }\n            }\n            \n            if (!onlySubfolds)\n                this.addFold(\"...\", range);\n\n            if (addSubfolds)\n                this.foldAll(range.start.row + 1, range.end.row);\n        } else {\n            if (addSubfolds)\n                this.foldAll(row + 1, this.getLength());\n            (e.target || e.srcElement).className += \" invalid\"\n        }\n    };\n    \n    this.updateFoldWidgets = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n        var firstRow = range.start.row;\n        var len = range.end.row - firstRow;\n\n        if (len === 0) {\n            this.foldWidgets[firstRow] = null;\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.foldWidgets.splice(firstRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(firstRow, 1);\n            this.foldWidgets.splice.apply(this.foldWidgets, args);\n        }\n    };\n\n}\n\nexports.Folding = Folding;\n\n});\n\ndefine('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n    this.foldData = foldData;\n    if (Array.isArray(folds)) {\n        this.folds = folds;\n    } else {\n        folds = this.folds = [ folds ];\n    }\n\n    var last = folds[folds.length - 1]\n    this.range = new Range(folds[0].start.row, folds[0].start.column,\n                           last.end.row, last.end.column);\n    this.start = this.range.start;\n    this.end   = this.range.end;\n\n    this.folds.forEach(function(fold) {\n        fold.setFoldLine(this);\n    }, this);\n}\n\n(function() {\n    /*\n     * Note: This doesn't update wrapData!\n     */\n    this.shiftRow = function(shift) {\n        this.start.row += shift;\n        this.end.row += shift;\n        this.folds.forEach(function(fold) {\n            fold.start.row += shift;\n            fold.end.row += shift;\n        });\n    }\n\n    this.addFold = function(fold) {\n        if (fold.sameRow) {\n            if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n                throw \"Can't add a fold to this FoldLine as it has no connection\";\n            }\n            this.folds.push(fold);\n            this.folds.sort(function(a, b) {\n                return -a.range.compareEnd(b.start.row, b.start.column);\n            });\n            if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n                this.end.row = fold.end.row;\n                this.end.column =  fold.end.column;\n            } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n                this.start.row = fold.start.row;\n                this.start.column = fold.start.column;\n            }\n        } else if (fold.start.row == this.end.row) {\n            this.folds.push(fold);\n            this.end.row = fold.end.row;\n            this.end.column = fold.end.column;\n        } else if (fold.end.row == this.start.row) {\n            this.folds.unshift(fold);\n            this.start.row = fold.start.row;\n            this.start.column = fold.start.column;\n        } else {\n            throw \"Trying to add fold to FoldRow that doesn't have a matching row\";\n        }\n        fold.foldLine = this;\n    }\n\n    this.containsRow = function(row) {\n        return row >= this.start.row && row <= this.end.row;\n    }\n\n    this.walk = function(callback, endRow, endColumn) {\n        var lastEnd = 0,\n            folds = this.folds,\n            fold,\n            comp, stop, isNewRow = true;\n\n        if (endRow == null) {\n            endRow = this.end.row;\n            endColumn = this.end.column;\n        }\n\n        for (var i = 0; i < folds.length; i++) {\n            fold = folds[i];\n\n            comp = fold.range.compareStart(endRow, endColumn);\n            // This fold is after the endRow/Column.\n            if (comp == -1) {\n                callback(null, endRow, endColumn, lastEnd, isNewRow);\n                return;\n            }\n\n            stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n            stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n\n            // If the user requested to stop the walk or endRow/endColumn is\n            // inside of this fold (comp == 0), then end here.\n            if (stop || comp == 0) {\n                return;\n            }\n\n            // Note the new lastEnd might not be on the same line. However,\n            // it's the callback's job to recognize this.\n            isNewRow = !fold.sameRow;\n            lastEnd = fold.end.column;\n        }\n        callback(null, endRow, endColumn, lastEnd, isNewRow);\n    }\n\n    this.getNextFoldTo = function(row, column) {\n        var fold, cmp;\n        for (var i = 0; i < this.folds.length; i++) {\n            fold = this.folds[i];\n            cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                return {\n                    fold: fold,\n                    kind: \"after\"\n                };\n            } else if (cmp == 0) {\n                return {\n                    fold: fold,\n                    kind: \"inside\"\n                }\n            }\n        }\n        return null;\n    }\n\n    this.addRemoveChars = function(row, column, len) {\n        var ret = this.getNextFoldTo(row, column),\n            fold, folds;\n        if (ret) {\n            fold = ret.fold;\n            if (ret.kind == \"inside\"\n                && fold.start.column != column\n                && fold.start.row != row)\n            {\n                //throwing here breaks whole editor\n                //TODO: properly handle this\n                window.console && window.console.log(row, column, fold);\n            } else if (fold.start.row == row) {\n                folds = this.folds;\n                var i = folds.indexOf(fold);\n                if (i == 0) {\n                    this.start.column += len;\n                }\n                for (i; i < folds.length; i++) {\n                    fold = folds[i];\n                    fold.start.column += len;\n                    if (!fold.sameRow) {\n                        return;\n                    }\n                    fold.end.column += len;\n                }\n                this.end.column += len;\n            }\n        }\n    }\n\n    this.split = function(row, column) {\n        var fold = this.getNextFoldTo(row, column).fold,\n            folds = this.folds;\n        var foldData = this.foldData;\n\n        if (!fold) {\n            return null;\n        }\n        var i = folds.indexOf(fold);\n        var foldBefore = folds[i - 1];\n        this.end.row = foldBefore.end.row;\n        this.end.column = foldBefore.end.column;\n\n        // Remove the folds after row/column and create a new FoldLine\n        // containing these removed folds.\n        folds = folds.splice(i, folds.length - i);\n\n        var newFoldLine = new FoldLine(foldData, folds);\n        foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n        return newFoldLine;\n    }\n\n    this.merge = function(foldLineNext) {\n        var folds = foldLineNext.folds;\n        for (var i = 0; i < folds.length; i++) {\n            this.addFold(folds[i]);\n        }\n        // Remove the foldLineNext - no longer needed, as\n        // it's merged now with foldLineNext.\n        var foldData = this.foldData;\n        foldData.splice(foldData.indexOf(foldLineNext), 1);\n    }\n\n    this.toString = function() {\n        var ret = [this.range.toString() + \": [\" ];\n\n        this.folds.forEach(function(fold) {\n            ret.push(\"  \" + fold.toString());\n        });\n        ret.push(\"]\")\n        return ret.join(\"\\n\");\n    }\n\n    this.idxToPosition = function(idx) {\n        var lastFoldEndColumn = 0;\n        var fold;\n\n        for (var i = 0; i < this.folds.length; i++) {\n            var fold = this.folds[i];\n\n            idx -= fold.start.column - lastFoldEndColumn;\n            if (idx < 0) {\n                return {\n                    row: fold.start.row,\n                    column: fold.start.column + idx\n                };\n            }\n\n            idx -= fold.placeholder.length;\n            if (idx < 0) {\n                return fold.start;\n            }\n\n            lastFoldEndColumn = fold.end.column;\n        }\n\n        return {\n            row: this.end.row,\n            column: this.end.column + idx\n        };\n    }\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\ndefine('ace/edit_session/fold', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/*\n * Simple fold-data struct.\n **/\nvar Fold = exports.Fold = function(range, placeholder) {\n    this.foldLine = null;\n    this.placeholder = placeholder;\n    this.range = range;\n    this.start = range.start;\n    this.end = range.end;\n\n    this.sameRow = range.start.row == range.end.row;\n    this.subFolds = [];\n};\n\n(function() {\n\n    this.toString = function() {\n        return '\"' + this.placeholder + '\" ' + this.range.toString();\n    };\n\n    this.setFoldLine = function(foldLine) {\n        this.foldLine = foldLine;\n        this.subFolds.forEach(function(fold) {\n            fold.setFoldLine(foldLine);\n        });\n    };\n\n    this.clone = function() {\n        var range = this.range.clone();\n        var fold = new Fold(range, this.placeholder);\n        this.subFolds.forEach(function(subFold) {\n            fold.subFolds.push(subFold.clone());\n        });\n        return fold;\n    };\n\n    this.addSubFold = function(fold) {\n        if (this.range.isEqual(fold))\n            return this;\n\n        if (!this.range.containsRange(fold))\n            throw \"A fold can't intersect already existing fold\" + fold.range + this.range;\n\n        var row = fold.range.start.row, column = fold.range.start.column;\n        for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n            cmp = this.subFolds[i].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterStart = this.subFolds[i];\n\n        if (cmp == 0)\n            return afterStart.addSubFold(fold);\n\n        // cmp == -1\n        var row = fold.range.end.row, column = fold.range.end.column;\n        for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n            cmp = this.subFolds[j].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterEnd = this.subFolds[j];\n\n        if (cmp == 0)\n            throw \"A fold can't intersect already existing fold\" + fold.range + this.range;\n\n        var consumedFolds = this.subFolds.splice(i, j - i, fold);\n        fold.setFoldLine(this.foldLine);\n\n        return fold;\n    };\n\n}).call(Fold.prototype);\n\n});\n\ndefine('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class TokenIterator\n *\n * This class provides an essay way to treat the document as a stream of tokens, and provides methods to iterate over these tokens.\n *\n **/\n\n/**\n * new TokenIterator(session, initialRow, initialColumn)\n * - session (EditSession): The session to associate with\n * - initialRow (Number): The row to start the tokenizing at\n * - initialColumn (Number): The column to start the tokenizing at\n *\n * Creates a new token iterator object. The inital token index is set to the provided row and column coordinates.\n *\n **/\nvar TokenIterator = function(session, initialRow, initialColumn) {\n    this.$session = session;\n    this.$row = initialRow;\n    this.$rowTokens = session.getTokens(initialRow);\n\n    var token = session.getTokenAt(initialRow, initialColumn);\n    this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() {\n   \n    /**\n    * TokenIterator.stepBackward() -> [String]\n    * + (String): If the current point is not at the top of the file, this function returns `null`. Otherwise, it returns an array of the tokenized strings.\n    * \n    * Tokenizes all the items from the current point to the row prior in the document. \n    **/ \n    this.stepBackward = function() {\n        this.$tokenIndex -= 1;\n        \n        while (this.$tokenIndex < 0) {\n            this.$row -= 1;\n            if (this.$row < 0) {\n                this.$row = 0;\n                return null;\n            }\n                \n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = this.$rowTokens.length - 1;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };   \n    this.stepForward = function() {\n        var rowCount = this.$session.getLength();\n        this.$tokenIndex += 1;\n        \n        while (this.$tokenIndex >= this.$rowTokens.length) {\n            this.$row += 1;\n            if (this.$row >= rowCount) {\n                this.$row = rowCount - 1;\n                return null;\n            }\n\n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = 0;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentToken = function () {\n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentTokenRow = function () {\n        return this.$row;\n    };     \n    this.getCurrentTokenColumn = function() {\n        var rowTokens = this.$rowTokens;\n        var tokenIndex = this.$tokenIndex;\n        \n        // If a column was cached by EditSession.getTokenAt, then use it\n        var column = rowTokens[tokenIndex].start;\n        if (column !== undefined)\n            return column;\n            \n        column = 0;\n        while (tokenIndex > 0) {\n            tokenIndex -= 1;\n            column += rowTokens[tokenIndex].value.length;\n        }\n        \n        return column;  \n    };\n            \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\ndefine('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) {\n\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n    this.findMatchingBracket = function(position) {\n        if (position.column == 0) return null;\n\n        var charBeforeCursor = this.getLine(position.row).charAt(position.column-1);\n        if (charBeforeCursor == \"\") return null;\n\n        var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match)\n            return null;\n\n        if (match[1])\n            return this.$findClosingBracket(match[1], position);\n        else\n            return this.$findOpeningBracket(match[2], position);\n    };\n    \n    this.getBracketRange = function(pos) {\n        var line = this.getLine(pos.row);\n        var before = true, range;\n\n        var chr = line.charAt(pos.column-1);\n        var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match) {\n            chr = line.charAt(pos.column);\n            pos = {row: pos.row, column: pos.column + 1};\n            match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n            before = false;\n        }\n        if (!match)\n            return null;\n\n        if (match[1]) {\n            var bracketPos = this.$findClosingBracket(match[1], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(pos, bracketPos);\n            if (!before) {\n                range.end.column++;\n                range.start.column--;\n            }\n            range.cursor = range.end;\n        } else {\n            var bracketPos = this.$findOpeningBracket(match[2], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(bracketPos, pos);\n            if (!before) {\n                range.start.column++;\n                range.end.column--;\n            }\n            range.cursor = range.start;\n        }\n        \n        return range;\n    };\n\n    this.$brackets = {\n        \")\": \"(\",\n        \"(\": \")\",\n        \"]\": \"[\",\n        \"[\": \"]\",\n        \"{\": \"}\",\n        \"}\": \"{\"\n    };\n\n    this.$findOpeningBracket = function(bracket, position, typeRe) {\n        var openBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n        \n         if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n                + \")+\"\n            );\n        }\n        \n        // Start searching in token, just before the character at position.column\n        var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n        var value = token.value;\n        \n        while (true) {\n        \n            while (valueIndex >= 0) {\n                var chr = value.charAt(valueIndex);\n                if (chr == openBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex -= 1;\n            }\n\n            // Scan backward through the document, looking for the next token\n            // whose type matches typeRe\n            do {\n                token = iterator.stepBackward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n                \n            value = token.value;\n            valueIndex = value.length - 1;\n        }\n        \n        return null;\n    };\n\n    this.$findClosingBracket = function(bracket, position, typeRe) {\n        var closingBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n\n        if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n                + \")+\"\n            );\n        }\n\n        // Start searching in token, after the character at position.column\n        var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n        while (true) {\n\n            var value = token.value;\n            var valueLength = value.length;\n            while (valueIndex < valueLength) {\n                var chr = value.charAt(valueIndex);\n                if (chr == closingBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex += 1;\n            }\n\n            // Scan forward through the document, looking for the next token\n            // whose type matches typeRe\n            do {\n                token = iterator.stepForward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n\n            valueIndex = 0;\n        }\n        \n        return null;\n    };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\ndefine('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {\n\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\n/**\n * new Search()\n *\n * Creates a new `Search` object. The following search options are avaliable:\n *\n * * `needle`: The string or regular expression you're looking for\n * * `backwards`: Whether to search backwards from where cursor currently is. Defaults to `false`.\n * * `wrap`: Whether to wrap the search back to the beginning when it hits the end. Defaults to `false`.\n * * `caseSensitive`: Whether the search ought to be case-sensitive. Defaults to `false`.\n * * `wholeWord`: Whether the search matches only on whole words. Defaults to `false`.\n * * `range`: The [[Range]] to search within. Set this to `null` for the whole document\n * * `regExp`: Whether the search is a regular expression or not. Defaults to `false`.\n * * `start`: The starting [[Range]] or cursor position to begin the search\n * * `skipCurrent`: Whether or not to include the current line in the search. Default to `false`.\n *\n**/\n\nvar Search = function() {\n    this.$options = {};\n};\n\n(function() {\n    /**\n     * Search.set(options) -> Search\n     * - options (Object): An object containing all the new search properties\n     *\n     * Sets the search options via the `options` parameter.\n     *\n    **/\n    this.set = function(options) {\n        oop.mixin(this.$options, options);\n        return this;\n    };\n    this.getOptions = function() {\n        return lang.copyObject(this.$options);\n    };\n\n    this.setOptions = function(options) {\n        this.$options = options;\n    };\n    this.find = function(session) {\n        var iterator = this.$matchIterator(session, this.$options);\n\n        if (!iterator)\n            return false;\n\n        var firstRange = null;\n        iterator.forEach(function(range, row, offset) {\n            if (!range.start) {\n                var column = range.offset + (offset || 0);\n                firstRange = new Range(row, column, row, column+range.length);\n            } else\n                firstRange = range;\n            return true;\n        });\n\n        return firstRange;\n    };\n    this.findAll = function(session) {\n        var options = this.$options;\n        if (!options.needle)\n            return [];\n        this.$assembleRegExp(options);\n\n        var range = options.range;\n        var lines = range\n            ? session.getLines(range.start.row, range.end.row)\n            : session.doc.getAllLines();\n\n        var ranges = [];\n        var re = options.re;\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var maxRow = lines.length - len;\n            for (var row = re.offset || 0; row <= maxRow; row++) {\n                for (var j = 0; j < len; j++)\n                    if (lines[row + j].search(re[j]) == -1)\n                        break;\n                \n                var startLine = lines[row];\n                var line = lines[row + len - 1];\n                var startIndex = startLine.match(re[0])[0].length;\n                var endIndex = line.match(re[len - 1])[0].length;\n\n                ranges.push(new Range(\n                    row, startLine.length - startIndex,\n                    row + len - 1, endIndex\n                ));\n            }\n        } else {\n            for (var i = 0; i < lines.length; i++) {\n                var matches = lang.getMatchOffsets(lines[i], re);\n                for (var j = 0; j < matches.length; j++) {\n                    var match = matches[j];\n                    ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n                }\n            }\n        }\n\n        if (range) {\n            var startColumn = range.start.column;\n            var endColumn = range.start.column;\n            var i = 0, j = ranges.length - 1;\n            while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n                i++;\n\n            while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n                j--;\n            return ranges.slice(i, j + 1);\n        }\n\n        return ranges;\n    };\n    this.replace = function(input, replacement) {\n        var options = this.$options;\n\n        var re = this.$assembleRegExp(options);\n        if (options.$isMultiLine)\n            return replacement;\n\n        if (!re)\n            return;\n\n        var match = re.exec(input);\n        if (!match || match[0].length != input.length)\n            return null;\n        \n        replacement = input.replace(re, replacement);\n        if (options.preserveCase) {\n            replacement = replacement.split(\"\");\n            for (var i = Math.min(input.length, input.length); i--; ) {\n                var ch = input[i];\n                if (ch && ch.toLowerCase() != ch)\n                    replacement[i] = replacement[i].toUpperCase();\n                else\n                    replacement[i] = replacement[i].toLowerCase();\n            }\n            replacement = replacement.join(\"\");\n        }\n        \n        return replacement;\n    };\n    this.$matchIterator = function(session, options) {\n        var re = this.$assembleRegExp(options);\n        if (!re)\n            return false;\n\n        var self = this, callback, backwards = options.backwards;\n\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var matchIterator = function(line, row, offset) {\n                var startIndex = line.search(re[0]);\n                if (startIndex == -1)\n                    return;\n                for (var i = 1; i < len; i++) {\n                    line = session.getLine(row + i);\n                    if (line.search(re[i]) == -1)\n                        return;\n                }\n\n                var endIndex = line.match(re[len - 1])[0].length;\n\n                var range = new Range(row, startIndex, row + len - 1, endIndex);\n                if (re.offset == 1) {\n                    range.start.row--;\n                    range.start.column = Number.MAX_VALUE;\n                } else if (offset)\n                    range.start.column += offset;\n\n                if (callback(range))\n                    return true;\n            };\n        } else if (backwards) {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = matches.length-1; i >= 0; i--)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        } else {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = 0; i < matches.length; i++)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        }\n\n        return {\n            forEach: function(_callback) {\n                callback = _callback;\n                self.$lineIterator(session, options).forEach(matchIterator);\n            }\n        };\n    };\n\n    this.$assembleRegExp = function(options) {\n        if (options.needle instanceof RegExp)\n            return options.re = options.needle;\n\n        var needle = options.needle;\n\n        if (!options.needle)\n            return options.re = false;\n\n        if (!options.regExp)\n            needle = lang.escapeRegExp(needle);\n\n        if (options.wholeWord)\n            needle = \"\\\\b\" + needle + \"\\\\b\";\n\n        var modifier = options.caseSensitive ? \"g\" : \"gi\";\n\n        options.$isMultiLine = /[\\n\\r]/.test(needle);\n        if (options.$isMultiLine)\n            return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n        try {\n            var re = new RegExp(needle, modifier);\n        } catch(e) {\n            re = false;\n        }\n        return options.re = re;\n    };\n\n    this.$assembleMultilineRegExp = function(needle, modifier) {\n        var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n        var re = [];\n        for (var i = 0; i < parts.length; i++) try {\n            re.push(new RegExp(parts[i], modifier));\n        } catch(e) {\n            return false;\n        }\n        if (parts[0] == \"\") {\n            re.shift();\n            re.offset = 1;\n        } else {\n            re.offset = 0;\n        }\n        return re;\n    };\n\n    this.$lineIterator = function(session, options) {\n        var backwards = options.backwards == true;\n        var skipCurrent = options.skipCurrent != false;\n\n        var range = options.range;\n        var start = options.start;\n        if (!start)\n            start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n         \n        if (start.start)\n            start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n        var firstRow = range ? range.start.row : 0;\n        var lastRow = range ? range.end.row : session.getLength() - 1;\n\n        var forEach = backwards ? function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substring(0, start.column);\n                if (callback(line, row))\n                    return;\n\n                for (row--; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap == false)\n                    return;\n\n                for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n            } : function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substr(start.column);\n                if (callback(line, row, start.column))\n                    return;\n\n                for (row = row+1; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap == false)\n                    return;\n\n                for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n            };\n        \n        return {forEach: forEach};\n    };\n\n}).call(Search.prototype);\n\nexports.Search = Search;\n});\ndefine('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\n/**\n * new CommandManager(platform, commands)\n * - platform (String): Identifier for the platform; must be either `'mac'` or `'win'`\n * - commands (Array): A list of commands\n *\n * TODO\n *\n *\n **/\n\nvar CommandManager = function(platform, commands) {\n    this.platform = platform;\n    this.commands = this.byName = {};\n    this.commmandKeyBinding = {};\n\n    this.addCommands(commands);\n    \n    this.setDefaultHandler(\"exec\", function(e) {\n        return e.command.exec(e.editor, e.args || {});\n    });\n};\n\noop.inherits(CommandManager, HashHandler);\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.exec = function(command, editor, args) {\n        if (typeof command === 'string')\n            command = this.commands[command];\n\n        if (!command)\n            return false;\n\n        if (editor && editor.$readOnly && !command.readOnly)\n            return false;\n\n        var retvalue = this._emit(\"exec\", {\n            editor: editor,\n            command: command,\n            args: args\n        });\n\n        return retvalue === false ? false : true;\n    };\n\n    this.toggleRecording = function(editor) {\n        if (this.$inReplay)\n            return;\n\n        editor && editor._emit(\"changeStatus\");\n        if (this.recording) {\n            this.macro.pop();\n            this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n            if (!this.macro.length)\n                this.macro = this.oldMacro;\n\n            return this.recording = false;\n        }\n        if (!this.$addCommandToMacro) {\n            this.$addCommandToMacro = function(e) {\n                this.macro.push([e.command, e.args]);\n            }.bind(this);\n        }\n\n        this.oldMacro = this.macro;\n        this.macro = [];\n        this.on(\"exec\", this.$addCommandToMacro);\n        return this.recording = true;\n    };\n\n    this.replay = function(editor) {\n        if (this.$inReplay || !this.macro)\n            return;\n\n        if (this.recording)\n            return this.toggleRecording(editor);\n\n        try {\n            this.$inReplay = true;\n            this.macro.forEach(function(x) {\n                if (typeof x == \"string\")\n                    this.exec(x, editor);\n                else\n                    this.exec(x[0], editor, x[1]);\n            }, this);\n        } finally {\n            this.$inReplay = false;\n        }\n    };\n\n    this.trimMacro = function(m) {\n        return m.map(function(x){\n            if (typeof x[0] != \"string\")\n                x[0] = x[0].name;\n            if (!x[1])\n                x = x[0];\n            return x;\n        });\n    };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\ndefine('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys'], function(require, exports, module) {\n\n\nvar keyUtil  = require(\"../lib/keys\");\n\nfunction HashHandler(config, platform) {\n    this.platform = platform;\n    this.commands = {};\n    this.commmandKeyBinding = {};\n\n    this.addCommands(config);\n};\n\n(function() {\n\n    this.addCommand = function(command) {\n        if (this.commands[command.name])\n            this.removeCommand(command);\n\n        this.commands[command.name] = command;\n\n        if (command.bindKey)\n            this._buildKeyHash(command);\n    };\n\n    this.removeCommand = function(command) {\n        var name = (typeof command === 'string' ? command : command.name);\n        command = this.commands[name];\n        delete this.commands[name];\n\n        // exhaustive search is brute force but since removeCommand is\n        // not a performance critical operation this should be OK\n        var ckb = this.commmandKeyBinding;\n        for (var hashId in ckb) {\n            for (var key in ckb[hashId]) {\n                if (ckb[hashId][key] == command)\n                    delete ckb[hashId][key];\n            }\n        }\n    };\n\n    this.bindKey = function(key, command) {\n        if(!key)\n            return;\n        if (typeof command == \"function\") {\n            this.addCommand({exec: command, bindKey: key, name: key});\n            return;\n        }\n\n        var ckb = this.commmandKeyBinding;\n        key.split(\"|\").forEach(function(keyPart) {\n            var binding = this.parseKeys(keyPart, command);\n            var hashId = binding.hashId;\n            (ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command;\n        }, this);\n    };\n\n    this.addCommands = function(commands) {\n        commands && Object.keys(commands).forEach(function(name) {\n            var command = commands[name];\n            if (typeof command === \"string\")\n                return this.bindKey(command, name);\n\n            if (typeof command === \"function\")\n                command = { exec: command };\n\n            if (!command.name)\n                command.name = name;\n\n            this.addCommand(command);\n        }, this);\n    };\n\n    this.removeCommands = function(commands) {\n        Object.keys(commands).forEach(function(name) {\n            this.removeCommand(commands[name]);\n        }, this);\n    };\n\n    this.bindKeys = function(keyList) {\n        Object.keys(keyList).forEach(function(key) {\n            this.bindKey(key, keyList[key]);\n        }, this);\n    };\n\n    this._buildKeyHash = function(command) {\n        var binding = command.bindKey;\n        if (!binding)\n            return;\n\n        var key = typeof binding == \"string\" ? binding: binding[this.platform];\n        this.bindKey(key, command);\n    };\n\t\n\t// accepts keys in the form ctrl+Enter or ctrl-Enter\n\t// keys without modifiers or shift only \n    this.parseKeys = function(keys) {\n        var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x});\n        var key = parts.pop();\n\n        var keyCode = keyUtil[key];\n        if (keyUtil.FUNCTION_KEYS[keyCode])\n            key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n        else if (!parts.length)\n            return {key: key, hashId: -1};\n        else if (parts.length == 1 && parts[0] == \"shift\")\n            return {key: key.toUpperCase(), hashId: -1};\n\n        var hashId = 0;\n        for (var i = parts.length; i--;) {\n            var modifier = keyUtil.KEY_MODS[parts[i]];\n            if (modifier == null)\n                throw \"invalid modifier \" + parts[i] + \" in \" + keys;\n            hashId |= modifier;\n        }\n        return {key: key, hashId: hashId};\n    };\n\n    this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n        var ckbr = this.commmandKeyBinding;\n        return ckbr[hashId] && ckbr[hashId][keyString];\n    };\n\n    this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n        return {\n            command: this.findKeyCommand(hashId, keyString)\n        };\n    };\n\n}).call(HashHandler.prototype)\n\nexports.HashHandler = HashHandler;\n});\n\ndefine('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar lang = require(\"../lib/lang\");\n\nfunction bindKey(win, mac) {\n    return {\n        win: win,\n        mac: mac\n    };\n}\n\nexports.commands = [{\n    name: \"selectall\",\n    bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n    exec: function(editor) { editor.selectAll(); },\n    readOnly: true\n}, {\n    name: \"centerselection\",\n    bindKey: bindKey(null, \"Ctrl-L\"),\n    exec: function(editor) { editor.centerSelection(); },\n    readOnly: true\n}, {\n    name: \"gotoline\",\n    bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n    exec: function(editor) {\n        var line = parseInt(prompt(\"Enter line number:\"), 10);\n        if (!isNaN(line)) {\n            editor.gotoLine(line);\n        }\n    },\n    readOnly: true\n}, {\n    name: \"fold\",\n    bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n    exec: function(editor) { editor.session.toggleFold(false); },\n    readOnly: true\n}, {\n    name: \"unfold\",\n    bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n    exec: function(editor) { editor.session.toggleFold(true); },\n    readOnly: true\n}, {\n    name: \"foldall\",\n    bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n    exec: function(editor) { editor.session.foldAll(); },\n    readOnly: true\n}, {\n    name: \"unfoldall\",\n    bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n    exec: function(editor) { editor.session.unfold(); },\n    readOnly: true\n}, {\n    name: \"findnext\",\n    bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n    exec: function(editor) { editor.findNext(); },\n    readOnly: true\n}, {\n    name: \"findprevious\",\n    bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n    exec: function(editor) { editor.findPrevious(); },\n    readOnly: true\n}, {\n    name: \"find\",\n    bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n    exec: function(editor) {\n        var needle = prompt(\"Find:\", editor.getCopyText());\n        editor.find(needle);\n    },\n    readOnly: true\n}, {\n    name: \"overwrite\",\n    bindKey: \"Insert\",\n    exec: function(editor) { editor.toggleOverwrite(); },\n    readOnly: true\n}, {\n    name: \"selecttostart\",\n    bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotostart\",\n    bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n    exec: function(editor) { editor.navigateFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectup\",\n    bindKey: bindKey(\"Shift-Up\", \"Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectUp(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"golineup\",\n    bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n    exec: function(editor, args) { editor.navigateUp(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttoend\",\n    bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-Down\"),\n    exec: function(editor) { editor.getSelection().selectFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotoend\",\n    bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n    exec: function(editor) { editor.navigateFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectdown\",\n    bindKey: bindKey(\"Shift-Down\", \"Shift-Down\"),\n    exec: function(editor) { editor.getSelection().selectDown(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"golinedown\",\n    bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n    exec: function(editor, args) { editor.navigateDown(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectwordleft\",\n    bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectWordLeft(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotowordleft\",\n    bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n    exec: function(editor) { editor.navigateWordLeft(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttolinestart\",\n    bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotolinestart\",\n    bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n    exec: function(editor) { editor.navigateLineStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectleft\",\n    bindKey: bindKey(\"Shift-Left\", \"Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectLeft(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotoleft\",\n    bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n    exec: function(editor, args) { editor.navigateLeft(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectwordright\",\n    bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectWordRight(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotowordright\",\n    bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n    exec: function(editor) { editor.navigateWordRight(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttolineend\",\n    bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotolineend\",\n    bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n    exec: function(editor) { editor.navigateLineEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectright\",\n    bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectRight(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotoright\",\n    bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n    exec: function(editor, args) { editor.navigateRight(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectpagedown\",\n    bindKey: \"Shift-PageDown\",\n    exec: function(editor) { editor.selectPageDown(); },\n    readOnly: true\n}, {\n    name: \"pagedown\",\n    bindKey: bindKey(null, \"Option-PageDown\"),\n    exec: function(editor) { editor.scrollPageDown(); },\n    readOnly: true\n}, {\n    name: \"gotopagedown\",\n    bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n    exec: function(editor) { editor.gotoPageDown(); },\n    readOnly: true\n}, {\n    name: \"selectpageup\",\n    bindKey: \"Shift-PageUp\",\n    exec: function(editor) { editor.selectPageUp(); },\n    readOnly: true\n}, {\n    name: \"pageup\",\n    bindKey: bindKey(null, \"Option-PageUp\"),\n    exec: function(editor) { editor.scrollPageUp(); },\n    readOnly: true\n}, {\n    name: \"gotopageup\",\n    bindKey: \"PageUp\",\n    exec: function(editor) { editor.gotoPageUp(); },\n    readOnly: true\n}, {\n    name: \"scrollup\",\n    bindKey: bindKey(\"Ctrl-Up\", null),\n    exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"scrolldown\",\n    bindKey: bindKey(\"Ctrl-Down\", null),\n    exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"selectlinestart\",\n    bindKey: \"Shift-Home\",\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectlineend\",\n    bindKey: \"Shift-End\",\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"togglerecording\",\n    bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n    exec: function(editor) { editor.commands.toggleRecording(editor); },\n    readOnly: true\n}, {\n    name: \"replaymacro\",\n    bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n    exec: function(editor) { editor.commands.replay(editor); },\n    readOnly: true\n}, {\n    name: \"jumptomatching\",\n    bindKey: bindKey(\"Ctrl-P\", \"Ctrl-Shift-P\"),\n    exec: function(editor) { editor.jumpToMatching(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttomatching\",\n    bindKey: bindKey(\"Ctrl-Shift-P\", null),\n    exec: function(editor) { editor.jumpToMatching(true); },\n    readOnly: true\n}, \n\n// commands disabled in readOnly mode\n{\n    name: \"cut\",\n    exec: function(editor) {\n        var range = editor.getSelectionRange();\n        editor._emit(\"cut\", range);\n\n        if (!editor.selection.isEmpty()) {\n            editor.session.remove(range);\n            editor.clearSelection();\n        }\n    },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removeline\",\n    bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n    exec: function(editor) { editor.removeLines(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"duplicateSelection\",\n    bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n    exec: function(editor) { editor.duplicateSelection(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"togglecomment\",\n    bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n    exec: function(editor) { editor.toggleCommentLines(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"replace\",\n    bindKey: bindKey(\"Ctrl-R\", \"Command-Option-F\"),\n    exec: function(editor) {\n        var needle = prompt(\"Find:\", editor.getCopyText());\n        if (!needle)\n            return;\n        var replacement = prompt(\"Replacement:\");\n        if (!replacement)\n            return;\n        editor.replace(replacement, {needle: needle});\n    }\n}, {\n    name: \"replaceall\",\n    bindKey: bindKey(\"Ctrl-Shift-R\", \"Command-Shift-Option-F\"),\n    exec: function(editor) {\n        var needle = prompt(\"Find:\");\n        if (!needle)\n            return;\n        var replacement = prompt(\"Replacement:\");\n        if (!replacement)\n            return;\n        editor.replaceAll(replacement, {needle: needle});\n    }\n}, {\n    name: \"undo\",\n    bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n    exec: function(editor) { editor.undo(); }\n}, {\n    name: \"redo\",\n    bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n    exec: function(editor) { editor.redo(); }\n}, {\n    name: \"copylinesup\",\n    bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n    exec: function(editor) { editor.copyLinesUp(); }\n}, {\n    name: \"movelinesup\",\n    bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n    exec: function(editor) { editor.moveLinesUp(); }\n}, {\n    name: \"copylinesdown\",\n    bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n    exec: function(editor) { editor.copyLinesDown(); }\n}, {\n    name: \"movelinesdown\",\n    bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n    exec: function(editor) { editor.moveLinesDown(); }\n}, {\n    name: \"del\",\n    bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D\"),\n    exec: function(editor) { editor.remove(\"right\"); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"backspace\",\n    bindKey: bindKey(\n        \"Command-Backspace|Option-Backspace|Shift-Backspace|Backspace\",\n        \"Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n    ),\n    exec: function(editor) { editor.remove(\"left\"); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removetolinestart\",\n    bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n    exec: function(editor) { editor.removeToLineStart(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removetolineend\",\n    bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K\"),\n    exec: function(editor) { editor.removeToLineEnd(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removewordleft\",\n    bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n    exec: function(editor) { editor.removeWordLeft(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removewordright\",\n    bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n    exec: function(editor) { editor.removeWordRight(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"outdent\",\n    bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"indent\",\n    bindKey: bindKey(\"Tab\", \"Tab\"),\n    exec: function(editor) { editor.indent(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"insertstring\",\n    exec: function(editor, str) { editor.insert(str); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"inserttext\",\n    exec: function(editor, args) {\n        editor.insert(lang.stringRepeat(args.text  || \"\", args.times || 1));\n    },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"splitline\",\n    bindKey: bindKey(null, \"Ctrl-O\"),\n    exec: function(editor) { editor.splitLine(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"transposeletters\",\n    bindKey: bindKey(\"Ctrl-T\", \"Ctrl-T\"),\n    exec: function(editor) { editor.transposeLetters(); },\n    multiSelectAction: function(editor) {editor.transposeSelections(1); }\n}, {\n    name: \"touppercase\",\n    bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n    exec: function(editor) { editor.toUpperCase(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"tolowercase\",\n    bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n    exec: function(editor) { editor.toLowerCase(); },\n    multiSelectAction: \"forEach\"\n}];\n\n});\n\ndefine('ace/undomanager', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class UndoManager\n *\n * This object maintains the undo stack for an [[EditSession `EditSession`]].\n *\n **/\n\n/**\n * new UndoManager()\n * \n * Resets the current undo state and creates a new `UndoManager`.\n **/\nvar UndoManager = function() {\n    this.reset();\n};\n\n(function() {\n\n    /**\n    * UndoManager.execute(options) -> Void\n    * - options (Object): Contains additional properties\n    *\n    * Provides a means for implementing your own undo manager. `options` has one property, `args`, an [[Array `Array`]], with two elements:\n    *\n    * * `args[0]` is an array of deltas\n    * * `args[1]` is the document to associate with\n    *\n    **/\n    this.execute = function(options) {\n        var deltas = options.args[0];\n        this.$doc  = options.args[1];\n        this.$undoStack.push(deltas);\n        this.$redoStack = [];\n    };\n    this.undo = function(dontSelect) {\n        var deltas = this.$undoStack.pop();\n        var undoSelectionRange = null;\n        if (deltas) {\n            undoSelectionRange =\n                this.$doc.undoChanges(deltas, dontSelect);\n            this.$redoStack.push(deltas);\n        }\n        return undoSelectionRange;\n    };\n    this.redo = function(dontSelect) {\n        var deltas = this.$redoStack.pop();\n        var redoSelectionRange = null;\n        if (deltas) {\n            redoSelectionRange =\n                this.$doc.redoChanges(deltas, dontSelect);\n            this.$undoStack.push(deltas);\n        }\n        return redoSelectionRange;\n    };\n    this.reset = function() {\n        this.$undoStack = [];\n        this.$redoStack = [];\n    };\n    this.hasUndo = function() {\n        return this.$undoStack.length > 0;\n    };\n    this.hasRedo = function() {\n        return this.$redoStack.length > 0;\n    };\n\n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\ndefine('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent', 'ace/config', 'ace/lib/net', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/lib/event_emitter', 'text!ace/css/editor.css'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar useragent = require(\"./lib/useragent\");\nvar config = require(\"./config\");\nvar net = require(\"./lib/net\");\nvar GutterLayer = require(\"./layer/gutter\").Gutter;\nvar MarkerLayer = require(\"./layer/marker\").Marker;\nvar TextLayer = require(\"./layer/text\").Text;\nvar CursorLayer = require(\"./layer/cursor\").Cursor;\nvar ScrollBar = require(\"./scrollbar\").ScrollBar;\nvar RenderLoop = require(\"./renderloop\").RenderLoop;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = require(\"text!./css/editor.css\");\n\ndom.importCssString(editorCss, \"ace_editor\");\n\n/**\n * new VirtualRenderer(container, theme)\n * - container (DOMElement): The root element of the editor\n * - theme (String): The starting theme\n *\n * Constructs a new `VirtualRenderer` within the `container` specified, applying the given `theme`.\n *\n **/\n\nvar VirtualRenderer = function(container, theme) {\n    var _self = this;\n\n    this.container = container;\n\n    // TODO: this breaks rendering in Cloud9 with multiple ace instances\n//    // Imports CSS once per DOM document ('ace_editor' serves as an identifier).\n//    dom.importCssString(editorCss, \"ace_editor\", container.ownerDocument);\n\n    // in IE <= 9 the native cursor always shines through\n    this.$keepTextAreaAtCursor = !useragent.isIE;\n\n    dom.addCssClass(container, \"ace_editor\");\n\n    this.setTheme(theme);\n\n    this.$gutter = dom.createElement(\"div\");\n    this.$gutter.className = \"ace_gutter\";\n    this.container.appendChild(this.$gutter);\n\n    this.scroller = dom.createElement(\"div\");\n    this.scroller.className = \"ace_scroller\";\n    this.container.appendChild(this.scroller);\n\n    this.content = dom.createElement(\"div\");\n    this.content.className = \"ace_content\";\n    this.scroller.appendChild(this.content);\n\n    this.setHighlightGutterLine(true);\n    this.$gutterLayer = new GutterLayer(this.$gutter);\n    this.$gutterLayer.on(\"changeGutterWidth\", this.onResize.bind(this, true));\n\n    this.$markerBack = new MarkerLayer(this.content);\n\n    var textLayer = this.$textLayer = new TextLayer(this.content);\n    this.canvas = textLayer.element;\n\n    this.$markerFront = new MarkerLayer(this.content);\n\n    this.characterWidth = textLayer.getCharacterWidth();\n    this.lineHeight = textLayer.getLineHeight();\n\n    this.$cursorLayer = new CursorLayer(this.content);\n    this.$cursorPadding = 8;\n\n    // Indicates whether the horizontal scrollbar is visible\n    this.$horizScroll = false;\n    this.$horizScrollAlwaysVisible = false;\n\n    this.$animatedScroll = false;\n\n    this.scrollBar = new ScrollBar(container);\n    this.scrollBar.addEventListener(\"scroll\", function(e) {\n        if (!_self.$inScrollAnimation)\n            _self.session.setScrollTop(e.data);\n    });\n\n    this.scrollTop = 0;\n    this.scrollLeft = 0;\n\n    event.addListener(this.scroller, \"scroll\", function() {\n        var scrollLeft = _self.scroller.scrollLeft;\n        _self.scrollLeft = scrollLeft;\n        _self.session.setScrollLeft(scrollLeft);\n    });\n\n    this.cursorPos = {\n        row : 0,\n        column : 0\n    };\n\n    this.$textLayer.addEventListener(\"changeCharacterSize\", function() {\n        _self.characterWidth = textLayer.getCharacterWidth();\n        _self.lineHeight = textLayer.getLineHeight();\n        _self.$updatePrintMargin();\n        _self.onResize(true);\n\n        _self.$loop.schedule(_self.CHANGE_FULL);\n    });\n\n    this.$size = {\n        width: 0,\n        height: 0,\n        scrollerHeight: 0,\n        scrollerWidth: 0\n    };\n\n    this.layerConfig = {\n        width : 1,\n        padding : 0,\n        firstRow : 0,\n        firstRowScreen: 0,\n        lastRow : 0,\n        lineHeight : 1,\n        characterWidth : 1,\n        minHeight : 1,\n        maxHeight : 1,\n        offset : 0,\n        height : 1\n    };\n\n    this.$loop = new RenderLoop(\n        this.$renderChanges.bind(this),\n        this.container.ownerDocument.defaultView\n    );\n    this.$loop.schedule(this.CHANGE_FULL);\n\n    this.setPadding(4);\n    this.$updatePrintMargin();\n};\n\n(function() {\n    this.showGutter = true;\n\n    this.CHANGE_CURSOR = 1;\n    this.CHANGE_MARKER = 2;\n    this.CHANGE_GUTTER = 4;\n    this.CHANGE_SCROLL = 8;\n    this.CHANGE_LINES = 16;\n    this.CHANGE_TEXT = 32;\n    this.CHANGE_SIZE = 64;\n    this.CHANGE_MARKER_BACK = 128;\n    this.CHANGE_MARKER_FRONT = 256;\n    this.CHANGE_FULL = 512;\n    this.CHANGE_H_SCROLL = 1024;\n\n    oop.implement(this, EventEmitter);\n    this.setSession = function(session) {\n        this.session = session;\n        \n        this.scroller.className = \"ace_scroller\";\n        \n        this.$cursorLayer.setSession(session);\n        this.$markerBack.setSession(session);\n        this.$markerFront.setSession(session);\n        this.$gutterLayer.setSession(session);\n        this.$textLayer.setSession(session);\n        this.$loop.schedule(this.CHANGE_FULL);\n        \n    };\n    this.updateLines = function(firstRow, lastRow) {\n        if (lastRow === undefined)\n            lastRow = Infinity;\n\n        if (!this.$changedLines) {\n            this.$changedLines = {\n                firstRow: firstRow,\n                lastRow: lastRow\n            };\n        }\n        else {\n            if (this.$changedLines.firstRow > firstRow)\n                this.$changedLines.firstRow = firstRow;\n\n            if (this.$changedLines.lastRow < lastRow)\n                this.$changedLines.lastRow = lastRow;\n        }\n\n        this.$loop.schedule(this.CHANGE_LINES);\n    };\n\n    this.onChangeTabSize = function() {\n        this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n        this.$textLayer.onChangeTabSize();\n    };\n    this.updateText = function() {\n        this.$loop.schedule(this.CHANGE_TEXT);\n    };\n    this.updateFull = function(force) {\n        if (force){\n            this.$renderChanges(this.CHANGE_FULL, true);\n        }\n        else {\n            this.$loop.schedule(this.CHANGE_FULL);\n        }\n    };\n    this.updateFontSize = function() {\n        this.$textLayer.checkForSizeChanges();\n    };\n    this.onResize = function(force, gutterWidth, width, height) {\n        var changes = this.CHANGE_SIZE;\n        var size = this.$size;\n\n        if (this.resizing > 2)\n            return;\n        else if (this.resizing > 1)\n            this.resizing++;\n        else\n            this.resizing = force ? 1 : 0;\n        \n        if (!height)\n            height = dom.getInnerHeight(this.container);\n        if (force || size.height != height) {\n            size.height = height;\n\n            this.scroller.style.height = height + \"px\";\n            size.scrollerHeight = this.scroller.clientHeight;\n            this.scrollBar.setHeight(size.scrollerHeight);\n\n            if (this.session) {\n                this.session.setScrollTop(this.getScrollTop());\n                changes = changes | this.CHANGE_FULL;\n            }\n        }\n\n        if (!width)\n            width = dom.getInnerWidth(this.container);\n        if (force || this.resizing > 1 || size.width != width) {\n            size.width = width;\n\n            var gutterWidth = this.showGutter ? this.$gutter.offsetWidth : 0;\n            this.scroller.style.left = gutterWidth + \"px\";\n            size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBar.getWidth());\n            this.scroller.style.right = this.scrollBar.getWidth() + \"px\";\n\n            if (this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n                changes = changes | this.CHANGE_FULL;\n        }\n\n        if (force)\n            this.$renderChanges(changes, true);\n        else\n            this.$loop.schedule(changes);\n        \n        if (force)\n            delete this.resizing;\n    };\n    this.adjustWrapLimit = function() {\n        var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n        var limit = Math.floor(availableWidth / this.characterWidth);\n        return this.session.adjustWrapLimit(limit);\n    };\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.$animatedScroll = shouldAnimate;\n    };\n    this.getAnimatedScroll = function() {\n        return this.$animatedScroll;\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        if (this.$textLayer.setShowInvisibles(showInvisibles))\n            this.$loop.schedule(this.CHANGE_TEXT);\n    };\n    this.getShowInvisibles = function() {\n        return this.$textLayer.showInvisibles;\n    };\n\n    this.getDisplayIndentGuides = function() {\n        return this.$textLayer.displayIndentGuides;\n    };\n    \n    this.setDisplayIndentGuides = function(display) {\n        if (this.$textLayer.setDisplayIndentGuides(display))\n            this.$loop.schedule(this.CHANGE_TEXT);\n    };\n    \n    this.$showPrintMargin = true;\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.$showPrintMargin = showPrintMargin;\n        this.$updatePrintMargin();\n    };\n    this.getShowPrintMargin = function() {\n        return this.$showPrintMargin;\n    };\n\n    this.$printMarginColumn = 80;\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.$printMarginColumn = showPrintMargin;\n        this.$updatePrintMargin();\n    };\n    this.getPrintMarginColumn = function() {\n        return this.$printMarginColumn;\n    };\n    this.getShowGutter = function(){\n        return this.showGutter;\n    };\n    this.setShowGutter = function(show){\n        if(this.showGutter === show)\n            return;\n        this.$gutter.style.display = show ? \"block\" : \"none\";\n        this.showGutter = show;\n        this.onResize(true);\n    };\n\n    this.getFadeFoldWidgets = function(){\n        return dom.hasCssClass(this.$gutter, \"ace_fade-fold-widgets\");\n    };\n\n    this.setFadeFoldWidgets = function(show) {\n        if (show)\n            dom.addCssClass(this.$gutter, \"ace_fade-fold-widgets\");\n        else\n            dom.removeCssClass(this.$gutter, \"ace_fade-fold-widgets\");\n    };\n\n    this.$highlightGutterLine = false;\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        if (this.$highlightGutterLine == shouldHighlight)\n            return;\n        this.$highlightGutterLine = shouldHighlight;\n\n        if (!this.$gutterLineHighlight) {\n            this.$gutterLineHighlight = dom.createElement(\"div\");\n            this.$gutterLineHighlight.className = \"ace_gutter_active_line\";\n            this.$gutter.appendChild(this.$gutterLineHighlight);\n            return;\n        }\n\n        this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n        // if cursorlayer have never been updated there's nothing on screen to update\n        if (this.$cursorLayer.$pixelPos)\n            this.$updateGutterLineHighlight();\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.$highlightGutterLine;\n    };\n\n    this.$updateGutterLineHighlight = function() {\n        this.$gutterLineHighlight.style.top = this.$cursorLayer.$pixelPos.top - this.layerConfig.offset + \"px\";\n        this.$gutterLineHighlight.style.height = this.layerConfig.lineHeight + \"px\";\n    };\n    \n    this.$updatePrintMargin = function() {\n        var containerEl;\n\n        if (!this.$showPrintMargin && !this.$printMarginEl)\n            return;\n\n        if (!this.$printMarginEl) {\n            containerEl = dom.createElement(\"div\");\n            containerEl.className = \"ace_print_margin_layer\";\n            this.$printMarginEl = dom.createElement(\"div\");\n            this.$printMarginEl.className = \"ace_print_margin\";\n            containerEl.appendChild(this.$printMarginEl);\n            this.content.insertBefore(containerEl, this.$textLayer.element);\n        }\n\n        var style = this.$printMarginEl.style;\n        style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n        style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n    };\n    this.getContainerElement = function() {\n        return this.container;\n    };\n    this.getMouseEventTarget = function() {\n        return this.content;\n    };\n    this.getTextAreaContainer = function() {\n        return this.container;\n    };\n\n    // move text input over the cursor\n    // this is required for iOS and IME\n    this.$moveTextAreaToCursor = function() {\n        if (!this.$keepTextAreaAtCursor)\n            return;\n\n        var posTop = this.$cursorLayer.$pixelPos.top;\n        var posLeft = this.$cursorLayer.$pixelPos.left;\n        posTop -= this.layerConfig.offset;\n\n        if (posTop < 0 || posTop > this.layerConfig.height - this.lineHeight)\n            return;\n\n        var w = this.characterWidth;\n        if (this.$composition)\n            w += this.textarea.scrollWidth;\n        posLeft -= this.scrollLeft;\n        if (posLeft > this.$size.scrollerWidth - w)\n            posLeft = this.$size.scrollerWidth - w;\n\n        if (this.showGutter)\n            posLeft += this.$gutterLayer.gutterWidth;\n\n        this.textarea.style.height = this.lineHeight + \"px\";\n        this.textarea.style.width = w + \"px\";\n        this.textarea.style.left = posLeft + \"px\";\n        this.textarea.style.top = posTop - 1 + \"px\";\n    };\n    this.getFirstVisibleRow = function() {\n        return this.layerConfig.firstRow;\n    };\n    this.getFirstFullyVisibleRow = function() {\n        return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n    };\n    this.getLastFullyVisibleRow = function() {\n        var flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight);\n        return this.layerConfig.firstRow - 1 + flint;\n    };\n    this.getLastVisibleRow = function() {\n        return this.layerConfig.lastRow;\n    };\n\n    this.$padding = null;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.$textLayer.setPadding(padding);\n        this.$cursorLayer.setPadding(padding);\n        this.$markerFront.setPadding(padding);\n        this.$markerBack.setPadding(padding);\n        this.$loop.schedule(this.CHANGE_FULL);\n        this.$updatePrintMargin();\n    };\n    this.getHScrollBarAlwaysVisible = function() {\n        return this.$horizScrollAlwaysVisible;\n    };\n    this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n        if (this.$horizScrollAlwaysVisible != alwaysVisible) {\n            this.$horizScrollAlwaysVisible = alwaysVisible;\n            if (!this.$horizScrollAlwaysVisible || !this.$horizScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        }\n    };\n\n    this.$updateScrollBar = function() {\n        this.scrollBar.setInnerHeight(this.layerConfig.maxHeight);\n        this.scrollBar.setScrollTop(this.scrollTop);\n    };\n\n    this.$renderChanges = function(changes, force) {\n        if (!force && (!changes || !this.session || !this.container.offsetWidth))\n            return;\n\n        // text, scrolling and resize changes can cause the view port size to change\n        if (changes & this.CHANGE_FULL ||\n            changes & this.CHANGE_SIZE ||\n            changes & this.CHANGE_TEXT ||\n            changes & this.CHANGE_LINES ||\n            changes & this.CHANGE_SCROLL\n        )\n            this.$computeLayerConfig();\n\n        // horizontal scrolling\n        if (changes & this.CHANGE_H_SCROLL) {\n            this.scroller.scrollLeft = this.scrollLeft;\n\n            // read the value after writing it since the value might get clipped\n            var scrollLeft = this.scroller.scrollLeft;\n            this.scrollLeft = scrollLeft;\n            this.session.setScrollLeft(scrollLeft);\n\n            this.scroller.className = this.scrollLeft == 0 ? \"ace_scroller\" : \"ace_scroller horscroll\";\n        }\n\n        // full\n        if (changes & this.CHANGE_FULL) {\n            this.$textLayer.checkForSizeChanges();\n            // update scrollbar first to not lose scroll position when gutter calls resize\n            this.$updateScrollBar();\n            this.$textLayer.update(this.layerConfig);\n            if (this.showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n            this.$markerBack.update(this.layerConfig);\n            this.$markerFront.update(this.layerConfig);\n            this.$cursorLayer.update(this.layerConfig);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            return;\n        }\n\n        // scrolling\n        if (changes & this.CHANGE_SCROLL) {\n            this.$updateScrollBar();\n            if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n                this.$textLayer.update(this.layerConfig);\n            else\n                this.$textLayer.scrollLines(this.layerConfig);\n\n            if (this.showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n            this.$markerBack.update(this.layerConfig);\n            this.$markerFront.update(this.layerConfig);\n            this.$cursorLayer.update(this.layerConfig);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            return;\n        }\n\n        if (changes & this.CHANGE_TEXT) {\n            this.$textLayer.update(this.layerConfig);\n            if (this.showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n        }\n        else if (changes & this.CHANGE_LINES) {\n            if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n        }\n        else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n            if (this.showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n        }\n\n        if (changes & this.CHANGE_CURSOR) {\n            this.$cursorLayer.update(this.layerConfig);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n            this.$markerFront.update(this.layerConfig);\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n            this.$markerBack.update(this.layerConfig);\n        }\n\n        if (changes & this.CHANGE_SIZE)\n            this.$updateScrollBar();\n    };\n\n    this.$computeLayerConfig = function() {\n        var session = this.session;\n\n        var offset = this.scrollTop % this.lineHeight;\n        var minHeight = this.$size.scrollerHeight + this.lineHeight;\n\n        var longestLine = this.$getLongestLine();\n\n        var horizScroll = this.$horizScrollAlwaysVisible || this.$size.scrollerWidth - longestLine < 0;\n        var horizScrollChanged = this.$horizScroll !== horizScroll;\n        this.$horizScroll = horizScroll;\n        if (horizScrollChanged) {\n            this.scroller.style.overflowX = horizScroll ? \"scroll\" : \"hidden\";\n            // when we hide scrollbar scroll event isn't emited\n            // leaving session with wrong scrollLeft value\n            if (!horizScroll)\n                this.session.setScrollLeft(0);\n        }\n        var maxHeight = this.session.getScreenLength() * this.lineHeight;\n        this.session.setScrollTop(Math.max(0, Math.min(this.scrollTop, maxHeight - this.$size.scrollerHeight)));\n\n        var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n        var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n        var lastRow = firstRow + lineCount;\n\n        // Map lines on the screen to lines in the document.\n        var firstRowScreen, firstRowHeight;\n        var lineHeight = this.lineHeight;\n        firstRow = session.screenToDocumentRow(firstRow, 0);\n\n        // Check if firstRow is inside of a foldLine. If true, then use the first\n        // row of the foldLine.\n        var foldLine = session.getFoldLine(firstRow);\n        if (foldLine) {\n            firstRow = foldLine.start.row;\n        }\n\n        firstRowScreen = session.documentToScreenRow(firstRow, 0);\n        firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n        lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n        minHeight = this.$size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n                                                firstRowHeight;\n\n        offset = this.scrollTop - firstRowScreen * lineHeight;\n\n        this.layerConfig = {\n            width : longestLine,\n            padding : this.$padding,\n            firstRow : firstRow,\n            firstRowScreen: firstRowScreen,\n            lastRow : lastRow,\n            lineHeight : lineHeight,\n            characterWidth : this.characterWidth,\n            minHeight : minHeight,\n            maxHeight : maxHeight,\n            offset : offset,\n            height : this.$size.scrollerHeight\n        };\n\n        // For debugging.\n        // console.log(JSON.stringify(this.layerConfig));\n\n        this.$gutterLayer.element.style.marginTop = (-offset) + \"px\";\n        this.content.style.marginTop = (-offset) + \"px\";\n        this.content.style.width = longestLine + 2 * this.$padding + \"px\";\n        this.content.style.height = minHeight + \"px\";\n\n        // Horizontal scrollbar visibility may have changed, which changes\n        // the client height of the scroller\n        if (horizScrollChanged)\n            this.onResize(true);\n    };\n\n    this.$updateLines = function() {\n        var firstRow = this.$changedLines.firstRow;\n        var lastRow = this.$changedLines.lastRow;\n        this.$changedLines = null;\n\n        var layerConfig = this.layerConfig;\n\n        if (firstRow > layerConfig.lastRow + 1) { return; }\n        if (lastRow < layerConfig.firstRow) { return; }\n\n        // if the last row is unknown -> redraw everything\n        if (lastRow === Infinity) {\n            if (this.showGutter)\n                this.$gutterLayer.update(layerConfig);\n            this.$textLayer.update(layerConfig);\n            return;\n        }\n\n        // else update only the changed rows\n        this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n        return true;\n    };\n\n    this.$getLongestLine = function() {\n        var charCount = this.session.getScreenWidth();\n        if (this.$textLayer.showInvisibles)\n            charCount += 1;\n\n        return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n    };\n    this.updateFrontMarkers = function() {\n        this.$markerFront.setMarkers(this.session.getMarkers(true));\n        this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n    };\n    this.updateBackMarkers = function() {\n        this.$markerBack.setMarkers(this.session.getMarkers());\n        this.$loop.schedule(this.CHANGE_MARKER_BACK);\n    };\n    this.addGutterDecoration = function(row, className){\n        this.$gutterLayer.addGutterDecoration(row, className);\n    };\n    this.removeGutterDecoration = function(row, className){\n        this.$gutterLayer.removeGutterDecoration(row, className);\n    };\n    this.updateBreakpoints = function(rows) {\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.setAnnotations = function(annotations) {\n        this.$gutterLayer.setAnnotations(annotations);\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.updateCursor = function() {\n        this.$loop.schedule(this.CHANGE_CURSOR);\n    };\n    this.hideCursor = function() {\n        this.$cursorLayer.hideCursor();\n    };\n    this.showCursor = function() {\n        this.$cursorLayer.showCursor();\n    };\n\n    this.scrollSelectionIntoView = function(anchor, lead, offset) {\n        // first scroll anchor into view then scroll lead into view\n        this.scrollCursorIntoView(anchor, offset);\n        this.scrollCursorIntoView(lead, offset);\n    };\n    this.scrollCursorIntoView = function(cursor, offset) {\n        // the editor is not visible\n        if (this.$size.scrollerHeight === 0)\n            return;\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n        var left = pos.left;\n        var top = pos.top;\n\n        if (this.scrollTop > top) {\n            if (offset)\n                top -= offset * this.$size.scrollerHeight;\n            this.session.setScrollTop(top);\n        } else if (this.scrollTop + this.$size.scrollerHeight < top + this.lineHeight) {\n            if (offset)\n                top += offset * this.$size.scrollerHeight;\n            this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n        }\n\n        var scrollLeft = this.scrollLeft;\n\n        if (scrollLeft > left) {\n            if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n                left = 0;\n            this.session.setScrollLeft(left);\n        } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n            this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n        }\n    };\n    this.getScrollTop = function() {\n        return this.session.getScrollTop();\n    };\n    this.getScrollLeft = function() {\n        return this.session.getScrollLeft();\n    };\n    this.getScrollTopRow = function() {\n        return this.scrollTop / this.lineHeight;\n    };\n    this.getScrollBottomRow = function() {\n        return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n    };\n    this.scrollToRow = function(row) {\n        this.session.setScrollTop(row * this.lineHeight);\n    };\n\n    this.alignCursor = function(cursor, alignment) {\n        if (typeof cursor == \"number\")\n            cursor = {row: cursor, column: 0};\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n        var h = this.$size.scrollerHeight - this.lineHeight;\n        var offset = pos.top - h * (alignment || 0);\n\n        this.session.setScrollTop(offset);\n        return offset;\n    };\n\n    this.STEPS = 8;\n    this.$calcSteps = function(fromValue, toValue){\n        var i = 0;\n        var l = this.STEPS;\n        var steps = [];\n\n        var func  = function(t, x_min, dx) {\n            return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n        };\n\n        for (i = 0; i < l; ++i)\n            steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n        return steps;\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n        var offset = pos.top;\n        if (center)\n            offset -= this.$size.scrollerHeight / 2;\n\n        var initialScroll = this.scrollTop;\n        this.session.setScrollTop(offset);\n        if (animate !== false)\n            this.animateScrolling(initialScroll, callback);\n    };\n\n    this.animateScrolling = function(fromValue, callback) {\n        var toValue = this.scrollTop;\n        if (this.$animatedScroll && Math.abs(fromValue - toValue) < 100000) {\n            var _self = this;\n            var steps = _self.$calcSteps(fromValue, toValue);\n            this.$inScrollAnimation = true;\n\n            clearInterval(this.$timer);\n\n            _self.session.setScrollTop(steps.shift());\n            this.$timer = setInterval(function() {\n                if (steps.length) {\n                    _self.session.setScrollTop(steps.shift());\n                    // trick session to think it's already scrolled to not loose toValue\n                    _self.session.$scrollTop = toValue;\n                } else if (toValue != null) {\n                    _self.session.$scrollTop = -1;\n                    _self.session.setScrollTop(toValue);\n                    toValue = null;\n                } else {\n                    // do this on separate step to not get spurious scroll event from scrollbar\n                    _self.$timer = clearInterval(_self.$timer);\n                    _self.$inScrollAnimation = false;\n                    callback && callback();\n                }\n            }, 10);\n        }\n    };\n    this.scrollToY = function(scrollTop) {\n        // after calling scrollBar.setScrollTop\n        // scrollbar sends us event with same scrollTop. ignore it\n        if (this.scrollTop !== scrollTop) {\n            this.$loop.schedule(this.CHANGE_SCROLL);\n            this.scrollTop = scrollTop;\n        }\n    };\n    this.scrollToX = function(scrollLeft) {\n        if (scrollLeft < 0)\n            scrollLeft = 0;\n\n        if (this.scrollLeft !== scrollLeft)\n            this.scrollLeft = scrollLeft;\n        this.$loop.schedule(this.CHANGE_H_SCROLL);\n    };\n    this.scrollBy = function(deltaX, deltaY) {\n        deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n        deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n    };\n    this.isScrollableBy = function(deltaX, deltaY) {\n        if (deltaY < 0 && this.session.getScrollTop() > 0)\n           return true;\n        if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight < this.layerConfig.maxHeight)\n           return true;\n        // todo: handle horizontal scrolling\n    };\n\n    this.pixelToScreenCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;\n        var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n        var col = Math.round(offset);\n\n        return {row: row, column: col, side: offset - col > 0 ? 1 : -1};\n    };\n\n    this.screenToTextCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var col = Math.round(\n            (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth\n        );\n        var row = Math.floor(\n            (y + this.scrollTop - canvasPos.top) / this.lineHeight\n        );\n\n        return this.session.screenToDocumentPosition(row, Math.max(col, 0));\n    };\n    this.textToScreenCoordinates = function(row, column) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n        var pos = this.session.documentToScreenPosition(row, column);\n\n        var x = this.$padding + Math.round(pos.column * this.characterWidth);\n        var y = pos.row * this.lineHeight;\n\n        return {\n            pageX: canvasPos.left + x - this.scrollLeft,\n            pageY: canvasPos.top + y - this.scrollTop\n        };\n    };\n    this.visualizeFocus = function() {\n        dom.addCssClass(this.container, \"ace_focus\");\n    };\n    this.visualizeBlur = function() {\n        dom.removeCssClass(this.container, \"ace_focus\");\n    };\n    this.showComposition = function(position) {\n        if (!this.$composition)\n            this.$composition = {\n                keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n                cssText: this.textarea.style.cssText\n            };\n\n        this.$keepTextAreaAtCursor = true;\n        dom.addCssClass(this.textarea, \"ace_composition\");\n        this.textarea.style.cssText = \"\";\n        this.$moveTextAreaToCursor();\n    };\n    this.setCompositionText = function(text) {\n        this.$moveTextAreaToCursor();\n    };\n    this.hideComposition = function() {\n        if (!this.$composition)\n            return;\n\n        dom.removeCssClass(this.textarea, \"ace_composition\");\n        this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n        this.textarea.style.cssText = this.$composition.cssText;\n        this.$composition = null;\n    };\n\n    this._loadTheme = function(name, callback) {\n        if (!config.get(\"packaged\"))\n            return callback();\n\n        net.loadScript(config.moduleUrl(name, \"theme\"), callback);\n    };\n    this.setTheme = function(theme) {\n        var _self = this;\n\n        this.$themeValue = theme;\n        if (!theme || typeof theme == \"string\") {\n            var moduleName = theme || \"ace/theme/textmate\";\n\n            var module;\n            try {\n                module = require(moduleName);\n            } catch (e) {};\n            if (module)\n                return afterLoad(module);\n\n            _self._loadTheme(moduleName, function() {\n                require([moduleName], function(module) {\n                    if (_self.$themeValue !== theme)\n                        return;\n\n                    afterLoad(module);\n                });\n            });\n        } else {\n            afterLoad(theme);\n        }\n\n        function afterLoad(theme) {\n            dom.importCssString(\n                theme.cssText,\n                theme.cssClass,\n                _self.container.ownerDocument\n            );\n\n            if (_self.$theme)\n                dom.removeCssClass(_self.container, _self.$theme);\n\n            _self.$theme = theme ? theme.cssClass : null;\n\n            if (_self.$theme)\n                dom.addCssClass(_self.container, _self.$theme);\n\n            if (theme && theme.isDark)\n                dom.addCssClass(_self.container, \"ace_dark\");\n            else\n                dom.removeCssClass(_self.container, \"ace_dark\");\n\n            // force re-measure of the gutter width\n            if (_self.$size) {\n                _self.$size.width = 0;\n                _self.onResize();\n            }\n        }\n    };\n    this.getTheme = function() {\n        return this.$themeValue;\n    };\n\n    // Methods allows to add / remove CSS classnames to the editor element.\n    // This feature can be used by plug-ins to provide a visual indication of\n    // a certain mode that editor is in.\n\n    /**\n    * VirtualRenderer.setStyle(style)\n    * - style (String): A class name\n    *\n    * [Adds a new class, `style`, to the editor.]{: #VirtualRenderer.setStyle}\n    **/\n    this.setStyle = function setStyle(style) {\n      dom.addCssClass(this.container, style);\n    };\n    this.unsetStyle = function unsetStyle(style) {\n      dom.removeCssClass(this.container, style);\n    };\n    this.destroy = function() {\n        this.$textLayer.destroy();\n        this.$cursorLayer.destroy();\n    };\n\n}).call(VirtualRenderer.prototype);\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\ndefine('ace/layer/gutter', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Gutter = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_gutter-layer\";\n    parentEl.appendChild(this.element);\n    this.setShowFoldWidgets(this.$showFoldWidgets);\n    \n    this.gutterWidth = 0;\n\n    this.$annotations = [];\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    \n    this.setSession = function(session) {\n        this.session = session;\n    };\n\n    this.addGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n        this.session.addGutterDecoration(row, className);\n    };\n\n    this.removeGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n        this.session.removeGutterDecoration(row, className);\n    };\n\n    this.setAnnotations = function(annotations) {\n        // iterate over sparse array\n        this.$annotations = [];\n        for (var row in annotations) if (annotations.hasOwnProperty(row)) {\n            var rowAnnotations = annotations[row];\n            if (!rowAnnotations)\n                continue;\n\n            var rowInfo = this.$annotations[row] = {\n                text: []\n            };\n            for (var i=0; i<rowAnnotations.length; i++) {\n                var annotation = rowAnnotations[i];\n                var annoText = annotation.text.replace(/\"/g, \"&quot;\").replace(/'/g, \"&#8217;\").replace(/</, \"&lt;\");\n                if (rowInfo.text.indexOf(annoText) === -1)\n                    rowInfo.text.push(annoText);\n                var type = annotation.type;\n                if (type == \"error\")\n                    rowInfo.className = \" ace_error\";\n                else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n                    rowInfo.className = \" ace_warning\";\n                else if (type == \"info\" && (!rowInfo.className))\n                    rowInfo.className = \" ace_info\";\n            }\n        }\n    };\n\n    this.update = function(config) {\n        var emptyAnno = {className: \"\"};\n        var html = [];\n        var i = config.firstRow;\n        var lastRow = config.lastRow;\n        var fold = this.session.getNextFoldLine(i);\n        var foldStart = fold ? fold.start.row : Infinity;\n        var foldWidgets = this.$showFoldWidgets && this.session.foldWidgets;\n        var breakpoints = this.session.$breakpoints;\n        var decorations = this.session.$decorations;\n        var lastLineNumber = 0;\n\n        while (true) {\n            if(i > foldStart) {\n                i = fold.end.row + 1;\n                fold = this.session.getNextFoldLine(i, fold);\n                foldStart = fold ?fold.start.row :Infinity;\n            }\n            if(i > lastRow)\n                break;\n\n            var annotation = this.$annotations[i] || emptyAnno;\n            html.push(\n                \"<div class='ace_gutter-cell \",\n                breakpoints[i] || \"\", decorations[i] || \"\", annotation.className,\n                \"' style='height:\", this.session.getRowLength(i) * config.lineHeight, \"px;'>\", \n                lastLineNumber = i + 1\n            );\n\n            if (foldWidgets) {\n                var c = foldWidgets[i];\n                // check if cached value is invalidated and we need to recompute\n                if (c == null)\n                    c = foldWidgets[i] = this.session.getFoldWidget(i);\n                if (c)\n                    html.push(\n                        \"<span class='ace_fold-widget \", c,\n                        c == \"start\" && i == foldStart && i < fold.end.row ? \" closed\" : \" open\",\n                        \"' style='height:\", config.lineHeight, \"px\",\n                        \"'></span>\"\n                    );\n            }\n\n            html.push(\"</div>\");\n\n            i++;\n        }\n\n        this.element = dom.setInnerHtml(this.element, html.join(\"\"));\n        this.element.style.height = config.minHeight + \"px\";\n        \n        if (this.session.$useWrapMode)\n            lastLineNumber = this.session.getLength();\n        \n        var gutterWidth = (\"\" + lastLineNumber).length * config.characterWidth;\n        var padding = this.$padding || this.$computePadding();\n        gutterWidth += padding.left + padding.right;\n        if (gutterWidth !== this.gutterWidth) {\n            this.gutterWidth = gutterWidth;\n            this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n            this._emit(\"changeGutterWidth\", gutterWidth);\n        }\n    };\n\n    this.$showFoldWidgets = true;\n    this.setShowFoldWidgets = function(show) {\n        if (show)\n            dom.addCssClass(this.element, \"ace_folding-enabled\");\n        else\n            dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n        this.$showFoldWidgets = show;\n        this.$padding = null;\n    };\n    \n    this.getShowFoldWidgets = function() {\n        return this.$showFoldWidgets;\n    };\n\n    this.$computePadding = function() {\n        if (!this.element.firstChild)\n            return {left: 0, right: 0};\n        var style = dom.computedStyle(this.element.firstChild);\n        this.$padding = {}\n        this.$padding.left = parseInt(style.paddingLeft) + 1;\n        this.$padding.right = parseInt(style.paddingRight);  \n        return this.$padding;\n    };\n\n    this.getRegion = function(point) {\n        var padding = this.$padding || this.$computePadding();\n        var rect = this.element.getBoundingClientRect();\n        if (point.x < padding.left + rect.left)\n            return \"markers\";\n        if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n            return \"foldWidgets\";\n    };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\ndefine('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar dom = require(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_marker-layer\";\n    parentEl.appendChild(this.element);\n};\n\n(function() {\n\n    this.$padding = 0;\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n    this.setSession = function(session) {\n        this.session = session;\n    };\n    \n    this.setMarkers = function(markers) {\n        this.markers = markers;\n    };\n\n    this.update = function(config) {\n        var config = config || this.config;\n        if (!config)\n            return;\n\n        this.config = config;\n\n\n        var html = [];\n        for (var key in this.markers) {\n            var marker = this.markers[key];\n\n            if (!marker.range) {\n                marker.update(html, this, this.session, config);\n                continue;\n            }\n\n            var range = marker.range.clipRows(config.firstRow, config.lastRow);\n            if (range.isEmpty()) continue;\n\n            range = range.toScreenRange(this.session);\n            if (marker.renderer) {\n                var top = this.$getTop(range.start.row, config);\n                var left = Math.round(\n                    this.$padding + range.start.column * config.characterWidth\n                );\n                marker.renderer(html, range, left, top, config);\n            }\n            else if (range.isMultiLine()) {\n                if (marker.type == \"text\") {\n                    this.drawTextMarker(html, range, marker.clazz, config);\n                } else {\n                    this.drawMultiLineMarker(\n                        html, range, marker.clazz, config,\n                        marker.type\n                    );\n                }\n            }\n            else {\n                this.drawSingleLineMarker(\n                    html, range, marker.clazz + \" start\", config,\n                    null, marker.type\n                );\n            }\n        }\n        this.element = dom.setInnerHtml(this.element, html.join(\"\"));\n    };\n\n    this.$getTop = function(row, layerConfig) {\n        return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n    };\n\n    // Draws a marker, which spans a range of text on multiple lines \n    this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig) {\n        // selection start\n        var row = range.start.row;\n\n        var lineRange = new Range(\n            row, range.start.column,\n            row, this.session.getScreenLastRowColumn(row)\n        );\n        this.drawSingleLineMarker(stringBuilder, lineRange, clazz + \" start\", layerConfig, 1, \"text\");\n\n        // selection end\n        row = range.end.row;\n        lineRange = new Range(row, 0, row, range.end.column);\n        this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, \"text\");\n\n        for (row = range.start.row + 1; row < range.end.row; row++) {\n            lineRange.start.row = row;\n            lineRange.end.row = row;\n            lineRange.end.column = this.session.getScreenLastRowColumn(row);\n            this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, \"text\");\n        }\n    };\n\n    // Draws a multi line marker, where lines span the full width\n    this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, type) {\n        var padding = type === \"background\" ? 0 : this.$padding;\n        // from selection start to the end of the line\n        var height = config.lineHeight;\n        var top = this.$getTop(range.start.row, config);\n        var left = Math.round(padding + range.start.column * config.characterWidth);\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \" start' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;'></div>\"\n        );\n\n        // from start of the last line to the selection end\n        top = this.$getTop(range.end.row, config);\n        var width = Math.round(range.end.column * config.characterWidth);\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;'></div>\"\n        );\n\n        // all the complete lines\n        height = (range.end.row - range.start.row - 1) * config.lineHeight;\n        if (height < 0)\n            return;\n        top = this.$getTop(range.start.row + 1, config);\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;'></div>\"\n        );\n    };\n\n    // Draws a marker which covers part or whole width of a single screen line\n    this.drawSingleLineMarker = function(stringBuilder, range, clazz, layerConfig, extraLength, type) {\n        var padding = type === \"background\" ? 0 : this.$padding;\n        var height = layerConfig.lineHeight;\n\n        if (type === \"background\")\n            var width = layerConfig.width;\n        else\n            width = Math.round((range.end.column + (extraLength || 0) - range.start.column) * layerConfig.characterWidth);\n\n        var top = this.$getTop(range.start.row, layerConfig);\n        var left = Math.round(\n            padding + range.start.column * layerConfig.characterWidth\n        );\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left,\"px;'></div>\"\n        );\n    };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\ndefine('ace/layer/text', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_text-layer\";\n    parentEl.appendChild(this.element);\n\n    this.$characterSize = this.$measureSizes() || {width: 0, height: 0};\n    this.$pollSizeChanges();\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.EOF_CHAR = \"\\xB6\"; //\"&para;\";\n    this.EOL_CHAR = \"\\xAC\"; //\"&not;\";\n    this.TAB_CHAR = \"\\u2192\"; //\"&rarr;\" \"\\u21E5\";\n    this.SPACE_CHAR = \"\\xB7\"; //\"&middot;\";\n    this.$padding = 0;\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.element.style.padding = \"0 \" + padding + \"px\";\n    };\n\n    this.getLineHeight = function() {\n        return this.$characterSize.height || 1;\n    };\n\n    this.getCharacterWidth = function() {\n        return this.$characterSize.width || 1;\n    };\n\n    this.checkForSizeChanges = function() {\n        var size = this.$measureSizes();\n        if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n            this.$characterSize = size;\n            this._emit(\"changeCharacterSize\", {data: size});\n        }\n    };\n\n    this.$pollSizeChanges = function() {\n        var self = this;\n        this.$pollSizeChangesTimer = setInterval(function() {\n            self.checkForSizeChanges();\n        }, 500);\n    };\n\n    this.$fontStyles = {\n        fontFamily : 1,\n        fontSize : 1,\n        fontWeight : 1,\n        fontStyle : 1,\n        lineHeight : 1\n    };\n\n    this.$measureSizes = useragent.isIE || useragent.isOldGecko ? function() {\n        var n = 1000;\n        if (!this.$measureNode) {\n            var measureNode = this.$measureNode = dom.createElement(\"div\");\n            var style = measureNode.style;\n\n            style.width = style.height = \"auto\";\n            style.left = style.top = (-n * 40)  + \"px\";\n\n            style.visibility = \"hidden\";\n            style.position = \"fixed\";\n            style.overflow = \"visible\";\n            style.whiteSpace = \"nowrap\";\n\n            // in FF 3.6 monospace fonts can have a fixed sub pixel width.\n            // that's why we have to measure many characters\n            // Note: characterWidth can be a float!\n            measureNode.innerHTML = lang.stringRepeat(\"Xy\", n);\n\n            if (this.element.ownerDocument.body) {\n                this.element.ownerDocument.body.appendChild(measureNode);\n            } else {\n                var container = this.element.parentNode;\n                while (!dom.hasCssClass(container, \"ace_editor\"))\n                    container = container.parentNode;\n                container.appendChild(measureNode);\n            }\n        }\n\n        // Size and width can be null if the editor is not visible or\n        // detached from the document\n        if (!this.element.offsetWidth)\n            return null;\n\n        var style = this.$measureNode.style;\n        var computedStyle = dom.computedStyle(this.element);\n        for (var prop in this.$fontStyles)\n            style[prop] = computedStyle[prop];\n\n        var size = {\n            height: this.$measureNode.offsetHeight,\n            width: this.$measureNode.offsetWidth / (n * 2)\n        };\n\n        // Size and width can be null if the editor is not visible or\n        // detached from the document\n        if (size.width == 0 || size.height == 0)\n            return null;\n\n        return size;\n    }\n    : function() {\n        if (!this.$measureNode) {\n            var measureNode = this.$measureNode = dom.createElement(\"div\");\n            var style = measureNode.style;\n\n            style.width = style.height = \"auto\";\n            style.left = style.top = -100 + \"px\";\n\n            style.visibility = \"hidden\";\n            style.position = \"fixed\";\n            style.overflow = \"visible\";\n            style.whiteSpace = \"nowrap\";\n\n            measureNode.innerHTML = \"X\";\n\n            var container = this.element.parentNode;\n            while (container && !dom.hasCssClass(container, \"ace_editor\"))\n                container = container.parentNode;\n\n            if (!container)\n                return this.$measureNode = null;\n\n            container.appendChild(measureNode);\n        }\n\n        var rect = this.$measureNode.getBoundingClientRect();\n\n        var size = {\n            height: rect.height,\n            width: rect.width\n        };\n\n        // Size and width can be null if the editor is not visible or\n        // detached from the document\n        if (size.width == 0 || size.height == 0)\n            return null;\n\n        return size;\n    };\n\n    this.setSession = function(session) {\n        this.session = session;\n        this.$computeTabString();\n    };\n\n    this.showInvisibles = false;\n    this.setShowInvisibles = function(showInvisibles) {\n        if (this.showInvisibles == showInvisibles)\n            return false;\n\n        this.showInvisibles = showInvisibles;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.displayIndentGuides = true;\n    this.setDisplayIndentGuides = function(display) {\n        if (this.displayIndentGuides == display)\n            return false;\n\n        this.displayIndentGuides = display;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.$tabStrings = [];\n    this.onChangeTabSize =\n    this.$computeTabString = function() {\n        var tabSize = this.session.getTabSize();\n        this.tabSize = tabSize;\n        var tabStr = this.$tabStrings = [0];\n        for (var i = 1; i < tabSize + 1; i++) {\n            if (this.showInvisibles) {\n                tabStr.push(\"<span class='ace_invisible'>\"\n                    + this.TAB_CHAR\n                    + Array(i).join(\"&#160;\")\n                    + \"</span>\");\n            } else {\n                tabStr.push(new Array(i+1).join(\"&#160;\"));\n            }\n        }\n        if (this.displayIndentGuides) {\n            this.$indentGuideRe =  /\\s\\S| \\t|\\t |\\s$/;\n            var className = \"ace_indent-guide\";\n            var content = Array(this.tabSize + 1).join(\"&#160;\");\n            var tabContent = content;\n            if (this.showInvisibles) {\n                className += \" ace_invisible\";\n                tabContent = this.TAB_CHAR + content.substr(6);\n            }\n\n            this.$tabStrings[\" \"] = \"<span class='\" + className + \"'>\" + content + \"</span>\";\n            this.$tabStrings[\"\\t\"] = \"<span class='\" + className + \"'>\" + tabContent + \"</span>\";\n        }\n    };\n\n    this.updateLines = function(config, firstRow, lastRow) {\n        // Due to wrap line changes there can be new lines if e.g.\n        // the line to updated wrapped in the meantime.\n        if (this.config.lastRow != config.lastRow ||\n            this.config.firstRow != config.firstRow) {\n            this.scrollLines(config);\n        }\n        this.config = config;\n\n        var first = Math.max(firstRow, config.firstRow);\n        var last = Math.min(lastRow, config.lastRow);\n\n        var lineElements = this.element.childNodes;\n        var lineElementsIdx = 0;\n\n        for (var row = config.firstRow; row < first; row++) {\n            var foldLine = this.session.getFoldLine(row);\n            if (foldLine) {\n                if (foldLine.containsRow(first)) {\n                    first = foldLine.start.row;\n                    break;\n                } else {\n                    row = foldLine.end.row;\n                }\n            }\n            lineElementsIdx ++;\n        }\n\n        var row = first;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > last)\n                break;\n\n            var lineElement = lineElements[lineElementsIdx++];\n            if (lineElement) {\n                var html = [];\n                this.$renderLine(\n                    html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n                );\n                dom.setInnerHtml(lineElement, html.join(\"\"));\n            }\n            row++;\n        }\n    };\n\n    this.scrollLines = function(config) {\n        var oldConfig = this.config;\n        this.config = config;\n\n        if (!oldConfig || oldConfig.lastRow < config.firstRow)\n            return this.update(config);\n\n        if (config.lastRow < oldConfig.firstRow)\n            return this.update(config);\n\n        var el = this.element;\n        if (oldConfig.firstRow < config.firstRow)\n            for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n                el.removeChild(el.firstChild);\n\n        if (oldConfig.lastRow > config.lastRow)\n            for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n                el.removeChild(el.lastChild);\n\n        if (config.firstRow < oldConfig.firstRow) {\n            var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n            if (el.firstChild)\n                el.insertBefore(fragment, el.firstChild);\n            else\n                el.appendChild(fragment);\n        }\n\n        if (config.lastRow > oldConfig.lastRow) {\n            var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n            el.appendChild(fragment);\n        }\n    };\n\n    this.$renderLinesFragment = function(config, firstRow, lastRow) {\n        var fragment = this.element.ownerDocument.createDocumentFragment();\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row : Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            var container = dom.createElement(\"div\");\n\n            var html = [];\n            // Get the tokens per line as there might be some lines in between\n            // beeing folded.\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n            // don't use setInnerHtml since we are working with an empty DIV\n            container.innerHTML = html.join(\"\");\n            if (this.$useLineGroups()) {\n                container.className = 'ace_line_group';\n                fragment.appendChild(container);\n            } else {\n                var lines = container.childNodes\n                while(lines.length)\n                    fragment.appendChild(lines[0]);\n            }\n\n            row++;\n        }\n        return fragment;\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var html = [];\n        var firstRow = config.firstRow, lastRow = config.lastRow;\n\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            if (this.$useLineGroups())\n                html.push(\"<div class='ace_line_group'>\")\n\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n            if (this.$useLineGroups())\n                html.push(\"</div>\"); // end the line group\n\n            row++;\n        }\n        this.element = dom.setInnerHtml(this.element, html.join(\"\"));\n    };\n\n    this.$textToken = {\n        \"text\": true,\n        \"rparen\": true,\n        \"lparen\": true\n    };\n\n    this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n        var self = this;\n        var replaceReg = /\\t|&|<|( +)|([\\x00-\\x1f\\x80-\\xa0\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]/g;\n        var replaceFunc = function(c, a, b, tabIdx, idx4) {\n            if (a) {\n                return new Array(c.length+1).join(\"&#160;\");\n            } else if (c == \"&\") {\n                return \"&#38;\";\n            } else if (c == \"<\") {\n                return \"&#60;\";\n            } else if (c == \"\\t\") {\n                var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n                screenColumn += tabSize - 1;\n                return self.$tabStrings[tabSize];\n            } else if (c == \"\\u3000\") {\n                // U+3000 is both invisible AND full-width, so must be handled uniquely\n                var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible\" : \"ace_cjk\";\n                var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n                screenColumn += 1;\n                return \"<span class='\" + classToUse + \"' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + space + \"</span>\";\n            } else if (b) {\n                return \"<span class='ace_invisible ace_invalid'>\" + self.SPACE_CHAR + \"</span>\";\n            } else {\n                screenColumn += 1;\n                return \"<span class='ace_cjk' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + c + \"</span>\";\n            }\n        };\n\n        var output = value.replace(replaceReg, replaceFunc);\n\n        if (!this.$textToken[token.type]) {\n            var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n            var style = \"\";\n            if (token.type == \"fold\")\n                style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n            stringBuilder.push(\"<span class='\", classes, \"'\", style, \">\", output, \"</span>\");\n        }\n        else {\n            stringBuilder.push(output);\n        }\n        return screenColumn + value.length;\n    };\n\n    this.renderIndentGuide = function(stringBuilder, value) {\n        var cols = value.search(this.$indentGuideRe);\n        if (cols <= 0)\n            return value;\n        if (value[0] == \" \") {\n            cols -= cols % this.tabSize;\n            stringBuilder.push(Array(cols/this.tabSize + 1).join(this.$tabStrings[\" \"]));\n            return value.substr(cols);\n        } else if (value[0] == \"\\t\") {\n            stringBuilder.push(Array(cols + 1).join(this.$tabStrings[\"\\t\"]));\n            return value.substr(cols);\n        }\n        return value;\n    };\n\n    this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n        var chars = 0;\n        var split = 0;\n        var splitChars = splits[0];\n        var screenColumn = 0;\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            var value = token.value;\n            if (i == 0 && this.displayIndentGuides) {\n                chars = value.length;\n                value = this.renderIndentGuide(stringBuilder, value);\n                if (!value)\n                    continue;\n                chars -= value.length;\n            }\n\n            if (chars + value.length < splitChars) {\n                screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n                chars += value.length;\n            } else {\n                while (chars + value.length >= splitChars) {\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn,\n                        token, value.substring(0, splitChars - chars)\n                    );\n                    value = value.substring(splitChars - chars);\n                    chars = splitChars;\n\n                    if (!onlyContents) {\n                        stringBuilder.push(\"</div>\",\n                            \"<div class='ace_line' style='height:\",\n                            this.config.lineHeight, \"px'>\"\n                        );\n                    }\n\n                    split ++;\n                    screenColumn = 0;\n                    splitChars = splits[split] || Number.MAX_VALUE;\n                }\n                if (value.length != 0) {\n                    chars += value.length;\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn, token, value\n                    );\n                }\n            }\n        }\n    };\n\n    this.$renderSimpleLine = function(stringBuilder, tokens) {\n        var screenColumn = 0;\n        var token = tokens[0];\n        var value = token.value;\n        if (this.displayIndentGuides)\n            value = this.renderIndentGuide(stringBuilder, value);\n        if (value)\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        for (var i = 1; i < tokens.length; i++) {\n            token = tokens[i];\n            value = token.value;\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        }\n    };\n\n    // row is either first row of foldline or not in fold\n    this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n        if (!foldLine && foldLine != false)\n            foldLine = this.session.getFoldLine(row);\n\n        if (foldLine)\n            var tokens = this.$getFoldLineTokens(row, foldLine);\n        else\n            var tokens = this.session.getTokens(row);\n\n\n        if (!onlyContents) {\n            stringBuilder.push(\n                \"<div class='ace_line' style='height:\", this.config.lineHeight, \"px'>\"\n            );\n        }\n\n        if (tokens.length) {\n            var splits = this.session.getRowSplitData(row);\n            if (splits && splits.length)\n                this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n            else\n                this.$renderSimpleLine(stringBuilder, tokens);\n        }\n\n        if (this.showInvisibles) {\n            if (foldLine)\n                row = foldLine.end.row\n\n            stringBuilder.push(\n                \"<span class='ace_invisible'>\",\n                row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n                \"</span>\"\n            );\n        }\n        if (!onlyContents)\n            stringBuilder.push(\"</div>\");\n    };\n\n    this.$getFoldLineTokens = function(row, foldLine) {\n        var session = this.session;\n        var renderTokens = [];\n\n        function addTokens(tokens, from, to) {\n            var idx = 0, col = 0;\n            while ((col + tokens[idx].value.length) < from) {\n                col += tokens[idx].value.length;\n                idx++;\n\n                if (idx == tokens.length)\n                    return;\n            }\n            if (col != from) {\n                var value = tokens[idx].value.substring(from - col);\n                // Check if the token value is longer then the from...to spacing.\n                if (value.length > (to - from))\n                    value = value.substring(0, to - from);\n\n                renderTokens.push({\n                    type: tokens[idx].type,\n                    value: value\n                });\n\n                col = from + value.length;\n                idx += 1;\n            }\n\n            while (col < to && idx < tokens.length) {\n                var value = tokens[idx].value;\n                if (value.length + col > to) {\n                    renderTokens.push({\n                        type: tokens[idx].type,\n                        value: value.substring(0, to - col)\n                    });\n                } else\n                    renderTokens.push(tokens[idx]);\n                col += value.length;\n                idx += 1;\n            }\n        }\n\n        var tokens = session.getTokens(row);\n        foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n            if (placeholder) {\n                renderTokens.push({\n                    type: \"fold\",\n                    value: placeholder\n                });\n            } else {\n                if (isNewRow)\n                    tokens = session.getTokens(row);\n\n                if (tokens.length)\n                    addTokens(tokens, lastColumn, column);\n            }\n        }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n        return renderTokens;\n    };\n\n    this.$useLineGroups = function() {\n        // For the updateLines function to work correctly, it's important that the\n        // child nodes of this.element correspond on a 1-to-1 basis to rows in the\n        // document (as distinct from lines on the screen). For sessions that are\n        // wrapped, this means we need to add a layer to the node hierarchy (tagged\n        // with the class name ace_line_group).\n        return this.session.getUseWrapMode();\n    };\n\n    this.destroy = function() {\n        clearInterval(this.$pollSizeChangesTimer);\n        if (this.$measureNode)\n            this.$measureNode.parentNode.removeChild(this.$measureNode);\n        delete this.$measureNode;\n    };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\ndefine('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\n\nvar Cursor = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_cursor-layer\";\n    parentEl.appendChild(this.element);\n\n    this.isVisible = false;\n    this.isBlinking = true;\n\n    this.cursors = [];\n    this.cursor = this.addCursor();\n};\n\n(function() {\n\n    this.$padding = 0;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n\n    this.setSession = function(session) {\n        this.session = session;\n    };\n\n    this.setBlinking = function(blinking) {\n        this.isBlinking = blinking;\n        if (blinking)\n            this.restartTimer();\n    };\n\n    this.addCursor = function() {\n        var el = dom.createElement(\"div\");\n        var className = \"ace_cursor\";\n        if (!this.isVisible)\n            className += \" ace_hidden\";\n        if (this.overwrite)\n            className += \" ace_overwrite\";\n\n        el.className = className;\n        this.element.appendChild(el);\n        this.cursors.push(el);\n        return el;\n    };\n\n    this.removeCursor = function() {\n        if (this.cursors.length > 1) {\n            var el = this.cursors.pop();\n            el.parentNode.removeChild(el);\n            return el;\n        }\n    };\n\n    this.hideCursor = function() {\n        this.isVisible = false;\n        for (var i = this.cursors.length; i--; )\n            dom.addCssClass(this.cursors[i], \"ace_hidden\");\n        clearInterval(this.blinkId);\n    };\n\n    this.showCursor = function() {\n        this.isVisible = true;\n        for (var i = this.cursors.length; i--; )\n            dom.removeCssClass(this.cursors[i], \"ace_hidden\");\n\n        this.element.style.visibility = \"\";\n        this.restartTimer();\n    };\n\n    this.restartTimer = function() {\n        clearInterval(this.blinkId);\n        if (!this.isBlinking)\n            return;\n        if (!this.isVisible)\n            return;\n\n        var element = this.cursors.length == 1 ? this.cursor : this.element;\n        this.blinkId = setInterval(function() {\n            element.style.visibility = \"hidden\";\n            setTimeout(function() {\n                element.style.visibility = \"\";\n            }, 400);\n        }, 1000);\n    };\n\n    this.getPixelPosition = function(position, onScreen) {\n        if (!this.config || !this.session) {\n            return {\n                left : 0,\n                top : 0\n            };\n        }\n\n        if (!position)\n            position = this.session.selection.getCursor();\n        var pos = this.session.documentToScreenPosition(position);\n        var cursorLeft = Math.round(this.$padding +\n                                    pos.column * this.config.characterWidth);\n        var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n            this.config.lineHeight;\n\n        return {\n            left : cursorLeft,\n            top : cursorTop\n        };\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        if (this.session.selectionMarkerCount > 0) {\n            var selections = this.session.$selectionMarkers;\n            var i = 0, sel, cursorIndex = 0;\n\n            for (var i = selections.length; i--; ) {\n                sel = selections[i];\n                var pixelPos = this.getPixelPosition(sel.cursor, true);\n                if ((pixelPos.top > config.height + config.offset || \n                     pixelPos.top < -config.offset) && i > 1) {\n                    continue;\n                }\n\n                var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n\n                style.left = pixelPos.left + \"px\";\n                style.top = pixelPos.top + \"px\";\n                style.width = config.characterWidth + \"px\";\n                style.height = config.lineHeight + \"px\";\n            }\n            if (cursorIndex > 1)\n                while (this.cursors.length > cursorIndex)\n                    this.removeCursor();\n        } else {\n            var pixelPos = this.getPixelPosition(null, true);\n            var style = this.cursor.style;\n            style.left = pixelPos.left + \"px\";\n            style.top = pixelPos.top + \"px\";\n            style.width = config.characterWidth + \"px\";\n            style.height = config.lineHeight + \"px\";\n\n            while (this.cursors.length > 1)\n                this.removeCursor();\n        }\n\n        var overwrite = this.session.getOverwrite();\n        if (overwrite != this.overwrite)\n            this.$setOverite(overwrite);\n\n        // cache for textarea and gutter highlight\n        this.$pixelPos = pixelPos;\n\n        this.restartTimer();\n    };\n\n    this.$setOverite = function(overwrite) {\n        this.overwrite = overwrite;\n        for (var i = this.cursors.length; i--; ) {\n            if (overwrite)\n                dom.addCssClass(this.cursors[i], \"ace_overwrite\");\n            else\n                dom.removeCssClass(this.cursors[i], \"ace_overwrite\");\n        }\n    };\n\n    this.destroy = function() {\n        clearInterval(this.blinkId);\n    }\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\ndefine('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n/**\n * new ScrollBar(parent)\n * - parent (DOMElement): A DOM element \n *\n * Creates a new `ScrollBar`. `parent` is the owner of the scroll bar.\n *\n **/\nvar ScrollBar = function(parent) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_sb\";\n\n    this.inner = dom.createElement(\"div\");\n    this.element.appendChild(this.inner);\n\n    parent.appendChild(this.element);\n\n    // in OSX lion the scrollbars appear to have no width. In this case resize\n    // the to show the scrollbar but still pretend that the scrollbar has a width\n    // of 0px\n    // in Firefox 6+ scrollbar is hidden if element has the same width as scrollbar\n    // make element a little bit wider to retain scrollbar when page is zoomed \n    this.width = dom.scrollbarWidth(parent.ownerDocument);\n    this.element.style.width = (this.width || 15) + 5 + \"px\";\n\n    event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n    this.onScroll = function() {\n        this._emit(\"scroll\", {data: this.element.scrollTop});\n    };\n    this.getWidth = function() {\n        return this.width;\n    };\n    this.setHeight = function(height) {\n        this.element.style.height = height + \"px\";\n    };\n    this.setInnerHeight = function(height) {\n        this.inner.style.height = height + \"px\";\n    };\n    // TODO: on chrome 17+ for small zoom levels after calling this function\n    // this.element.scrollTop != scrollTop which makes page to scroll up.\n    this.setScrollTop = function(scrollTop) {\n        this.element.scrollTop = scrollTop;\n    };\n\n}).call(ScrollBar.prototype);\n\nexports.ScrollBar = ScrollBar;\n});\n\ndefine('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {\n\n\nvar event = require(\"./lib/event\");\n\n/** internal, hide\n * new RenderLoop(onRender, win)\n *\n * \n *\n**/\nvar RenderLoop = function(onRender, win) {\n    this.onRender = onRender;\n    this.pending = false;\n    this.changes = 0;\n    this.window = win || window;\n};\n\n(function() {\n\n    /** internal, hide\n     * RenderLoop.schedule(change)\n     * - change (Array):\n     * \n     * \n     **/\n    this.schedule = function(change) {\n        //this.onRender(change);\n        //return;\n        this.changes = this.changes | change;\n        if (!this.pending) {\n            this.pending = true;\n            var _self = this;\n            event.nextTick(function() {\n                _self.pending = false;\n                var changes;\n                while (changes = _self.changes) {\n                    _self.changes = 0;\n                    _self.onRender(changes);\n                }\n            }, this.window);\n        }\n    };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\ndefine(\"text!ace/css/editor.css\", [], \".ace_editor {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    overflow: hidden;\\n\" +\n  \"    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Droid Sans Mono', 'Consolas', monospace;\\n\" +\n  \"    font-size: 12px;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_scroller {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    overflow: hidden;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_content {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    box-sizing: border-box;\\n\" +\n  \"    -moz-box-sizing: border-box;\\n\" +\n  \"    -webkit-box-sizing: border-box;\\n\" +\n  \"    cursor: text;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    overflow : hidden;\\n\" +\n  \"    height: 100%;\\n\" +\n  \"    width: auto;\\n\" +\n  \"    cursor: default;\\n\" +\n  \"    z-index: 4;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter_active_line {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    left: 0;\\n\" +\n  \"    right: 0;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_scroller.horscroll {\\n\" +\n  \"    box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter-cell {\\n\" +\n  \"    padding-left: 19px;\\n\" +\n  \"    padding-right: 6px;\\n\" +\n  \"    background-repeat: no-repeat;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter-cell.ace_error {\\n\" +\n  \"    background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=\\\");\\n\" +\n  \"    background-repeat: no-repeat;\\n\" +\n  \"    background-position: 2px center;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter-cell.ace_warning {\\n\" +\n  \"    background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==\\\");\\n\" +\n  \"    background-position: 2px center;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter-cell.ace_info {\\n\" +\n  \"    background-image: url(\\\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\\\");\\n\" +\n  \"    background-position: 2px center;\\n\" +\n  \"}\\n\" +\n  \".ace_dark .ace_gutter-cell.ace_info {\\n\" +\n  \"    background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=\\\");\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_editor .ace_sb {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    overflow-x: hidden;\\n\" +\n  \"    overflow-y: scroll;\\n\" +\n  \"    right: 0;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_editor .ace_sb div {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    width: 1px;\\n\" +\n  \"    left: 0;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_editor .ace_print_margin_layer {\\n\" +\n  \"    z-index: 0;\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    overflow: hidden;\\n\" +\n  \"    margin: 0;\\n\" +\n  \"    left: 0;\\n\" +\n  \"    height: 100%;\\n\" +\n  \"    width: 100%;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_editor .ace_print_margin {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    height: 100%;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_editor > textarea {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    z-index: 0;\\n\" +\n  \"    width: 0.5em;\\n\" +\n  \"    height: 1em;\\n\" +\n  \"    opacity: 0;\\n\" +\n  \"    background: transparent;\\n\" +\n  \"    appearance: none;\\n\" +\n  \"    -moz-appearance: none;\\n\" +\n  \"    border: none;\\n\" +\n  \"    resize: none;\\n\" +\n  \"    outline: none;\\n\" +\n  \"    overflow: hidden;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_editor > textarea.ace_composition {\\n\" +\n  \"    background: #fff;\\n\" +\n  \"    color: #000;\\n\" +\n  \"    z-index: 1000;\\n\" +\n  \"    opacity: 1;\\n\" +\n  \"    border: solid lightgray 1px;\\n\" +\n  \"    margin: -1px\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_layer {\\n\" +\n  \"    z-index: 1;\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    overflow: hidden;\\n\" +\n  \"    white-space: nowrap;\\n\" +\n  \"    height: 100%;\\n\" +\n  \"    width: 100%;\\n\" +\n  \"    box-sizing: border-box;\\n\" +\n  \"    -moz-box-sizing: border-box;\\n\" +\n  \"    -webkit-box-sizing: border-box;\\n\" +\n  \"    /* setting pointer-events: auto; on node under the mouse, which changes\\n\" +\n  \"        during scroll, will break mouse wheel scrolling in Safari */\\n\" +\n  \"    pointer-events: none;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter .ace_layer {\\n\" +\n  \"    position: relative;\\n\" +\n  \"    width: auto;\\n\" +\n  \"    text-align: right;\\n\" +\n  \"    pointer-events: auto;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_text-layer {\\n\" +\n  \"    color: black;\\n\" +\n  \"    font: inherit !important;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_cjk {\\n\" +\n  \"    display: inline-block;\\n\" +\n  \"    text-align: center;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_cursor-layer {\\n\" +\n  \"    z-index: 4;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_cursor {\\n\" +\n  \"    z-index: 4;\\n\" +\n  \"    position: absolute;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_cursor.ace_hidden {\\n\" +\n  \"    opacity: 0.2;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_editor.multiselect .ace_cursor {\\n\" +\n  \"    border-left-width: 1px;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_line {\\n\" +\n  \"    white-space: nowrap;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_marker-layer .ace_step {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    z-index: 3;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_marker-layer .ace_selection {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    z-index: 5;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_marker-layer .ace_bracket {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    z-index: 6;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_marker-layer .ace_active_line {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    z-index: 2;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_marker-layer .ace_selected_word {\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    z-index: 4;\\n\" +\n  \"    box-sizing: border-box;\\n\" +\n  \"    -moz-box-sizing: border-box;\\n\" +\n  \"    -webkit-box-sizing: border-box;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_line .ace_fold {\\n\" +\n  \"    box-sizing: border-box;\\n\" +\n  \"    -moz-box-sizing: border-box;\\n\" +\n  \"    -webkit-box-sizing: border-box;\\n\" +\n  \"\\n\" +\n  \"    display: inline-block;\\n\" +\n  \"    height: 11px;\\n\" +\n  \"    margin-top: -2px;\\n\" +\n  \"    vertical-align: middle;\\n\" +\n  \"\\n\" +\n  \"    background-image:\\n\" +\n  \"        url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\\\"),\\n\" +\n  \"        url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\\\");\\n\" +\n  \"    background-repeat: no-repeat, repeat-x;\\n\" +\n  \"    background-position: center center, top left;\\n\" +\n  \"    color: transparent;\\n\" +\n  \"\\n\" +\n  \"    border: 1px solid black;\\n\" +\n  \"    -moz-border-radius: 2px;\\n\" +\n  \"    -webkit-border-radius: 2px;\\n\" +\n  \"    border-radius: 2px;\\n\" +\n  \"\\n\" +\n  \"    cursor: pointer;\\n\" +\n  \"    pointer-events: auto;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_dark .ace_fold {\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fold:hover{\\n\" +\n  \"    background-image:\\n\" +\n  \"        url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\\\"),\\n\" +\n  \"        url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\\\");\\n\" +\n  \"    background-repeat: no-repeat, repeat-x;\\n\" +\n  \"    background-position: center center, top left;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_dragging .ace_content {\\n\" +\n  \"    cursor: move;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_gutter_tooltip {\\n\" +\n  \"    background-color: #FFFFD5;\\n\" +\n  \"    border: 1px solid gray;\\n\" +\n  \"    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);\\n\" +\n  \"    color: black;\\n\" +\n  \"    display: inline-block;\\n\" +\n  \"    padding: 4px;\\n\" +\n  \"    position: absolute;\\n\" +\n  \"    z-index: 300;\\n\" +\n  \"    box-sizing: border-box;\\n\" +\n  \"    -moz-box-sizing: border-box;\\n\" +\n  \"    -webkit-box-sizing: border-box;\\n\" +\n  \"    cursor: default;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_folding-enabled > .ace_gutter-cell {\\n\" +\n  \"    padding-right: 13px;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fold-widget {\\n\" +\n  \"    box-sizing: border-box;\\n\" +\n  \"    -moz-box-sizing: border-box;\\n\" +\n  \"    -webkit-box-sizing: border-box;\\n\" +\n  \"\\n\" +\n  \"    margin: 0 -12px 0 1px;\\n\" +\n  \"    display: inline-block;\\n\" +\n  \"    width: 11px;\\n\" +\n  \"    vertical-align: top;\\n\" +\n  \"\\n\" +\n  \"    background-image: url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\\\");\\n\" +\n  \"    background-repeat: no-repeat;\\n\" +\n  \"    background-position: center;\\n\" +\n  \"\\n\" +\n  \"    border-radius: 3px;\\n\" +\n  \"    \\n\" +\n  \"    border: 1px solid transparent;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fold-widget.end {\\n\" +\n  \"    background-image: url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\\\");\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fold-widget.closed {\\n\" +\n  \"    background-image: url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\\\");\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fold-widget:hover {\\n\" +\n  \"    border: 1px solid rgba(0, 0, 0, 0.3);\\n\" +\n  \"    background-color: rgba(255, 255, 255, 0.2);\\n\" +\n  \"    -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\n\" +\n  \"    -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\n\" +\n  \"    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fold-widget:active {\\n\" +\n  \"    border: 1px solid rgba(0, 0, 0, 0.4);\\n\" +\n  \"    background-color: rgba(0, 0, 0, 0.05);\\n\" +\n  \"    -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\n\" +\n  \"    -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\n\" +\n  \"    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\n\" +\n  \"}\\n\" +\n  \"/**\\n\" +\n  \" * Dark version for fold widgets\\n\" +\n  \" */\\n\" +\n  \".ace_dark .ace_fold-widget {\\n\" +\n  \"    background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\n\" +\n  \"}\\n\" +\n  \".ace_dark .ace_fold-widget.end {\\n\" +\n  \"    background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\n\" +\n  \"}\\n\" +\n  \".ace_dark .ace_fold-widget.closed {\\n\" +\n  \"    background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\n\" +\n  \"}\\n\" +\n  \".ace_dark .ace_fold-widget:hover {\\n\" +\n  \"    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\n\" +\n  \"    background-color: rgba(255, 255, 255, 0.1);\\n\" +\n  \"}\\n\" +\n  \".ace_dark .ace_fold-widget:active {\\n\" +\n  \"    -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\n\" +\n  \"    -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\n\" +\n  \"    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\n\" +\n  \"}\\n\" +\n  \"    \\n\" +\n  \"    \\n\" +\n  \"    \\n\" +\n  \".ace_fold-widget.invalid {\\n\" +\n  \"    background-color: #FFB4B4;\\n\" +\n  \"    border-color: #DE5555;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fade-fold-widgets .ace_fold-widget {\\n\" +\n  \"       -moz-transition: opacity 0.4s ease 0.05s;\\n\" +\n  \"    -webkit-transition: opacity 0.4s ease 0.05s;\\n\" +\n  \"         -o-transition: opacity 0.4s ease 0.05s;\\n\" +\n  \"        -ms-transition: opacity 0.4s ease 0.05s;\\n\" +\n  \"            transition: opacity 0.4s ease 0.05s;\\n\" +\n  \"    opacity: 0;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_fade-fold-widgets:hover .ace_fold-widget {\\n\" +\n  \"       -moz-transition: opacity 0.05s ease 0.05s;\\n\" +\n  \"    -webkit-transition: opacity 0.05s ease 0.05s;\\n\" +\n  \"         -o-transition: opacity 0.05s ease 0.05s;\\n\" +\n  \"        -ms-transition: opacity 0.05s ease 0.05s;\\n\" +\n  \"            transition: opacity 0.05s ease 0.05s;\\n\" +\n  \"    opacity:1;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_underline {\\n\" +\n  \"    text-decoration: underline;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_bold {\\n\" +\n  \"    font-weight: bold;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace_italic {\\n\" +\n  \"    font-style: italic;\\n\" +\n  \"}\\n\" +\n  \"\");\n\ndefine('ace/multi_select', ['require', 'exports', 'module' , 'ace/range_list', 'ace/range', 'ace/selection', 'ace/mouse/multi_select_handler', 'ace/lib/event', 'ace/lib/lang', 'ace/commands/multi_select_commands', 'ace/search', 'ace/edit_session', 'ace/editor'], function(require, exports, module) {\n\nvar RangeList = require(\"./range_list\").RangeList;\nvar Range = require(\"./range\").Range;\nvar Selection = require(\"./selection\").Selection;\nvar onMouseDown = require(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = require(\"./lib/event\");\nvar lang = require(\"./lib/lang\");\nvar commands = require(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\n\n// Todo: session.find or editor.findVolatile that returns range\nvar Search = require(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n    search.$options.wrap = true;\n    search.$options.needle = needle;\n    search.$options.backwards = dir == -1;\n    return search.find(session);\n}\n\n// extend EditSession\nvar EditSession = require(\"./edit_session\").EditSession;\n(function() {\n    this.getSelectionMarkers = function() {\n        return this.$selectionMarkers;\n    };\n}).call(EditSession.prototype);\n\n// extend Selection\n(function() {\n    // list of ranges in reverse addition order\n    this.ranges = null;\n\n    // automatically sorted list of ranges\n    this.rangeList = null;\n    this.addRange = function(range, $blockChangeEvents) {\n        if (!range)\n            return;\n\n        if (!this.inMultiSelectMode && this.rangeCount == 0) {\n            var oldRange = this.toOrientedRange();\n            if (range.intersects(oldRange))\n                return $blockChangeEvents || this.fromOrientedRange(range);\n\n            this.rangeList.add(oldRange);\n            this.$onAddRange(oldRange);\n        }\n\n        if (!range.cursor)\n            range.cursor = range.end;\n\n        var removed = this.rangeList.add(range);\n\n        this.$onAddRange(range);\n\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n            this._emit(\"multiSelect\");\n            this.inMultiSelectMode = true;\n            this.session.$undoSelect = false;\n            this.rangeList.attach(this.session);\n        }\n\n        return $blockChangeEvents || this.fromOrientedRange(range);\n    };\n\n    this.toSingleRange = function(range) {\n        range = range || this.ranges[0];\n        var removed = this.rangeList.removeAll();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        range && this.fromOrientedRange(range);\n    };\n    this.substractPoint = function(pos) {\n        var removed = this.rangeList.substractPoint(pos);\n        if (removed) {\n            this.$onRemoveRange(removed);\n            return removed[0];\n        }\n    };\n    this.mergeOverlappingRanges = function() {\n        var removed = this.rangeList.merge();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n        else if(this.ranges[0])\n            this.fromOrientedRange(this.ranges[0]);\n    };\n\n    this.$onAddRange = function(range) {\n        this.rangeCount = this.rangeList.ranges.length;\n        this.ranges.unshift(range);\n        this._emit(\"addRange\", {range: range});\n    };\n\n    this.$onRemoveRange = function(removed) {\n        this.rangeCount = this.rangeList.ranges.length;\n        if (this.rangeCount == 1 && this.inMultiSelectMode) {\n            var lastRange = this.rangeList.ranges.pop();\n            removed.push(lastRange);\n            this.rangeCount = 0;\n        }\n\n        for (var i = removed.length; i--; ) {\n            var index = this.ranges.indexOf(removed[i]);\n            this.ranges.splice(index, 1);\n        }\n\n        this._emit(\"removeRange\", {ranges: removed});\n\n        if (this.rangeCount == 0 && this.inMultiSelectMode) {\n            this.inMultiSelectMode = false;\n            this._emit(\"singleSelect\");\n            this.session.$undoSelect = true;\n            this.rangeList.detach(this.session);\n        }\n\n        lastRange = lastRange || this.ranges[0];\n        if (lastRange && !lastRange.isEqual(this.getRange()))\n            this.fromOrientedRange(lastRange);\n    };\n\n    // adds multicursor support to selection\n    this.$initRangeList = function() {\n        if (this.rangeList)\n            return;\n\n        this.rangeList = new RangeList();\n        this.ranges = [];\n        this.rangeCount = 0;\n    };\n\n    this.getAllRanges = function() {\n        return this.rangeList.ranges.concat();\n    };\n\n    this.splitIntoLines = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var range = this.getRange();\n            var isBackwards = this.isBackwards();\n            var startRow = range.start.row;\n            var endRow = range.end.row;\n            if (startRow == endRow) {\n                if (isBackwards)\n                    var start = range.end, end = range.start;\n                else\n                    var start = range.start, end = range.end;\n                \n                this.addRange(Range.fromPoints(end, end));\n                this.addRange(Range.fromPoints(start, start));\n                return;\n            }\n\n            var rectSel = [];\n            var r = this.getLineRange(startRow, true);\n            r.start.column = range.start.column;\n            rectSel.push(r);\n\n            for (var i = startRow + 1; i < endRow; i++)\n                rectSel.push(this.getLineRange(i, true));\n\n            r = this.getLineRange(endRow, true);\n            r.end.column = range.end.column;\n            rectSel.push(r);\n\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n\n    this.toggleBlockSelection = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var cursor = this.session.documentToScreenPosition(this.selectionLead);\n            var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n            var rectSel = this.rectangularRangeBlock(cursor, anchor);\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n        var rectSel = [];\n\n        var xBackwards = screenCursor.column < screenAnchor.column;\n        if (xBackwards) {\n            var startColumn = screenCursor.column;\n            var endColumn = screenAnchor.column;\n        } else {\n            var startColumn = screenAnchor.column;\n            var endColumn = screenCursor.column;\n        }\n\n        var yBackwards = screenCursor.row < screenAnchor.row;\n        if (yBackwards) {\n            var startRow = screenCursor.row;\n            var endRow = screenAnchor.row;\n        } else {\n            var startRow = screenAnchor.row;\n            var endRow = screenCursor.row;\n        }\n\n        if (startColumn < 0)\n            startColumn = 0;\n        if (startRow < 0)\n            startRow = 0;\n\n        if (startRow == endRow)\n            includeEmptyLines = true;\n\n        for (var row = startRow; row <= endRow; row++) {\n            var range = Range.fromPoints(\n                this.session.screenToDocumentPosition(row, startColumn),\n                this.session.screenToDocumentPosition(row, endColumn)\n            );\n            if (range.isEmpty()) {\n                if (docEnd && isSamePoint(range.end, docEnd))\n                    break;\n                var docEnd = range.end;\n            }\n            range.cursor = xBackwards ? range.start : range.end;\n            rectSel.push(range);\n        }\n\n        if (yBackwards)\n            rectSel.reverse();\n\n        if (!includeEmptyLines) {\n            var end = rectSel.length - 1;\n            while (rectSel[end].isEmpty() && end > 0)\n                end--;\n            if (end > 0) {\n                var start = 0;\n                while (rectSel[start].isEmpty())\n                    start++;\n            }\n            for (var i = end; i >= start; i--) {\n                if (rectSel[i].isEmpty())\n                    rectSel.splice(i, 1);\n            }\n        }\n\n        return rectSel;\n    };\n}).call(Selection.prototype);\n\n// extend Editor\nvar Editor = require(\"./editor\").Editor;\n(function() {\n\n    /** extension\n     * Editor.updateSelectionMarkers()\n     *\n     * Updates the cursor and marker layers.\n     **/\n    this.updateSelectionMarkers = function() {\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n    this.addSelectionMarker = function(orientedRange) {\n        if (!orientedRange.cursor)\n            orientedRange.cursor = orientedRange.end;\n\n        var style = this.getSelectionStyle();\n        orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n        this.session.$selectionMarkers.push(orientedRange);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n        return orientedRange;\n    };\n    this.removeSelectionMarker = function(range) {\n        if (!range.marker)\n            return;\n        this.session.removeMarker(range.marker);\n        var index = this.session.$selectionMarkers.indexOf(range);\n        if (index != -1)\n            this.session.$selectionMarkers.splice(index, 1);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n    };\n\n    this.removeSelectionMarkers = function(ranges) {\n        var markerList = this.session.$selectionMarkers;\n        for (var i = ranges.length; i--; ) {\n            var range = ranges[i];\n            if (!range.marker)\n                continue;\n            this.session.removeMarker(range.marker);\n            var index = markerList.indexOf(range);\n            if (index != -1)\n                markerList.splice(index, 1);\n        }\n        this.session.selectionMarkerCount = markerList.length;\n    };\n\n    this.$onAddRange = function(e) {\n        this.addSelectionMarker(e.range);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onRemoveRange = function(e) {\n        this.removeSelectionMarkers(e.ranges);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onMultiSelect = function(e) {\n        if (this.inMultiSelectMode)\n            return;\n        this.inMultiSelectMode = true;\n\n        this.setStyle(\"multiselect\");\n        this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n        this.commands.on(\"exec\", this.$onMultiSelectExec);\n\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onSingleSelect = function(e) {\n        if (this.session.multiSelect.inVirtualMode)\n            return;\n        this.inMultiSelectMode = false;\n\n        this.unsetStyle(\"multiselect\");\n        this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n        this.commands.removeEventListener(\"exec\", this.$onMultiSelectExec);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onMultiSelectExec = function(e) {\n        var command = e.command;\n        var editor = e.editor;\n        if (!editor.multiSelect)\n            return;\n        if (!command.multiSelectAction) {\n            command.exec(editor, e.args || {});\n            editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n            editor.multiSelect.mergeOverlappingRanges();\n        } else if (command.multiSelectAction == \"forEach\") {\n            editor.forEachSelection(command, e.args);\n        } else if (command.multiSelectAction == \"single\") {\n            editor.exitMultiSelectMode();\n            command.exec(editor, e.args || {});\n        } else {\n            command.multiSelectAction(editor, e.args || {});\n        }\n        e.preventDefault();\n    };\n    this.forEachSelection = function(cmd, args) {\n        if (this.inVirtualSelectionMode)\n            return;\n\n        var session = this.session;\n        var selection = this.selection;\n        var rangeList = selection.rangeList;\n\n        var reg = selection._eventRegistry;\n        selection._eventRegistry = {};\n\n        var tmpSel = new Selection(session);\n        this.inVirtualSelectionMode = true;\n        for (var i = rangeList.ranges.length; i--;) {\n            tmpSel.fromOrientedRange(rangeList.ranges[i]);\n            this.selection = session.selection = tmpSel;\n            cmd.exec(this, args || {});\n            tmpSel.toOrientedRange(rangeList.ranges[i]);\n        }\n        tmpSel.detach();\n\n        this.selection = session.selection = selection;\n        this.inVirtualSelectionMode = false;\n        selection._eventRegistry = reg;\n        selection.mergeOverlappingRanges();\n\n        this.onCursorChange();\n        this.onSelectionChange();\n    };\n    this.exitMultiSelectMode = function() {\n        if (this.inVirtualSelectionMode)\n            return;\n        this.multiSelect.toSingleRange();\n    };\n\n    this.getCopyText = function() {\n        var text = \"\";\n        if (this.inMultiSelectMode) {\n            var ranges = this.multiSelect.rangeList.ranges;\n            text = [];\n            for (var i = 0; i < ranges.length; i++) {\n                text.push(this.session.getTextRange(ranges[i]));\n            }\n            text = text.join(this.session.getDocument().getNewLineCharacter());\n        } else if (!this.selection.isEmpty()) {\n            text = this.session.getTextRange(this.getSelectionRange());\n        }\n\n        return text;\n    };\n\n    // todo this should change when paste becomes a command\n    this.onPaste = function(text) {\n        if (this.$readOnly)\n            return;\n\n        this._emit(\"paste\", text);\n        if (!this.inMultiSelectMode)\n            return this.insert(text);\n\n        var lines = text.split(/\\r\\n|\\r|\\n/);\n        var ranges = this.selection.rangeList.ranges;\n\n        if (lines.length > ranges.length || (lines.length <= 2 || !lines[1]))\n            return this.commands.exec(\"insertstring\", this, text);\n\n        for (var i = ranges.length; i--; ) {\n            var range = ranges[i];\n            if (!range.isEmpty())\n                this.session.remove(range);\n\n            this.session.insert(range.start, lines[i]);\n        }\n    };\n    this.findAll = function(needle, options, additive) {\n        options = options || {};\n        options.needle = needle || options.needle;\n        this.$search.set(options);\n\n        var ranges = this.$search.findAll(this.session);\n        if (!ranges.length)\n            return 0;\n\n        this.$blockScrolling += 1;\n        var selection = this.multiSelect;\n\n        if (!additive)\n            selection.toSingleRange(ranges[0]);\n\n        for (var i = ranges.length; i--; )\n            selection.addRange(ranges[i], true);\n\n        this.$blockScrolling -= 1;\n\n        return ranges.length;\n    };\n\n    // commands\n    /** extension\n     * Editor.selectMoreLines(dir, skip)\n     * - dir (Number): The direction of lines to select: -1 for up, 1 for down\n     * - skip (Boolean): If `true`, removes the active selection range\n     *\n     * Adds a cursor above or below the active cursor.\n     **/\n    this.selectMoreLines = function(dir, skip) {\n        var range = this.selection.toOrientedRange();\n        var isBackwards = range.cursor == range.end;\n\n        var screenLead = this.session.documentToScreenPosition(range.cursor);\n        if (this.selection.$desiredColumn)\n            screenLead.column = this.selection.$desiredColumn;\n\n        var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n        if (!range.isEmpty()) {\n            var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n            var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n        } else {\n            var anchor = lead;\n        }\n\n        if (isBackwards) {\n            var newRange = Range.fromPoints(lead, anchor);\n            newRange.cursor = newRange.start;\n        } else {\n            var newRange = Range.fromPoints(anchor, lead);\n            newRange.cursor = newRange.end;\n        }\n\n        newRange.desiredColumn = screenLead.column;\n        if (!this.selection.inMultiSelectMode) {\n            this.selection.addRange(range);\n        } else {\n            if (skip)\n                var toRemove = range.cursor;\n        }\n\n        this.selection.addRange(newRange);\n        if (toRemove)\n            this.selection.substractPoint(toRemove);\n    };\n    this.transposeSelections = function(dir) {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var all = sel.ranges;\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            if (range.isEmpty()) {\n                var tmp = session.getWordRange(range.start.row, range.start.column);\n                range.start.row = tmp.start.row;\n                range.start.column = tmp.start.column;\n                range.end.row = tmp.end.row;\n                range.end.column = tmp.end.column;\n            }\n        }\n        sel.mergeOverlappingRanges();\n\n        var words = [];\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            words.unshift(session.getTextRange(range));\n        }\n\n        if (dir < 0)\n            words.unshift(words.pop());\n        else\n            words.push(words.shift());\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            var tmp = range.clone();\n            session.replace(range, words[i]);\n            range.start.row = tmp.start.row;\n            range.start.column = tmp.start.column;\n        }\n    }\n\n    /** extension\n     * Editor.selectMore(dir, skip)\n     * - dir (Number): The direction of lines to select: -1 for up, 1 for down\n     * - skip (Boolean): If `true`, removes the active selection range\n     *\n     * Finds the next occurence of text in an active selection and adds it to the selections.\n     **/\n    this.selectMore = function(dir, skip) {\n        var session = this.session;\n        var sel = session.multiSelect;\n\n        var range = sel.toOrientedRange();\n        if (range.isEmpty()) {\n            var range = session.getWordRange(range.start.row, range.start.column);\n            range.cursor = range.end;\n            this.multiSelect.addRange(range);\n        }\n        var needle = session.getTextRange(range);\n\n        var newRange = find(session, needle, dir);\n        if (newRange) {\n            newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n            this.multiSelect.addRange(newRange);\n        }\n        if (skip)\n            this.multiSelect.substractPoint(range.cursor);\n    };\n    this.alignCursors = function() {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var ranges = sel.ranges;\n\n        if (!ranges.length) {\n            var range = this.selection.getRange();\n            var fr = range.start.row, lr = range.end.row;\n            var lines = this.session.doc.removeLines(fr, lr);\n            lines = this.$reAlignText(lines);\n            this.session.doc.insertLines(fr, lines);\n            range.start.column = 0;\n            range.end.column = lines[lines.length - 1].length;\n            this.selection.setRange(range);\n        } else {\n            // filter out ranges on same row\n            var row = -1;\n            var sameRowRanges = ranges.filter(function(r) {\n                if (r.cursor.row == row)\n                    return true;\n                row = r.cursor.row;\n            });\n            sel.$onRemoveRange(sameRowRanges);\n\n            var maxCol = 0;\n            var minSpace = Infinity;\n            var spaceOffsets = ranges.map(function(r) {\n                var p = r.cursor;\n                var line = session.getLine(p.row);\n                var spaceOffset = line.substr(p.column).search(/\\S/g);\n                if (spaceOffset == -1)\n                    spaceOffset = 0;\n\n                if (p.column > maxCol)\n                    maxCol = p.column;\n                if (spaceOffset < minSpace)\n                    minSpace = spaceOffset;\n                return spaceOffset;\n            });\n            ranges.forEach(function(r, i) {\n                var p = r.cursor;\n                var l = maxCol - p.column;\n                var d = spaceOffsets[i] - minSpace;\n                if (l > d)\n                    session.insert(p, lang.stringRepeat(\" \", l - d));\n                else\n                    session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n                r.start.column = r.end.column = maxCol;\n                r.start.row = r.end.row = p.row;\n                r.cursor = r.end;\n            });\n            sel.fromOrientedRange(ranges[0]);\n            this.renderer.updateCursor();\n            this.renderer.updateBackMarkers();\n        }\n    };\n\n    this.$reAlignText = function(lines) {\n        var isLeftAligned = true, isRightAligned = true;\n        var startW, textW, endW;\n\n        return lines.map(function(line) {\n            var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n            if (!m)\n                return [line];\n\n            if (startW == null) {\n                startW = m[1].length;\n                textW = m[2].length;\n                endW = m[3].length;\n                return m;\n            }\n\n            if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n                isRightAligned = false;\n            if (startW != m[1].length)\n                isLeftAligned = false;\n\n            if (startW > m[1].length)\n                startW = m[1].length;\n            if (textW < m[2].length)\n                textW = m[2].length;\n            if (endW > m[3].length)\n                endW = m[3].length;\n\n            return m;\n        }).map(isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n        function strRepeat(n, ch) {\n            return Array(n + 1).join(ch)\n        }\n\n        function alignLeft(m) {\n            return !m[2] ? m[0] : strRepeat(startW, \" \") + m[2]\n                + strRepeat(textW - m[2].length + endW, \" \")\n                + m[4].replace(/^([=:])\\s+/, \"$1 \")\n        }\n        function alignRight(m) {\n            return !m[2] ? m[0] : strRepeat(startW + textW - m[2].length, \" \") + m[2]\n                + strRepeat(endW, \" \")\n                + m[4].replace(/^([=:])\\s+/, \"$1 \")\n        }\n        function unAlign(m) {\n            return !m[2] ? m[0] : strRepeat(startW, \" \") + m[2]\n                + strRepeat(endW, \" \")\n                + m[4].replace(/^([=:])\\s+/, \"$1 \")\n        }\n    }\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\n\n// patch\n// adds multicursor support to a session\nexports.onSessionChange = function(e) {\n    var session = e.session;\n    if (!session.multiSelect) {\n        session.$selectionMarkers = [];\n        session.selection.$initRangeList();\n        session.multiSelect = session.selection;\n    }\n    this.multiSelect = session.multiSelect;\n\n    var oldSession = e.oldSession;\n    if (oldSession) {\n        // todo use events\n        if (oldSession.multiSelect && oldSession.multiSelect.editor == this)\n            oldSession.multiSelect.editor = null;\n\n        session.multiSelect.removeEventListener(\"addRange\", this.$onAddRange);\n        session.multiSelect.removeEventListener(\"removeRange\", this.$onRemoveRange);\n        session.multiSelect.removeEventListener(\"multiSelect\", this.$onMultiSelect);\n        session.multiSelect.removeEventListener(\"singleSelect\", this.$onSingleSelect);\n    }\n\n    session.multiSelect.on(\"addRange\", this.$onAddRange);\n    session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n    session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n    session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n\n    // this.$onSelectionChange = this.onSelectionChange.bind(this);\n\n    if (this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n        if (session.selection.inMultiSelectMode)\n            this.$onMultiSelect();\n        else\n            this.$onSingleSelect();\n    }\n};\n\n// MultiSelect(editor)\n// adds multiple selection support to the editor\n// (note: should be called only once for each editor instance)\nfunction MultiSelect(editor) {\n    editor.$onAddRange = editor.$onAddRange.bind(editor);\n    editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n    editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n    editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n\n    exports.onSessionChange.call(editor, editor);\n    editor.on(\"changeSession\", exports.onSessionChange.bind(editor));\n\n    editor.on(\"mousedown\", onMouseDown);\n    editor.commands.addCommands(commands.defaultCommands);\n\n    addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n    var el = editor.textInput.getElement();\n    var altCursor = false;\n    var contentEl = editor.renderer.content;\n    event.addListener(el, \"keydown\", function(e) {\n        if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {\n            if (!altCursor) {\n                contentEl.style.cursor = \"crosshair\";\n                altCursor = true;\n            }\n        } else if (altCursor) {\n            contentEl.style.cursor = \"\";\n        }\n    });\n\n    event.addListener(el, \"keyup\", reset);\n    event.addListener(el, \"blur\", reset);\n    function reset() {\n        if (altCursor) {\n            contentEl.style.cursor = \"\";\n            altCursor = false;\n        }\n    }\n}\n\nexports.MultiSelect = MultiSelect;\n\n});\n\ndefine('ace/range_list', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n\nvar RangeList = function() {\n    this.ranges = [];\n};\n\n(function() {\n    this.comparePoints = function(p1, p2) {\n        return p1.row - p2.row || p1.column - p2.column;\n    };\n\n    this.pointIndex = function(pos, startIndex) {\n        var list = this.ranges;\n\n        for (var i = startIndex || 0; i < list.length; i++) {\n            var range = list[i];\n            var cmp = this.comparePoints(pos, range.end);\n\n            if (cmp > 0)\n                continue;\n            if (cmp == 0)\n                return i;\n            cmp = this.comparePoints(pos, range.start);\n            if (cmp >= 0)\n                return i;\n\n            return -i-1;\n        }\n        return -i - 1;\n    };\n\n    this.add = function(range) {\n        var startIndex = this.pointIndex(range.start);\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n\n        var endIndex = this.pointIndex(range.end, startIndex);\n\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n        else\n            endIndex++;\n\n        return this.ranges.splice(startIndex, endIndex - startIndex, range);\n    };\n\n    this.addList = function(list) {\n        var removed = [];\n        for (var i = list.length; i--; ) {\n            removed.push.call(removed, this.add(list[i]));\n        }\n        return removed;\n    };\n\n    this.substractPoint = function(pos) {\n        var i = this.pointIndex(pos);\n\n        if (i >= 0)\n            return this.ranges.splice(i, 1);\n    };\n\n    // merge overlapping ranges\n    this.merge = function() {\n        var removed = [];\n        var list = this.ranges;\n        var next = list[0], range;\n        for (var i = 1; i < list.length; i++) {\n            range = next;\n            next = list[i];\n            var cmp = this.comparePoints(range.end, next.start);\n            if (cmp < 0)\n                continue;\n\n            if (cmp == 0 && !(range.isEmpty() || next.isEmpty()))\n                continue;\n\n            if (this.comparePoints(range.end, next.end) < 0) {\n                range.end.row = next.end.row;\n                range.end.column = next.end.column;\n            }\n\n            list.splice(i, 1);\n            removed.push(next);\n            next = range;\n            i--;\n        }\n\n        return removed;\n    };\n\n    this.contains = function(row, column) {\n        return this.pointIndex({row: row, column: column}) >= 0;\n    };\n\n    this.containsPoint = function(pos) {\n        return this.pointIndex(pos) >= 0;\n    };\n\n    this.rangeAtPoint = function(pos) {\n        var i = this.pointIndex(pos);\n        if (i >= 0)\n            return this.ranges[i];\n    };\n\n\n    this.clipRows = function(startRow, endRow) {\n        var list = this.ranges;\n        if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n            return [];\n\n        var startIndex = this.pointIndex({row: startRow, column: 0});\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n        var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n\n        var clipped = [];\n        for (var i = startIndex; i < endIndex; i++) {\n            clipped.push(list[i]);\n        }\n        return clipped;\n    };\n\n    this.removeAll = function() {\n        return this.ranges.splice(0, this.ranges.length);\n    };\n\n    this.attach = function(session) {\n        if (this.session)\n            this.detach();\n\n        this.session = session;\n        this.onChange = this.$onChange.bind(this);\n\n        this.session.on('change', this.onChange);\n    };\n\n    this.detach = function() {\n        if (!this.session)\n            return;\n        this.session.removeListener('change', this.onChange);\n        this.session = null;\n    };\n\n    this.$onChange = function(e) {\n        var changeRange = e.data.range;\n        if (e.data.action[0] == \"i\"){\n            var start = changeRange.start;\n            var end = changeRange.end;\n        } else {\n            var end = changeRange.start;\n            var start = changeRange.end;\n        }\n        var startRow = start.row;\n        var endRow = end.row;\n        var lineDif = endRow - startRow;\n\n        var colDiff = -start.column + end.column;\n        var ranges = this.ranges;\n\n        for (var i = 0, n = ranges.length; i < n; i++) {\n            var r = ranges[i];\n            if (r.end.row < startRow)\n                continue;\n            if (r.start.row > startRow)\n                break;\n\n            if (r.start.row == startRow && r.start.column >= start.column ) {\n                r.start.column += colDiff;\n                r.start.row += lineDif;\n            }\n            if (r.end.row == startRow && r.end.column >=  start.column) {\n                r.end.column += colDiff;\n                r.end.row += lineDif;\n            }\n        }\n\n        if (lineDif != 0 && i < n) {\n            for (; i < n; i++) {\n                var r = ranges[i];\n                r.start.row += lineDif;\n                r.end.row += lineDif;\n            }\n        }\n    };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\ndefine('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {\n\nvar event = require(\"../lib/event\");\n\n\n// mouse\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n    var ev = e.domEvent;\n    var alt = ev.altKey;\n    var shift = ev.shiftKey;\n    var ctrl = e.getAccelKey();\n    var button = e.getButton();\n\n    if (e.editor.inMultiSelectMode && button == 2) {\n        e.editor.textInput.onContextMenu(e.domEvent);\n        return;\n    }\n    \n    if (!ctrl && !alt) {\n        if (button == 0 && e.editor.inMultiSelectMode)\n            e.editor.exitMultiSelectMode();\n        return;\n    }\n\n    var editor = e.editor;\n    var selection = editor.selection;\n    var isMultiSelect = editor.inMultiSelectMode;\n    var pos = e.getDocumentPosition();\n    var cursor = selection.getCursor();\n    var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n\n    var mouseX = e.x, mouseY = e.y;\n    var onMouseSelection = function(e) {\n        mouseX = e.clientX;\n        mouseY = e.clientY;\n    };\n\n    var blockSelect = function() {\n        var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n        var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);\n\n        if (isSamePoint(screenCursor, newCursor)\n            && isSamePoint(cursor, selection.selectionLead))\n            return;\n        screenCursor = newCursor;\n\n        editor.selection.moveCursorToPosition(cursor);\n        editor.selection.clearSelection();\n        editor.renderer.scrollCursorIntoView();\n\n        editor.removeSelectionMarkers(rectSel);\n        rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n        rectSel.forEach(editor.addSelectionMarker, editor);\n        editor.updateSelectionMarkers();\n    };\n    \n    var session = editor.session;\n    var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n    var screenCursor = screenAnchor;\n\n    \n\n    if (ctrl && !shift && !alt && button == 0) {\n        if (!isMultiSelect && inSelection)\n            return; // dragging\n\n        if (!isMultiSelect) {\n            var range = selection.toOrientedRange();\n            editor.addSelectionMarker(range);\n        }\n\n        var oldRange = selection.rangeList.rangeAtPoint(pos);\n\n        event.capture(editor.container, function(){}, function() {\n            var tmpSel = selection.toOrientedRange();\n\n            if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n                selection.substractPoint(tmpSel.cursor);\n            else {\n                if (range) {\n                    editor.removeSelectionMarker(range);\n                    selection.addRange(range);\n                }\n                selection.addRange(tmpSel);\n            }\n        });\n\n    } else if (!shift && alt && button == 0) {\n        e.stop();\n\n        if (isMultiSelect && !ctrl)\n            selection.toSingleRange();\n        else if (!isMultiSelect && ctrl)\n            selection.addRange();\n\n        selection.moveCursorToPosition(pos);\n        selection.clearSelection();\n\n        var rectSel = [];\n\n        var onMouseSelectionEnd = function(e) {\n            clearInterval(timerId);\n            editor.removeSelectionMarkers(rectSel);\n            for (var i = 0; i < rectSel.length; i++)\n                selection.addRange(rectSel[i]);\n        };\n\n        var onSelectionInterval = blockSelect;\n\n        event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n        var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n        return e.preventDefault();\n    }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\ndefine('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) {\n\n// commands to enter multiselect mode\nexports.defaultCommands = [{\n    name: \"addCursorAbove\",\n    exec: function(editor) { editor.selectMoreLines(-1); },\n    bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n    readonly: true\n}, {\n    name: \"addCursorBelow\",\n    exec: function(editor) { editor.selectMoreLines(1); },\n    bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n    readonly: true\n}, {\n    name: \"addCursorAboveSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n    readonly: true\n}, {\n    name: \"addCursorBelowSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n    readonly: true\n}, {\n    name: \"selectMoreBefore\",\n    exec: function(editor) { editor.selectMore(-1); },\n    bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n    readonly: true\n}, {\n    name: \"selectMoreAfter\",\n    exec: function(editor) { editor.selectMore(1); },\n    bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n    readonly: true\n}, {\n    name: \"selectNextBefore\",\n    exec: function(editor) { editor.selectMore(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n    readonly: true\n}, {\n    name: \"selectNextAfter\",\n    exec: function(editor) { editor.selectMore(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n    readonly: true\n}, {\n    name: \"splitIntoLines\",\n    exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n    bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n    readonly: true\n}, {\n    name: \"alignCursors\",\n    exec: function(editor) { editor.alignCursors(); },\n    bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"}\n}];\n\n// commands active only in multiselect mode\nexports.multiSelectCommands = [{\n    name: \"singleSelection\",\n    bindKey: \"esc\",\n    exec: function(editor) { editor.exitMultiSelectMode(); },\n    readonly: true,\n    isAvailable: function(editor) {return editor && editor.inMultiSelectMode}\n}];\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\ndefine('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar config = require(\"../config\");\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname) {\n\n    this.changeListener = this.changeListener.bind(this);\n\n    if (config.get(\"packaged\")) {\n        this.$worker = new Worker(config.moduleUrl(mod, \"worker\"));\n    }\n    else {\n        var workerUrl;\n        if (typeof require.supports !== \"undefined\" && require.supports.indexOf(\"ucjs2-pinf-0\") >= 0) {\n            // We are running in the sourcemint loader.\n            workerUrl = require.nameToUrl(\"ace/worker/worker_sourcemint\");\n        } else {\n            // We are running in RequireJS.\n            // nameToUrl is renamed to toUrl in requirejs 2\n            if (require.nameToUrl && !require.toUrl)\n                require.toUrl = require.nameToUrl;\n            workerUrl = this.$normalizePath(require.toUrl(\"ace/worker/worker\", null, \"_\"));\n        }\n        this.$worker = new Worker(workerUrl);\n\n        var tlns = {};\n        for (var i=0; i<topLevelNamespaces.length; i++) {\n            var ns = topLevelNamespaces[i];\n            var path = this.$normalizePath(require.toUrl(ns, null, \"_\").replace(/.js(\\?.*)?$/, \"\"));\n\n            tlns[ns] = path;\n        }\n    }\n\n    this.$worker.postMessage({\n        init : true,\n        tlns: tlns,\n        module: mod,\n        classname: classname\n    });\n\n    this.callbackId = 1;\n    this.callbacks = {};\n\n    var _self = this;\n    this.$worker.onerror = function(e) {\n        window.console && console.log && console.log(e);\n        throw e;\n    };\n    this.$worker.onmessage = function(e) {\n        var msg = e.data;\n        switch(msg.type) {\n            case \"log\":\n                window.console && console.log && console.log(msg.data);\n                break;\n\n            case \"event\":\n                _self._emit(msg.name, {data: msg.data});\n                break;\n\n            case \"call\":\n                var callback = _self.callbacks[msg.id];\n                if (callback) {\n                    callback(msg.data);\n                    delete _self.callbacks[msg.id];\n                }\n                break;\n        }\n    };\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.$normalizePath = function(path) {\n        if (!location.host) // needed for file:// protocol\n            return path;\n        path = path.replace(/^[a-z]+:\\/\\/[^\\/]+/, \"\"); // Remove domain name and rebuild it\n        path = location.protocol + \"//\" + location.host\n            // paths starting with a slash are relative to the root (host)\n            + (path.charAt(0) == \"/\" ? \"\" : location.pathname.replace(/\\/[^\\/]*$/, \"\"))\n            + \"/\" + path.replace(/^[\\/]+/, \"\");\n        return path;\n    };\n\n    this.terminate = function() {\n        this._emit(\"terminate\", {});\n        this.$worker.terminate();\n        this.$worker = null;\n        this.$doc.removeEventListener(\"change\", this.changeListener);\n        this.$doc = null;\n    };\n\n    this.send = function(cmd, args) {\n        this.$worker.postMessage({command: cmd, args: args});\n    };\n\n    this.call = function(cmd, args, callback) {\n        if (callback) {\n            var id = this.callbackId++;\n            this.callbacks[id] = callback;\n            args.push(id);\n        }\n        this.send(cmd, args);\n    };\n\n    this.emit = function(event, data) {\n        try {\n            // firefox refuses to clone objects which have function properties\n            // TODO: cleanup event\n            this.$worker.postMessage({event: event, data: {data: data.data}});\n        }\n        catch(ex) {}\n    };\n\n    this.attachToDocument = function(doc) {\n        if(this.$doc)\n            this.terminate();\n\n        this.$doc = doc;\n        this.call(\"setValue\", [doc.getValue()]);\n        doc.on(\"change\", this.changeListener);\n    };\n\n    this.changeListener = function(e) {\n        e.range = {\n            start: e.data.range.start,\n            end: e.data.range.end\n        };\n        this.emit(\"change\", e);\n    };\n\n}).call(WorkerClient.prototype);\n\nexports.WorkerClient = WorkerClient;\n\n});\n\ndefine('ace/keyboard/state_handler', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n// If you're developing a new keymapping and want to get an idea what's going\n// on, then enable debugging.\nvar DEBUG = false;\n\nfunction StateHandler(keymapping) {\n    this.keymapping = this.$buildKeymappingRegex(keymapping);\n}\n\nStateHandler.prototype = {\n    /*\n     * Build the RegExp from the keymapping as RegExp can't stored directly\n     * in the metadata JSON and as the RegExp used to match the keys/buffer\n     * need to be adapted.\n     */\n    $buildKeymappingRegex: function(keymapping) {\n        for (var state in keymapping) {\n            this.$buildBindingsRegex(keymapping[state]);\n        }\n        return keymapping;\n    },\n\n    $buildBindingsRegex: function(bindings) {\n        // Escape a given Regex string.\n        bindings.forEach(function(binding) {\n            if (binding.key) {\n                binding.key = new RegExp('^' + binding.key + '$');\n            } else if (Array.isArray(binding.regex)) {\n                if (!('key' in binding))\n                  binding.key = new RegExp('^' + binding.regex[1] + '$');\n                binding.regex = new RegExp(binding.regex.join('') + '$');\n            } else if (binding.regex) {\n                binding.regex = new RegExp(binding.regex + '$');\n            }\n        });\n    },\n\n    $composeBuffer: function(data, hashId, key, e) {\n        // Initialize the data object.\n        if (data.state == null || data.buffer == null) {\n            data.state = \"start\";\n            data.buffer = \"\";\n        }\n\n        var keyArray = [];\n        if (hashId & 1) keyArray.push(\"ctrl\");\n        if (hashId & 8) keyArray.push(\"command\");\n        if (hashId & 2) keyArray.push(\"option\");\n        if (hashId & 4) keyArray.push(\"shift\");\n        if (key)        keyArray.push(key);\n\n        var symbolicName = keyArray.join(\"-\");\n        var bufferToUse = data.buffer + symbolicName;\n\n        // Don't add the symbolic name to the key buffer if the alt_ key is\n        // part of the symbolic name. If it starts with alt_, this means\n        // that the user hit an alt keycombo and there will be a single,\n        // new character detected after this event, which then will be\n        // added to the buffer (e.g. alt_j will result in ∆).\n        //\n        // We test for 2 and not for & 2 as we only want to exclude the case where\n        // the option key is pressed alone.\n        if (hashId != 2) {\n            data.buffer = bufferToUse;\n        }\n\n        var bufferObj = {\n            bufferToUse: bufferToUse,\n            symbolicName: symbolicName\n        };\n\n        if (e) {\n            bufferObj.keyIdentifier = e.keyIdentifier;\n        }\n\n        return bufferObj;\n    },\n\n    $find: function(data, buffer, symbolicName, hashId, key, keyIdentifier) {\n        // Holds the command to execute and the args if a command matched.\n        var result = {};\n\n        // Loop over all the bindings of the keymap until a match is found.\n        this.keymapping[data.state].some(function(binding) {\n            var match;\n\n            // Check if the key matches.\n            if (binding.key && !binding.key.test(symbolicName)) {\n                return false;\n            }\n\n            // Check if the regex matches.\n            if (binding.regex && !(match = binding.regex.exec(buffer))) {\n                return false;\n            }\n\n            // Check if the match function matches.\n            if (binding.match && !binding.match(buffer, hashId, key, symbolicName, keyIdentifier)) {\n                return false;\n            }\n\n            // Check for disallowed matches.\n            if (binding.disallowMatches) {\n                for (var i = 0; i < binding.disallowMatches.length; i++) {\n                    if (!!match[binding.disallowMatches[i]]) {\n                        return false;\n                    }\n                }\n            }\n\n            // If there is a command to execute, then figure out the\n            // command and the arguments.\n            if (binding.exec) {\n                result.command = binding.exec;\n\n                // Build the arguments.\n                if (binding.params) {\n                    var value;\n                    result.args = {};\n                    binding.params.forEach(function(param) {\n                        if (param.match != null && match != null) {\n                            value = match[param.match] || param.defaultValue;\n                        } else {\n                            value = param.defaultValue;\n                        }\n\n                        if (param.type === 'number') {\n                            value = parseInt(value);\n                        }\n\n                        result.args[param.name] = value;\n                    });\n                }\n                data.buffer = \"\";\n            }\n\n            // Handle the 'then' property.\n            if (binding.then) {\n                data.state = binding.then;\n                data.buffer = \"\";\n            }\n\n            // If no command is set, then execute the \"null\" fake command.\n            if (result.command == null) {\n                result.command = \"null\";\n            }\n\n            if (DEBUG) {\n                console.log(\"KeyboardStateMapper#find\", binding);\n            }\n            return true;\n        });\n\n        if (result.command) {\n            return result;\n        } else {\n            data.buffer = \"\";\n            return false;\n        }\n    },\n\n    /*\n     * This function is called by keyBinding.\n     */\n    handleKeyboard: function(data, hashId, key, keyCode, e) {\n        if (hashId == -1)\n            hashId = 0\n        // If we pressed any command key but no other key, then ignore the input.\n        // Otherwise \"shift-\" is added to the buffer, and later on \"shift-g\"\n        // which results in \"shift-shift-g\" which doesn't make sense.\n        if (hashId != 0 && (key == \"\" || key == String.fromCharCode(0))) {\n            return null;\n        }\n\n        // Compute the current value of the keyboard input buffer.\n        var r = this.$composeBuffer(data, hashId, key, e);\n        var buffer = r.bufferToUse;\n        var symbolicName = r.symbolicName;\n        var keyId = r.keyIdentifier;\n\n        r = this.$find(data, buffer, symbolicName, hashId, key, keyId);\n        if (DEBUG) {\n            console.log(\"KeyboardStateMapper#match\", buffer, symbolicName, r);\n        }\n\n        return r;\n    }\n}\n\n/*\n * This is a useful matching function and therefore is defined here so that\n * users of KeyboardStateMapper can use it.\n *\n * @return boolean\n *          If no command key (Command|Option|Shift|Ctrl) is pressed, it\n *          returns true. If the only the Shift key is pressed + a character\n *          true is returned as well. Otherwise, false is returned.\n *          Summing up, the function returns true whenever the user typed\n *          a normal character on the keyboard and no shortcut.\n */\nexports.matchCharacterOnly = function(buffer, hashId, key, symbolicName) {\n    // If no command keys are pressed, then catch the input.\n    if (hashId == 0) {\n        return true;\n    }\n    // If only the shift key is pressed and a character key, then\n    // catch that input as well.\n    else if ((hashId == 4) && key.length == 1) {\n        return true;\n    }\n    // Otherwise, we let the input got through.\n    else {\n        return false;\n    }\n};\n\nexports.StateHandler = StateHandler;\n});\ndefine('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar Range = require('./range').Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar oop = require(\"./lib/oop\");\n\n/**\n * new PlaceHolder(session, length, pos, others, mainClass, othersClass)\n * - session (Document): The document to associate with the anchor\n * - length (Number): The starting row position\n * - pos (Number): The starting column position\n * - others (String):\n * - mainClass (String):\n * - othersClass (String):\n *\n *  TODO\n *\n **/\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n    var _self = this;\n    this.length = length;\n    this.session = session;\n    this.doc = session.getDocument();\n    this.mainClass = mainClass;\n    this.othersClass = othersClass;\n    this.$onUpdate = this.onUpdate.bind(this);\n    this.doc.on(\"change\", this.$onUpdate);\n    this.$others = others;\n    \n    this.$onCursorChange = function() {\n        setTimeout(function() {\n            _self.onCursorChange();\n        });\n    };\n    \n    this.$pos = pos;\n    // Used for reset\n    var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n    this.$undoStackDepth =  undoStack.length;\n    this.setup();\n\n    session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setup = function() {\n        var _self = this;\n        var doc = this.doc;\n        var session = this.session;\n        var pos = this.$pos;\n\n        this.pos = doc.createAnchor(pos.row, pos.column);\n        this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n        this.pos.on(\"change\", function(event) {\n            session.removeMarker(_self.markerId);\n            _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false);\n        });\n        this.others = [];\n        this.$others.forEach(function(other) {\n            var anchor = doc.createAnchor(other.row, other.column);\n            _self.others.push(anchor);\n        });\n        session.setUndoSelect(false);\n    };\n    this.showOtherMarkers = function() {\n        if(this.othersActive) return;\n        var session = this.session;\n        var _self = this;\n        this.othersActive = true;\n        this.others.forEach(function(anchor) {\n            anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n            anchor.on(\"change\", function(event) {\n                session.removeMarker(anchor.markerId);\n                anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false);\n            });\n        });\n    };\n    this.hideOtherMarkers = function() {\n        if(!this.othersActive) return;\n        this.othersActive = false;\n        for (var i = 0; i < this.others.length; i++) {\n            this.session.removeMarker(this.others[i].markerId);\n        }\n    };\n    this.onUpdate = function(event) {\n        var delta = event.data;\n        var range = delta.range;\n        if(range.start.row !== range.end.row) return;\n        if(range.start.row !== this.pos.row) return;\n        if (this.$updating) return;\n        this.$updating = true;\n        var lengthDiff = delta.action === \"insertText\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n        \n        if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) {\n            var distanceFromStart = range.start.column - this.pos.column;\n            this.length += lengthDiff;\n            if(!this.session.$fromUndo) {\n                if(delta.action === \"insertText\") {\n                    for (var i = this.others.length - 1; i >= 0; i--) {\n                        var otherPos = this.others[i];\n                        var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                        if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n                            newPos.column += lengthDiff;\n                        this.doc.insert(newPos, delta.text);\n                    }\n                } else if(delta.action === \"removeText\") {\n                    for (var i = this.others.length - 1; i >= 0; i--) {\n                        var otherPos = this.others[i];\n                        var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                        if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n                            newPos.column += lengthDiff;\n                        this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n                    }\n                }\n                // Special case: insert in beginning\n                if(range.start.column === this.pos.column && delta.action === \"insertText\") {\n                    setTimeout(function() {\n                        this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff);\n                        for (var i = 0; i < this.others.length; i++) {\n                            var other = this.others[i];\n                            var newPos = {row: other.row, column: other.column - lengthDiff};\n                            if(other.row === range.start.row && range.start.column < other.column)\n                                newPos.column += lengthDiff;\n                            other.setPosition(newPos.row, newPos.column);\n                        }\n                    }.bind(this), 0);\n                }\n                else if(range.start.column === this.pos.column && delta.action === \"removeText\") {\n                    setTimeout(function() {\n                        for (var i = 0; i < this.others.length; i++) {\n                            var other = this.others[i];\n                            if(other.row === range.start.row && range.start.column < other.column) {\n                                other.setPosition(other.row, other.column - lengthDiff);\n                            }\n                        }\n                    }.bind(this), 0);\n                }\n            }\n            this.pos._emit(\"change\", {value: this.pos});\n            for (var i = 0; i < this.others.length; i++) {\n                this.others[i]._emit(\"change\", {value: this.others[i]});\n            }\n        }\n        this.$updating = false;\n    };\n\n    this.onCursorChange = function(event) {\n        if (this.$updating) return;\n        var pos = this.session.selection.getCursor();\n        if(pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n            this.showOtherMarkers();\n            this._emit(\"cursorEnter\", event);\n        } else {\n            this.hideOtherMarkers();\n            this._emit(\"cursorLeave\", event);\n        }\n    };    \n    this.detach = function() {\n        this.session.removeMarker(this.markerId);\n        this.hideOtherMarkers();\n        this.doc.removeEventListener(\"change\", this.$onUpdate);\n        this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n        this.pos.detach();\n        for (var i = 0; i < this.others.length; i++) {\n            this.others[i].detach();\n        }\n        this.session.setUndoSelect(true);\n    };\n    this.cancel = function() {\n        if(this.$undoStackDepth === -1)\n            throw Error(\"Canceling placeholders only supported with undo manager attached to session.\");\n        var undoManager = this.session.getUndoManager();\n        var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n        for (var i = 0; i < undosRequired; i++) {\n            undoManager.undo(true);\n        }\n    };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\ndefine('ace/theme/textmate', ['require', 'exports', 'module' , 'text!ace/theme/textmate.css', 'ace/lib/dom'], function(require, exports, module) {\n\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = require('text!./textmate.css');\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\ndefine(\"text!ace/theme/textmate.css\", [], \".ace-tm .ace_editor {\\n\" +\n  \"  border: 2px solid rgb(159, 159, 159);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_editor.ace_focus {\\n\" +\n  \"  border: 2px solid #327fbd;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_gutter {\\n\" +\n  \"  background: #f0f0f0;\\n\" +\n  \"  color: #333;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_print_margin {\\n\" +\n  \"  width: 1px;\\n\" +\n  \"  background: #e8e8e8;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_fold {\\n\" +\n  \"    background-color: #6B72E6;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_scroller {\\n\" +\n  \"  background-color: #FFFFFF;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_cursor {\\n\" +\n  \"  border-left: 2px solid black;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_cursor.ace_overwrite {\\n\" +\n  \"  border-left: 0px;\\n\" +\n  \"  border-bottom: 1px solid black;\\n\" +\n  \"}\\n\" +\n  \"        \\n\" +\n  \".ace-tm .ace_line .ace_invisible {\\n\" +\n  \"  color: rgb(191, 191, 191);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_storage,\\n\" +\n  \".ace-tm .ace_line .ace_keyword {\\n\" +\n  \"  color: blue;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_constant {\\n\" +\n  \"  color: rgb(197, 6, 11);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_constant.ace_buildin {\\n\" +\n  \"  color: rgb(88, 72, 246);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_constant.ace_language {\\n\" +\n  \"  color: rgb(88, 92, 246);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_constant.ace_library {\\n\" +\n  \"  color: rgb(6, 150, 14);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_invalid {\\n\" +\n  \"  background-color: rgba(255, 0, 0, 0.1);\\n\" +\n  \"  color: red;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_support.ace_function {\\n\" +\n  \"  color: rgb(60, 76, 114);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_support.ace_constant {\\n\" +\n  \"  color: rgb(6, 150, 14);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_support.ace_type,\\n\" +\n  \".ace-tm .ace_line .ace_support.ace_class {\\n\" +\n  \"  color: rgb(109, 121, 222);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_keyword.ace_operator {\\n\" +\n  \"  color: rgb(104, 118, 135);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_string {\\n\" +\n  \"  color: rgb(3, 106, 7);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_comment {\\n\" +\n  \"  color: rgb(76, 136, 107);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_comment.ace_doc {\\n\" +\n  \"  color: rgb(0, 102, 255);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_comment.ace_doc.ace_tag {\\n\" +\n  \"  color: rgb(128, 159, 191);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_constant.ace_numeric {\\n\" +\n  \"  color: rgb(0, 0, 205);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_variable {\\n\" +\n  \"  color: rgb(49, 132, 149);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_line .ace_xml_pe {\\n\" +\n  \"  color: rgb(104, 104, 91);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_entity.ace_name.ace_function {\\n\" +\n  \"  color: #0000A2;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_markup.ace_heading {\\n\" +\n  \"  color: rgb(12, 7, 255);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_markup.ace_list {\\n\" +\n  \"  color:rgb(185, 6, 144);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_meta.ace_tag {\\n\" +\n  \"  color:rgb(0, 22, 142);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_string.ace_regex {\\n\" +\n  \"  color: rgb(255, 0, 0)\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_marker-layer .ace_selection {\\n\" +\n  \"  background: rgb(181, 213, 255);\\n\" +\n  \"}\\n\" +\n  \".ace-tm.multiselect .ace_selection.start {\\n\" +\n  \"  box-shadow: 0 0 3px 0px white;\\n\" +\n  \"  border-radius: 2px;\\n\" +\n  \"}\\n\" +\n  \".ace-tm .ace_marker-layer .ace_step {\\n\" +\n  \"  background: rgb(252, 255, 0);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_marker-layer .ace_stack {\\n\" +\n  \"  background: rgb(164, 229, 101);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_marker-layer .ace_bracket {\\n\" +\n  \"  margin: -1px 0 0 -1px;\\n\" +\n  \"  border: 1px solid rgb(192, 192, 192);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_marker-layer .ace_active_line {\\n\" +\n  \"  background: rgba(0, 0, 0, 0.07);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_gutter_active_line {\\n\" +\n  \"    background-color : #dcdcdc;\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_marker-layer .ace_selected_word {\\n\" +\n  \"  background: rgb(250, 250, 255);\\n\" +\n  \"  border: 1px solid rgb(200, 200, 250);\\n\" +\n  \"}\\n\" +\n  \"\\n\" +\n  \".ace-tm .ace_indent-guide {\\n\" +\n  \"  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\n\" +\n  \"}\\n\" +\n  \"\");\n\n;\n            (function() {\n                window.require([\"ace/ace\"], function(a) {\n                    a && a.config.init();\n                    if (!window.ace)\n                        window.ace = {};\n                    for (var key in a) if (a.hasOwnProperty(key))\n                        ace[key] = a[key];\n                });\n            })();\n        "
  },
  {
    "path": "servers/www/assets/js/vendor/ace/keybinding-emacs.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/keyboard/emacs', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/keyboard/hash_handler', 'ace/lib/keys'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\n\nvar screenToTextBlockCoordinates = function(pageX, pageY) {\n    var canvasPos = this.scroller.getBoundingClientRect();\n\n    var col = Math.floor(\n        (pageX + this.scrollLeft - canvasPos.left - this.$padding - dom.getPageScrollLeft()) / this.characterWidth\n    );\n    var row = Math.floor(\n        (pageY + this.scrollTop - canvasPos.top - dom.getPageScrollTop()) / this.lineHeight\n    );\n\n    return this.session.screenToDocumentPosition(row, col);\n};\n\nvar HashHandler = require(\"./hash_handler\").HashHandler;\nexports.handler = new HashHandler();\n\nvar initialized = false;\nexports.handler.attach = function(editor) {\n    if (!initialized) {\n        initialized = true;\n        dom.importCssString('\\\n            .emacs-mode .ace_cursor{\\\n                border: 2px rgba(50,250,50,0.8) solid!important;\\\n                -moz-box-sizing: border-box!important;\\\n                box-sizing: border-box!important;\\\n                background-color: rgba(0,250,0,0.9);\\\n                opacity: 0.5;\\\n            }\\\n            .emacs-mode .ace_cursor.ace_hidden{\\\n                opacity: 1;\\\n                background-color: transparent;\\\n            }\\\n            .emacs-mode .ace_cursor.ace_overwrite {\\\n                opacity: 1;\\\n                background-color: transparent;\\\n                border-width: 0 0 2px 2px !important;\\\n            }\\\n            .emacs-mode .ace_text-layer {\\\n                z-index: 4\\\n            }\\\n            .emacs-mode .ace_cursor-layer {\\\n                z-index: 2\\\n            }', 'emacsMode'\n        );\n    }\n\n    editor.renderer.screenToTextCoordinates = screenToTextBlockCoordinates;\n    editor.setStyle(\"emacs-mode\");\n};\n\nexports.handler.detach = function(editor) {\n    delete editor.renderer.screenToTextCoordinates;\n    editor.unsetStyle(\"emacs-mode\");\n};\n\n\nvar keys = require(\"../lib/keys\").KEY_MODS;\nvar eMods = {\n    C: \"ctrl\", S: \"shift\", M: \"alt\"\n};\n[\"S-C-M\", \"S-C\", \"S-M\", \"C-M\", \"S\", \"C\", \"M\"].forEach(function(c) {\n    var hashId = 0;\n    c.split(\"-\").forEach(function(c){\n        hashId = hashId | keys[eMods[c]];\n    });\n    eMods[hashId] = c.toLowerCase() + \"-\";\n});\n\nexports.handler.bindKey = function(key, command) {\n    if (!key)\n        return;\n\n    var ckb = this.commmandKeyBinding;\n    key.split(\"|\").forEach(function(keyPart) {\n        keyPart = keyPart.toLowerCase();\n        ckb[keyPart] = command;\n        keyPart = keyPart.split(\" \")[0];\n        if (!ckb[keyPart])\n            ckb[keyPart] = \"null\";\n    }, this);\n};\n\n\nexports.handler.handleKeyboard = function(data, hashId, key, keyCode) {\n    if (hashId == -1) {\n        if (data.count) {\n            var str = Array(data.count + 1).join(key);\n            data.count = null;\n            return {command: \"insertstring\", args: str};\n        }\n    }\n\n    if (key == \"\\x00\")\n        return;\n\n    var modifier = eMods[hashId];\n    if (modifier == \"c-\" || data.universalArgument) {\n        var count = parseInt(key[key.length - 1]);\n        if (count) {\n            data.count = count;\n            return {command: \"null\"};\n        }\n    }\n    data.universalArgument = false;\n\n    if (modifier)\n        key = modifier + key;\n\n    if (data.keyChain)\n        key = data.keyChain += \" \" + key;\n\n    var command = this.commmandKeyBinding[key];\n    data.keyChain = command == \"null\" ? key : \"\";\n\n    if (!command)\n        return;\n\n    if (command == \"null\")\n        return {command: \"null\"};\n\n    if (command == \"universalArgument\") {\n        data.universalArgument = true;\n        return {command: \"null\"};\n    }\n\n    if (typeof command != \"string\") {\n        var args = command.args;\n        command = command.command;\n    }\n\n    if (typeof command == \"string\") {\n        command = this.commands[command] || data.editor.commands.commands[command];\n    }\n\n    if (!command.readonly && !command.isYank)\n        data.lastCommand = null;\n\n    if (data.count) {\n        var count = data.count;\n        data.count = 0;\n        return {\n            args: args,\n            command: {\n                exec: function(editor, args) {\n                    for (var i = 0; i < count; i++)\n                        command.exec(editor, args);\n                }\n            }\n        };\n    }\n\n    return {command: command, args: args};\n};\n\nexports.emacsKeys = {\n    // movement\n    \"Up|C-p\"      : \"golineup\",\n    \"Down|C-n\"    : \"golinedown\",\n    \"Left|C-b\"    : \"gotoleft\",\n    \"Right|C-f\"   : \"gotoright\",\n    \"C-Left|M-b\"  : \"gotowordleft\",\n    \"C-Right|M-f\" : \"gotowordright\",\n    \"Home|C-a\"    : \"gotolinestart\",\n    \"End|C-e\"     : \"gotolineend\",\n    \"C-Home|S-M-,\": \"gotostart\",\n    \"C-End|S-M-.\" : \"gotoend\",\n\n    // selection\n    \"S-Up|S-C-p\"      : \"selectup\",\n    \"S-Down|S-C-n\"    : \"selectdown\",\n    \"S-Left|S-C-b\"    : \"selectleft\",\n    \"S-Right|S-C-f\"   : \"selectright\",\n    \"S-C-Left|S-M-b\"  : \"selectwordleft\",\n    \"S-C-Right|S-M-f\" : \"selectwordright\",\n    \"S-Home|S-C-a\"    : \"selecttolinestart\",\n    \"S-End|S-C-e\"     : \"selecttolineend\",\n    \"S-C-Home\"        : \"selecttostart\",\n    \"S-C-End\"         : \"selecttoend\",\n\n    \"C-l\" : \"recenterTopBottom\",\n    \"M-s\" : \"centerselection\",\n    \"M-g\": \"gotoline\",\n    \"C-x C-p\": \"selectall\",\n\n    // todo fix these\n    \"C-Down\": \"gotopagedown\",\n    \"C-Up\": \"gotopageup\",\n    \"PageDown|C-v\": \"gotopagedown\",\n    \"PageUp|M-v\": \"gotopageup\",\n    \"S-C-Down\": \"selectpagedown\",\n    \"S-C-Up\": \"selectpageup\",\n    \"C-s\": \"findnext\",\n    \"C-r\": \"findprevious\",\n    \"M-C-s\": \"findnext\",\n    \"M-C-r\": \"findprevious\",\n    \"S-M-5\": \"replace\",\n\n    // basic editing\n    \"Backspace\": \"backspace\",\n    \"Delete|C-d\": \"del\",\n    \"Return|C-m\": {command: \"insertstring\", args: \"\\n\"}, // \"newline\"\n    \"C-o\": \"splitline\",\n\n    \"M-d|C-Delete\": {command: \"killWord\", args: \"right\"},\n    \"C-Backspace|M-Backspace|M-Delete\": {command: \"killWord\", args: \"left\"},\n    \"C-k\": \"killLine\",\n\n    \"C-y|S-Delete\": \"yank\",\n    \"M-y\": \"yankRotate\",\n    \"C-g\": \"keyboardQuit\",\n\n    \"C-w\": \"killRegion\",\n    \"M-w\": \"killRingSave\",\n\n    \"C-Space\": \"setMark\",\n    \"C-x C-x\": \"exchangePointAndMark\",\n\n    \"C-t\": \"transposeletters\",\n\n    \"M-u\": \"touppercase\",\n    \"M-l\": \"tolowercase\",\n    \"M-/\": \"autocomplete\",\n    \"C-u\": \"universalArgument\",\n    \"M-;\": \"togglecomment\",\n\n    \"C-/|C-x u|S-C--|C-z\": \"undo\",\n    \"S-C-/|S-C-x u|C--|S-C-z\": \"redo\", //infinite undo?\n    // vertical editing\n    \"C-x r\":  \"selectRectangularRegion\"\n\n    // todo\n    // \"M-x\" \"C-x C-t\" \"M-t\" \"M-c\" \"F11\" \"C-M- \"M-q\"\n};\n\n\nexports.handler.bindKeys(exports.emacsKeys);\n\nexports.handler.addCommands({\n    recenterTopBottom: function(editor) {\n        var renderer = editor.renderer;\n        var pos = renderer.$cursorLayer.getPixelPosition();\n        var h = renderer.$size.scrollerHeight - renderer.lineHeight;       \n        var scrollTop = renderer.scrollTop;\n        if (Math.abs(pos.top - scrollTop) < 2) {\n            scrollTop = pos.top - h;\n        } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) {\n            scrollTop = pos.top;\n        } else {\n            scrollTop = pos.top - h * 0.5;\n        }\n        editor.session.setScrollTop(scrollTop);\n    },\n    selectRectangularRegion:  function(editor) {\n        editor.multiSelect.toggleBlockSelection();\n    },\n    setMark:  function() {\n    },\n    exchangePointAndMark: {\n        exec: function(editor) {\n            var range = editor.selection.getRange();\n            editor.selection.setSelectionRange(range, !editor.selection.isBackwards());\n        },\n        readonly: true,\n        multiselectAction: \"forEach\"\n    },\n    killWord: {\n        exec: function(editor, dir) {\n            editor.clearSelection();\n            if (dir == \"left\")\n                editor.selection.selectWordLeft();\n            else\n                editor.selection.selectWordRight();\n\n            var range = editor.getSelectionRange();\n            var text = editor.session.getTextRange(range);\n            exports.killRing.add(text);\n\n            editor.session.remove(range);\n            editor.clearSelection();\n        },\n        multiselectAction: \"forEach\"\n    },\n    killLine: function(editor) {\n        editor.selection.selectLine();\n        var range = editor.getSelectionRange();\n        var text = editor.session.getTextRange(range);\n        exports.killRing.add(text);\n\n        editor.session.remove(range);\n        editor.clearSelection();\n    },\n    yank: function(editor) {\n        editor.onPaste(exports.killRing.get());\n        editor.keyBinding.$data.lastCommand = \"yank\";\n    },\n    yankRotate: function(editor) {\n        if (editor.keyBinding.$data.lastCommand != \"yank\")\n            return;\n\n        editor.undo();\n        editor.onPaste(exports.killRing.rotate());\n        editor.keyBinding.$data.lastCommand = \"yank\";\n    },\n    killRegion: function(editor) {\n        exports.killRing.add(editor.getCopyText());\n        editor.commands.byName.cut.exec(editor);\n    },\n    killRingSave: function(editor) {\n        exports.killRing.add(editor.getCopyText());\n    }\n});\n\nvar commands = exports.handler.commands;\ncommands.yank.isYank = true;\ncommands.yankRotate.isYank = true;\n\nexports.killRing = {\n    $data: [],\n    add: function(str) {\n        str && this.$data.push(str);\n        if (this.$data.length > 30)\n            this.$data.shift();\n    },\n    get: function() {\n        return this.$data[this.$data.length - 1] || \"\";\n    },\n    pop: function() {\n        if (this.$data.length > 1)\n            this.$data.pop();\n        return this.get();\n    },\n    rotate: function() {\n        this.$data.unshift(this.$data.pop());\n        return this.get();\n    }\n};\n\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/keybinding-vim.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/keyboard/vim', ['require', 'exports', 'module' , 'ace/keyboard/vim/commands', 'ace/keyboard/vim/maps/util', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar cmds = require(\"./vim/commands\");\nvar coreCommands = cmds.coreCommands;\nvar util = require(\"./vim/maps/util\");\nvar useragent = require(\"../lib/useragent\");\n\nvar startCommands = {\n    \"i\": {\n        command: coreCommands.start\n    },\n    \"I\": {\n        command: coreCommands.startBeginning\n    },\n    \"a\": {\n        command: coreCommands.append\n    },\n    \"A\": {\n        command: coreCommands.appendEnd\n    },\n    \"ctrl-f\": {\n        command: \"gotopagedown\"\n    },\n    \"ctrl-b\": {\n        command: \"gotopageup\"\n    }\n};\n\nexports.handler = {\n    // workaround for j not repeating with `defaults write -g ApplePressAndHoldEnabled -bool true`\n    handleMacRepeat: function(data, hashId, key) {\n        if (hashId == -1) {\n            // record key\n            data.inputChar = key;\n            data.lastEvent = \"input\";\n        } else if (data.inputChar && data.$lastHash == hashId && data.$lastKey == key) {\n            // check for repeated keypress \n            if (data.lastEvent == \"input\") {\n                data.lastEvent = \"input1\";\n            } else if (data.lastEvent == \"input1\") {\n                // simulate textinput\n                return true;\n            }\n        } else {\n            // reset\n            data.$lastHash = hashId;\n            data.$lastKey = key;\n            data.lastEvent = \"keypress\";\n        }\n    },\n\n    handleKeyboard: function(data, hashId, key, keyCode, e) {\n        // ignore command keys (shift, ctrl etc.)\n        if (hashId != 0 && (key == \"\" || key == \"\\x00\"))\n            return null;\n\n        if (hashId == 1)\n            key = \"ctrl-\" + key;\n        \n        if ((key == \"esc\" && hashId == 0) || key == \"ctrl-[\") {\n            return {command: coreCommands.stop};\n        } else if (data.state == \"start\") {\n            if (useragent.isMac && this.handleMacRepeat(data, hashId, key)) {\n                hashId = -1;\n                key = data.inputChar;\n            }\n            \n            if (hashId == -1 || hashId == 1) {\n                if (cmds.inputBuffer.idle && startCommands[key])\n                    return startCommands[key];\n                return {\n                    command: {\n                        exec: function(editor) {cmds.inputBuffer.push(editor, key);}\n                    }\n                };\n            } // if no modifier || shift: wait for input.\n            else if (key.length == 1 && (hashId == 0 || hashId == 4)) {\n                return {command: \"null\", passEvent: true};\n            } else if (key == \"esc\" && hashId == 0) {\n                return {command: coreCommands.stop};\n            }\n        } else {\n            if (key == \"ctrl-w\") {\n                return {command: \"removewordleft\"};\n            }\n        }\n    },\n\n    attach: function(editor) {\n        editor.on(\"click\", exports.onCursorMove);\n        if (util.currentMode !== \"insert\")\n            cmds.coreCommands.stop.exec(editor);\n        editor.$vimModeHandler = this;\n    },\n\n    detach: function(editor) {\n        editor.removeListener(\"click\", exports.onCursorMove);\n        util.noMode(editor);\n        util.currentMode = \"normal\";\n    },\n\n    actions: cmds.actions,\n    getStatusText: function() {\n        if (util.currentMode == \"insert\")\n            return \"INSERT\";\n        if (util.onVisualMode)\n            return (util.onVisualLineMode ? \"VISUAL LINE \" : \"VISUAL \") + cmds.inputBuffer.status;\n        return cmds.inputBuffer.status;\n    }\n};\n\n\nexports.onCursorMove = function(e) {\n    cmds.onCursorMove(e.editor, e);\n    exports.onCursorMove.scheduled = false;\n};\n\n});\n \ndefine('ace/keyboard/vim/commands', ['require', 'exports', 'module' , 'ace/keyboard/vim/maps/util', 'ace/keyboard/vim/maps/motions', 'ace/keyboard/vim/maps/operators', 'ace/keyboard/vim/maps/aliases', 'ace/keyboard/vim/registers'], function(require, exports, module) {\n\n\"never use strict\";\n\nvar util = require(\"./maps/util\");\nvar motions = require(\"./maps/motions\");\nvar operators = require(\"./maps/operators\");\nvar alias = require(\"./maps/aliases\");\nvar registers = require(\"./registers\");\n\nvar NUMBER = 1;\nvar OPERATOR = 2;\nvar MOTION = 3;\nvar ACTION = 4;\nvar HMARGIN = 8; // Minimum amount of line separation between margins;\n\nvar repeat = function repeat(fn, count, args) {\n    while (0 < count--)\n        fn.apply(this, args);\n};\n\nvar ensureScrollMargin = function(editor) {\n    var renderer = editor.renderer;\n    var pos = renderer.$cursorLayer.getPixelPosition();\n\n    var top = pos.top;\n\n    var margin = HMARGIN * renderer.layerConfig.lineHeight;\n    if (2 * margin > renderer.$size.scrollerHeight)\n        margin = renderer.$size.scrollerHeight / 2;\n\n    if (renderer.scrollTop > top - margin) {\n        renderer.session.setScrollTop(top - margin);\n    }\n\n    if (renderer.scrollTop + renderer.$size.scrollerHeight < top + margin + renderer.lineHeight) {\n        renderer.session.setScrollTop(top + margin + renderer.lineHeight - renderer.$size.scrollerHeight);\n    }\n};\n\nvar actions = exports.actions = {\n    \"z\": {\n        param: true,\n        fn: function(editor, range, count, param) {\n            switch (param) {\n                case \"z\":\n                    editor.alignCursor(null, 0.5);\n                    break;\n                case \"t\":\n                    editor.alignCursor(null, 0);\n                    break;\n                case \"b\":\n                    editor.alignCursor(null, 1);\n                    break;\n            }\n        }\n    },\n    \"r\": {\n        param: true,\n        fn: function(editor, range, count, param) {\n            if (param && param.length) {\n                repeat(function() { editor.insert(param); }, count || 1);\n                editor.navigateLeft();\n            }\n        }\n    },\n    \"R\": {\n        fn: function(editor, range, count, param) {\n            util.insertMode(editor);\n            editor.setOverwrite(true);\n        }\n    },\n    \"~\": {\n        fn: function(editor, range, count) {\n            repeat(function() {\n                var range = editor.selection.getRange();\n                if (range.isEmpty())\n                    range.end.column++;\n                var text = editor.session.getTextRange(range);\n                var toggled = text.toUpperCase();\n                if (toggled == text)\n                    editor.navigateRight();\n                else\n                    editor.session.replace(range, toggled);\n            }, count || 1);\n        }\n    },\n    \"*\": {\n        fn: function(editor, range, count, param) {\n            editor.selection.selectWord();\n            editor.findNext();\n            ensureScrollMargin(editor);\n            var r = editor.selection.getRange();\n            editor.selection.setSelectionRange(r, true);\n        }\n    },\n    \"#\": {\n        fn: function(editor, range, count, param) {\n            editor.selection.selectWord();\n            editor.findPrevious();\n            ensureScrollMargin(editor);\n            var r = editor.selection.getRange();\n            editor.selection.setSelectionRange(r, true);\n        }\n    },\n    \"n\": {\n        fn: function(editor, range, count, param) {\n            var options = editor.getLastSearchOptions();\n            options.backwards = false;\n\n            editor.selection.moveCursorRight();\n            editor.selection.clearSelection();\n            editor.findNext(options);\n\n            ensureScrollMargin(editor);\n            var r = editor.selection.getRange();\n            r.end.row = r.start.row;\n            r.end.column = r.start.column;\n            editor.selection.setSelectionRange(r, true);\n        }\n    },\n    \"N\": {\n        fn: function(editor, range, count, param) {\n            var options = editor.getLastSearchOptions();\n            options.backwards = true;\n\n            editor.findPrevious(options);\n            ensureScrollMargin(editor);\n            var r = editor.selection.getRange();\n            r.end.row = r.start.row;\n            r.end.column = r.start.column;\n            editor.selection.setSelectionRange(r, true);\n        }\n    },\n    \"v\": {\n        fn: function(editor, range, count, param) {\n            editor.selection.selectRight();\n            util.visualMode(editor, false);\n        },\n        acceptsMotion: true\n    },\n    \"V\": {\n        fn: function(editor, range, count, param) {\n            //editor.selection.selectLine();\n            //editor.selection.selectLeft();\n            var row = editor.getCursorPosition().row;\n            editor.selection.clearSelection();\n            editor.selection.moveCursorTo(row, 0);\n            editor.selection.selectLineEnd();\n            editor.selection.visualLineStart = row;\n\n            util.visualMode(editor, true);\n        },\n        acceptsMotion: true\n    },\n    \"Y\": {\n        fn: function(editor, range, count, param) {\n            util.copyLine(editor);\n        }\n    },\n    \"p\": {\n        fn: function(editor, range, count, param) {\n            var defaultReg = registers._default;\n\n            editor.setOverwrite(false);\n            if (defaultReg.isLine) {\n                var pos = editor.getCursorPosition();\n                var lines = defaultReg.text.split(\"\\n\");\n                editor.session.getDocument().insertLines(pos.row + 1, lines);\n                editor.moveCursorTo(pos.row + 1, 0);\n            }\n            else {\n                editor.navigateRight();\n                editor.insert(defaultReg.text);\n                editor.navigateLeft();\n            }\n            editor.setOverwrite(true);\n            editor.selection.clearSelection();\n        }\n    },\n    \"P\": {\n        fn: function(editor, range, count, param) {\n            var defaultReg = registers._default;\n            editor.setOverwrite(false);\n\n            if (defaultReg.isLine) {\n                var pos = editor.getCursorPosition();\n                var lines = defaultReg.text.split(\"\\n\");\n                editor.session.getDocument().insertLines(pos.row, lines);\n                editor.moveCursorTo(pos.row, 0);\n            }\n            else {\n                editor.insert(defaultReg.text);\n            }\n            editor.setOverwrite(true);\n            editor.selection.clearSelection();\n        }\n    },\n    \"J\": {\n        fn: function(editor, range, count, param) {\n            var session = editor.session;\n            range = editor.getSelectionRange();\n            var pos = {row: range.start.row, column: range.start.column};\n            count = count || range.end.row - range.start.row;\n            var maxRow = Math.min(pos.row + (count || 1), session.getLength() - 1);\n\n            range.start.column = session.getLine(pos.row).length;\n            range.end.column = session.getLine(maxRow).length;\n            range.end.row = maxRow;\n\n            var text = \"\";\n            for (var i = pos.row; i < maxRow; i++) {\n                var nextLine = session.getLine(i + 1);\n                text += \" \" + /^\\s*(.*)$/.exec(nextLine)[1] || \"\";\n            }\n\n            session.replace(range, text);\n            editor.moveCursorTo(pos.row, pos.column);\n        }\n    },\n    \"u\": {\n        fn: function(editor, range, count, param) {\n            count = parseInt(count || 1, 10);\n            for (var i = 0; i < count; i++) {\n                editor.undo();\n            }\n            editor.selection.clearSelection();\n        }\n    },\n    \"ctrl-r\": {\n        fn: function(editor, range, count, param) {\n            count = parseInt(count || 1, 10);\n            for (var i = 0; i < count; i++) {\n                editor.redo();\n            }\n            editor.selection.clearSelection();\n        }\n    },\n    \":\": {\n        fn: function(editor, range, count, param) {\n            // not implemented\n        }\n    },\n    \"/\": {\n        fn: function(editor, range, count, param) {\n            // not implemented\n        }\n    },\n    \"?\": {\n        fn: function(editor, range, count, param) {\n            // not implemented\n        }\n    },\n    \".\": {\n        fn: function(editor, range, count, param) {\n            util.onInsertReplaySequence = inputBuffer.lastInsertCommands;\n            var previous = inputBuffer.previous;\n            if (previous) // If there is a previous action\n                inputBuffer.exec(editor, previous.action, previous.param);\n        }\n    }\n};\n\nvar inputBuffer = exports.inputBuffer = {\n    accepting: [NUMBER, OPERATOR, MOTION, ACTION],\n    currentCmd: null,\n    //currentMode: 0,\n    currentCount: \"\",\n    status: \"\",\n\n    // Types\n    operator: null,\n    motion: null,\n\n    lastInsertCommands: [],\n\n    push: function(editor, char, keyId) {\n        this.idle = false;\n        var wObj = this.waitingForParam;\n        if (wObj) {\n            this.exec(editor, wObj, char);\n        }\n        // If input is a number (that doesn't start with 0)\n        else if (!(char === \"0\" && !this.currentCount.length) &&\n            (char.match(/^\\d+$/) && this.isAccepting(NUMBER))) {\n            // Assuming that char is always of type String, and not Number\n            this.currentCount += char;\n            this.currentCmd = NUMBER;\n            this.accepting = [NUMBER, OPERATOR, MOTION, ACTION];\n        }\n        else if (!this.operator && this.isAccepting(OPERATOR) && operators[char]) {\n            this.operator = {\n                char: char,\n                count: this.getCount()\n            };\n            this.currentCmd = OPERATOR;\n            this.accepting = [NUMBER, MOTION, ACTION];\n            this.exec(editor, { operator: this.operator });\n        }\n        else if (motions[char] && this.isAccepting(MOTION)) {\n            this.currentCmd = MOTION;\n\n            var ctx = {\n                operator: this.operator,\n                motion: {\n                    char: char,\n                    count: this.getCount()\n                }\n            };\n\n            if (motions[char].param)\n                this.waitForParam(ctx);\n            else\n                this.exec(editor, ctx);\n        }\n        else if (alias[char] && this.isAccepting(MOTION)) {\n            alias[char].operator.count = this.getCount();\n            this.exec(editor, alias[char]);\n        }\n        else if (actions[char] && this.isAccepting(ACTION)) {\n            var actionObj = {\n                action: {\n                    fn: actions[char].fn,\n                    count: this.getCount()\n                }\n            };\n\n            if (actions[char].param) {\n                this.waitForParam(actionObj);\n            }\n            else {\n                this.exec(editor, actionObj);\n            }\n\n            if (actions[char].acceptsMotion)\n                this.idle = false;\n        }\n        else if (this.operator) {\n            this.exec(editor, { operator: this.operator }, char);\n        }\n        else {\n            this.reset();\n        }\n        \n        if (this.waitingForParam || this.motion || this.operator) {\n            this.status += char;\n        } else if (this.currentCount) {\n            this.status = this.currentCount;\n        } else if (this.status) {\n            this.status = \"\";\n        } else {\n            return;\n        }\n        editor._emit(\"changeStatus\");\n    },\n\n    waitForParam: function(cmd) {\n        this.waitingForParam = cmd;\n    },\n\n    getCount: function() {\n        var count = this.currentCount;\n        this.currentCount = \"\";\n        return count && parseInt(count, 10);\n    },\n\n    exec: function(editor, action, param) {\n        var m = action.motion;\n        var o = action.operator;\n        var a = action.action;\n\n        if (!param)\n            param = action.param;\n\n        if (o) {\n            this.previous = {\n                action: action,\n                param: param\n            };\n        }\n\n        if (o && !editor.selection.isEmpty()) {\n            if (operators[o.char].selFn) {\n                operators[o.char].selFn(editor, editor.getSelectionRange(), o.count, param);\n                this.reset();\n            }\n            return;\n        }\n\n        // There is an operator, but no motion or action. We try to pass the\n        // current char to the operator to see if it responds to it (an example\n        // of this is the 'dd' operator).\n        else if (!m && !a && o && param) {\n            operators[o.char].fn(editor, null, o.count, param);\n            this.reset();\n        }\n        else if (m) {\n            var run = function(fn) {\n                if (fn && typeof fn === \"function\") { // There should always be a motion\n                    if (m.count && !motionObj.handlesCount)\n                        repeat(fn, m.count, [editor, null, m.count, param]);\n                    else\n                        fn(editor, null, m.count, param);\n                }\n            };\n\n            var motionObj = motions[m.char];\n            var selectable = motionObj.sel;\n\n            if (!o) {\n                if ((util.onVisualMode || util.onVisualLineMode) && selectable)\n                    run(motionObj.sel);\n                else\n                    run(motionObj.nav);\n            }\n            else if (selectable) {\n                repeat(function() {\n                    run(motionObj.sel);\n                    operators[o.char].fn(editor, editor.getSelectionRange(), o.count, param);\n                }, o.count || 1);\n            }\n            this.reset();\n        }\n        else if (a) {\n            a.fn(editor, editor.getSelectionRange(), a.count, param);\n            this.reset();\n        }\n        handleCursorMove(editor);\n    },\n\n    isAccepting: function(type) {\n        return this.accepting.indexOf(type) !== -1;\n    },\n\n    reset: function() {\n        this.operator = null;\n        this.motion = null;\n        this.currentCount = \"\";\n        this.status = \"\";\n        this.accepting = [NUMBER, OPERATOR, MOTION, ACTION];\n        this.idle = true;\n        this.waitingForParam = null;\n    }\n};\n\nfunction setPreviousCommand(fn) {\n    inputBuffer.previous = { action: { action: { fn: fn } } };\n}\n\nexports.coreCommands = {\n    start: {\n        exec: function start(editor) {\n            util.insertMode(editor);\n            setPreviousCommand(start);\n        }\n    },\n    startBeginning: {\n        exec: function startBeginning(editor) {\n            editor.navigateLineStart();\n            util.insertMode(editor);\n            setPreviousCommand(startBeginning);\n        }\n    },\n    // Stop Insert mode as soon as possible. Works like typing <Esc> in\n    // insert mode.\n    stop: {\n        exec: function stop(editor) {\n            inputBuffer.reset();\n            util.onVisualMode = false;\n            util.onVisualLineMode = false;\n            inputBuffer.lastInsertCommands = util.normalMode(editor);\n        }\n    },\n    append: {\n        exec: function append(editor) {\n            var pos = editor.getCursorPosition();\n            var lineLen = editor.session.getLine(pos.row).length;\n            if (lineLen)\n                editor.navigateRight();\n            util.insertMode(editor);\n            setPreviousCommand(append);\n        }\n    },\n    appendEnd: {\n        exec: function appendEnd(editor) {\n            editor.navigateLineEnd();\n            util.insertMode(editor);\n            setPreviousCommand(appendEnd);\n        }\n    }\n};\n\nvar handleCursorMove = exports.onCursorMove = function(editor, e) {\n    if (util.currentMode === 'insert' || handleCursorMove.running)\n        return;\n    else if(!editor.selection.isEmpty()) {\n        handleCursorMove.running = true;\n        if (util.onVisualLineMode) {\n            var originRow = editor.selection.visualLineStart;\n            var cursorRow = editor.getCursorPosition().row;\n            if(originRow <= cursorRow) {\n                var endLine = editor.session.getLine(cursorRow);\n                editor.selection.clearSelection();\n                editor.selection.moveCursorTo(originRow, 0);\n                editor.selection.selectTo(cursorRow, endLine.length);\n            } else {\n                var endLine = editor.session.getLine(originRow);\n                editor.selection.clearSelection();\n                editor.selection.moveCursorTo(originRow, endLine.length);\n                editor.selection.selectTo(cursorRow, 0);\n            }\n        }\n        handleCursorMove.running = false;\n        return;\n    }\n    else {\n        if (e && (util.onVisualLineMode || util.onVisualMode)) {\n            editor.selection.clearSelection();\n            util.normalMode(editor);\n        }\n\n        handleCursorMove.running = true;\n        var pos = editor.getCursorPosition();\n        var lineLen = editor.session.getLine(pos.row).length;\n\n        if (lineLen && pos.column === lineLen)\n            editor.navigateLeft();\n        handleCursorMove.running = false;\n    }\n};\n});\ndefine('ace/keyboard/vim/maps/util', ['require', 'exports', 'module' , 'ace/keyboard/vim/registers', 'ace/lib/dom'], function(require, exports, module) {\nvar registers = require(\"../registers\");\n\nvar dom = require(\"../../../lib/dom\");\ndom.importCssString('.insert-mode. ace_cursor{\\\n    border-left: 2px solid #333333;\\\n}\\\n.ace_dark.insert-mode .ace_cursor{\\\n    border-left: 2px solid #eeeeee;\\\n}\\\n.normal-mode .ace_cursor{\\\n    border: 0!important;\\\n    background-color: red;\\\n    opacity: 0.5;\\\n}', 'vimMode');\n\nmodule.exports = {\n    onVisualMode: false,\n    onVisualLineMode: false,\n    currentMode: 'normal',\n    noMode: function(editor) {\n        editor.unsetStyle('insert-mode');\n        editor.unsetStyle('normal-mode');\n        if (editor.commands.recording)\n            editor.commands.toggleRecording(editor);\n        editor.setOverwrite(false);\n    },\n    insertMode: function(editor) {\n        this.currentMode = 'insert';\n        // Switch editor to insert mode\n        editor.setStyle('insert-mode');\n        editor.unsetStyle('normal-mode');\n\n        editor.setOverwrite(false);\n        editor.keyBinding.$data.buffer = \"\";\n        editor.keyBinding.$data.state = \"insertMode\";\n        this.onVisualMode = false;\n        this.onVisualLineMode = false;\n        if(this.onInsertReplaySequence) {\n            // Ok, we're apparently replaying (\".\"), so let's do it\n            editor.commands.macro = this.onInsertReplaySequence;\n            editor.commands.replay(editor);\n            this.onInsertReplaySequence = null;\n            this.normalMode(editor);\n        } else {\n            editor._emit(\"changeStatus\");\n            // Record any movements, insertions in insert mode\n            if(!editor.commands.recording)\n                editor.commands.toggleRecording(editor);\n        }\n    },\n    normalMode: function(editor) {\n        // Switch editor to normal mode\n        this.currentMode = 'normal';\n\n        editor.unsetStyle('insert-mode');\n        editor.setStyle('normal-mode');\n        editor.clearSelection();\n\n        var pos;\n        if (!editor.getOverwrite()) {\n            pos = editor.getCursorPosition();\n            if (pos.column > 0)\n                editor.navigateLeft();\n        }\n\n        editor.setOverwrite(true);\n        editor.keyBinding.$data.buffer = \"\";\n        editor.keyBinding.$data.state = \"start\";\n        this.onVisualMode = false;\n        this.onVisualLineMode = false;\n        editor._emit(\"changeStatus\");\n        // Save recorded keystrokes\n        if (editor.commands.recording) {\n            editor.commands.toggleRecording(editor);\n            return editor.commands.macro;\n        }\n        else {\n            return [];\n        }\n    },\n    visualMode: function(editor, lineMode) {\n        if (\n            (this.onVisualLineMode && lineMode)\n            || (this.onVisualMode && !lineMode)\n        ) {\n            this.normalMode(editor);\n            return;\n        }\n\n        editor.setStyle('insert-mode');\n        editor.unsetStyle('normal-mode');\n\n        editor._emit(\"changeStatus\");\n        if (lineMode) {\n            this.onVisualLineMode = true;\n        } else {\n            this.onVisualMode = true;\n            this.onVisualLineMode = false;\n        }\n    },\n    getRightNthChar: function(editor, cursor, char, n) {\n        var line = editor.getSession().getLine(cursor.row);\n        var matches = line.substr(cursor.column + 1).split(char);\n\n        return n < matches.length ? matches.slice(0, n).join(char).length : null;\n    },\n    getLeftNthChar: function(editor, cursor, char, n) {\n        var line = editor.getSession().getLine(cursor.row);\n        var matches = line.substr(0, cursor.column).split(char);\n\n        return n < matches.length ? matches.slice(-1 * n).join(char).length : null;\n    },\n    toRealChar: function(char) {\n        if (char.length === 1)\n            return char;\n\n        if (/^shift-./.test(char))\n            return char[char.length - 1].toUpperCase();\n        else\n            return \"\";\n    },\n    copyLine: function(editor) {\n        var pos = editor.getCursorPosition();\n        editor.selection.clearSelection();\n        editor.moveCursorTo(pos.row, pos.column);\n        editor.selection.selectLine();\n        registers._default.isLine = true;\n        registers._default.text = editor.getCopyText().replace(/\\n$/, \"\");\n        editor.selection.clearSelection();\n        editor.moveCursorTo(pos.row, pos.column);\n    }\n};\n});\n\ndefine('ace/keyboard/vim/registers', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\"never use strict\";\n\nmodule.exports = {\n    _default: {\n        text: \"\",\n        isLine: false\n    }\n};\n\n});\n\n\"use strict\"\n\ndefine('ace/keyboard/vim/maps/motions', ['require', 'exports', 'module' , 'ace/keyboard/vim/maps/util', 'ace/search', 'ace/range'], function(require, exports, module) {\n\nvar util = require(\"./util\");\n\nvar keepScrollPosition = function(editor, fn) {\n    var scrollTopRow = editor.renderer.getScrollTopRow();\n    var initialRow = editor.getCursorPosition().row;\n    var diff = initialRow - scrollTopRow;\n    fn && fn.call(editor);\n    editor.renderer.scrollToRow(editor.getCursorPosition().row - diff);\n};\n\nfunction Motion(getRange, type){\n    if (type == 'extend')\n        var extend = true;\n    else\n        var reverse = type;\n\n    this.nav = function(editor) {\n        var r = getRange(editor);\n        if (!r)\n            return;\n        if (!r.end)\n            var a = r;\n        else if (reverse)\n            var a = r.start;\n        else\n            var a = r.end;\n\n        editor.clearSelection();\n        editor.moveCursorTo(a.row, a.column);\n    }\n    this.sel = function(editor){\n        var r = getRange(editor);\n        if (!r)\n            return;\n        if (extend)\n            return editor.selection.setSelectionRange(r);\n\n        if (!r.end)\n            var a = r;\n        else if (reverse)\n            var a = r.start;\n        else\n            var a = r.end;\n\n        editor.selection.selectTo(a.row, a.column);\n    }\n}\n\nvar nonWordRe = /[\\s.\\/\\\\()\\\"'-:,.;<>~!@#$%^&*|+=\\[\\]{}`~?]/;\nvar wordSeparatorRe = /[.\\/\\\\()\\\"'-:,.;<>~!@#$%^&*|+=\\[\\]{}`~?]/;\nvar whiteRe = /\\s/;\nvar StringStream = function(editor, cursor) {\n    var sel = editor.selection;\n    this.range = sel.getRange();\n    cursor = cursor || sel.selectionLead;\n    this.row = cursor.row;\n    this.col = cursor.column;\n    var line = editor.session.getLine(this.row);\n    var maxRow = editor.session.getLength()\n    this.ch = line[this.col] || '\\n'\n    this.skippedLines = 0;\n\n    this.next = function() {\n        this.ch = line[++this.col] || this.handleNewLine(1);\n        //this.debug()\n        return this.ch;\n    }\n    this.prev = function() {\n        this.ch = line[--this.col] || this.handleNewLine(-1);\n        //this.debug()\n        return this.ch;\n    }\n    this.peek = function(dir) {\n        var ch = line[this.col + dir];\n        if (ch)\n            return ch;\n        if (dir == -1)\n            return '\\n';\n        if (this.col == line.length - 1)\n            return '\\n';\n        return editor.session.getLine(this.row + 1)[0] || '\\n';\n    }\n\n    this.handleNewLine = function(dir) {\n        if (dir == 1){\n            if (this.col == line.length)\n                return '\\n';\n            if (this.row == maxRow - 1)\n                return '';\n            this.col = 0;\n            this.row ++;\n            line = editor.session.getLine(this.row);\n            this.skippedLines++;\n            return line[0] || '\\n';\n        }\n        if (dir == -1) {\n            if (this.row == 0)\n                return '';\n            this.row --;\n            line = editor.session.getLine(this.row);\n            this.col = line.length;\n            this.skippedLines--;\n            return '\\n';\n        }\n    }\n    this.debug = function() {\n        console.log(line.substring(0, this.col)+'|'+this.ch+'\\''+this.col+'\\''+line.substr(this.col+1));\n    }\n}\n\nvar Search = require(\"ace/search\").Search;\nvar search = new Search();\n\nfunction find(editor, needle, dir) {\n    search.$options.needle = needle;\n    search.$options.backwards = dir == -1;\n    return search.find(editor.session);\n}\n\nvar Range = require(\"ace/range\").Range;\n\nmodule.exports = {\n    \"w\": new Motion(function(editor) {\n        var str = new StringStream(editor);\n\n        if (str.ch && wordSeparatorRe.test(str.ch)) {\n            while (str.ch && wordSeparatorRe.test(str.ch))\n                str.next();\n        } else {\n            while (str.ch && !nonWordRe.test(str.ch))\n                str.next();\n        }\n        while (str.ch && whiteRe.test(str.ch) && str.skippedLines < 2)\n            str.next();\n\n        str.skippedLines == 2 && str.prev();\n        return {column: str.col, row: str.row};\n    }),\n    \"W\": new Motion(function(editor) {\n        var str = new StringStream(editor);\n        while(str.ch && !(whiteRe.test(str.ch) && !whiteRe.test(str.peek(1))) && str.skippedLines < 2)\n            str.next();\n        if (str.skippedLines == 2)\n            str.prev();\n        else\n            str.next();\n\n        return {column: str.col, row: str.row}\n    }),\n    \"b\": new Motion(function(editor) {\n        var str = new StringStream(editor);\n\n        str.prev();\n        while (str.ch && whiteRe.test(str.ch) && str.skippedLines > -2)\n            str.prev();\n\n        if (str.ch && wordSeparatorRe.test(str.ch)) {\n            while (str.ch && wordSeparatorRe.test(str.ch))\n                str.prev();\n        } else {\n            while (str.ch && !nonWordRe.test(str.ch))\n                str.prev();\n        }\n        str.ch && str.next();\n        return {column: str.col, row: str.row};\n    }),\n    \"B\": new Motion(function(editor) {\n        var str = new StringStream(editor)\n        str.prev();\n        while(str.ch && !(!whiteRe.test(str.ch) && whiteRe.test(str.peek(-1))) && str.skippedLines > -2)\n            str.prev();\n\n        if (str.skippedLines == -2)\n            str.next();\n\n        return {column: str.col, row: str.row};\n    }, true),\n    \"e\": new Motion(function(editor) {\n        var str = new StringStream(editor);\n\n        str.next();\n        while (str.ch && whiteRe.test(str.ch))\n            str.next();\n\n        if (str.ch && wordSeparatorRe.test(str.ch)) {\n            while (str.ch && wordSeparatorRe.test(str.ch))\n                str.next();\n        } else {\n            while (str.ch && !nonWordRe.test(str.ch))\n                str.next();\n        }\n        str.ch && str.prev();\n        return {column: str.col, row: str.row};\n    }),\n    \"E\": new Motion(function(editor) {\n        var str = new StringStream(editor);\n        str.next();\n        while(str.ch && !(!whiteRe.test(str.ch) && whiteRe.test(str.peek(1))))\n            str.next();\n\n        return {column: str.col, row: str.row};\n    }),\n\n    \"l\": {\n        nav: function(editor) {\n            editor.navigateRight();\n        },\n        sel: function(editor) {\n            var pos = editor.getCursorPosition();\n            var col = pos.column;\n            var lineLen = editor.session.getLine(pos.row).length;\n\n            // Solving the behavior at the end of the line due to the\n            // different 0 index-based colum positions in ACE.\n            if (lineLen && col !== lineLen) //In selection mode you can select the newline\n                editor.selection.selectRight();\n        }\n    },\n    \"h\": {\n        nav: function(editor) {\n            var pos = editor.getCursorPosition();\n            if (pos.column > 0)\n                editor.navigateLeft();\n        },\n        sel: function(editor) {\n            var pos = editor.getCursorPosition();\n            if (pos.column > 0)\n                editor.selection.selectLeft();\n        }\n    },\n    \"H\": {\n        nav: function(editor) {\n            var row = editor.renderer.getScrollTopRow();\n            editor.moveCursorTo(row);\n        },\n        sel: function(editor) {\n            var row = editor.renderer.getScrollTopRow();\n            editor.selection.selectTo(row);\n        }\n    },\n    \"M\": {\n        nav: function(editor) {\n            var topRow = editor.renderer.getScrollTopRow();\n            var bottomRow = editor.renderer.getScrollBottomRow();\n            var row = topRow + ((bottomRow - topRow) / 2);\n            editor.moveCursorTo(row);\n        },\n        sel: function(editor) {\n            var topRow = editor.renderer.getScrollTopRow();\n            var bottomRow = editor.renderer.getScrollBottomRow();\n            var row = topRow + ((bottomRow - topRow) / 2);\n            editor.selection.selectTo(row);\n        }\n    },\n    \"L\": {\n        nav: function(editor) {\n            var row = editor.renderer.getScrollBottomRow();\n            editor.moveCursorTo(row);\n        },\n        sel: function(editor) {\n            var row = editor.renderer.getScrollBottomRow();\n            editor.selection.selectTo(row);\n        }\n    },\n    \"k\": {\n        nav: function(editor) {\n            editor.navigateUp();\n        },\n        sel: function(editor) {\n            editor.selection.selectUp();\n        }\n    },\n    \"j\": {\n        nav: function(editor) {\n            editor.navigateDown();\n        },\n        sel: function(editor) {\n            editor.selection.selectDown();\n        }\n    },\n\n    \"i\": {\n        param: true,\n        sel: function(editor, range, count, param) {\n            switch (param) {\n                case \"w\":\n                    editor.selection.selectWord();\n                    break;\n                case \"W\":\n                    editor.selection.selectAWord();\n                    break;\n                case \"(\":\n                case \"{\":\n                case \"[\":\n                    var cursor = editor.getCursorPosition();\n                    var end = editor.session.$findClosingBracket(param, cursor, /paren/);\n                    if (!end)\n                        return;\n                    var start = editor.session.$findOpeningBracket(editor.session.$brackets[param], cursor, /paren/);\n                    if (!start)\n                        return;\n                    start.column ++;\n                    editor.selection.setSelectionRange(Range.fromPoints(start, end));\n                    break;\n                case \"'\":\n                case '\"':\n                case \"/\":\n                    var end = find(editor, param, 1);\n                    if (!end)\n                        return;\n                    var start = find(editor, param, -1);\n                    if (!start)\n                        return;\n                    editor.selection.setSelectionRange(Range.fromPoints(start.end, end.start));\n                    break;\n            }\n        }\n    },\n    \"a\": {\n        param: true,\n        sel: function(editor, range, count, param) {\n            switch (param) {\n                case \"w\":\n                    editor.selection.selectAWord();\n                    break;\n                case \"W\":\n                    editor.selection.selectAWord();\n                    break;\n                case \"(\":\n                case \"{\":\n                case \"[\":\n                    var cursor = editor.getCursorPosition();\n                    var end = editor.session.$findClosingBracket(param, cursor, /paren/);\n                    if (!end)\n                        return;\n                    var start = editor.session.$findOpeningBracket(editor.session.$brackets[param], cursor, /paren/);\n                    if (!start)\n                        return;\n                    end.column ++;\n                    editor.selection.setSelectionRange(Range.fromPoints(start, end));\n                    break;\n                case \"'\":\n                case \"\\\"\":\n                case \"/\":\n                    var end = find(editor, param, 1);\n                    if (!end)\n                        return;\n                    var start = find(editor, param, -1);\n                    if (!start)\n                        return;\n                    end.column ++;\n                    editor.selection.setSelectionRange(Range.fromPoints(start.start, end.end));\n                    break;\n            }\n        }\n    },\n\n    \"f\": {\n        param: true,\n        handlesCount: true,\n        nav: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getRightNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.selection.clearSelection(); // Why does it select in the first place?\n                ed.moveCursorTo(cursor.row, column + cursor.column + 1);\n            }\n        },\n        sel: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getRightNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.moveCursorTo(cursor.row, column + cursor.column + 1);\n            }\n        }\n    },\n    \"F\": {\n        param: true,\n        handlesCount: true,\n        nav: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getLeftNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.selection.clearSelection(); // Why does it select in the first place?\n                ed.moveCursorTo(cursor.row, cursor.column - column - 1);\n            }\n        },\n        sel: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getLeftNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.moveCursorTo(cursor.row, cursor.column - column - 1);\n            }\n        }\n    },\n    \"t\": {\n        param: true,\n        handlesCount: true,\n        nav: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getRightNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.selection.clearSelection(); // Why does it select in the first place?\n                ed.moveCursorTo(cursor.row, column + cursor.column);\n            }\n        },\n        sel: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getRightNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.moveCursorTo(cursor.row, column + cursor.column);\n            }\n        }\n    },\n    \"T\": {\n        param: true,\n        handlesCount: true,\n        nav: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getLeftNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.selection.clearSelection(); // Why does it select in the first place?\n                ed.moveCursorTo(cursor.row, -column + cursor.column);\n            }\n        },\n        sel: function(editor, range, count, param) {\n            var ed = editor;\n            var cursor = ed.getCursorPosition();\n            var column = util.getLeftNthChar(editor, cursor, param, count || 1);\n\n            if (typeof column === \"number\") {\n                ed.moveCursorTo(cursor.row, -column + cursor.column);\n            }\n        }\n    },\n\n    \"^\": {\n        nav: function(editor) {\n            editor.navigateLineStart();\n        },\n        sel: function(editor) {\n            editor.selection.selectLineStart();\n        }\n    },\n    \"$\": {\n        nav: function(editor) {\n            editor.navigateLineEnd();\n        },\n        sel: function(editor) {\n            editor.selection.selectLineEnd();\n        }\n    },\n    \"0\": new Motion(function(ed) {\n        return {row: ed.selection.lead.row, column: 0};\n    }),\n    \"G\": {\n        nav: function(editor, range, count, param) {\n            if (!count && count !== 0) { // Stupid JS\n                count = editor.session.getLength();\n            }\n            editor.gotoLine(count);\n        },\n        sel: function(editor, range, count, param) {\n            if (!count && count !== 0) { // Stupid JS\n                count = editor.session.getLength();\n            }\n            editor.selection.selectTo(count, 0);\n        }\n    },\n    \"g\": {\n        param: true,\n        nav: function(editor, range, count, param) {\n            switch(param) {\n                case \"m\":\n                    console.log(\"Middle line\");\n                    break;\n                case \"e\":\n                    console.log(\"End of prev word\");\n                    break;\n                case \"g\":\n                    editor.gotoLine(count || 0);\n                case \"u\":\n                    editor.gotoLine(count || 0);\n                case \"U\":\n                    editor.gotoLine(count || 0);\n            }\n        },\n        sel: function(editor, range, count, param) {\n            switch(param) {\n                case \"m\":\n                    console.log(\"Middle line\");\n                    break;\n                case \"e\":\n                    console.log(\"End of prev word\");\n                    break;\n                case \"g\":\n                    editor.selection.selectTo(count || 0, 0);\n            }\n        }\n    },\n    \"o\": {\n        nav: function(editor, range, count, param) {\n            count = count || 1;\n            var content = \"\";\n            while (0 < count--)\n                content += \"\\n\";\n\n            if (content.length) {\n                editor.navigateLineEnd()\n                editor.insert(content);\n                util.insertMode(editor);\n            }\n        }\n    },\n    \"O\": {\n        nav: function(editor, range, count, param) {\n            var row = editor.getCursorPosition().row;\n            count = count || 1;\n            var content = \"\";\n            while (0 < count--)\n                content += \"\\n\";\n\n            if (content.length) {\n                if(row > 0) {\n                    editor.navigateUp();\n                    editor.navigateLineEnd()\n                    editor.insert(content);\n                } else {\n                    editor.session.insert({row: 0, column: 0}, content);\n                    editor.navigateUp();\n                }\n                util.insertMode(editor);\n            }\n        }\n    },\n    \"%\": new Motion(function(editor){\n        var brRe = /[\\[\\]{}()]/g;\n        var cursor = editor.getCursorPosition();\n        var ch = editor.session.getLine(cursor.row)[cursor.column];\n        if (!brRe.test(ch)) {\n            var range = find(editor, brRe);\n            if (!range)\n                return;\n            cursor = range.start;\n        }\n        var match = editor.session.findMatchingBracket({\n            row: cursor.row,\n            column: cursor.column + 1\n        });\n\n        return match;\n    }),\n    \"{\": new Motion(function(ed) {\n        var session = ed.session;\n        var row = session.selection.lead.row;\n        while(row > 0 && !/\\S/.test(session.getLine(row)))\n            row--;\n        while(/\\S/.test(session.getLine(row)))\n            row--;\n        return {column: 0, row: row};\n    }),\n    \"}\": new Motion(function(ed) {\n        var session = ed.session;\n        var l = session.getLength();\n        var row = session.selection.lead.row;\n        while(row < l && !/\\S/.test(session.getLine(row)))\n            row++;\n        while(/\\S/.test(session.getLine(row)))\n            row++;        \n        return {column: 0, row: row};\n    }),\n    \"ctrl-d\": {\n        nav: function(editor, range, count, param) {\n            editor.selection.clearSelection();\n            keepScrollPosition(editor, editor.gotoPageDown);\n        },\n        sel: function(editor, range, count, param) {\n            keepScrollPosition(editor, editor.selectPageDown);\n        }\n    },\n    \"ctrl-u\": {\n        nav: function(editor, range, count, param) {\n            editor.selection.clearSelection();\n            keepScrollPosition(editor, editor.gotoPageUp);\n\n        },\n        sel: function(editor, range, count, param) {\n            keepScrollPosition(editor, editor.selectPageUp);\n        }\n    },\n};\n\nmodule.exports.backspace = module.exports.left = module.exports.h;\nmodule.exports.right = module.exports.l;\nmodule.exports.up = module.exports.k;\nmodule.exports.down = module.exports.j;\nmodule.exports.pagedown = module.exports[\"ctrl-d\"];\nmodule.exports.pageup = module.exports[\"ctrl-u\"];\n\n});\n \ndefine('ace/keyboard/vim/maps/operators', ['require', 'exports', 'module' , 'ace/keyboard/vim/maps/util', 'ace/keyboard/vim/registers'], function(require, exports, module) {\n\n\"never use strict\";\n\nvar util = require(\"./util\");\nvar registers = require(\"../registers\");\n\nmodule.exports = {\n    \"d\": {\n        selFn: function(editor, range, count, param) {\n            registers._default.text = editor.getCopyText();\n            registers._default.isLine = util.onVisualLineMode;\n            if(util.onVisualLineMode)\n                editor.removeLines();\n            else\n                editor.session.remove(range);\n            util.normalMode(editor);\n        },\n        fn: function(editor, range, count, param) {\n            count = count || 1;\n            switch (param) {\n                case \"d\":\n                    registers._default.text = \"\";\n                    registers._default.isLine = true;\n                    for (var i = 0; i < count; i++) {\n                        editor.selection.selectLine();\n                        registers._default.text += editor.getCopyText();\n                        var selRange = editor.getSelectionRange();\n                        // check if end of the document was reached\n                        if (!selRange.isMultiLine()) {\n                            lastLineReached = true\n                            var row = selRange.start.row - 1;\n                            var col = editor.session.getLine(row).length\n                            selRange.setStart(row, col);\n                            editor.session.remove(selRange);\n                            editor.selection.clearSelection();\n                            break;\n                        }\n                        editor.session.remove(selRange);\n                        editor.selection.clearSelection();\n                    }\n                    registers._default.text = registers._default.text.replace(/\\n$/, \"\");\n                    break;\n                default:\n                    if (range) {\n                        editor.selection.setSelectionRange(range);\n                        registers._default.text = editor.getCopyText();\n                        registers._default.isLine = false;\n                        editor.session.remove(range);\n                        editor.selection.clearSelection();\n                    }\n            }\n        }\n    },\n    \"c\": {\n        selFn: function(editor, range, count, param) {\n            editor.session.remove(range);\n            util.insertMode(editor);\n        },\n        fn: function(editor, range, count, param) {\n            count = count || 1;\n            switch (param) {\n                case \"c\":\n                    for (var i = 0; i < count; i++) {\n                        editor.removeLines();\n                        util.insertMode(editor);\n                    }\n\n                    break;\n                default:\n                    if (range) {\n\n                        // range.end.column ++;\n                        editor.session.remove(range);\n                        util.insertMode(editor);\n                    }\n            }\n        }\n    },\n    \"y\": {\n        selFn: function(editor, range, count, param) {\n            registers._default.text = editor.getCopyText();\n            registers._default.isLine = util.onVisualLineMode;\n            editor.selection.clearSelection();\n            util.normalMode(editor);\n        },\n        fn: function(editor, range, count, param) {\n            count = count || 1;\n            switch (param) {\n                case \"y\":\n                    var pos = editor.getCursorPosition();\n                    editor.selection.selectLine();\n                    for (var i = 0; i < count - 1; i++) {\n                        editor.selection.moveCursorDown();\n                    }\n                    registers._default.text = editor.getCopyText().replace(/\\n$/, \"\");\n                    editor.selection.clearSelection();\n                    registers._default.isLine = true;\n                    editor.moveCursorToPosition(pos);\n                    break;\n                default:\n                    if (range) {\n                        var pos = editor.getCursorPosition();\n                        editor.selection.setSelectionRange(range);\n                        registers._default.text = editor.getCopyText();\n                        registers._default.isLine = false;\n                        editor.selection.clearSelection();\n                        editor.moveCursorTo(pos.row, pos.column);\n                    }\n            }\n        }\n    },\n    \">\": {\n        selFn: function(editor, range, count, param) {\n            count = count || 1;\n            for (var i = 0; i < count; i++) {\n                editor.indent();\n            }\n            util.normalMode(editor);\n        },\n        fn: function(editor, range, count, param) {\n            count = parseInt(count || 1, 10);\n            switch (param) {\n                case \">\":\n                    var pos = editor.getCursorPosition();\n                    editor.selection.selectLine();\n                    for (var i = 0; i < count - 1; i++) {\n                        editor.selection.moveCursorDown();\n                    }\n                    editor.indent();\n                    editor.selection.clearSelection();\n                    editor.moveCursorToPosition(pos);\n                    editor.navigateLineEnd();\n                    editor.navigateLineStart();\n                    break;\n            }\n        }\n    },\n    \"<\": {\n        selFn: function(editor, range, count, param) {\n            count = count || 1;\n            for (var i = 0; i < count; i++) {\n                editor.blockOutdent();\n            }\n            util.normalMode(editor);\n        },\n        fn: function(editor, range, count, param) {\n            count = count || 1;\n            switch (param) {\n                case \"<\":\n                    var pos = editor.getCursorPosition();\n                    editor.selection.selectLine();\n                    for (var i = 0; i < count - 1; i++) {\n                        editor.selection.moveCursorDown();\n                    }\n                    editor.blockOutdent();\n                    editor.selection.clearSelection();\n                    editor.moveCursorToPosition(pos);\n                    editor.navigateLineEnd();\n                    editor.navigateLineStart();\n                    break;\n            }\n        }\n    }\n};\n});\n \n\"use strict\"\n\ndefine('ace/keyboard/vim/maps/aliases', ['require', 'exports', 'module' ], function(require, exports, module) {\nmodule.exports = {\n    \"x\": {\n        operator: {\n            char: \"d\",\n            count: 1\n        },\n        motion: {\n            char: \"l\",\n            count: 1\n        }\n    },\n    \"X\": {\n        operator: {\n            char: \"d\",\n            count: 1\n        },\n        motion: {\n            char: \"h\",\n            count: 1\n        }\n    },\n    \"D\": {\n        operator: {\n            char: \"d\",\n            count: 1\n        },\n        motion: {\n            char: \"$\",\n            count: 1\n        }\n    },\n    \"C\": {\n        operator: {\n            char: \"c\",\n            count: 1\n        },\n        motion: {\n            char: \"$\",\n            count: 1\n        }\n    },\n    \"s\": {\n        operator: {\n            char: \"c\",\n            count: 1\n        },\n        motion: {\n            char: \"l\",\n            count: 1\n        }\n    },\n    \"S\": {\n        operator: {\n            char: \"c\",\n            count: 1\n        },\n        param: \"c\"\n    }\n};\n});\n\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-c9search.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/c9search', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/c9search_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/c9search'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar C9SearchHighlightRules = require(\"./c9search_highlight_rules\").C9SearchHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar C9StyleFoldMode = require(\"./folding/c9search\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new C9SearchHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new C9StyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/c9search_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar C9SearchHighlightRules = function() {\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        \"start\" : [\n            {\n                token : [\"c9searchresults.constant.numeric\", \"c9searchresults.text\", \"c9searchresults.text\"],\n                regex : \"(^\\\\s+[0-9]+)(:\\\\s*)(.+)\"\n            },\n            {\n                token : [\"string\", \"text\"], // single line\n                regex : \"(.+)(:$)\"\n            }\n        ]\n    };\n};\n\noop.inherits(C9SearchHighlightRules, TextHighlightRules);\n\nexports.C9SearchHighlightRules = C9SearchHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\n\ndefine('ace/mode/folding/c9search', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /^(\\S.*\\:|Searching for.*)$/;\n    this.foldingStopMarker = /^(\\s+|Found.*)$/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var lines = session.doc.getAllLines(row);\n        var line = lines[row];\n        var level1 = /^(Found.*|Searching for.*)$/;\n        var level2 = /^(\\S.*\\:|\\s*)$/;\n        var re = level1.test(line) ? level1 : level2;\n\n        if (this.foldingStartMarker.test(line)) {            \n            for (var i = row + 1, l = session.getLength(); i < l; i++) {\n                if (re.test(lines[i]))\n                    break;\n            }\n\n            return new Range(row, line.length, i, 0);\n        }\n\n        if (this.foldingStopMarker.test(line)) {\n            for (var i = row - 1; i >= 0; i--) {\n                line = lines[i];\n                if (re.test(line))\n                    break;\n            }\n\n            return new Range(i, line.length, row, 0);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-c_cpp.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/c_cpp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/c_cpp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n// used by objective-c\nvar cFunctions = exports.cFunctions = \"\\\\s*\\\\bhypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len)))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private:|\" +\n        \"protected:|public:|friend|explicit|virtual|export|mutable|typename\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n              token : \"constant\", // <CONSTANT>\n              regex : \"<[a-zA-Z0-9.]+>\"\n            }, {\n              token : \"keyword\", // pre-compiler directivs\n              regex : \"(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-clojure.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/clojure', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/clojure_highlight_rules', 'ace/mode/matching_parens_outdent', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar ClojureHighlightRules = require(\"./clojure_highlight_rules\").ClojureHighlightRules;\nvar MatchingParensOutdent = require(\"./matching_parens_outdent\").MatchingParensOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new ClojureHighlightRules().getRules());\n    this.$outdent = new MatchingParensOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \";\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\") {\n            var match = line.match(/[\\(\\[]/);\n            if (match) {\n                indent += \"  \";\n            }\n            match = line.match(/[\\)]/);\n            if (match) {\n              indent = \"\";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/clojure_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n\n\nvar ClojureHighlightRules = function() {\n\n    var builtinFunctions = (\n        '* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* ' +\n        '*command-line-args* *compile-files* *compile-path* *e *err* *file* ' +\n        '*flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* ' +\n        '*print-dup* *print-length* *print-level* *print-meta* *print-readably* ' +\n        '*read-eval* *source-path* *use-context-classloader* ' +\n        '*warn-on-reflection* + - -> ->> .. / < <= = ' +\n        '== > &gt; >= &gt;= accessor aclone ' +\n        'add-classpath add-watch agent agent-errors aget alength alias all-ns ' +\n        'alter alter-meta! alter-var-root amap ancestors and apply areduce ' +\n        'array-map aset aset-boolean aset-byte aset-char aset-double aset-float ' +\n        'aset-int aset-long aset-short assert assoc assoc! assoc-in associative? ' +\n        'atom await await-for await1 bases bean bigdec bigint binding bit-and ' +\n        'bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left ' +\n        'bit-shift-right bit-test bit-xor boolean boolean-array booleans ' +\n        'bound-fn bound-fn* butlast byte byte-array bytes cast char char-array ' +\n        'char-escape-string char-name-string char? chars chunk chunk-append ' +\n        'chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? ' +\n        'class class? clear-agent-errors clojure-version coll? comment commute ' +\n        'comp comparator compare compare-and-set! compile complement concat cond ' +\n        'condp conj conj! cons constantly construct-proxy contains? count ' +\n        'counted? create-ns create-struct cycle dec decimal? declare definline ' +\n        'defmacro defmethod defmulti defn defn- defonce defstruct delay delay? ' +\n        'deliver deref derive descendants destructure disj disj! dissoc dissoc! ' +\n        'distinct distinct? doall doc dorun doseq dosync dotimes doto double ' +\n        'double-array doubles drop drop-last drop-while empty empty? ensure ' +\n        'enumeration-seq eval even? every? false? ffirst file-seq filter find ' +\n        'find-doc find-ns find-var first float float-array float? floats flush ' +\n        'fn fn? fnext for force format future future-call future-cancel ' +\n        'future-cancelled? future-done? future? gen-class gen-interface gensym ' +\n        'get get-in get-method get-proxy-class get-thread-bindings get-validator ' +\n        'hash hash-map hash-set identical? identity if-let if-not ifn? import ' +\n        'in-ns inc init-proxy instance? int int-array integer? interleave intern ' +\n        'interpose into into-array ints io! isa? iterate iterator-seq juxt key ' +\n        'keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list ' +\n        'list* list? load load-file load-reader load-string loaded-libs locking ' +\n        'long long-array longs loop macroexpand macroexpand-1 make-array ' +\n        'make-hierarchy map map? mapcat max max-key memfn memoize merge ' +\n        'merge-with meta method-sig methods min min-key mod name namespace neg? ' +\n        'newline next nfirst nil? nnext not not-any? not-empty not-every? not= ' +\n        'ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ' +\n        'ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? ' +\n        'or parents partial partition pcalls peek persistent! pmap pop pop! ' +\n        'pop-thread-bindings pos? pr pr-str prefer-method prefers ' +\n        'primitives-classnames print print-ctor print-doc print-dup print-method ' +\n        'print-namespace-doc print-simple print-special-doc print-str printf ' +\n        'println println-str prn prn-str promise proxy proxy-call-with-super ' +\n        'proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot ' +\n        'rand rand-int range ratio? rational? rationalize re-find re-groups ' +\n        're-matcher re-matches re-pattern re-seq read read-line read-string ' +\n        'reduce ref ref-history-count ref-max-history ref-min-history ref-set ' +\n        'refer refer-clojure release-pending-sends rem remove remove-method ' +\n        'remove-ns remove-watch repeat repeatedly replace replicate require ' +\n        'reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq ' +\n        'rsubseq second select-keys send send-off seq seq? seque sequence ' +\n        'sequential? set set-validator! set? short short-array shorts ' +\n        'shutdown-agents slurp some sort sort-by sorted-map sorted-map-by ' +\n        'sorted-set sorted-set-by sorted? special-form-anchor special-symbol? ' +\n        'split-at split-with str stream? string? struct struct-map subs subseq ' +\n        'subvec supers swap! symbol symbol? sync syntax-symbol-anchor take ' +\n        'take-last take-nth take-while test the-ns time to-array to-array-2d ' +\n        'trampoline transient tree-seq true? type unchecked-add unchecked-dec ' +\n        'unchecked-divide unchecked-inc unchecked-multiply unchecked-negate ' +\n        'unchecked-remainder unchecked-subtract underive unquote ' +\n        'unquote-splicing update-in update-proxy use val vals var-get var-set ' +\n        'var? vary-meta vec vector vector? when when-first when-let when-not ' +\n        'while with-bindings with-bindings* with-in-str with-loading-context ' +\n        'with-local-vars with-meta with-open with-out-str with-precision xml-seq ' +\n        'zero? zipmap'\n    );\n\n    var keywords = ('throw try var ' +\n        'def do fn if let loop monitor-enter monitor-exit new quote recur set!'\n    );\n\n    var buildinConstants = (\"true false nil\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\", false, \" \");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \";.*$\"\n            }, {\n                token : \"comment\", // multi line comment\n                regex : \"^=begin$\",\n                next : \"comment\"\n            }, {\n                token : \"keyword\", //parens\n                regex : \"[\\\\(|\\\\)]\"\n            }, {\n                token : \"keyword\", //lists\n                regex : \"[\\\\'\\\\(]\"\n            }, {\n                token : \"keyword\", //vectors\n                regex : \"[\\\\[|\\\\]]\"\n            }, {\n                token : \"keyword\", //sets and maps\n                regex : \"[\\\\{|\\\\}|\\\\#\\\\{|\\\\#\\\\}]\"\n            }, {\n                    token : \"keyword\", // ampersands\n                    regex : '[\\\\&]'\n            }, {\n                    token : \"keyword\", // metadata\n                    regex : '[\\\\#\\\\^\\\\{]'\n            }, {\n                    token : \"keyword\", // anonymous fn syntactic sugar\n                    regex : '[\\\\%]'\n            }, {\n                    token : \"keyword\", // deref reader macro\n                    regex : '[@]'\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language\",\n                regex : '[!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+||=|!=|<=|>=|<>|<|>|!|&&]'\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"string\", // single line\n                regex : '\"',\n                next: \"string\"\n            }, {\n                token : \"string\", // symbol\n                regex : \"[:](?:[a-zA-Z]|\\\\d)+\"\n            }, {\n                token : \"string.regexp\", //Regular Expressions\n                regex : '/#\"(?:\\\\.|(?:\\\\\\\")|[^\\\"\"\\n])*\"/g'\n            }\n\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"^=end$\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"string\" : [\n            {\n                token : \"constant.language.escape\",\n                merge : true,\n                regex : \"\\\\\\\\.|\\\\\\\\$\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '[^\"\\\\\\\\]+'\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next : \"start\"\n            }\n        ]\n    };\n};\n\noop.inherits(ClojureHighlightRules, TextHighlightRules);\n\nexports.ClojureHighlightRules = ClojureHighlightRules;\n});\n\ndefine('ace/mode/matching_parens_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingParensOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\)/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\))/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingParensOutdent.prototype);\n\nexports.MatchingParensOutdent = MatchingParensOutdent;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-coffee.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/coffee', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/coffee_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/coffee', 'ace/range', 'ace/mode/text', 'ace/worker/worker_client', 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar Rules = require(\"./coffee_highlight_rules\").CoffeeHighlightRules;\nvar Outdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\nvar Range = require(\"../range\").Range;\nvar TextMode = require(\"./text\").Mode;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar oop = require(\"../lib/oop\");\n\nfunction Mode() {\n    this.$tokenizer = new Tokenizer(new Rules().getRules());\n    this.$outdent   = new Outdent();\n    this.foldingRules = new FoldMode();\n}\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    var indenter = /(?:[({[=:]|[-=]>|\\b(?:else|switch|try|catch(?:\\s*[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*)?|finally))\\s*$/;\n    var commentLine = /^(\\s*)#/;\n    var hereComment = /^\\s*###(?!#)/;\n    var indentation = /^\\s*/;\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n    \n        if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') &&\n            state === 'start' && indenter.test(line))\n            indent += tab;\n        return indent;\n    };\n    \n    this.toggleCommentLines = function(state, doc, startRow, endRow){\n        console.log(\"toggle\");\n        var range = new Range(0, 0, 0, 0);\n        for (var i = startRow; i <= endRow; ++i) {\n            var line = doc.getLine(i);\n            if (hereComment.test(line))\n                continue;\n                \n            if (commentLine.test(line))\n                line = line.replace(commentLine, '$1');\n            else\n                line = line.replace(indentation, '$&#');\n    \n            range.end.row = range.start.row = i;\n            range.end.column = line.length + 1;\n            doc.replace(range, line);\n        }\n    };\n    \n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n    \n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/coffee_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"error\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"ok\", function(e) {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/coffee_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\n    var oop = require(\"../lib/oop\");\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    oop.inherits(CoffeeHighlightRules, TextHighlightRules);\n\n    function CoffeeHighlightRules() {\n        var identifier = \"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\";\n        var stringfill = {\n            token : \"string\",\n            merge : true,\n            regex : \".+\"\n        };\n\n        var keywords = (\n            \"this|throw|then|try|typeof|super|switch|return|break|by)|continue|\" +\n            \"catch|class|in|instanceof|is|isnt|if|else|extends|for|forown|\" +\n            \"finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|\" +\n            \"or|on|unless|until|and|yes\"\n        );\n\n        var langConstant = (\n            \"true|false|null|undefined\"\n        );\n\n        var illegal = (\n            \"case|const|default|function|var|void|with|enum|export|implements|\" +\n            \"interface|let|package|private|protected|public|static|yield|\" +\n            \"__hasProp|extends|slice|bind|indexOf\"\n        );\n\n        var supportClass = (\n            \"Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|\" +\n            \"String|RangeError|SyntaxError|Error|EvalError|TypeError|URIError\"\n        );\n\n        var supportFunction = (\n            \"Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|\" +\n            \"encodeURIComponent|decodeURI|decodeURIComponent|String|\"\n        );\n\n        var keywordMapper = this.createKeywordMapper({\n            \"keyword\": keywords,\n            \"constant.language\": langConstant,\n            \"invalid.illegal\": illegal,\n            \"language.support.class\": supportClass,\n            \"language.support.function\": supportFunction,\n        }, \"identifier\");\n\n        this.$rules = {\n            start : [\n                {\n                    token : \"identifier\",\n                    regex : \"(?:(?:\\\\.|::)\\\\s*)\" + identifier\n                }, {\n                    token : \"variable\",\n                    regex : \"@(?:\" + identifier + \")?\"\n                }, {\n                    token: keywordMapper,\n                    regex : identifier\n                }, {\n                    token : \"constant.numeric\",\n                    regex : \"(?:0x[\\\\da-fA-F]+|(?:\\\\d+(?:\\\\.\\\\d+)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : \"'''\",\n                    next : \"qdoc\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : '\"\"\"',\n                    next : \"qqdoc\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : \"'\",\n                    next : \"qstring\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : '\"',\n                    next : \"qqstring\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : \"`\",\n                    next : \"js\"\n                }, {\n                    token : \"string.regex\",\n                    merge : true,\n                    regex : \"///\",\n                    next : \"heregex\"\n                }, {\n                    token : \"string.regex\",\n                    regex : \"/(?!\\\\s)[^[/\\\\n\\\\\\\\]*(?: (?:\\\\\\\\.|\\\\[[^\\\\]\\\\n\\\\\\\\]*(?:\\\\\\\\.[^\\\\]\\\\n\\\\\\\\]*)*\\\\])[^[/\\\\n\\\\\\\\]*)*/[imgy]{0,4}(?!\\\\w)\"\n                }, {\n                    token : \"comment\",\n                    merge : true,\n                    regex : \"###(?!#)\",\n                    next : \"comment\"\n                }, {\n                    token : \"comment\",\n                    regex : \"#.*\"\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\?|\\\\:|\\\\,|\\\\.\"\n                }, {\n                    token : \"keyword.operator\",\n                    regex : \"(?:[\\\\-=]>|[-+*/%<>&|^!?=]=|>>>=?|\\\\-\\\\-|\\\\+\\\\+|::|&&=|\\\\|\\\\|=|<<=|>>=|\\\\?\\\\.|\\\\.{2,3}|[!*+-=><])\"\n                }, {\n                    token : \"paren.lparen\",\n                    regex : \"[({[]\"\n                }, {\n                    token : \"paren.rparen\",\n                    regex : \"[\\\\]})]\"\n                }, {\n                    token : \"text\",\n                    regex : \"\\\\s+\"\n                }],\n\n            qdoc : [{\n                token : \"string\",\n                regex : \".*?'''\",\n                next : \"start\"\n            }, stringfill],\n\n            qqdoc : [{\n                token : \"string\",\n                regex : '.*?\"\"\"',\n                next : \"start\"\n            }, stringfill],\n\n            qstring : [{\n                token : \"string\",\n                regex : \"[^\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\']*)*'\",\n                merge : true,\n                next : \"start\"\n            }, stringfill],\n\n            qqstring : [{\n                token : \"string\",\n                regex : '[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',\n                merge : true,\n                next : \"start\"\n            }, stringfill],\n\n            js : [{\n                token : \"string\",\n                merge : true,\n                regex : \"[^\\\\\\\\`]*(?:\\\\\\\\.[^\\\\\\\\`]*)*`\",\n                next : \"start\"\n            }, stringfill],\n\n            heregex : [{\n                token : \"string.regex\",\n                regex : '.*?///[imgy]{0,4}',\n                next : \"start\"\n            }, {\n                token : \"comment.regex\",\n                regex : \"\\\\s+(?:#.*)?\"\n            }, {\n                token : \"string.regex\",\n                merge : true,\n                regex : \"\\\\S+\"\n            }],\n\n            comment : [{\n                token : \"comment\",\n                regex : '.*?###',\n                next : \"start\"\n            }, {\n                token : \"comment\",\n                merge : true,\n                regex : \".+\"\n            }]\n        };\n    }\n\n    exports.CoffeeHighlightRules = CoffeeHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n\n        // documentation comments\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-coldfusion.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/coldfusion', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/coldfusion_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar XmlMode = require(\"./xml\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar ColdfusionHighlightRules = require(\"./coldfusion_highlight_rules\").ColdfusionHighlightRules;\n\nvar Mode = function() {\n    XmlMode.call(this);\n    \n    var highlighter = new ColdfusionHighlightRules();\n    this.$tokenizer = new Tokenizer(highlighter.getRules());\n    \n    this.$embeds = highlighter.getEmbeds();\n    this.createModeDelegates({\n      \"js-\": JavaScriptMode,\n      \"css-\": CssMode\n    });\n};\noop.inherits(Mode, XmlMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        }],\n        \n        cdata : [{\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"\n        }],\n\n        comment : [{\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        }]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\");\n};\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.indexOf(\"meta.tag\") === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = this.tagRe.exec(tag);\n        var column = this.tagRe.lastIndex || 0;\n        this.tagRe.lastIndex = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"csslint\", function(e) {\n            var errors = [];\n            e.data.forEach(function(message) {\n                errors.push({\n                    row: message.line - 1,\n                    column: message.col - 1,\n                    text: message.message,\n                    type: message.type,\n                    lint: message\n                });\n            });\n            \n            session.setAnnotations(errors);\n        });\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/coldfusion_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/text_highlight_rules', 'ace/mode/xml_util'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar xml_util = require(\"./xml_util\");\n\nvar ColdfusionHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        start : [ {\n            token : \"text\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*script)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*style)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n    \n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ]\n    };\n    \n    xml_util.tag(this.$rules, \"tag\", \"start\");\n    xml_util.tag(this.$rules, \"style\", \"css-start\");\n    xml_util.tag(this.$rules, \"script\", \"js-start\");\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(ColdfusionHighlightRules, TextHighlightRules);\n\nexports.ColdfusionHighlightRules = ColdfusionHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-csharp.js",
    "content": "define('ace/mode/csharp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/csharp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CSharpHighlightRules = require(\"./csharp_highlight_rules\").CSharpHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new CSharpHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n  \n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n  \n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n    \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n  \n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n  \n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\ndefine('ace/mode/csharp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CSharpHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": \"abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic\",\n        \"constant.language\": \"null|true|false\"\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                merge : true,\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(CSharpHighlightRules, TextHighlightRules);\n\nexports.CSharpHighlightRules = CSharpHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-css.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"csslint\", function(e) {\n            var errors = [];\n            e.data.forEach(function(message) {\n                errors.push({\n                    row: message.line - 1,\n                    column: message.col - 1,\n                    text: message.message,\n                    type: message.type,\n                    lint: message\n                });\n            });\n            \n            session.setAnnotations(errors);\n        });\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-diff.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/diff', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/diff_highlight_rules', 'ace/mode/folding/diff'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HighlightRules = require(\"./diff_highlight_rules\").DiffHighlightRules;\nvar FoldMode = require(\"./folding/diff\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new HighlightRules().getRules(), \"i\");\n    this.foldingRules = new FoldMode([\"diff\", \"index\", \"\\\\+{3}\", \"@@|\\\\*{5}\"], \"i\");\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/diff_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DiffHighlightRules = function() {\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [{\n                \"regex\": \"^(?:\\\\*{15}|={67}|-{3}|\\\\+{3})$\",\n                \"token\": \"punctuation.definition.separator.diff\",\n                \"name\": \"keyword\"\n            }, { //diff.range.unified\n                \"regex\": \"^(@@)(\\\\s*.+?\\\\s*)(@@)(.*)$\",\n                \"token\": [\n                    \"constant\",\n                    \"constant.numeric\",\n                    \"constant\",\n                    \"comment.doc.tag\"\n                ]\n            }, { //diff.range.normal\n                \"regex\": \"^(\\\\d+)([,\\\\d]+)(a|d|c)(\\\\d+)([,\\\\d]+)(.*)$\",\n                \"token\": [\n                    \"constant.numeric\",\n                    \"punctuation.definition.range.diff\",\n                    \"constant.function\",\n                    \"constant.numeric\",\n                    \"punctuation.definition.range.diff\",\n                    \"invalid\"\n                ],\n                \"name\": \"meta.\"\n            }, {\n                \"regex\": \"^(?:(\\\\-{3}|\\\\+{3}|\\\\*{3})( .+))$\",\n                \"token\": [\n                    \"constant.numeric\",\n                    \"meta.tag\"\n                ]\n            }, { // added\n                \"regex\": \"^([!+>])(.*?)(\\\\s*)$\",\n                \"token\": [\n                    \"support.constant\",\n                    \"text\",\n                    \"invalid\"\n                ],\n            }, { // removed\n                \"regex\": \"^([<\\\\-])(.*?)(\\\\s*)$\",\n                \"token\": [\n                    \"support.function\",\n                    \"string\",\n                    \"invalid\"\n                ],\n            }, {\n                \"regex\": \"^(diff)(\\\\s+--\\\\w+)?(.+?)( .+)?$\",\n                \"token\": [\"variable\", \"variable\", \"keyword\", \"variable\"]\n            }, {\n                \"regex\": \"^Index.+$\",\n                \"token\": \"variable\"\n            }, {\n                \"regex\": \"^(.*?)(\\\\s*)$\",\n                \"token\": [\"invisible\", \"invalid\"]\n            }\n        ]\n    };\n};\n\noop.inherits(DiffHighlightRules, TextHighlightRules);\n\nexports.DiffHighlightRules = DiffHighlightRules;\n});\n\ndefine('ace/mode/folding/diff', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function(levels, flag) {\n\tthis.regExpList = levels;\n\tthis.flag = flag;\n\tthis.foldingStartMarker = RegExp(\"^(\" + levels.join(\"|\") + \")\", this.flag);\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var start = {row: row, column: line.length};\n\n        var regList = this.regExpList;\n        for (var i = 1; i <= regList.length; i++) {\n            var re = RegExp(\"^(\" + regList.slice(0, i).join(\"|\") + \")\", this.flag);\n            if (re.test(line))\n                break;\n        }\n\n        for (var l = session.getLength(); ++row < l; ) {\n            line = session.getLine(row);\n            if (re.test(line))\n                break;\n        }\n        if (row == start.row + 1)\n            return;\n        return  Range.fromPoints(start, {row: row - 1, column: line.length});\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-glsl.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/glsl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp', 'ace/tokenizer', 'ace/mode/glsl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar CMode = require(\"./c_cpp\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar glslHighlightRules = require(\"./glsl_highlight_rules\").glslHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new glslHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, CMode);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/c_cpp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/c_cpp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n// used by objective-c\nvar cFunctions = exports.cFunctions = \"\\\\s*\\\\bhypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len)))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private:|\" +\n        \"protected:|public:|friend|explicit|virtual|export|mutable|typename\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n              token : \"constant\", // <CONSTANT>\n              regex : \"<[a-zA-Z0-9.]+>\"\n            }, {\n              token : \"keyword\", // pre-compiler directivs\n              regex : \"(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/glsl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\n\nvar glslHighlightRules = function() {\n\n    var keywords = (\n        \"attribute|const|uniform|varying|break|continue|do|for|while|\" +\n        \"if|else|in|out|inout|float|int|void|bool|true|false|\" +\n        \"lowp|mediump|highp|precision|invariant|discard|return|mat2|mat3|\" +\n        \"mat4|vec2|vec3|vec4|ivec2|ivec3|ivec4|bvec2|bvec3|bvec4|sampler2D|\" +\n        \"samplerCube|struct\"\n    );\n\n    var buildinConstants = (\n        \"radians|degrees|sin|cos|tan|asin|acos|atan|pow|\" +\n        \"exp|log|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|\" +\n        \"min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|\" +\n        \"normalize|faceforward|reflect|refract|matrixCompMult|lessThan|\" +\n        \"lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|\" +\n        \"not|dFdx|dFdy|fwidth|texture2D|texture2DProj|texture2DLod|\" +\n        \"texture2DProjLod|textureCube|textureCubeLod|\" +\n        \"gl_MaxVertexAttribs|gl_MaxVertexUniformVectors|gl_MaxVaryingVectors|\" +\n        \"gl_MaxVertexTextureImageUnits|gl_MaxCombinedTextureImageUnits|\" +\n        \"gl_MaxTextureImageUnits|gl_MaxFragmentUniformVectors|gl_MaxDrawBuffers|\" +\n        \"gl_DepthRangeParameters|gl_DepthRange|\" +\n        // The following two are only for MIME x-shader/x-vertex.\n        \"gl_Position|gl_PointSize|\" +\n        // The following five are only for MIME x-shader/x-fragment.\n        \"gl_FragCoord|gl_FrontFacing|gl_PointCoord|gl_FragColor|gl_FragData\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    this.$rules = new c_cppHighlightRules().$rules;\n    this.$rules.start.forEach(function(rule) {\n        if (typeof rule.token == \"function\")\n            rule.token = keywordMapper;\n    })\n};\n\noop.inherits(glslHighlightRules, c_cppHighlightRules);\n\nexports.glslHighlightRules = glslHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-golang.js",
    "content": "define('ace/mode/golang', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/golang_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n    var oop = require(\"../lib/oop\");\n    var TextMode = require(\"./text\").Mode;\n    var Tokenizer = require(\"../tokenizer\").Tokenizer;\n    var GolangHighlightRules = require(\"./golang_highlight_rules\").GolangHighlightRules;\n    var MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n    var CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\n    var CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n    \n    var Mode = function() {\n        this.$tokenizer = new Tokenizer(new GolangHighlightRules().getRules());\n        this.$outdent = new MatchingBraceOutdent();\n        this.foldingRules = new CStyleFoldMode();\n    };\n    oop.inherits(Mode, TextMode);\n    \n    (function() {\n        \n        this.toggleCommentLines = function(state, doc, startRow, endRow) {\n            var outdent = true;\n            var outentedRows = [];\n            var re = /^(\\s*)\\/\\//;\n\n            for (var i=startRow; i<= endRow; i++) {\n                if (!re.test(doc.getLine(i))) {\n                    outdent = false;\n                    break;\n                }\n            }\n\n            if (outdent) {\n                var deleteRange = new Range(0, 0, 0, 0);\n                for (var i=startRow; i<= endRow; i++)\n                {\n                    var line = doc.getLine(i);\n                    var m = line.match(re);\n                    deleteRange.start.row = i;\n                    deleteRange.end.row = i;\n                    deleteRange.end.column = m[0].length;\n                    doc.replace(deleteRange, m[1]);\n                }\n            }\n            else {\n                doc.indentRows(startRow, endRow, \"//\");\n            }\n        };\n\n        this.getNextLineIndent = function(state, line, tab) {\n            var indent = this.$getIndent(line);\n\n            var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n            var tokens = tokenizedLine.tokens;\n            var endState = tokenizedLine.state;\n\n            if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n                return indent;\n            }\n            \n            if (state == \"start\") {\n                var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n                if (match) {\n                    indent += tab;\n                }\n            }\n\n            return indent;\n        };//end getNextLineIndent\n\n        this.checkOutdent = function(state, line, input) {\n            return this.$outdent.checkOutdent(line, input);\n        };\n\n        this.autoOutdent = function(state, doc, row) {\n            this.$outdent.autoOutdent(doc, row);\n        };\n\n    }).call(Mode.prototype);\n\n    exports.Mode = Mode;\n});\ndefine('ace/mode/golang_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n    var oop = require(\"../lib/oop\");\n    var DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    var GolangHighlightRules = function() {\n        var keywords = (\n            \"true|else|false|break|case|return|goto|if|const|\" +\n            \"continue|struct|default|switch|for|\" +\n            \"func|import|package|chan|defer|fallthrough|go|interface|map|range\" +\n            \"select|type|var\"\n        );\n        var buildinConstants = (\"nil|true|false|iota\");\n\n        var keywordMapper = this.createKeywordMapper({\n            \"variable.language\": \"this\",\n            \"keyword\": keywords,\n            \"constant.language\": buildinConstants\n        }, \"identifier\");\n\n        this.$rules = {\n            \"start\" : [\n                {\n                    token : \"comment\",\n                    regex : \"\\\\/\\\\/.*$\"\n                },\n                DocCommentHighlightRules.getStartRule(\"doc-start\"),\n                {\n                    token : \"comment\", // multi line comment\n                    merge : true,\n                    regex : \"\\\\/\\\\*\",\n                    next : \"comment\"\n                }, {\n                    token : \"string\", // single line\n                    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n                }, {\n                    token : \"string\", // multi line string start\n                    merge : true,\n                    regex : '[\"].*\\\\\\\\$',\n                    next : \"qqstring\"\n                }, {\n                    token : \"string\", // single line\n                    regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n                }, {\n                    token : \"string\", // multi line string start\n                    merge : true,\n                    regex : \"['].*\\\\\\\\$\",\n                    next : \"qstring\"\n                }, {\n                    token : \"constant.numeric\", // hex\n                    regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n                }, {\n                    token : \"constant.numeric\", // float\n                    regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n                }, {\n                    token : \"constant\", // <CONSTANT>\n                    regex : \"<[a-zA-Z0-9.]+>\"\n                }, {\n                    token : \"keyword\", // pre-compiler directivs\n                    regex : \"(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)\"\n                }, {\n                    token : keywordMapper,\n                    regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n                }, {\n                    token : \"keyword.operator\",\n                    regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n                }, {\n                    token : \"paren.lparen\",\n                    regex : \"[[({]\"\n                }, {\n                    token : \"paren.rparen\",\n                    regex : \"[\\\\])}]\"\n                }, {\n                    token : \"text\",\n                    regex : \"\\\\s+\"\n                }\n            ],\n            \"comment\" : [\n                {\n                    token : \"comment\", // closing comment\n                    regex : \".*?\\\\*\\\\/\",\n                    next : \"start\"\n                }, {\n                    token : \"comment\", // comment spanning whole line\n                    merge : true,\n                    regex : \".+\"\n                }\n            ],\n            \"qqstring\" : [\n                {\n                    token : \"string\",\n                    regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                    next : \"start\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : '.+'\n                }\n            ],\n            \"qstring\" : [\n                {\n                    token : \"string\",\n                    regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                    next : \"start\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : '.+'\n                }\n            ]\n        };\n\n        this.embedRules(DocCommentHighlightRules, \"doc-\",\n            [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n    }\n    oop.inherits(GolangHighlightRules, TextHighlightRules);\n\n    exports.GolangHighlightRules = GolangHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-groovy.js",
    "content": "define('ace/mode/groovy', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/groovy_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar GroovyHighlightRules = require(\"./groovy_highlight_rules\").GroovyHighlightRules;\n\nvar Mode = function() {\n    JavaScriptMode.call(this);\n    this.$tokenizer = new Tokenizer(new GroovyHighlightRules().getRules());\n};\noop.inherits(Mode, JavaScriptMode);\n\n(function() {\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\ndefine('ace/mode/groovy_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar GroovyHighlightRules = function() {\n\n    var keywords = (\n        \"assert|with|abstract|continue|for|new|switch|\" +\n        \"assert|default|goto|package|synchronized|\" +\n        \"boolean|do|if|private|this|\" +\n        \"break|double|implements|protected|throw|\" +\n        \"byte|else|import|public|throws|\" +\n        \"case|enum|instanceof|return|transient|\" +\n        \"catch|extends|int|short|try|\" +\n        \"char|final|interface|static|void|\" +\n        \"class|finally|long|strictfp|volatile|\" +\n        \"def|float|native|super|while\"\n    );\n\n    var buildinConstants = (\n        \"null|Infinity|NaN|undefined\"\n    );\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object\"\n    );\n\n    // TODO var importClasses = \"\";\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"support.function\": langClasses,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\",\n                regex : '\"\"\"',\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : \"'''\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"\\\\?:|\\\\?\\\\.|\\\\*\\\\.|<=>|=~|==~|\\\\.@|\\\\*\\\\.@|\\\\.&|as|in|is|!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:u[0-9A-Fa-f]{4}|.|$)/\n            }, {\n                token : \"constant.language.escape\",\n                regex : /\\$[\\w\\d]+/\n            }, {\n                token : \"constant.language.escape\",\n                regex : /\\$\\{[^\"\\}]+\\}?/\n            }, {\n                token : \"string\",\n                regex : '\"{3,5}',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+?'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:u[0-9A-Fa-f]{4}|.|$)/\n            }, {\n                token : \"string\",\n                regex : \"'{3,5}\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : \".+?\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(GroovyHighlightRules, TextHighlightRules);\n\nexports.GroovyHighlightRules = GroovyHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-haxe.js",
    "content": "define('ace/mode/haxe', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/haxe_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HaxeHighlightRules = require(\"./haxe_highlight_rules\").HaxeHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new HaxeHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\ndefine('ace/mode/haxe_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\n\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar HaxeHighlightRules = function() {\n\n    var keywords = (\n        \"break|case|cast|catch|class|continue|default|else|enum|extends|for|function|if|implements|import|in|inline|interface|new|override|package|private|public|return|static|super|switch|this|throw|trace|try|typedef|untyped|var|while|Array|Void|Bool|Int|UInt|Float|Dynamic|String|List|Hash|IntHash|Error|Unknown|Type|Std\"\n    );\n\n    var buildinConstants = (\n        \"null|true|false\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                merge : true,\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({<]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}>]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(HaxeHighlightRules, TextHighlightRules);\n\nexports.HaxeHighlightRules = HaxeHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-html.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar HtmlBehaviour = require(\"./behaviour/html\").HtmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\n\nvar Mode = function() {\n    var highlighter = new HtmlHighlightRules();\n    this.$tokenizer = new Tokenizer(highlighter.getRules());\n    this.$behaviour = new HtmlBehaviour();\n    \n    this.$embeds = highlighter.getEmbeds();\n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    \n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        return 0;\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"csslint\", function(e) {\n            var errors = [];\n            e.data.forEach(function(message) {\n                errors.push({\n                    row: message.line - 1,\n                    column: message.col - 1,\n                    text: message.message,\n                    type: message.type,\n                    lint: message\n                });\n            });\n            \n            session.setAnnotations(errors);\n        });\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*script\\\\b)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*style\\\\b)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n    \n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\", tagMap);\n    xmlUtil.tag(this.$rules, \"style\", \"css-start\", tagMap);\n    xmlUtil.tag(this.$rules, \"script\", \"js-start\", tagMap);\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(HtmlHighlightRules, TextHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar XmlBehaviour = require(\"../behaviour/xml\").XmlBehaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar HtmlBehaviour = function () {\n\n    this.inherit(XmlBehaviour); // Get xml behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var element = token.value;\n            if (atCursor){\n                var element = element.substring(0, position.column - token.start);\n            }\n            if (voidElements.indexOf(element) !== -1){\n                return;\n            }\n            return {\n               text: '>' + '</' + element + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n}\noop.inherits(HtmlBehaviour, XmlBehaviour);\n\nexports.HtmlBehaviour = HtmlBehaviour;\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/folding/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {\n    MixedFoldMode.call(this, new XmlFoldMode({\n        // void elements\n        \"area\": 1,\n        \"base\": 1,\n        \"br\": 1,\n        \"col\": 1,\n        \"command\": 1,\n        \"embed\": 1,\n        \"hr\": 1,\n        \"img\": 1,\n        \"input\": 1,\n        \"keygen\": 1,\n        \"link\": 1,\n        \"meta\": 1,\n        \"param\": 1,\n        \"source\": 1,\n        \"track\": 1,\n        \"wbr\": 1,\n        \n        // optional tags \n        \"li\": 1,\n        \"dt\": 1,\n        \"dd\": 1,\n        \"p\": 1,\n        \"rt\": 1,\n        \"rp\": 1,\n        \"optgroup\": 1,\n        \"option\": 1,\n        \"colgroup\": 1,\n        \"td\": 1,\n        \"th\": 1\n    }), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\ndefine('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.indexOf(\"meta.tag\") === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = this.tagRe.exec(tag);\n        var column = this.tagRe.lastIndex || 0;\n        this.tagRe.lastIndex = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-jade.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2012, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n *\n * Contributor(s):\n * \n * Garen J. Torikian <gjtorikian @ gmail DOT com>\n *\n * ***** END LICENSE BLOCK ***** */\n \ndefine('ace/mode/jade', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/jade_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JadeHighlightRules = require(\"./jade_highlight_rules\").JadeHighlightRules;\n// var JavascriptMode = require(\"ace/mode/javascript\").Mode;\n// var CssMode = require(\"ace/mode/css\").Mode;\n\nvar Mode = function() {\n    var highlighter = new JadeHighlightRules();\n    \n    this.$tokenizer = new Tokenizer(highlighter.getRules());\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    // Extra logic goes here. \n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\n/*\n  THIS FILE WAS AUTOGENERATED BY mode_highlight_rules.tmpl.js (UUID: C5B73B98-5F2A-42E3-9F0E-028A74A9FE4B)\n*/\n\ndefine('ace/mode/jade_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/markdown_highlight_rules', 'ace/mode/scss_highlight_rules', 'ace/mode/less_highlight_rules', 'ace/mode/coffee_highlight_rules', 'ace/mode/javascript_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar MarkdownHighlightRules = require(\"./markdown_highlight_rules\").MarkdownHighlightRules;\nvar SassHighlightRules = require(\"./scss_highlight_rules\").ScssHighlightRules;\nvar LessHighlightRules = require(\"./less_highlight_rules\").LessHighlightRules;\nvar CoffeeHighlightRules = require(\"./coffee_highlight_rules\").CoffeeHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\n\nfunction mixin_embed(tag, prefix) {\n    return { \n        token : \"entity.name.function.jade\",\n        regex : \"^\\\\s*\\\\:\" + tag,\n        next  : prefix + \"start\"\n    };\n}\n\nvar JadeHighlightRules = function() {\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = \n        {\n    \"start\": [\n        {\n            \"token\": \"keyword.control.import.include.jade\",\n            \"regex\": \"\\\\s*\\\\binclude\\\\b\"\n        },\n        {\n            \"token\": \"keyword.other.doctype.jade\",\n            \"regex\": \"^!!!\\\\s*(?:[a-zA-Z0-9-_]+)?\"\n        },\n        {\n            \"token\" : \"punctuation.section.comment\",\n            \"regex\" : \"^\\\\s*\\/\\/(?:\\\\s*[^-\\\\s]|\\\\s+\\\\S)(?:.*$)\",\n        },\n        {\n            \"token\" : function(space, text) {\n                return \"punctuation.section.comment\";\n            },\n            \"regex\" : \"^((\\\\s*)\\/\\/)(?:\\\\s*$)\",\n            \"next\": \"comment_block\"\n        },\n        mixin_embed(\"markdown\", \"markdown-\"),\n        mixin_embed(\"sass\", \"sass-\"),\n        mixin_embed(\"less\", \"less-\"),\n        mixin_embed(\"coffee\", \"coffee-\"),\n        /*\n        {\n            \"token\": {\n                \"2\": {\n                    \"name\": \"entity.name.function.jade\"\n                }\n            },\n            \"regex\": \"^(\\\\s*)(\\\\:cdata)\",\n            \"next\": \"state_9\"\n        },*/\n        // match stuff like: mixin dialog-title-desc(title, desc)\n        {\n            \"token\": [ \"storage.type.function.jade\",\n                       \"entity.name.function.jade\",\n                       \"punctuation.definition.parameters.begin.jade\",\n                       \"variable.parameter.function.jade\",\n                       \"punctuation.definition.parameters.end.jade\"\n                    ],\n            \"regex\": \"^(\\\\s*mixin)( [\\\\w\\\\-]+)(\\\\s*\\\\()(.*?)(\\\\))\"\n        },\n        // match stuff like: mixin dialog-title-desc\n        {\n            \"token\": [ \"storage.type.function.jade\", \"entity.name.function.jade\"],\n            \"regex\": \"^(\\\\s*mixin)( [\\\\w\\\\-]+)\"\n        },\n       /* {\n            \"token\": \"source.js.embedded.jade\",\n            \"regex\": \"^\\\\s*-|=|!=\",\n            \"next\": \"js_code\"\n        },*/\n        /*{\n            \"token\": \"entity.name.tag.script.jade\",\n            \"regex\": \"^\\\\s*script\",\n            \"next\": \"js_code_tag\"\n        },*/\n        {\n            \"token\": \"string.interpolated.jade\",\n            \"regex\": \"[#!]\\\\{[^\\\\}]+\\\\}\"\n        },\n        // Match any tag, id or class. skip AST filters\n        {\n            \"token\": [\"meta.tag.any.jade\", \"entity.variable.tag.jade\"],\n            \"regex\": /^\\s*(?!\\w+\\:)(?:[\\w]+|(?=\\.|#)])/,\n            \"next\": \"tag_single\"\n        },\n        {\n            \"token\": \"suport.type.attribute.id.jade\",\n            \"regex\": \"#\\\\w+\"\n        },\n        {\n            \"token\": \"suport.type.attribute.class.jade\",\n            \"regex\": \"\\\\.\\\\w+\"\n        },\n        {\n            \"token\": \"punctuation\",\n            \"regex\": \"\\\\s*(?:\\\\()\",\n            \"next\": \"tag_attributes\"\n        }\n    ],\n    \"comment_block\": [\n        {\n            \"token\": function(text) {\n                return \"text\";\n            },\n            \"regex\": \"^(\\\\1\\\\S|$)\", \n            \"captures\": \"1\",\n            \"next\": \"start\"\n        },\n        {\n            \"token\": \"comment.block.jade\",\n            \"merge\" : true,\n            \"regex\" : \".+\"\n        }\n    ],\n    /*\n    \n    \"state_9\": [\n        {\n            \"token\": \"TODO\",\n            \"regex\": \"^(?!\\\\1\\\\s+)\",\n            \"next\": \"start\"\n        },\n        {\n            \"token\": \"TODO\",\n            \"regex\": \".+\",\n            \"next\": \"state_9\"\n        }\n    ],*/\n    /*\"js_code\": [\n        {\n            \"token\": \"keyword.control.js\",\n            \"regex\": \"\\\\beach\\\\b\"\n        },\n        {\n            \"token\": \"text\",\n            \"regex\": \"$\",\n            \"next\": \"start\"\n        }\n    ],*/\n    /*\"js_code_tag\": [\n        {\n            \"include\": \"source.js\"\n        },\n        {\n            \"token\": \"TODO\",\n            \"regex\": \"^((?=(\\\\1)([\\\\w#\\\\.]|$\\\\n?))|^$\\\\n?)\",\n            \"next\": \"start\"\n        }\n    ],*/\n    \"tag_single\": [\n        {\n            \"token\": \"suport.type.attribute.class.jade\",\n            \"regex\": \"\\\\.[\\\\w-]+\"\n        },\n        {\n            \"token\": \"suport.type.attribute.id.jade\",\n            \"regex\": \"#[\\\\w-]+\"\n        },\n        {\n            \"token\": [\"text\", \"punctuation\"],\n            \"regex\": \"($)|((?!\\\\.|#|=|-))\",\n            \"next\": \"start\"\n        }\n    ],\n    \"tag_attributes\": [\n        {\n            \"token\": [\"entity.other.attribute-name.jade\", \"punctuation\"],\n            \"regex\": \"\\\\b([a-zA-Z:\\\\.-]+)(=)\",\n            \"next\": \"attribute_strings\"\n        },\n        {\n            \"token\": \"punctuation\",\n            \"regex\": \"\\\\)\",\n            \"next\": \"start\"\n        }\n    ],\n    \"attribute_strings\": [\n        {\n            \"token\" : \"string\",\n            \"regex\" : \"'(?=.)\",\n            \"next\"  : \"qstring\"\n        }, \n        {\n            \"token\" : \"string\",\n            \"regex\" : '\"(?=.)',\n            \"next\"  : \"qqstring\"\n        }\n    ],\n    \"qqstring\" : [\n        {\n            token : \"constant.language.escape\",\n            regex : escapedRe\n        }, {\n            token : \"string\",\n            regex : '[^\"\\\\\\\\]+',\n            merge : true\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\",\n            merge : true\n        }, {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"tag_attributes\",\n            merge : true\n        }\n    ],\n    \"qstring\" : [\n        {\n            token : \"constant.language.escape\",\n            regex : escapedRe\n        }, {\n            token : \"string\",\n            regex : \"[^'\\\\\\\\]+\",\n            merge : true\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qstring\",\n            merge : true\n        }, {\n            token : \"string\",\n            regex : \"'|$\",\n            next  : \"tag_attributes\",\n            merge : true\n        }\n    ]\n};\n};\n\noop.inherits(JadeHighlightRules, TextHighlightRules);\n\nexports.JadeHighlightRules = JadeHighlightRules;\n});\n\ndefine('ace/mode/markdown_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules', 'ace/mode/html_highlight_rules', 'ace/mode/css_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\n\nfunction github_embed(tag, prefix) {\n    return { // Github style block\n        token : \"support.function\",\n        regex : \"^```\" + tag + \"\\\\s*$\",\n        next  : prefix + \"start\"\n    };\n}\n\nvar MarkdownHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"empty_line\",\n            regex : '^$'\n        }, { // code span `\n            token : [\"support.function\", \"support.function\", \"support.function\"],\n            regex : \"(`+)([^\\\\r]*?[^`])(\\\\1)\"\n        }, { // code block\n            token : \"support.function\",\n            regex : \"^[ ]{4}.+\"\n        }, { // h1\n            token: \"markup.heading.1\",\n            regex: \"^=+(?=\\\\s*$)\"\n        }, { // h2\n            token: \"markup.heading.2\",\n            regex: \"^\\\\-+(?=\\\\s*$)\"\n        }, { // header\n            token : function(value) {\n                return \"markup.heading.\" + value.search(/[^#]/);\n            },\n            regex : \"^#{1,6}(?:[^ #].*| +.*(?:[^ #].*|[^ ]+.* +#+ *))$\"\n        }, github_embed(\"(?:javascript|js)\", \"js-\"),\n           github_embed(\"xml\", \"xml-\"),\n           github_embed(\"html\", \"html-\"),\n           github_embed(\"css\", \"css-\"),\n        { // Github style block\n            token : \"support.function\",\n            regex : \"^```[a-zA-Z]+\\\\s*$\",\n            next  : \"githubblock\"\n        }, { // block quote\n            token : \"string\",\n            regex : \"^>[ ].+$\",\n            next  : \"blockquote\"\n        }, { // reference\n            token : [\"text\", \"constant\", \"text\", \"url\", \"string\", \"text\"],\n            regex : \"^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\\\"][^\\\"]+[\\\"])?(\\\\s*))$\"\n        }, { // link by reference\n            token : [\"text\", \"string\", \"text\", \"constant\", \"text\"],\n            regex : \"(\\\\[)((?:[[^\\\\]]*\\\\]|[^\\\\[\\\\]])*)(\\\\][ ]?(?:\\\\n[ ]*)?\\\\[)(.*?)(\\\\])\"\n        }, { // link by url\n            token : [\"text\", \"string\", \"text\", \"markup.underline\", \"string\", \"text\"],\n            regex : \"(\\\\[)\"+\n                    \"(\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]*)\"+\n                    \"(\\\\]\\\\([ \\\\t]*)\"+\n                    \"(<?(?:(?:[^\\\\(]*?\\\\([^\\\\)]*?\\\\)\\\\S*?)|(?:.*?))>?)\"+\n                    \"((?:[ \\t]*\\\"(?:.*?)\\\"[ \\\\t]*)?)\"+\n                    \"(\\\\))\"\n        }, { // HR *\n            token : \"constant\",\n            regex : \"^[ ]{0,2}(?:[ ]?\\\\*[ ]?){3,}\\\\s*$\"\n        }, { // HR -\n            token : \"constant\",\n            regex : \"^[ ]{0,2}(?:[ ]?\\\\-[ ]?){3,}\\\\s*$\"\n        }, { // HR _\n            token : \"constant\",\n            regex : \"^[ ]{0,2}(?:[ ]?\\\\_[ ]?){3,}\\\\s*$\"\n        }, { // list\n            token : \"markup.list\",\n            regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n            next  : \"listblock\"\n        }, { // strong ** __\n            token : [\"string\", \"string\", \"string\"],\n            regex : \"([*]{2}|[_]{2}(?=\\\\S))([^\\\\r]*?\\\\S[*_]*)(\\\\1)\"\n        }, { // emphasis * _\n            token : [\"string\", \"string\", \"string\"],\n            regex : \"([*]|[_](?=\\\\S))([^\\\\r]*?\\\\S[*_]*)(\\\\1)\"\n        }, { // \n            token : [\"text\", \"url\", \"text\"],\n            regex : \"(<)(\"+\n                      \"(?:https?|ftp|dict):[^'\\\">\\\\s]+\"+\n                      \"|\"+\n                      \"(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+\"+\n                    \")(>)\"\n        }, {\n            token : \"text\",\n            regex : \"[^\\\\*_%$`\\\\[#<>]+\"\n        } ],\n        \n        \"listblock\" : [ { // Lists only escape on completely blank lines.\n            token : \"empty_line\",\n            regex : \"^$\",\n            next  : \"start\"\n        }, {\n            token : \"markup.list\",\n            regex : \".+\"\n        } ],\n        \n        \"blockquote\" : [ { // BLockquotes only escape on blank lines.\n            token : \"empty_line\",\n            regex : \"^\\\\s*$\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            regex : \".+\"\n        } ],\n        \n        \"githubblock\" : [ {\n            token : \"support.function\",\n            regex : \"^```\",\n            next  : \"start\"\n        }, {\n            token : \"support.function\",\n            regex : \".+\"\n        } ]\n    };\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n    \n    this.embedRules(HtmlHighlightRules, \"html-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n    \n    this.embedRules(XmlHighlightRules, \"xml-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n};\noop.inherits(MarkdownHighlightRules, TextHighlightRules);\n\nexports.MarkdownHighlightRules = MarkdownHighlightRules;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        }],\n        \n        cdata : [{\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"\n        }],\n\n        comment : [{\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        }]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\");\n};\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*script\\\\b)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*style\\\\b)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n    \n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\", tagMap);\n    xmlUtil.tag(this.$rules, \"style\", \"css-start\", tagMap);\n    xmlUtil.tag(this.$rules, \"script\", \"js-start\", tagMap);\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(HtmlHighlightRules, TextHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/scss_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ScssHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|\" +\n            \"bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n          \n        //The return array     \n        var ret = [];\n        \n        //All prefixProperties will get the browserPrefix in\n        //the begning by join the prefixProperties array with the value of browserPrefix\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        \n        //Add also prefixProperties and properties without any browser prefix\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|\" +\n         \"alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|\" + \n         \"floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|\" + \n         \"nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|\" +\n         \"scale_color|transparentize|type_of|unit|unitless|unqoute\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\").split(\"|\")\n    )\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token : \"variable\",\n                regex : \"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(ScssHighlightRules, TextHighlightRules);\n\nexports.ScssHighlightRules = ScssHighlightRules;\n\n});\n\ndefine('ace/mode/less_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LessHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|\" +\n            \"bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n          \n        //The return array     \n        var ret = [];\n        \n        //All prefixProperties will get the browserPrefix in\n        //the begning by join the prefixProperties array with the value of browserPrefix\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        \n        //Add also prefixProperties and properties without any browser prefix\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|lighten|darken|saturate|\" +\n        \"desaturate|fadein|fadeout|fade|spin|mix|hue|saturation|lightness|\" +\n        \"alpha|round|ceil|floor|percentage|color|iscolor|isnumber|isstring|\" +\n        \"iskeyword|isurl|ispixel|ispercentage|isem\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|\" +\n        \"@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|\" +\n        \"def|end|declare|when|not|and\").split(\"|\")\n    );\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : function(value) {\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else\n                        return \"variable\";\n                },\n                regex : \"@[a-z0-9_\\\\-@]*\\\\b\"\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    else if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n};\n\noop.inherits(LessHighlightRules, TextHighlightRules);\n\nexports.LessHighlightRules = LessHighlightRules;\n\n});\n\ndefine('ace/mode/coffee_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\n    var oop = require(\"../lib/oop\");\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    oop.inherits(CoffeeHighlightRules, TextHighlightRules);\n\n    function CoffeeHighlightRules() {\n        var identifier = \"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\";\n        var stringfill = {\n            token : \"string\",\n            merge : true,\n            regex : \".+\"\n        };\n\n        var keywords = (\n            \"this|throw|then|try|typeof|super|switch|return|break|by)|continue|\" +\n            \"catch|class|in|instanceof|is|isnt|if|else|extends|for|forown|\" +\n            \"finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|\" +\n            \"or|on|unless|until|and|yes\"\n        );\n\n        var langConstant = (\n            \"true|false|null|undefined\"\n        );\n\n        var illegal = (\n            \"case|const|default|function|var|void|with|enum|export|implements|\" +\n            \"interface|let|package|private|protected|public|static|yield|\" +\n            \"__hasProp|extends|slice|bind|indexOf\"\n        );\n\n        var supportClass = (\n            \"Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|\" +\n            \"String|RangeError|SyntaxError|Error|EvalError|TypeError|URIError\"\n        );\n\n        var supportFunction = (\n            \"Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|\" +\n            \"encodeURIComponent|decodeURI|decodeURIComponent|String|\"\n        );\n\n        var keywordMapper = this.createKeywordMapper({\n            \"keyword\": keywords,\n            \"constant.language\": langConstant,\n            \"invalid.illegal\": illegal,\n            \"language.support.class\": supportClass,\n            \"language.support.function\": supportFunction,\n        }, \"identifier\");\n\n        this.$rules = {\n            start : [\n                {\n                    token : \"identifier\",\n                    regex : \"(?:(?:\\\\.|::)\\\\s*)\" + identifier\n                }, {\n                    token : \"variable\",\n                    regex : \"@(?:\" + identifier + \")?\"\n                }, {\n                    token: keywordMapper,\n                    regex : identifier\n                }, {\n                    token : \"constant.numeric\",\n                    regex : \"(?:0x[\\\\da-fA-F]+|(?:\\\\d+(?:\\\\.\\\\d+)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : \"'''\",\n                    next : \"qdoc\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : '\"\"\"',\n                    next : \"qqdoc\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : \"'\",\n                    next : \"qstring\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : '\"',\n                    next : \"qqstring\"\n                }, {\n                    token : \"string\",\n                    merge : true,\n                    regex : \"`\",\n                    next : \"js\"\n                }, {\n                    token : \"string.regex\",\n                    merge : true,\n                    regex : \"///\",\n                    next : \"heregex\"\n                }, {\n                    token : \"string.regex\",\n                    regex : \"/(?!\\\\s)[^[/\\\\n\\\\\\\\]*(?: (?:\\\\\\\\.|\\\\[[^\\\\]\\\\n\\\\\\\\]*(?:\\\\\\\\.[^\\\\]\\\\n\\\\\\\\]*)*\\\\])[^[/\\\\n\\\\\\\\]*)*/[imgy]{0,4}(?!\\\\w)\"\n                }, {\n                    token : \"comment\",\n                    merge : true,\n                    regex : \"###(?!#)\",\n                    next : \"comment\"\n                }, {\n                    token : \"comment\",\n                    regex : \"#.*\"\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\?|\\\\:|\\\\,|\\\\.\"\n                }, {\n                    token : \"keyword.operator\",\n                    regex : \"(?:[\\\\-=]>|[-+*/%<>&|^!?=]=|>>>=?|\\\\-\\\\-|\\\\+\\\\+|::|&&=|\\\\|\\\\|=|<<=|>>=|\\\\?\\\\.|\\\\.{2,3}|[!*+-=><])\"\n                }, {\n                    token : \"paren.lparen\",\n                    regex : \"[({[]\"\n                }, {\n                    token : \"paren.rparen\",\n                    regex : \"[\\\\]})]\"\n                }, {\n                    token : \"text\",\n                    regex : \"\\\\s+\"\n                }],\n\n            qdoc : [{\n                token : \"string\",\n                regex : \".*?'''\",\n                next : \"start\"\n            }, stringfill],\n\n            qqdoc : [{\n                token : \"string\",\n                regex : '.*?\"\"\"',\n                next : \"start\"\n            }, stringfill],\n\n            qstring : [{\n                token : \"string\",\n                regex : \"[^\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\']*)*'\",\n                merge : true,\n                next : \"start\"\n            }, stringfill],\n\n            qqstring : [{\n                token : \"string\",\n                regex : '[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',\n                merge : true,\n                next : \"start\"\n            }, stringfill],\n\n            js : [{\n                token : \"string\",\n                merge : true,\n                regex : \"[^\\\\\\\\`]*(?:\\\\\\\\.[^\\\\\\\\`]*)*`\",\n                next : \"start\"\n            }, stringfill],\n\n            heregex : [{\n                token : \"string.regex\",\n                regex : '.*?///[imgy]{0,4}',\n                next : \"start\"\n            }, {\n                token : \"comment.regex\",\n                regex : \"\\\\s+(?:#.*)?\"\n            }, {\n                token : \"string.regex\",\n                merge : true,\n                regex : \"\\\\S+\"\n            }],\n\n            comment : [{\n                token : \"comment\",\n                regex : '.*?###',\n                next : \"start\"\n            }, {\n                token : \"comment\",\n                merge : true,\n                regex : \".+\"\n            }]\n        };\n    }\n\n    exports.CoffeeHighlightRules = CoffeeHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-java.js",
    "content": "define('ace/mode/java', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/java_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaHighlightRules = require(\"./java_highlight_rules\").JavaHighlightRules;\n\nvar Mode = function() {\n    JavaScriptMode.call(this);\n    \n    this.$tokenizer = new Tokenizer(new JavaHighlightRules().getRules());\n};\noop.inherits(Mode, JavaScriptMode);\n\n(function() {\n    \n    this.createWorker = function(session) {\n        return null;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\ndefine('ace/mode/java_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaHighlightRules = function() {\n\n    // taken from http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html\n    var keywords = (\n    \"abstract|continue|for|new|switch|\" +\n    \"assert|default|goto|package|synchronized|\" +\n    \"boolean|do|if|private|this|\" +\n    \"break|double|implements|protected|throw|\" +\n    \"byte|else|import|public|throws|\" +\n    \"case|enum|instanceof|return|transient|\" +\n    \"catch|extends|int|short|try|\" +\n    \"char|final|interface|static|void|\" +\n    \"class|finally|long|strictfp|volatile|\" +\n    \"const|float|native|super|while\"\n    );\n\n    var buildinConstants = (\"null|Infinity|NaN|undefined\");\n\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": langClasses,\n\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaHighlightRules, TextHighlightRules);\n\nexports.JavaHighlightRules = JavaHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-javascript.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-json.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/json', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/json_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/worker/worker_client'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HighlightRules = require(\"./json_highlight_rules\").JsonHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new HighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/json_worker\", \"JsonWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n\n        worker.on(\"ok\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/json_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JsonHighlightRules = function() {\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"variable\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'\n            }, {\n                token : \"string\", // single line\n                regex : '\"',\n                next  : \"string\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : \"invalid.illegal\", // single quoted strings are not allowed\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"invalid.illegal\", // comments are not allowed\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"string\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next  : \"start\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n    \n};\n\noop.inherits(JsonHighlightRules, TextHighlightRules);\n\nexports.JsonHighlightRules = JsonHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-jsp.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/jsp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/jsp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/mode/javascript', 'ace/mode/css'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JspHighlightRules = require(\"./jsp_highlight_rules\").JspHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\n\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\n\nvar Mode = function() {\n    var highlighter = new JspHighlightRules();\n    this.$tokenizer = new Tokenizer(highlighter.getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/jsp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules', 'ace/mode/java_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar JavaHighlightRules = require(\"./java_highlight_rules\").JavaHighlightRules;\n\nvar JspHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n    for (var i in this.$rules) {\n        this.$rules[i].unshift({\n            token : \"meta.tag\", // jsp open tag\n            regex : \"<%@?|<%=?|<jsp:[^>]+>\",\n            next  : \"jsp-start\"\n        });\n    }\n\n    var builtinVariables = 'request|response|out|session|' +\n            'application|config|pageContext|page|Exception';\n\n    var keywords = 'page|include|taglib';\n\n    this.embedRules(JavaHighlightRules, \"jsp-\");\n\n    this.$rules[\"start\"].unshift({\n        token : \"comment\",\n        merge : true,\n        regex : \"<%--\",\n        next : \"comment\"\n    });\n\n    this.$rules[\"jsp-start\"].unshift({\n        token : \"meta.tag\", // jsp close tag\n        regex : \"%>|<\\\\/jsp:[^>]+>\",\n        next  : \"start\"\n    },\n    {\n        token: \"variable.language\",\n        regex : builtinVariables\n    }, {\n        token: \"keyword\",\n        regex : keywords\n    });\n\n    this.$rules.comment.unshift({\n        token : \"comment\",\n        regex : \".*?--%>\",\n        next : \"start\"\n    });\n};\n\noop.inherits(JspHighlightRules, HtmlHighlightRules);\n\nexports.JspHighlightRules = JspHighlightRules;\n});\n\ndefine('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*script\\\\b)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*style\\\\b)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n    \n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\", tagMap);\n    xmlUtil.tag(this.$rules, \"style\", \"css-start\", tagMap);\n    xmlUtil.tag(this.$rules, \"script\", \"js-start\", tagMap);\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(HtmlHighlightRules, TextHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\ndefine('ace/mode/java_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaHighlightRules = function() {\n\n    // taken from http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html\n    var keywords = (\n    \"abstract|continue|for|new|switch|\" +\n    \"assert|default|goto|package|synchronized|\" +\n    \"boolean|do|if|private|this|\" +\n    \"break|double|implements|protected|throw|\" +\n    \"byte|else|import|public|throws|\" +\n    \"case|enum|instanceof|return|transient|\" +\n    \"catch|extends|int|short|try|\" +\n    \"char|final|interface|static|void|\" +\n    \"class|finally|long|strictfp|volatile|\" +\n    \"const|float|native|super|while\"\n    );\n\n    var buildinConstants = (\"null|Infinity|NaN|undefined\");\n\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": langClasses,\n\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaHighlightRules, TextHighlightRules);\n\nexports.JavaHighlightRules = JavaHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"csslint\", function(e) {\n            var errors = [];\n            e.data.forEach(function(message) {\n                errors.push({\n                    row: message.line - 1,\n                    column: message.col - 1,\n                    text: message.message,\n                    type: message.type,\n                    lint: message\n                });\n            });\n            \n            session.setAnnotations(errors);\n        });\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-jsx.js",
    "content": "define('ace/mode/jsx', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/jsx_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JsxHighlightRules = require(\"./jsx_highlight_rules\").JsxHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nfunction Mode() {\n    this.$tokenizer = new Tokenizer(new JsxHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n}\noop.inherits(Mode, TextMode);\n\n(function() {\n\n      this.getNextLineIndent = function(state, line, tab) {\n          var indent = this.$getIndent(line);\n\n          var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n          var tokens = tokenizedLine.tokens;\n\n          if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n              return indent;\n          }\n\n          if (state == \"start\") {\n              var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n              if (match) {\n                  indent += tab;\n              }\n          }\n\n          return indent;\n      };\n\n      this.checkOutdent = function(state, line, input) {\n          return this.$outdent.checkOutdent(line, input);\n      };\n\n      this.autoOutdent = function(state, doc, row) {\n          this.$outdent.autoOutdent(doc, row);\n      };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\ndefine('ace/mode/jsx_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n    var oop = require(\"../lib/oop\");\n    var lang = require(\"../lib/lang\");\n    var DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n    \n    var JsxHighlightRules = function() {\n        var keywords = lang.arrayToMap(\n            (\"break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|\" +\n             \"if|throw|\" +\n             \"delete|in|try|\" +\n             \"class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|\" +\n             \"number|int|string|boolean|variant|\" +\n             \"log|assert\").split(\"|\")\n        );\n        \n        var buildinConstants = lang.arrayToMap(\n            (\"null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined\").split(\"|\")\n        );\n        \n        var reserved = lang.arrayToMap(\n            (\"debugger|with|\" +\n             \"const|export|\" +\n             \"let|private|public|yield|protected|\" +\n             \"extern|native|as|operator|__fake__|__readonly__\").split(\"|\")\n        );\n        \n        var identifierRe = \"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\";\n        \n        this.$rules = {\n            \"start\" : [\n                {\n                    token : \"comment\",\n                    regex : \"\\\\/\\\\/.*$\"\n                },\n                DocCommentHighlightRules.getStartRule(\"doc-start\"),\n                {\n                    token : \"comment\", // multi line comment\n                    regex : \"\\\\/\\\\*\",\n                    merge : true,\n                    next : \"comment\"\n                }, {\n                    token : \"string.regexp\",\n                    regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n                }, {\n                    token : \"string\", // single line\n                    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n                }, {\n                    token : \"string\", // single line\n                    regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n                }, {\n                    token : \"constant.numeric\", // hex\n                    regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n                }, {\n                    token : \"constant.numeric\", // float\n                    regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n                }, {\n                    token : \"constant.language.boolean\",\n                    regex : \"(?:true|false)\\\\b\"\n                }, {\n                    token : [\n                        \"storage.type\",\n                        \"text\",\n                        \"entity.name.function\"\n                    ],\n                    regex : \"(function)(\\\\s+)(\" + identifierRe + \")\"\n                }, {\n                    token : function(value) {\n                        if (value == \"this\")\n                            return \"variable.language\";\n                        else if (value == \"function\")\n                            return \"storage.type\";\n                        else if (keywords.hasOwnProperty(value) || reserved.hasOwnProperty(value))\n                            return \"keyword\";\n                        else if (buildinConstants.hasOwnProperty(value))\n                            return \"constant.language\";\n                        else if (/^_?[A-Z][a-zA-Z0-9_]*$/.test(value))\n                            return \"language.support.class\";\n                        else\n                            return \"identifier\";\n                    },\n                    // TODO: Unicode escape sequences\n                    // TODO: Unicode identifiers\n                    regex : identifierRe\n                }, {\n                    token : \"keyword.operator\",\n                    regex : \"!|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n                }, {\n                    token : \"paren.lparen\",\n                    regex : \"[[({<]\"\n                }, {\n                    token : \"paren.rparen\",\n                    regex : \"[\\\\])}>]\"\n                }, {\n                    token : \"text\",\n                    regex : \"\\\\s+\"\n                }\n            ],\n            \"comment\" : [\n                {\n                    token : \"comment\", // closing comment\n                    regex : \".*?\\\\*\\\\/\",\n                    next : \"start\"\n                }, {\n                    token : \"comment\", // comment spanning whole line\n                    merge : true,\n                    regex : \".+\"\n                }\n            ]\n        };\n        \n        this.embedRules(DocCommentHighlightRules, \"doc-\",\n            [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n    };\n    \n    oop.inherits(JsxHighlightRules, TextHighlightRules);\n\n    exports.JsxHighlightRules = JsxHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-latex.js",
    "content": "define('ace/mode/latex', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/latex_highlight_rules', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar LatexHighlightRules = require(\"./latex_highlight_rules\").LatexHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function()\n{\n    this.$tokenizer = new Tokenizer(new LatexHighlightRules().getRules());\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        // This code is adapted from ruby.js\n        var outdent = true;\n        \n        // LaTeX comments begin with % and go to the end of the line\n        var commentRegEx = /^(\\s*)\\%/;\n\n        for (var i = startRow; i <= endRow; i++) {\n            if (!commentRegEx.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i = startRow; i <= endRow; i++) {\n                var line = doc.getLine(i);\n                var m = line.match(commentRegEx);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"%\");\n        }\n    };\n    \n    // There is no universally accepted way of indenting a tex document\n    // so just maintain the indentation of the previous line\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n    \n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\ndefine('ace/mode/latex_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LatexHighlightRules = function() {   \n    this.$rules = {\n        \"start\" : [{\n            // A tex command e.g. \\foo\n            token : \"keyword\",\n            regex : \"\\\\\\\\(?:[^a-zA-Z]|[a-zA-Z]+)\",\n        }, {\n            // Curly and square braces\n            token : \"lparen\",\n            regex : \"[[({]\"\n        }, {\n            // Curly and square braces\n            token : \"rparen\",\n            regex : \"[\\\\])}]\"\n        }, {\n            // Inline math between two $ symbols\n            token : \"string\",\n            regex : \"\\\\$(?:(?:\\\\\\\\.)|(?:[^\\\\$\\\\\\\\]))*?\\\\$\"\n        }, {\n            // A comment. Tex comments start with % and go to \n            // the end of the line\n            token : \"comment\",\n            regex : \"%.*$\"\n        }]\n    };\n};\n\noop.inherits(LatexHighlightRules, TextHighlightRules);\n\nexports.LatexHighlightRules = LatexHighlightRules;\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-less.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/less', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/less_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar LessHighlightRules = require(\"./less_highlight_rules\").LessHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new LessHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/less_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LessHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|\" +\n            \"bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n          \n        //The return array     \n        var ret = [];\n        \n        //All prefixProperties will get the browserPrefix in\n        //the begning by join the prefixProperties array with the value of browserPrefix\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        \n        //Add also prefixProperties and properties without any browser prefix\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|lighten|darken|saturate|\" +\n        \"desaturate|fadein|fadeout|fade|spin|mix|hue|saturation|lightness|\" +\n        \"alpha|round|ceil|floor|percentage|color|iscolor|isnumber|isstring|\" +\n        \"iskeyword|isurl|ispixel|ispercentage|isem\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|\" +\n        \"@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|\" +\n        \"def|end|declare|when|not|and\").split(\"|\")\n    );\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : function(value) {\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else\n                        return \"variable\";\n                },\n                regex : \"@[a-z0-9_\\\\-@]*\\\\b\"\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    else if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n};\n\noop.inherits(LessHighlightRules, TextHighlightRules);\n\nexports.LessHighlightRules = LessHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-liquid.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/liquid', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/liquid_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range'], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar LiquidHighlightRules = require(\"./liquid_highlight_rules\").LiquidHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new LiquidHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var outentedRows = [];\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"#\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/liquid_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LiquidHighlightRules = function() {\n\n    // see: https://developer.mozilla.org/en/Liquid/Reference/Global_Objects\n    var functions = (\n      // Standard Filters\n        \"date|capitalize|downcase|upcase|first|last|join|sort|map|size|escape|\" +\n         \"escape_once|strip_html|strip_newlines|newline_to_br|replace|replace_first|\" +\n         \"truncate|truncatewords|prepend|append|minus|plus|times|divided_by|split\"\n    );\n\n    var keywords = (\n      // Standard Tags\n        \"capture|endcapture|case|endcase|when|comment|endcomment|\" +\n        \"cycle|for|endfor|in|reversed|if|endif|else|elsif|include|endinclude|unless|endunless|\" +\n      // Commonly used tags\n        \"style|text|image|widget|plugin|marker|endmarker|tablerow|endtablerow\"\n    );\n\n    var builtinVariables = 'forloop|tablerowloop';\n        // \"forloop\\\\.(length|index|index0|rindex|rindex0|first|last)|limit|offset|range\" +\n        // \"tablerowloop\\\\.(length|index|index0|rindex|rindex0|first|last|col|col0|\"+\n        // \"col_first|col_last)\"\n\n    var definitions = (\"assign\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": builtinVariables,\n        \"keyword\": keywords,\n        \"support.function\": functions,\n        \"keyword.definition\": definitions\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        start : [{\n            token : \"variable\",\n            regex : \"{%\",\n            next : \"liquid_start\"\n        }, {\n            token : \"variable\",\n            regex : \"{{\",\n            next : \"liquid_start\"\n        }, {\n            token : \"meta.tag\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\\\s*script\\\\b)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\\\s*style\\\\b)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n\n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ] ,\n\n        liquid_start : [{\n            token: \"variable\",\n            regex: \"}}\",\n            next: \"start\"\n        }, {\n            token: \"variable\",\n            regex: \"%}\",\n            next: \"start\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : \"constant.numeric\", // hex\n            regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : \"constant.language.boolean\",\n            regex : \"(?:true|false)\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\/|\\\\*|\\\\-|\\\\+|=|!=|\\\\?\\\\:\"\n        }, {\n            token : \"paren.lparen\",\n            regex : /[\\[\\({]/\n        }, {\n            token : \"paren.rparen\",\n            regex : /[\\])}]/\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }]\n    };\n\n    xmlUtil.tag(this.$rules, \"tag\", \"start\");\n    xmlUtil.tag(this.$rules, \"style\", \"css-start\");\n    xmlUtil.tag(this.$rules, \"script\", \"js-start\");\n\n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n\n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\noop.inherits(LiquidHighlightRules, TextHighlightRules);\n\nexports.LiquidHighlightRules = LiquidHighlightRules;\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-lua.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lua_highlight_rules', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar LuaHighlightRules = require(\"./lua_highlight_rules\").LuaHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules());\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    var indentKeywords = {\n        \"function\": 1,\n        \"then\": 1,\n        \"do\": 1,\n        \"else\": 1,\n        \"elseif\": 1,\n        \"repeat\": 1,\n        \"end\": -1,\n        \"until\": -1,\n    };\n    var outdentKeywords = [\n        \"else\",\n        \"elseif\",\n        \"end\",\n        \"until\"\n    ];\n\n    function getNetIndentLevel(tokens) {\n        var level = 0;\n        // Support single-line blocks by decrementing the indent level if\n        // an ending token is found\n        for (var i in tokens){\n            var token = tokens[i];\n            if (token.type == \"keyword\") {\n                if (token.value in indentKeywords) {\n                    level += indentKeywords[token.value];\n                }\n            } else if (token.type == \"paren.lparen\") {\n                level ++;\n            } else if (token.type == \"paren.rparen\") {\n                level --;\n            }\n        }\n        // Limit the level to +/- 1 since usually users only indent one level\n        // at a time regardless of the logical nesting level\n        if (level < 0) {\n            return -1;\n        } else if (level > 0) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var level = 0;\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (state == \"start\") {\n            level = getNetIndentLevel(tokens);\n        }\n        if (level > 0) {\n            return indent + tab;\n        } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) {\n            // Don't do a next-line outdent if we're going to do a real outdent of this line\n            if (!this.checkOutdent(state, line, \"\\n\")) {\n                return indent.substr(0, indent.length - tab.length);\n            }\n        }\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input != \"\\n\" && input != \"\\r\" && input != \"\\r\\n\")\n            return false;\n\n        if (line.match(/^\\s*[\\)\\}\\]]$/))\n            return true;\n\n        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens || !tokens.length)\n            return false;\n\n        return (tokens[0].type == \"keyword\" && outdentKeywords.indexOf(tokens[0].value) != -1);\n    };\n\n    this.autoOutdent = function(state, session, row) {\n        var prevLine = session.getLine(row - 1);\n        var prevIndent = this.$getIndent(prevLine).length;\n        var prevTokens = this.$tokenizer.getLineTokens(prevLine, \"start\").tokens;\n        var tabLength = session.getTabString().length;\n        var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens);\n        var curIndent = this.$getIndent(session.getLine(row)).length;\n        if (curIndent < expectedIndent) {\n            // User already outdented //\n            return;\n        }\n        session.outdentRows(new Range(row, 0, row + 2, 0));\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/lua_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LuaHighlightRules = function() {\n\n    var keywords = (\n        \"break|do|else|elseif|end|for|function|if|in|local|repeat|\"+\n         \"return|then|until|while|or|and|not\"\n    );\n\n    var builtinConstants = (\"true|false|nil|_G|_VERSION\");\n\n    var functions = (\n      // builtinFunctions\n        \"string|xpcall|package|tostring|print|os|unpack|require|\"+\n        \"getfenv|setmetatable|next|assert|tonumber|io|rawequal|\"+\n        \"collectgarbage|getmetatable|module|rawset|math|debug|\"+\n        \"pcall|table|newproxy|type|coroutine|_G|select|gcinfo|\"+\n        \"pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|\"+\n        \"load|error|loadfile|\"+\n\n        \"sub|upper|len|gfind|rep|find|match|char|dump|gmatch|\"+\n        \"reverse|byte|format|gsub|lower|preload|loadlib|loaded|\"+\n        \"loaders|cpath|config|path|seeall|exit|setlocale|date|\"+\n        \"getenv|difftime|remove|time|clock|tmpname|rename|execute|\"+\n        \"lines|write|close|flush|open|output|type|read|stderr|\"+\n        \"stdin|input|stdout|popen|tmpfile|log|max|acos|huge|\"+\n        \"ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|\"+\n        \"frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|\"+\n        \"atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|\"+\n        \"gethook|setmetatable|setlocal|traceback|setfenv|getinfo|\"+\n        \"setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|\"+\n        \"foreachi|maxn|foreach|concat|sort|remove|resume|yield|\"+\n        \"status|wrap|create|running|\"+\n      // metatableMethods\n        \"__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|\"+\n         \"__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber\"\n    );\n\n    var stdLibaries = (\"string|package|os|io|math|debug|table|coroutine\");\n\n    var futureReserved = \"\";\n\n    var deprecatedIn5152 = (\"setn|foreach|foreachi|gcinfo|log10|maxn\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"support.function\": functions,\n        \"invalid.deprecated\": deprecatedIn5152,\n        \"constant.library\": stdLibaries,\n        \"constant.language\": builtinConstants,\n        \"invalid.illegal\": futureReserved,\n        \"variable.language\": \"this\"\n    }, \"identifier\");\n\n    var strPre = \"\";\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + hexInteger + \")\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var floatNumber = \"(?:\" + pointFloat + \")\";\n\n    var comment_stack = [];\n\n    this.$rules = {\n        \"start\" :\n\n\n        // bracketed comments\n        [{\n            token : \"comment\",           // --[[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\[.*\\\\]\\\\]'\n        }, {\n            token : \"comment\",           // --[=[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\=\\\\[.*\\\\]\\\\=\\\\]'\n        }, {\n            token : \"comment\",           // --[==[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={2}\\\\[.*\\\\]\\\\={2}\\\\]'\n        }, {\n            token : \"comment\",           // --[===[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={3}\\\\[.*\\\\]\\\\={3}\\\\]'\n        }, {\n            token : \"comment\",           // --[====[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={4}\\\\[.*\\\\]\\\\={4}\\\\]'\n        }, {\n            token : \"comment\",           // --[====+[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={5}\\\\=*\\\\[.*\\\\]\\\\={5}\\\\=*\\\\]'\n        },\n\n        // multiline bracketed comments\n        {\n            token : \"comment\",           // --[[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\[.*$',\n            merge : true,\n            next  : \"qcomment\"\n        }, {\n            token : \"comment\",           // --[=[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\=\\\\[.*$',\n            merge : true,\n            next  : \"qcomment1\"\n        }, {\n            token : \"comment\",           // --[==[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={2}\\\\[.*$',\n            merge : true,\n            next  : \"qcomment2\"\n        }, {\n            token : \"comment\",           // --[===[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={3}\\\\[.*$',\n            merge : true,\n            next  : \"qcomment3\"\n        }, {\n            token : \"comment\",           // --[====[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={4}\\\\[.*$',\n            merge : true,\n            next  : \"qcomment4\"\n        }, {\n            token : function(value){     // --[====+[ comment\n                // WARNING: EXTREMELY SLOW, but this is the only way to circumvent the\n                // limits imposed by the current automaton.\n                // I've never personally seen any practical code where 5 or more '='s are\n                // used for string or commenting, so this will rarely be invoked.\n                var pattern = /\\-\\-\\[(\\=+)\\[/, match;\n                // you can never be too paranoid ;)\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined)\n                    comment_stack.push(match.length);\n\n                return \"comment\";\n            },\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={5}\\\\=*\\\\[.*$',\n            merge : true,\n            next  : \"qcomment5\"\n        },\n\n        // single line comments\n        {\n            token : \"comment\",\n            regex : \"\\\\-\\\\-.*$\"\n        },\n\n        // bracketed strings\n        {\n            token : \"string\",           // [[ string\n            regex : strPre + '\\\\[\\\\[.*\\\\]\\\\]'\n        }, {\n            token : \"string\",           // [=[ string\n            regex : strPre + '\\\\[\\\\=\\\\[.*\\\\]\\\\=\\\\]'\n        }, {\n            token : \"string\",           // [==[ string\n            regex : strPre + '\\\\[\\\\={2}\\\\[.*\\\\]\\\\={2}\\\\]'\n        }, {\n            token : \"string\",           // [===[ string\n            regex : strPre + '\\\\[\\\\={3}\\\\[.*\\\\]\\\\={3}\\\\]'\n        }, {\n            token : \"string\",           // [====[ string\n            regex : strPre + '\\\\[\\\\={4}\\\\[.*\\\\]\\\\={4}\\\\]'\n        }, {\n            token : \"string\",           // [====+[ string\n            regex : strPre + '\\\\[\\\\={5}\\\\=*\\\\[.*\\\\]\\\\={5}\\\\=*\\\\]'\n        },\n\n        // multiline bracketed strings\n        {\n            token : \"string\",           // [[ string\n            regex : strPre + '\\\\[\\\\[.*$',\n            merge : true,\n            next  : \"qstring\"\n        }, {\n            token : \"string\",           // [=[ string\n            regex : strPre + '\\\\[\\\\=\\\\[.*$',\n            merge : true,\n            next  : \"qstring1\"\n        }, {\n            token : \"string\",           // [==[ string\n            regex : strPre + '\\\\[\\\\={2}\\\\[.*$',\n            merge : true,\n            next  : \"qstring2\"\n        }, {\n            token : \"string\",           // [===[ string\n            regex : strPre + '\\\\[\\\\={3}\\\\[.*$',\n            merge : true,\n            next  : \"qstring3\"\n        }, {\n            token : \"string\",           // [====[ string\n            regex : strPre + '\\\\[\\\\={4}\\\\[.*$',\n            merge : true,\n            next  : \"qstring4\"\n        }, {\n            token : function(value){     // --[====+[ string\n                // WARNING: EXTREMELY SLOW, see above.\n                var pattern = /\\[(\\=+)\\[/, match;\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined)\n                    comment_stack.push(match.length);\n\n                return \"string\";\n            },\n            regex : strPre + '\\\\[\\\\={5}\\\\=*\\\\[.*$',\n            merge : true,\n            next  : \"qstring5\"\n        },\n\n        {\n            token : \"string\",           // \" string\n            regex : strPre + '\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : strPre + \"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\/|%|\\\\#|\\\\^|~|<|>|<=|=>|==|~=|=|\\\\:|\\\\.\\\\.\\\\.|\\\\.\\\\.\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n\n        \"qcomment\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment1\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\=\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment2\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={2}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment3\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={3}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment4\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={4}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment5\": [ {\n            token : function(value){\n                // very hackish, mutates the qcomment5 field on the fly.\n                var pattern = /\\](\\=+)\\]/, rule = this.rules.qcomment5[0], match;\n                rule.next = \"start\";\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined){\n                    var found = match.length, expected;\n                    if ((expected = comment_stack.pop()) != found){\n                        comment_stack.push(expected);\n                        rule.next = \"qcomment5\";\n                    }\n                }\n\n                return \"comment\";\n            },\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={5}\\\\=*\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n\n        \"qstring\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring1\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\=\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring2\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={2}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring3\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={3}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring4\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={4}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring5\": [ {\n            token : function(value){\n                // very hackish, mutates the qstring5 field on the fly.\n                var pattern = /\\](\\=+)\\]/, rule = this.rules.qstring5[0], match;\n                rule.next = \"start\";\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined){\n                    var found = match.length, expected;\n                    if ((expected = comment_stack.pop()) != found){\n                        comment_stack.push(expected);\n                        rule.next = \"qstring5\";\n                    }\n                }\n\n                return \"string\";\n            },\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={5}\\\\=*\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ]\n\n    };\n\n}\n\noop.inherits(LuaHighlightRules, TextHighlightRules);\n\nexports.LuaHighlightRules = LuaHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-luapage.js",
    "content": "define('ace/mode/luapage', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html', 'ace/mode/lua', 'ace/tokenizer', 'ace/mode/luapage_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar LuaMode = require(\"./lua\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar LuaPageHighlightRules = require(\"./luapage_highlight_rules\").LuaPageHighlightRules;\n\nvar Mode = function() {\n    var highlighter = new LuaPageHighlightRules();\n    \n    this.$tokenizer = new Tokenizer(new LuaPageHighlightRules().getRules());\n    this.$embeds = highlighter.getEmbeds();\n    this.createModeDelegates({\n        \"lua-\": LuaMode\n    });\n};\noop.inherits(Mode, HtmlMode);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar HtmlBehaviour = require(\"./behaviour/html\").HtmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\n\nvar Mode = function() {\n    var highlighter = new HtmlHighlightRules();\n    this.$tokenizer = new Tokenizer(highlighter.getRules());\n    this.$behaviour = new HtmlBehaviour();\n    \n    this.$embeds = highlighter.getEmbeds();\n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    \n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        return 0;\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"csslint\", function(e) {\n            var errors = [];\n            e.data.forEach(function(message) {\n                errors.push({\n                    row: message.line - 1,\n                    column: message.col - 1,\n                    text: message.message,\n                    type: message.type,\n                    lint: message\n                });\n            });\n            \n            session.setAnnotations(errors);\n        });\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*script\\\\b)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*style\\\\b)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n    \n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\", tagMap);\n    xmlUtil.tag(this.$rules, \"style\", \"css-start\", tagMap);\n    xmlUtil.tag(this.$rules, \"script\", \"js-start\", tagMap);\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(HtmlHighlightRules, TextHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar XmlBehaviour = require(\"../behaviour/xml\").XmlBehaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar HtmlBehaviour = function () {\n\n    this.inherit(XmlBehaviour); // Get xml behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var element = token.value;\n            if (atCursor){\n                var element = element.substring(0, position.column - token.start);\n            }\n            if (voidElements.indexOf(element) !== -1){\n                return;\n            }\n            return {\n               text: '>' + '</' + element + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n}\noop.inherits(HtmlBehaviour, XmlBehaviour);\n\nexports.HtmlBehaviour = HtmlBehaviour;\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/folding/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {\n    MixedFoldMode.call(this, new XmlFoldMode({\n        // void elements\n        \"area\": 1,\n        \"base\": 1,\n        \"br\": 1,\n        \"col\": 1,\n        \"command\": 1,\n        \"embed\": 1,\n        \"hr\": 1,\n        \"img\": 1,\n        \"input\": 1,\n        \"keygen\": 1,\n        \"link\": 1,\n        \"meta\": 1,\n        \"param\": 1,\n        \"source\": 1,\n        \"track\": 1,\n        \"wbr\": 1,\n        \n        // optional tags \n        \"li\": 1,\n        \"dt\": 1,\n        \"dd\": 1,\n        \"p\": 1,\n        \"rt\": 1,\n        \"rp\": 1,\n        \"optgroup\": 1,\n        \"option\": 1,\n        \"colgroup\": 1,\n        \"td\": 1,\n        \"th\": 1\n    }), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\ndefine('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.indexOf(\"meta.tag\") === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = this.tagRe.exec(tag);\n        var column = this.tagRe.lastIndex || 0;\n        this.tagRe.lastIndex = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lua_highlight_rules', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar LuaHighlightRules = require(\"./lua_highlight_rules\").LuaHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules());\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    var indentKeywords = {\n        \"function\": 1,\n        \"then\": 1,\n        \"do\": 1,\n        \"else\": 1,\n        \"elseif\": 1,\n        \"repeat\": 1,\n        \"end\": -1,\n        \"until\": -1,\n    };\n    var outdentKeywords = [\n        \"else\",\n        \"elseif\",\n        \"end\",\n        \"until\"\n    ];\n\n    function getNetIndentLevel(tokens) {\n        var level = 0;\n        // Support single-line blocks by decrementing the indent level if\n        // an ending token is found\n        for (var i in tokens){\n            var token = tokens[i];\n            if (token.type == \"keyword\") {\n                if (token.value in indentKeywords) {\n                    level += indentKeywords[token.value];\n                }\n            } else if (token.type == \"paren.lparen\") {\n                level ++;\n            } else if (token.type == \"paren.rparen\") {\n                level --;\n            }\n        }\n        // Limit the level to +/- 1 since usually users only indent one level\n        // at a time regardless of the logical nesting level\n        if (level < 0) {\n            return -1;\n        } else if (level > 0) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var level = 0;\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (state == \"start\") {\n            level = getNetIndentLevel(tokens);\n        }\n        if (level > 0) {\n            return indent + tab;\n        } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) {\n            // Don't do a next-line outdent if we're going to do a real outdent of this line\n            if (!this.checkOutdent(state, line, \"\\n\")) {\n                return indent.substr(0, indent.length - tab.length);\n            }\n        }\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input != \"\\n\" && input != \"\\r\" && input != \"\\r\\n\")\n            return false;\n\n        if (line.match(/^\\s*[\\)\\}\\]]$/))\n            return true;\n\n        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens || !tokens.length)\n            return false;\n\n        return (tokens[0].type == \"keyword\" && outdentKeywords.indexOf(tokens[0].value) != -1);\n    };\n\n    this.autoOutdent = function(state, session, row) {\n        var prevLine = session.getLine(row - 1);\n        var prevIndent = this.$getIndent(prevLine).length;\n        var prevTokens = this.$tokenizer.getLineTokens(prevLine, \"start\").tokens;\n        var tabLength = session.getTabString().length;\n        var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens);\n        var curIndent = this.$getIndent(session.getLine(row)).length;\n        if (curIndent < expectedIndent) {\n            // User already outdented //\n            return;\n        }\n        session.outdentRows(new Range(row, 0, row + 2, 0));\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/lua_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LuaHighlightRules = function() {\n\n    var keywords = (\n        \"break|do|else|elseif|end|for|function|if|in|local|repeat|\"+\n         \"return|then|until|while|or|and|not\"\n    );\n\n    var builtinConstants = (\"true|false|nil|_G|_VERSION\");\n\n    var functions = (\n      // builtinFunctions\n        \"string|xpcall|package|tostring|print|os|unpack|require|\"+\n        \"getfenv|setmetatable|next|assert|tonumber|io|rawequal|\"+\n        \"collectgarbage|getmetatable|module|rawset|math|debug|\"+\n        \"pcall|table|newproxy|type|coroutine|_G|select|gcinfo|\"+\n        \"pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|\"+\n        \"load|error|loadfile|\"+\n\n        \"sub|upper|len|gfind|rep|find|match|char|dump|gmatch|\"+\n        \"reverse|byte|format|gsub|lower|preload|loadlib|loaded|\"+\n        \"loaders|cpath|config|path|seeall|exit|setlocale|date|\"+\n        \"getenv|difftime|remove|time|clock|tmpname|rename|execute|\"+\n        \"lines|write|close|flush|open|output|type|read|stderr|\"+\n        \"stdin|input|stdout|popen|tmpfile|log|max|acos|huge|\"+\n        \"ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|\"+\n        \"frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|\"+\n        \"atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|\"+\n        \"gethook|setmetatable|setlocal|traceback|setfenv|getinfo|\"+\n        \"setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|\"+\n        \"foreachi|maxn|foreach|concat|sort|remove|resume|yield|\"+\n        \"status|wrap|create|running|\"+\n      // metatableMethods\n        \"__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|\"+\n         \"__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber\"\n    );\n\n    var stdLibaries = (\"string|package|os|io|math|debug|table|coroutine\");\n\n    var futureReserved = \"\";\n\n    var deprecatedIn5152 = (\"setn|foreach|foreachi|gcinfo|log10|maxn\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"support.function\": functions,\n        \"invalid.deprecated\": deprecatedIn5152,\n        \"constant.library\": stdLibaries,\n        \"constant.language\": builtinConstants,\n        \"invalid.illegal\": futureReserved,\n        \"variable.language\": \"this\"\n    }, \"identifier\");\n\n    var strPre = \"\";\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + hexInteger + \")\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var floatNumber = \"(?:\" + pointFloat + \")\";\n\n    var comment_stack = [];\n\n    this.$rules = {\n        \"start\" :\n\n\n        // bracketed comments\n        [{\n            token : \"comment\",           // --[[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\[.*\\\\]\\\\]'\n        }, {\n            token : \"comment\",           // --[=[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\=\\\\[.*\\\\]\\\\=\\\\]'\n        }, {\n            token : \"comment\",           // --[==[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={2}\\\\[.*\\\\]\\\\={2}\\\\]'\n        }, {\n            token : \"comment\",           // --[===[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={3}\\\\[.*\\\\]\\\\={3}\\\\]'\n        }, {\n            token : \"comment\",           // --[====[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={4}\\\\[.*\\\\]\\\\={4}\\\\]'\n        }, {\n            token : \"comment\",           // --[====+[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={5}\\\\=*\\\\[.*\\\\]\\\\={5}\\\\=*\\\\]'\n        },\n\n        // multiline bracketed comments\n        {\n            token : \"comment\",           // --[[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\[.*$',\n            merge : true,\n            next  : \"qcomment\"\n        }, {\n            token : \"comment\",           // --[=[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\=\\\\[.*$',\n            merge : true,\n            next  : \"qcomment1\"\n        }, {\n            token : \"comment\",           // --[==[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={2}\\\\[.*$',\n            merge : true,\n            next  : \"qcomment2\"\n        }, {\n            token : \"comment\",           // --[===[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={3}\\\\[.*$',\n            merge : true,\n            next  : \"qcomment3\"\n        }, {\n            token : \"comment\",           // --[====[ comment\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={4}\\\\[.*$',\n            merge : true,\n            next  : \"qcomment4\"\n        }, {\n            token : function(value){     // --[====+[ comment\n                // WARNING: EXTREMELY SLOW, but this is the only way to circumvent the\n                // limits imposed by the current automaton.\n                // I've never personally seen any practical code where 5 or more '='s are\n                // used for string or commenting, so this will rarely be invoked.\n                var pattern = /\\-\\-\\[(\\=+)\\[/, match;\n                // you can never be too paranoid ;)\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined)\n                    comment_stack.push(match.length);\n\n                return \"comment\";\n            },\n            regex : strPre + '\\\\-\\\\-\\\\[\\\\={5}\\\\=*\\\\[.*$',\n            merge : true,\n            next  : \"qcomment5\"\n        },\n\n        // single line comments\n        {\n            token : \"comment\",\n            regex : \"\\\\-\\\\-.*$\"\n        },\n\n        // bracketed strings\n        {\n            token : \"string\",           // [[ string\n            regex : strPre + '\\\\[\\\\[.*\\\\]\\\\]'\n        }, {\n            token : \"string\",           // [=[ string\n            regex : strPre + '\\\\[\\\\=\\\\[.*\\\\]\\\\=\\\\]'\n        }, {\n            token : \"string\",           // [==[ string\n            regex : strPre + '\\\\[\\\\={2}\\\\[.*\\\\]\\\\={2}\\\\]'\n        }, {\n            token : \"string\",           // [===[ string\n            regex : strPre + '\\\\[\\\\={3}\\\\[.*\\\\]\\\\={3}\\\\]'\n        }, {\n            token : \"string\",           // [====[ string\n            regex : strPre + '\\\\[\\\\={4}\\\\[.*\\\\]\\\\={4}\\\\]'\n        }, {\n            token : \"string\",           // [====+[ string\n            regex : strPre + '\\\\[\\\\={5}\\\\=*\\\\[.*\\\\]\\\\={5}\\\\=*\\\\]'\n        },\n\n        // multiline bracketed strings\n        {\n            token : \"string\",           // [[ string\n            regex : strPre + '\\\\[\\\\[.*$',\n            merge : true,\n            next  : \"qstring\"\n        }, {\n            token : \"string\",           // [=[ string\n            regex : strPre + '\\\\[\\\\=\\\\[.*$',\n            merge : true,\n            next  : \"qstring1\"\n        }, {\n            token : \"string\",           // [==[ string\n            regex : strPre + '\\\\[\\\\={2}\\\\[.*$',\n            merge : true,\n            next  : \"qstring2\"\n        }, {\n            token : \"string\",           // [===[ string\n            regex : strPre + '\\\\[\\\\={3}\\\\[.*$',\n            merge : true,\n            next  : \"qstring3\"\n        }, {\n            token : \"string\",           // [====[ string\n            regex : strPre + '\\\\[\\\\={4}\\\\[.*$',\n            merge : true,\n            next  : \"qstring4\"\n        }, {\n            token : function(value){     // --[====+[ string\n                // WARNING: EXTREMELY SLOW, see above.\n                var pattern = /\\[(\\=+)\\[/, match;\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined)\n                    comment_stack.push(match.length);\n\n                return \"string\";\n            },\n            regex : strPre + '\\\\[\\\\={5}\\\\=*\\\\[.*$',\n            merge : true,\n            next  : \"qstring5\"\n        },\n\n        {\n            token : \"string\",           // \" string\n            regex : strPre + '\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : strPre + \"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\/|%|\\\\#|\\\\^|~|<|>|<=|=>|==|~=|=|\\\\:|\\\\.\\\\.\\\\.|\\\\.\\\\.\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n\n        \"qcomment\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment1\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\=\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment2\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={2}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment3\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={3}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment4\": [ {\n            token : \"comment\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={4}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qcomment5\": [ {\n            token : function(value){\n                // very hackish, mutates the qcomment5 field on the fly.\n                var pattern = /\\](\\=+)\\]/, rule = this.rules.qcomment5[0], match;\n                rule.next = \"start\";\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined){\n                    var found = match.length, expected;\n                    if ((expected = comment_stack.pop()) != found){\n                        comment_stack.push(expected);\n                        rule.next = \"qcomment5\";\n                    }\n                }\n\n                return \"comment\";\n            },\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={5}\\\\=*\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : '.+'\n        } ],\n\n        \"qstring\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring1\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\=\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring2\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={2}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring3\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={3}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring4\": [ {\n            token : \"string\",\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={4}\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring5\": [ {\n            token : function(value){\n                // very hackish, mutates the qstring5 field on the fly.\n                var pattern = /\\](\\=+)\\]/, rule = this.rules.qstring5[0], match;\n                rule.next = \"start\";\n                if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined){\n                    var found = match.length, expected;\n                    if ((expected = comment_stack.pop()) != found){\n                        comment_stack.push(expected);\n                        rule.next = \"qstring5\";\n                    }\n                }\n\n                return \"string\";\n            },\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?\\\\]\\\\={5}\\\\=*\\\\]\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ]\n\n    };\n\n}\n\noop.inherits(LuaHighlightRules, TextHighlightRules);\n\nexports.LuaHighlightRules = LuaHighlightRules;\n});\n// LuaPage implements the LuaPage markup as described by the Kepler Project's CGILua\n// documentation: http://keplerproject.github.com/cgilua/manual.html#templates\ndefine('ace/mode/luapage_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules', 'ace/mode/lua_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar LuaHighlightRules = require(\"./lua_highlight_rules\").LuaHighlightRules;\n\nvar LuaPageHighlightRules = function() {\n    this.$rules = new HtmlHighlightRules().getRules();\n    \n    for (var i in this.$rules) {\n        this.$rules[i].unshift({\n            token: \"keyword\",\n            regex: \"<\\\\%\\\\=?\",\n            next: \"lua-start\"\n        }, {\n            token: \"keyword\",\n            regex: \"<\\\\?lua\\\\=?\",\n            next: \"lua-start\"\n        });\n    }\n    this.embedRules(LuaHighlightRules, \"lua-\", [\n        {\n            token: \"keyword\",\n            regex: \"\\\\%>\",\n            next: \"start\"\n        },\n        {\n            token: \"keyword\",\n            regex: \"\\\\?>\",\n            next: \"start\"\n        }\n    ]);\n};\n\noop.inherits(LuaPageHighlightRules, HtmlHighlightRules);\n\nexports.LuaPageHighlightRules = LuaPageHighlightRules;\n\n});"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-markdown.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/markdown', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/xml', 'ace/mode/html', 'ace/tokenizer', 'ace/mode/markdown_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar XmlMode = require(\"./xml\").Mode;\nvar HtmlMode = require(\"./html\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar MarkdownHighlightRules = require(\"./markdown_highlight_rules\").MarkdownHighlightRules;\n\nvar Mode = function() {\n    var highlighter = new MarkdownHighlightRules();\n    \n    this.$tokenizer = new Tokenizer(highlighter.getRules());\n    this.$embeds = highlighter.getEmbeds();\n    this.createModeDelegates({\n      \"js-\": JavaScriptMode,\n      \"xml-\": XmlMode,\n      \"html-\": HtmlMode\n    });\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.getNextLineIndent = function(state, line, tab) {\n        if (state == \"listblock\") {\n            var match = /^((?:.+)?)(([-+*]|\\d+\\.)\\s+)/.exec(line);\n            if (match) {\n                return new Array(match[1].length + 1).join(\" \") + match[2];\n            } else {\n                return \"\";\n            }\n        } else {\n            return this.$getIndent(line);\n        }\n    };\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        }],\n        \n        cdata : [{\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"\n        }],\n\n        comment : [{\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        }]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\");\n};\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.indexOf(\"meta.tag\") === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = this.tagRe.exec(tag);\n        var column = this.tagRe.lastIndex || 0;\n        this.tagRe.lastIndex = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar HtmlBehaviour = require(\"./behaviour/html\").HtmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\n\nvar Mode = function() {\n    var highlighter = new HtmlHighlightRules();\n    this.$tokenizer = new Tokenizer(highlighter.getRules());\n    this.$behaviour = new HtmlBehaviour();\n    \n    this.$embeds = highlighter.getEmbeds();\n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    \n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        return 0;\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"csslint\", function(e) {\n            var errors = [];\n            e.data.forEach(function(message) {\n                errors.push({\n                    row: message.line - 1,\n                    column: message.col - 1,\n                    text: message.message,\n                    type: message.type,\n                    lint: message\n                });\n            });\n            \n            session.setAnnotations(errors);\n        });\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*script\\\\b)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*style\\\\b)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n    \n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\", tagMap);\n    xmlUtil.tag(this.$rules, \"style\", \"css-start\", tagMap);\n    xmlUtil.tag(this.$rules, \"script\", \"js-start\", tagMap);\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(HtmlHighlightRules, TextHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\ndefine('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar XmlBehaviour = require(\"../behaviour/xml\").XmlBehaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar HtmlBehaviour = function () {\n\n    this.inherit(XmlBehaviour); // Get xml behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var element = token.value;\n            if (atCursor){\n                var element = element.substring(0, position.column - token.start);\n            }\n            if (voidElements.indexOf(element) !== -1){\n                return;\n            }\n            return {\n               text: '>' + '</' + element + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n}\noop.inherits(HtmlBehaviour, XmlBehaviour);\n\nexports.HtmlBehaviour = HtmlBehaviour;\n});\n\ndefine('ace/mode/folding/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {\n    MixedFoldMode.call(this, new XmlFoldMode({\n        // void elements\n        \"area\": 1,\n        \"base\": 1,\n        \"br\": 1,\n        \"col\": 1,\n        \"command\": 1,\n        \"embed\": 1,\n        \"hr\": 1,\n        \"img\": 1,\n        \"input\": 1,\n        \"keygen\": 1,\n        \"link\": 1,\n        \"meta\": 1,\n        \"param\": 1,\n        \"source\": 1,\n        \"track\": 1,\n        \"wbr\": 1,\n        \n        // optional tags \n        \"li\": 1,\n        \"dt\": 1,\n        \"dd\": 1,\n        \"p\": 1,\n        \"rt\": 1,\n        \"rp\": 1,\n        \"optgroup\": 1,\n        \"option\": 1,\n        \"colgroup\": 1,\n        \"td\": 1,\n        \"th\": 1\n    }), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\ndefine('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/markdown_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules', 'ace/mode/html_highlight_rules', 'ace/mode/css_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\n\nfunction github_embed(tag, prefix) {\n    return { // Github style block\n        token : \"support.function\",\n        regex : \"^```\" + tag + \"\\\\s*$\",\n        next  : prefix + \"start\"\n    };\n}\n\nvar MarkdownHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"empty_line\",\n            regex : '^$'\n        }, { // code span `\n            token : [\"support.function\", \"support.function\", \"support.function\"],\n            regex : \"(`+)([^\\\\r]*?[^`])(\\\\1)\"\n        }, { // code block\n            token : \"support.function\",\n            regex : \"^[ ]{4}.+\"\n        }, { // h1\n            token: \"markup.heading.1\",\n            regex: \"^=+(?=\\\\s*$)\"\n        }, { // h2\n            token: \"markup.heading.2\",\n            regex: \"^\\\\-+(?=\\\\s*$)\"\n        }, { // header\n            token : function(value) {\n                return \"markup.heading.\" + value.search(/[^#]/);\n            },\n            regex : \"^#{1,6}(?:[^ #].*| +.*(?:[^ #].*|[^ ]+.* +#+ *))$\"\n        }, github_embed(\"(?:javascript|js)\", \"js-\"),\n           github_embed(\"xml\", \"xml-\"),\n           github_embed(\"html\", \"html-\"),\n           github_embed(\"css\", \"css-\"),\n        { // Github style block\n            token : \"support.function\",\n            regex : \"^```[a-zA-Z]+\\\\s*$\",\n            next  : \"githubblock\"\n        }, { // block quote\n            token : \"string\",\n            regex : \"^>[ ].+$\",\n            next  : \"blockquote\"\n        }, { // reference\n            token : [\"text\", \"constant\", \"text\", \"url\", \"string\", \"text\"],\n            regex : \"^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\\\"][^\\\"]+[\\\"])?(\\\\s*))$\"\n        }, { // link by reference\n            token : [\"text\", \"string\", \"text\", \"constant\", \"text\"],\n            regex : \"(\\\\[)((?:[[^\\\\]]*\\\\]|[^\\\\[\\\\]])*)(\\\\][ ]?(?:\\\\n[ ]*)?\\\\[)(.*?)(\\\\])\"\n        }, { // link by url\n            token : [\"text\", \"string\", \"text\", \"markup.underline\", \"string\", \"text\"],\n            regex : \"(\\\\[)\"+\n                    \"(\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]*)\"+\n                    \"(\\\\]\\\\([ \\\\t]*)\"+\n                    \"(<?(?:(?:[^\\\\(]*?\\\\([^\\\\)]*?\\\\)\\\\S*?)|(?:.*?))>?)\"+\n                    \"((?:[ \\t]*\\\"(?:.*?)\\\"[ \\\\t]*)?)\"+\n                    \"(\\\\))\"\n        }, { // HR *\n            token : \"constant\",\n            regex : \"^[ ]{0,2}(?:[ ]?\\\\*[ ]?){3,}\\\\s*$\"\n        }, { // HR -\n            token : \"constant\",\n            regex : \"^[ ]{0,2}(?:[ ]?\\\\-[ ]?){3,}\\\\s*$\"\n        }, { // HR _\n            token : \"constant\",\n            regex : \"^[ ]{0,2}(?:[ ]?\\\\_[ ]?){3,}\\\\s*$\"\n        }, { // list\n            token : \"markup.list\",\n            regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n            next  : \"listblock\"\n        }, { // strong ** __\n            token : [\"string\", \"string\", \"string\"],\n            regex : \"([*]{2}|[_]{2}(?=\\\\S))([^\\\\r]*?\\\\S[*_]*)(\\\\1)\"\n        }, { // emphasis * _\n            token : [\"string\", \"string\", \"string\"],\n            regex : \"([*]|[_](?=\\\\S))([^\\\\r]*?\\\\S[*_]*)(\\\\1)\"\n        }, { // \n            token : [\"text\", \"url\", \"text\"],\n            regex : \"(<)(\"+\n                      \"(?:https?|ftp|dict):[^'\\\">\\\\s]+\"+\n                      \"|\"+\n                      \"(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+\"+\n                    \")(>)\"\n        }, {\n            token : \"text\",\n            regex : \"[^\\\\*_%$`\\\\[#<>]+\"\n        } ],\n        \n        \"listblock\" : [ { // Lists only escape on completely blank lines.\n            token : \"empty_line\",\n            regex : \"^$\",\n            next  : \"start\"\n        }, {\n            token : \"markup.list\",\n            regex : \".+\"\n        } ],\n        \n        \"blockquote\" : [ { // BLockquotes only escape on blank lines.\n            token : \"empty_line\",\n            regex : \"^\\\\s*$\",\n            next  : \"start\"\n        }, {\n            token : \"string\",\n            regex : \".+\"\n        } ],\n        \n        \"githubblock\" : [ {\n            token : \"support.function\",\n            regex : \"^```\",\n            next  : \"start\"\n        }, {\n            token : \"support.function\",\n            regex : \".+\"\n        } ]\n    };\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n    \n    this.embedRules(HtmlHighlightRules, \"html-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n    \n    this.embedRules(XmlHighlightRules, \"xml-\", [{\n       token : \"support.function\",\n       regex : \"^```\",\n       next  : \"start\"\n    }]);\n};\noop.inherits(MarkdownHighlightRules, TextHighlightRules);\n\nexports.MarkdownHighlightRules = MarkdownHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-ocaml.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/ocaml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ocaml_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar OcamlHighlightRules = require(\"./ocaml_highlight_rules\").OcamlHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new OcamlHighlightRules().getRules());\n    this.$outdent   = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\nvar indenter = /(?:[({[=:]|[-=]>|\\b(?:else|try|with))\\s*$/;\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var i, line;\n        var outdent = true;\n        var re = /^\\s*\\(\\*(.*)\\*\\)/;\n\n        for (i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        var range = new Range(0, 0, 0, 0);\n        for (i=startRow; i<= endRow; i++) {\n            line = doc.getLine(i);\n            range.start.row  = i;\n            range.end.row    = i;\n            range.end.column = line.length;\n\n            doc.replace(range, outdent ? line.match(re)[1] : \"(*\" + line + \"*)\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n\n        if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') &&\n            state === 'start' && indenter.test(line))\n            indent += tab;\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/ocaml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar OcamlHighlightRules = function() {\n\n    var keywords = (\n        \"and|as|assert|begin|class|constraint|do|done|downto|else|end|\"  +\n        \"exception|external|for|fun|function|functor|if|in|include|\"     +\n        \"inherit|initializer|lazy|let|match|method|module|mutable|new|\"  +\n        \"object|of|open|or|private|rec|sig|struct|then|to|try|type|val|\" +\n        \"virtual|when|while|with\"\n    );\n\n    var builtinConstants = (\"true|false\");\n\n    var builtinFunctions = (\n        \"abs|abs_big_int|abs_float|abs_num|abstract_tag|accept|access|acos|add|\" +\n        \"add_available_units|add_big_int|add_buffer|add_channel|add_char|\" +\n        \"add_initializer|add_int_big_int|add_interfaces|add_num|add_string|\" +\n        \"add_substitute|add_substring|alarm|allocated_bytes|allow_only|\" +\n        \"allow_unsafe_modules|always|append|appname_get|appname_set|\" +\n        \"approx_num_exp|approx_num_fix|arg|argv|arith_status|array|\" +\n        \"array1_of_genarray|array2_of_genarray|array3_of_genarray|asin|asr|\" +\n        \"assoc|assq|at_exit|atan|atan2|auto_synchronize|background|basename|\" +\n        \"beginning_of_input|big_int_of_int|big_int_of_num|big_int_of_string|bind|\" +\n        \"bind_class|bind_tag|bits|bits_of_float|black|blit|blit_image|blue|bool|\" +\n        \"bool_of_string|bounded_full_split|bounded_split|bounded_split_delim|\" +\n        \"bprintf|break|broadcast|bscanf|button_down|c_layout|capitalize|cardinal|\" +\n        \"cardinal|catch|catch_break|ceil|ceiling_num|channel|char|char_of_int|\" +\n        \"chdir|check|check_suffix|chmod|choose|chop_extension|chop_suffix|chown|\" +\n        \"chown|chr|chroot|classify_float|clear|clear_available_units|\" +\n        \"clear_close_on_exec|clear_graph|clear_nonblock|clear_parser|\" +\n        \"close|close|closeTk|close_box|close_graph|close_in|close_in_noerr|\" +\n        \"close_out|close_out_noerr|close_process|close_process|\" +\n        \"close_process_full|close_process_in|close_process_out|close_subwindow|\" +\n        \"close_tag|close_tbox|closedir|closedir|closure_tag|code|combine|\" +\n        \"combine|combine|command|compact|compare|compare_big_int|compare_num|\" +\n        \"complex32|complex64|concat|conj|connect|contains|contains_from|contents|\" +\n        \"copy|cos|cosh|count|count|counters|create|create_alarm|create_image|\" +\n        \"create_matrix|create_matrix|create_matrix|create_object|\" +\n        \"create_object_and_run_initializers|create_object_opt|create_process|\" +\n        \"create_process|create_process_env|create_process_env|create_table|\" +\n        \"current|current_dir_name|current_point|current_x|current_y|curveto|\" +\n        \"custom_tag|cyan|data_size|decr|decr_num|default_available_units|delay|\" +\n        \"delete_alarm|descr_of_in_channel|descr_of_out_channel|destroy|diff|dim|\" +\n        \"dim1|dim2|dim3|dims|dirname|display_mode|div|div_big_int|div_num|\" +\n        \"double_array_tag|double_tag|draw_arc|draw_char|draw_circle|draw_ellipse|\" +\n        \"draw_image|draw_poly|draw_poly_line|draw_rect|draw_segments|draw_string|\" +\n        \"dummy_pos|dummy_table|dump_image|dup|dup2|elements|empty|end_of_input|\" +\n        \"environment|eprintf|epsilon_float|eq_big_int|eq_num|equal|err_formatter|\" +\n        \"error_message|escaped|establish_server|executable_name|execv|execve|execvp|\" +\n        \"execvpe|exists|exists2|exit|exp|failwith|fast_sort|fchmod|fchown|field|\" +\n        \"file|file_exists|fill|fill_arc|fill_circle|fill_ellipse|fill_poly|fill_rect|\" +\n        \"filter|final_tag|finalise|find|find_all|first_chars|firstkey|flatten|\" +\n        \"float|float32|float64|float_of_big_int|float_of_bits|float_of_int|\" +\n        \"float_of_num|float_of_string|floor|floor_num|flush|flush_all|flush_input|\" +\n        \"flush_str_formatter|fold|fold_left|fold_left2|fold_right|fold_right2|\" +\n        \"for_all|for_all2|force|force_newline|force_val|foreground|fork|\" +\n        \"format_of_string|formatter_of_buffer|formatter_of_out_channel|\" +\n        \"fortran_layout|forward_tag|fprintf|frexp|from|from_channel|from_file|\" +\n        \"from_file_bin|from_function|from_string|fscanf|fst|fstat|ftruncate|\" +\n        \"full_init|full_major|full_split|gcd_big_int|ge_big_int|ge_num|\" +\n        \"genarray_of_array1|genarray_of_array2|genarray_of_array3|get|\" +\n        \"get_all_formatter_output_functions|get_approx_printing|get_copy|\" +\n        \"get_ellipsis_text|get_error_when_null_denominator|get_floating_precision|\" +\n        \"get_formatter_output_functions|get_formatter_tag_functions|get_image|\" +\n        \"get_margin|get_mark_tags|get_max_boxes|get_max_indent|get_method|\" +\n        \"get_method_label|get_normalize_ratio|get_normalize_ratio_when_printing|\" +\n        \"get_print_tags|get_state|get_variable|getcwd|getegid|getegid|getenv|\" +\n        \"getenv|getenv|geteuid|geteuid|getgid|getgid|getgrgid|getgrgid|getgrnam|\" +\n        \"getgrnam|getgroups|gethostbyaddr|gethostbyname|gethostname|getitimer|\" +\n        \"getlogin|getpeername|getpid|getppid|getprotobyname|getprotobynumber|\" +\n        \"getpwnam|getpwuid|getservbyname|getservbyport|getsockname|getsockopt|\" +\n        \"getsockopt_float|getsockopt_int|getsockopt_optint|gettimeofday|getuid|\" +\n        \"global_replace|global_substitute|gmtime|green|grid|group_beginning|\" +\n        \"group_end|gt_big_int|gt_num|guard|handle_unix_error|hash|hash_param|\" +\n        \"hd|header_size|i|id|ignore|in_channel_length|in_channel_of_descr|incr|\" +\n        \"incr_num|index|index_from|inet_addr_any|inet_addr_of_string|infinity|\" +\n        \"infix_tag|init|init_class|input|input_binary_int|input_byte|input_char|\" +\n        \"input_line|input_value|int|int16_signed|int16_unsigned|int32|int64|\" +\n        \"int8_signed|int8_unsigned|int_of_big_int|int_of_char|int_of_float|\" +\n        \"int_of_num|int_of_string|integer_num|inter|interactive|inv|invalid_arg|\" +\n        \"is_block|is_empty|is_implicit|is_int|is_int_big_int|is_integer_num|\" +\n        \"is_relative|iter|iter2|iteri|join|junk|key_pressed|kill|kind|kprintf|\" +\n        \"kscanf|land|last_chars|layout|lazy_from_fun|lazy_from_val|lazy_is_val|\" +\n        \"lazy_tag|ldexp|le_big_int|le_num|length|lexeme|lexeme_char|lexeme_end|\" +\n        \"lexeme_end_p|lexeme_start|lexeme_start_p|lineto|link|list|listen|lnot|\" +\n        \"loadfile|loadfile_private|localtime|lock|lockf|log|log10|logand|lognot|\" +\n        \"logor|logxor|lor|lower_window|lowercase|lseek|lsl|lsr|lstat|lt_big_int|\" +\n        \"lt_num|lxor|magenta|magic|mainLoop|major|major_slice|make|make_formatter|\" +\n        \"make_image|make_lexer|make_matrix|make_self_init|map|map2|map_file|mapi|\" +\n        \"marshal|match_beginning|match_end|matched_group|matched_string|max|\" +\n        \"max_array_length|max_big_int|max_elt|max_float|max_int|max_num|\" +\n        \"max_string_length|mem|mem_assoc|mem_assq|memq|merge|min|min_big_int|\" +\n        \"min_elt|min_float|min_int|min_num|minor|minus_big_int|minus_num|\" +\n        \"minus_one|mkdir|mkfifo|mktime|mod|mod_big_int|mod_float|mod_num|modf|\" +\n        \"mouse_pos|moveto|mul|mult_big_int|mult_int_big_int|mult_num|nan|narrow|\" +\n        \"nat_of_num|nativeint|neg|neg_infinity|new_block|new_channel|new_method|\" +\n        \"new_variable|next|nextkey|nice|nice|no_scan_tag|norm|norm2|not|npeek|\" +\n        \"nth|nth_dim|num_digits_big_int|num_dims|num_of_big_int|num_of_int|\" +\n        \"num_of_nat|num_of_ratio|num_of_string|O|obj|object_tag|ocaml_version|\" +\n        \"of_array|of_channel|of_float|of_int|of_int32|of_list|of_nativeint|\" +\n        \"of_string|one|openTk|open_box|open_connection|open_graph|open_hbox|\" +\n        \"open_hovbox|open_hvbox|open_in|open_in_bin|open_in_gen|open_out|\" +\n        \"open_out_bin|open_out_gen|open_process|open_process_full|open_process_in|\" +\n        \"open_process_out|open_subwindow|open_tag|open_tbox|open_temp_file|\" +\n        \"open_vbox|opendbm|opendir|openfile|or|os_type|out_channel_length|\" +\n        \"out_channel_of_descr|output|output_binary_int|output_buffer|output_byte|\" +\n        \"output_char|output_string|output_value|over_max_boxes|pack|params|\" +\n        \"parent_dir_name|parse|parse_argv|partition|pause|peek|pipe|pixels|\" +\n        \"place|plot|plots|point_color|polar|poll|pop|pos_in|pos_out|pow|\" +\n        \"power_big_int_positive_big_int|power_big_int_positive_int|\" +\n        \"power_int_positive_big_int|power_int_positive_int|power_num|\" +\n        \"pp_close_box|pp_close_tag|pp_close_tbox|pp_force_newline|\" +\n        \"pp_get_all_formatter_output_functions|pp_get_ellipsis_text|\" +\n        \"pp_get_formatter_output_functions|pp_get_formatter_tag_functions|\" +\n        \"pp_get_margin|pp_get_mark_tags|pp_get_max_boxes|pp_get_max_indent|\" +\n        \"pp_get_print_tags|pp_open_box|pp_open_hbox|pp_open_hovbox|pp_open_hvbox|\" +\n        \"pp_open_tag|pp_open_tbox|pp_open_vbox|pp_over_max_boxes|pp_print_as|\" +\n        \"pp_print_bool|pp_print_break|pp_print_char|pp_print_cut|pp_print_float|\" +\n        \"pp_print_flush|pp_print_if_newline|pp_print_int|pp_print_newline|\" +\n        \"pp_print_space|pp_print_string|pp_print_tab|pp_print_tbreak|\" +\n        \"pp_set_all_formatter_output_functions|pp_set_ellipsis_text|\" +\n        \"pp_set_formatter_out_channel|pp_set_formatter_output_functions|\" +\n        \"pp_set_formatter_tag_functions|pp_set_margin|pp_set_mark_tags|\" +\n        \"pp_set_max_boxes|pp_set_max_indent|pp_set_print_tags|pp_set_tab|\" +\n        \"pp_set_tags|pred|pred_big_int|pred_num|prerr_char|prerr_endline|\" +\n        \"prerr_float|prerr_int|prerr_newline|prerr_string|print|print_as|\" +\n        \"print_bool|print_break|print_char|print_cut|print_endline|print_float|\" +\n        \"print_flush|print_if_newline|print_int|print_newline|print_space|\" +\n        \"print_stat|print_string|print_tab|print_tbreak|printf|prohibit|\" +\n        \"public_method_label|push|putenv|quo_num|quomod_big_int|quote|raise|\" +\n        \"raise_window|ratio_of_num|rcontains_from|read|read_float|read_int|\" +\n        \"read_key|read_line|readdir|readdir|readlink|really_input|receive|recv|\" +\n        \"recvfrom|red|ref|regexp|regexp_case_fold|regexp_string|\" +\n        \"regexp_string_case_fold|register|register_exception|rem|remember_mode|\" +\n        \"remove|remove_assoc|remove_assq|rename|replace|replace_first|\" +\n        \"replace_matched|repr|reset|reshape|reshape_1|reshape_2|reshape_3|rev|\" +\n        \"rev_append|rev_map|rev_map2|rewinddir|rgb|rhs_end|rhs_end_pos|rhs_start|\" +\n        \"rhs_start_pos|rindex|rindex_from|rlineto|rmdir|rmoveto|round_num|\" +\n        \"run_initializers|run_initializers_opt|scanf|search_backward|\" +\n        \"search_forward|seek_in|seek_out|select|self|self_init|send|sendto|set|\" +\n        \"set_all_formatter_output_functions|set_approx_printing|\" +\n        \"set_binary_mode_in|set_binary_mode_out|set_close_on_exec|\" +\n        \"set_close_on_exec|set_color|set_ellipsis_text|\" +\n        \"set_error_when_null_denominator|set_field|set_floating_precision|\" +\n        \"set_font|set_formatter_out_channel|set_formatter_output_functions|\" +\n        \"set_formatter_tag_functions|set_line_width|set_margin|set_mark_tags|\" +\n        \"set_max_boxes|set_max_indent|set_method|set_nonblock|set_nonblock|\" +\n        \"set_normalize_ratio|set_normalize_ratio_when_printing|set_print_tags|\" +\n        \"set_signal|set_state|set_tab|set_tag|set_tags|set_text_size|\" +\n        \"set_window_title|setgid|setgid|setitimer|setitimer|setsid|setsid|\" +\n        \"setsockopt|setsockopt|setsockopt_float|setsockopt_float|setsockopt_int|\" +\n        \"setsockopt_int|setsockopt_optint|setsockopt_optint|setuid|setuid|\" +\n        \"shift_left|shift_left|shift_left|shift_right|shift_right|shift_right|\" +\n        \"shift_right_logical|shift_right_logical|shift_right_logical|show_buckets|\" +\n        \"shutdown|shutdown|shutdown_connection|shutdown_connection|sigabrt|\" +\n        \"sigalrm|sigchld|sigcont|sigfpe|sighup|sigill|sigint|sigkill|sign_big_int|\" +\n        \"sign_num|signal|signal|sigpending|sigpending|sigpipe|sigprocmask|\" +\n        \"sigprocmask|sigprof|sigquit|sigsegv|sigstop|sigsuspend|sigsuspend|\" +\n        \"sigterm|sigtstp|sigttin|sigttou|sigusr1|sigusr2|sigvtalrm|sin|singleton|\" +\n        \"sinh|size|size|size_x|size_y|sleep|sleep|sleep|slice_left|slice_left|\" +\n        \"slice_left_1|slice_left_2|slice_right|slice_right|slice_right_1|\" +\n        \"slice_right_2|snd|socket|socket|socket|socketpair|socketpair|sort|sound|\" +\n        \"split|split_delim|sprintf|sprintf|sqrt|sqrt|sqrt_big_int|square_big_int|\" +\n        \"square_num|sscanf|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|\" +\n        \"stable_sort|stat|stat|stat|stat|stat|stats|stats|std_formatter|stdbuf|\" +\n        \"stderr|stderr|stderr|stdib|stdin|stdin|stdin|stdout|stdout|stdout|\" +\n        \"str_formatter|string|string_after|string_before|string_match|\" +\n        \"string_of_big_int|string_of_bool|string_of_float|string_of_format|\" +\n        \"string_of_inet_addr|string_of_inet_addr|string_of_int|string_of_num|\" +\n        \"string_partial_match|string_tag|sub|sub|sub_big_int|sub_left|sub_num|\" +\n        \"sub_right|subset|subset|substitute_first|substring|succ|succ|\" +\n        \"succ|succ|succ_big_int|succ_num|symbol_end|symbol_end_pos|symbol_start|\" +\n        \"symbol_start_pos|symlink|symlink|sync|synchronize|system|system|system|\" +\n        \"tag|take|tan|tanh|tcdrain|tcdrain|tcflow|tcflow|tcflush|tcflush|\" +\n        \"tcgetattr|tcgetattr|tcsendbreak|tcsendbreak|tcsetattr|tcsetattr|\" +\n        \"temp_file|text_size|time|time|time|timed_read|timed_write|times|times|\" +\n        \"tl|tl|tl|to_buffer|to_channel|to_float|to_hex|to_int|to_int32|to_list|\" +\n        \"to_list|to_list|to_nativeint|to_string|to_string|to_string|to_string|\" +\n        \"to_string|top|top|total_size|transfer|transp|truncate|truncate|truncate|\" +\n        \"truncate|truncate|truncate|try_lock|umask|umask|uncapitalize|uncapitalize|\" +\n        \"uncapitalize|union|union|unit_big_int|unlink|unlink|unlock|unmarshal|\" +\n        \"unsafe_blit|unsafe_fill|unsafe_get|unsafe_get|unsafe_set|unsafe_set|\" +\n        \"update|uppercase|uppercase|uppercase|uppercase|usage|utimes|utimes|wait|\" +\n        \"wait|wait|wait|wait_next_event|wait_pid|wait_read|wait_signal|\" +\n        \"wait_timed_read|wait_timed_write|wait_write|waitpid|white|\" +\n        \"widen|window_id|word_size|wrap|wrap_abort|write|yellow|yield|zero|zero_big_int|\" +\n\n        \"Arg|Arith_status|Array|Array1|Array2|Array3|ArrayLabels|Big_int|Bigarray|\" +\n        \"Buffer|Callback|CamlinternalOO|Char|Complex|Condition|Dbm|Digest|Dynlink|\" +\n        \"Event|Filename|Format|Gc|Genarray|Genlex|Graphics|GraphicsX11|Hashtbl|\" +\n        \"Int32|Int64|LargeFile|Lazy|Lexing|List|ListLabels|Make|Map|Marshal|\" +\n        \"MoreLabels|Mutex|Nativeint|Num|Obj|Oo|Parsing|Pervasives|Printexc|\" +\n        \"Printf|Queue|Random|Scanf|Scanning|Set|Sort|Stack|State|StdLabels|Str|\" +\n        \"Stream|String|StringLabels|Sys|Thread|ThreadUnix|Tk|Unix|UnixLabels|Weak\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\");\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : '\\\\(\\\\*.*?\\\\*\\\\)\\\\s*?$'\n            },\n            {\n                token : \"comment\",\n                merge : true,\n                regex : '\\\\(\\\\*.*',\n                next : \"comment\"\n            },\n            {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            },\n            {\n                token : \"string\", // single char\n                regex : \"'.'\"\n            },\n            {\n                token : \"string\", // \" string\n                merge : true,\n                regex : '\"',\n                next  : \"qstring\"\n            },\n            {\n                token : \"constant.numeric\", // imaginary\n                regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n            },\n            {\n                token : \"constant.numeric\", // float\n                regex : floatNumber\n            },\n            {\n                token : \"constant.numeric\", // integer\n                regex : integer + \"\\\\b\"\n            },\n            {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            },\n            {\n                token : \"keyword.operator\",\n                regex : \"\\\\+\\\\.|\\\\-\\\\.|\\\\*\\\\.|\\\\/\\\\.|#|;;|\\\\+|\\\\-|\\\\*|\\\\*\\\\*\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|<-|=\"\n            },\n            {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            },\n            {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            },\n            {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\)\",\n                next : \"start\"\n            },\n            {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : '\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(OcamlHighlightRules, TextHighlightRules);\n\nexports.OcamlHighlightRules = OcamlHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-perl.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/perl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/perl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar PerlHighlightRules = require(\"./perl_highlight_rules\").PerlHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new PerlHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"#\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/perl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PerlHighlightRules = function() {\n\n    var keywords = (\n        \"base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|\" +\n         \"no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars\"\n    );\n\n    var buildinConstants = (\"ARGV|ENV|INC|SIG\");\n\n    var builtinFunctions = (\n        \"getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|\" +\n         \"gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|\" +\n         \"getpeername|setpriority|getprotoent|setprotoent|getpriority|\" +\n         \"endprotoent|getservent|setservent|endservent|sethostent|socketpair|\" +\n         \"getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|\" +\n         \"localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|\" +\n         \"closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|\" +\n         \"shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|\" +\n         \"dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|\" +\n         \"setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|\" +\n         \"lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|\" +\n         \"waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|\" +\n         \"chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|\" +\n         \"unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|\" +\n         \"length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|\" +\n         \"undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|\" +\n         \"sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|\" +\n         \"BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|\" +\n         \"join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|\" +\n         \"keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|\" +\n         \"eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|\" +\n         \"map|die|uc|lc|do\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0x[0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"\\\\.\\\\.\\\\.|\\\\|\\\\|=|>>=|<<=|<=>|&&=|=>|!~|\\\\^=|&=|\\\\|=|\\\\.=|x=|%=|\\\\/=|\\\\*=|\\\\-=|\\\\+=|=~|\\\\*\\\\*|\\\\-\\\\-|\\\\.\\\\.|\\\\|\\\\||&&|\\\\+\\\\+|\\\\->|!=|==|>=|<=|>>|<<|,|=|\\\\?\\\\:|\\\\^|\\\\||x|%|\\\\/|\\\\*|<|&|\\\\\\\\|~|!|>|\\\\.|\\\\-|\\\\+|\\\\-C|\\\\-b|\\\\-S|\\\\-u|\\\\-t|\\\\-p|\\\\-l|\\\\-d|\\\\-f|\\\\-g|\\\\-s|\\\\-z|\\\\-k|\\\\-e|\\\\-O|\\\\-T|\\\\-B|\\\\-M|\\\\-A|\\\\-X|\\\\-W|\\\\-c|\\\\-R|\\\\-o|\\\\-x|\\\\-w|\\\\-r|\\\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(PerlHighlightRules, TextHighlightRules);\n\nexports.PerlHighlightRules = PerlHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-pgsql.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/pgsql', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/pgsql_highlight_rules', 'ace/range'], function(require, exports, module) {\n\n    var oop = require(\"../lib/oop\");\n    var TextMode = require(\"../mode/text\").Mode;\n    var Tokenizer = require(\"../tokenizer\").Tokenizer;\n    var PgsqlHighlightRules = require(\"./pgsql_highlight_rules\").PgsqlHighlightRules;\n    var Range = require(\"../range\").Range;\n\n    var Mode = function() {\n        this.$tokenizer = new Tokenizer(new PgsqlHighlightRules().getRules());\n    };\n    oop.inherits(Mode, TextMode);\n\n    (function() {\n\n        this.toggleCommentLines = function(state, doc, startRow, endRow) {\n            var outdent = true;\n            // var outentedRows = [];\n            var re = /^(\\s*)--/;\n\n            for (var i=startRow; i<= endRow; i++) {\n                if (!re.test(doc.getLine(i))) {\n                    outdent = false;\n                    break;\n                }\n            }\n\n            if (outdent) {\n                var deleteRange = new Range(0, 0, 0, 0);\n                for (var i=startRow; i<= endRow; i++)\n                {\n                    var line = doc.getLine(i);\n                    var m = line.match(re);\n                    deleteRange.start.row = i;\n                    deleteRange.end.row = i;\n                    deleteRange.end.column = m[0].length;\n                    doc.replace(deleteRange, m[1]);\n                }\n            }\n            else {\n                doc.indentRows(startRow, endRow, \"--\");\n            }\n        };\n\n\n        this.getNextLineIndent = function(state, line, tab) { \n            if (state == \"start\" || state == \"keyword.statementEnd\") {\n                return \"\";\n            } else {\n                return this.$getIndent(line); // Keep whatever indent the previous line has\n            }\n        }\n\n    }).call(Mode.prototype);\n\n    exports.Mode = Mode;\n});\n\ndefine('ace/mode/pgsql_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules', 'ace/mode/perl_highlight_rules', 'ace/mode/python_highlight_rules'], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n// Supporting perl and python for now -- both in pg core and ace\nvar PerlHighlightRules = require(\"./perl_highlight_rules\").PerlHighlightRules;\nvar PythonHighlightRules = require(\"./python_highlight_rules\").PythonHighlightRules;\n\nvar PgsqlHighlightRules = function() {\n\n    // Keywords, functions, operators last updated for pg 9.1.\n    var keywords = (\n        \"abort|absolute|abstime|access|aclitem|action|add|admin|after|aggregate|all|also|alter|always|\" +\n        \"analyse|analyze|and|any|anyarray|anyelement|anyenum|anynonarray|array|as|asc|assertion|\" +\n        \"assignment|asymmetric|at|attribute|authorization|backward|before|begin|between|bigint|\" +\n        \"binary|bit|bool|boolean|both|box|bpchar|by|bytea|cache|called|cascade|cascaded|case|cast|\" +\n        \"catalog|chain|char|character|characteristics|check|checkpoint|cid|cidr|circle|class|close|\" +\n        \"cluster|coalesce|collate|collation|column|comment|comments|commit|committed|concurrently|\" +\n        \"configuration|connection|constraint|constraints|content|continue|conversion|copy|cost|\" +\n        \"create|cross|cstring|csv|current|current_catalog|current_date|current_role|\" +\n        \"current_schema|current_time|current_timestamp|current_user|cursor|cycle|data|database|\" +\n        \"date|day|deallocate|dec|decimal|declare|default|defaults|deferrable|deferred|definer|delete|\" +\n        \"delimiter|delimiters|desc|dictionary|disable|discard|distinct|do|document|domain|double|\" +\n        \"drop|each|else|enable|encoding|encrypted|end|enum|escape|except|exclude|excluding|exclusive|\" +\n        \"execute|exists|explain|extension|external|extract|false|family|fdw_handler|fetch|first|\" +\n        \"float|float4|float8|following|for|force|foreign|forward|freeze|from|full|function|functions|\" +\n        \"global|grant|granted|greatest|group|gtsvector|handler|having|header|hold|hour|identity|if|\" +\n        \"ilike|immediate|immutable|implicit|in|including|increment|index|indexes|inet|inherit|\" +\n        \"inherits|initially|inline|inner|inout|input|insensitive|insert|instead|int|int2|int2vector|\" +\n        \"int4|int8|integer|internal|intersect|interval|into|invoker|is|isnull|isolation|join|key|label|\" +\n        \"language|language_handler|large|last|lc_collate|lc_ctype|leading|least|left|level|like|\" +\n        \"limit|line|listen|load|local|localtime|localtimestamp|location|lock|lseg|macaddr|mapping|\" +\n        \"match|maxvalue|minute|minvalue|mode|money|month|move|name|names|national|natural|nchar|next|no|\" +\n        \"none|not|nothing|notify|notnull|nowait|null|nullif|nulls|numeric|object|of|off|offset|oid|oids|\" +\n        \"oidvector|on|only|opaque|operator|option|options|or|order|out|outer|over|overlaps|overlay|\" +\n        \"owned|owner|parser|partial|partition|passing|password|path|pg_attribute|pg_auth_members|\" +\n        \"pg_authid|pg_class|pg_database|pg_node_tree|pg_proc|pg_type|placing|plans|point|polygon|\" +\n        \"position|preceding|precision|prepare|prepared|preserve|primary|prior|privileges|\" +\n        \"procedural|procedure|quote|range|read|real|reassign|recheck|record|recursive|ref|refcursor|\" +\n        \"references|regclass|regconfig|regdictionary|regoper|regoperator|regproc|regprocedure|\" +\n        \"regtype|reindex|relative|release|reltime|rename|repeatable|replace|replica|reset|restart|\" +\n        \"restrict|returning|returns|revoke|right|role|rollback|row|rows|rule|savepoint|schema|scroll|\" +\n        \"search|second|security|select|sequence|sequences|serializable|server|session|session_user|\" +\n        \"set|setof|share|show|similar|simple|smallint|smgr|some|stable|standalone|start|statement|\" +\n        \"statistics|stdin|stdout|storage|strict|strip|substring|symmetric|sysid|system|table|tables|\" +\n        \"tablespace|temp|template|temporary|text|then|tid|time|timestamp|timestamptz|timetz|\" +\n        \"tinterval|to|trailing|transaction|treat|trigger|trim|true|truncate|trusted|tsquery|tsvector|\" +\n        \"txid_snapshot|type|unbounded|uncommitted|unencrypted|union|unique|unknown|unlisten|\" +\n        \"unlogged|until|update|user|using|uuid|vacuum|valid|validate|validator|value|values|varbit|\" +\n        \"varchar|variadic|varying|verbose|version|view|void|volatile|when|where|whitespace|window|\" +\n        \"with|without|work|wrapper|write|xid|xml|xmlattributes|xmlconcat|xmlelement|xmlexists|\" +\n        \"xmlforest|xmlparse|xmlpi|xmlroot|xmlserialize|year|yes|zone\"\n    );\n\n\n    var builtinFunctions = (\n        \"RI_FKey_cascade_del|RI_FKey_cascade_upd|RI_FKey_check_ins|RI_FKey_check_upd|\" +\n        \"RI_FKey_noaction_del|RI_FKey_noaction_upd|RI_FKey_restrict_del|RI_FKey_restrict_upd|\" +\n        \"RI_FKey_setdefault_del|RI_FKey_setdefault_upd|RI_FKey_setnull_del|\" +\n        \"RI_FKey_setnull_upd|abbrev|abs|abstime|abstimeeq|abstimege|abstimegt|abstimein|abstimele|\" +\n        \"abstimelt|abstimene|abstimeout|abstimerecv|abstimesend|aclcontains|aclexplode|aclinsert|\" +\n        \"aclitemeq|aclitemin|aclitemout|aclremove|acos|age|any_in|any_out|anyarray_in|anyarray_out|\" +\n        \"anyarray_recv|anyarray_send|anyelement_in|anyelement_out|anyenum_in|anyenum_out|\" +\n        \"anynonarray_in|anynonarray_out|anytextcat|area|areajoinsel|areasel|array_agg|\" +\n        \"array_agg_finalfn|array_agg_transfn|array_append|array_cat|array_dims|array_eq|\" +\n        \"array_fill|array_ge|array_gt|array_in|array_larger|array_le|array_length|array_lower|\" +\n        \"array_lt|array_ndims|array_ne|array_out|array_prepend|array_recv|array_send|\" +\n        \"array_smaller|array_to_string|array_upper|arraycontained|arraycontains|arrayoverlap|\" +\n        \"ascii|ascii_to_mic|ascii_to_utf8|asin|atan|atan2|avg|big5_to_euc_tw|big5_to_mic|\" +\n        \"big5_to_utf8|bit_and|bit_in|bit_length|bit_or|bit_out|bit_recv|bit_send|bitand|bitcat|\" +\n        \"bitcmp|biteq|bitge|bitgt|bitle|bitlt|bitne|bitnot|bitor|bitshiftleft|bitshiftright|\" +\n        \"bittypmodin|bittypmodout|bitxor|bool|bool_and|bool_or|booland_statefunc|booleq|boolge|\" +\n        \"boolgt|boolin|boolle|boollt|boolne|boolor_statefunc|boolout|boolrecv|boolsend|box|\" +\n        \"box_above|box_above_eq|box_add|box_below|box_below_eq|box_center|box_contain|\" +\n        \"box_contain_pt|box_contained|box_distance|box_div|box_eq|box_ge|box_gt|box_in|\" +\n        \"box_intersect|box_le|box_left|box_lt|box_mul|box_out|box_overabove|box_overbelow|\" +\n        \"box_overlap|box_overleft|box_overright|box_recv|box_right|box_same|box_send|box_sub|\" +\n        \"bpchar_larger|bpchar_pattern_ge|bpchar_pattern_gt|bpchar_pattern_le|\" +\n        \"bpchar_pattern_lt|bpchar_smaller|bpcharcmp|bpchareq|bpcharge|bpchargt|bpchariclike|\" +\n        \"bpcharicnlike|bpcharicregexeq|bpcharicregexne|bpcharin|bpcharle|bpcharlike|bpcharlt|\" +\n        \"bpcharne|bpcharnlike|bpcharout|bpcharrecv|bpcharregexeq|bpcharregexne|bpcharsend|\" +\n        \"bpchartypmodin|bpchartypmodout|broadcast|btabstimecmp|btarraycmp|btbeginscan|btboolcmp|\" +\n        \"btbpchar_pattern_cmp|btbuild|btbuildempty|btbulkdelete|btcharcmp|btcostestimate|\" +\n        \"btendscan|btfloat48cmp|btfloat4cmp|btfloat84cmp|btfloat8cmp|btgetbitmap|btgettuple|\" +\n        \"btinsert|btint24cmp|btint28cmp|btint2cmp|btint42cmp|btint48cmp|btint4cmp|btint82cmp|\" +\n        \"btint84cmp|btint8cmp|btmarkpos|btnamecmp|btoidcmp|btoidvectorcmp|btoptions|btrecordcmp|\" +\n        \"btreltimecmp|btrescan|btrestrpos|btrim|bttext_pattern_cmp|bttextcmp|bttidcmp|\" +\n        \"bttintervalcmp|btvacuumcleanup|byteacat|byteacmp|byteaeq|byteage|byteagt|byteain|byteale|\" +\n        \"bytealike|bytealt|byteane|byteanlike|byteaout|bytearecv|byteasend|cash_cmp|cash_div_cash|\" +\n        \"cash_div_flt4|cash_div_flt8|cash_div_int2|cash_div_int4|cash_eq|cash_ge|cash_gt|cash_in|\" +\n        \"cash_le|cash_lt|cash_mi|cash_mul_flt4|cash_mul_flt8|cash_mul_int2|cash_mul_int4|cash_ne|\" +\n        \"cash_out|cash_pl|cash_recv|cash_send|cash_words|cashlarger|cashsmaller|cbrt|ceil|ceiling|\" +\n        \"center|char|char_length|character_length|chareq|charge|chargt|charin|charle|charlt|charne|\" +\n        \"charout|charrecv|charsend|chr|cideq|cidin|cidout|cidr|cidr_in|cidr_out|cidr_recv|cidr_send|\" +\n        \"cidrecv|cidsend|circle|circle_above|circle_add_pt|circle_below|circle_center|\" +\n        \"circle_contain|circle_contain_pt|circle_contained|circle_distance|circle_div_pt|\" +\n        \"circle_eq|circle_ge|circle_gt|circle_in|circle_le|circle_left|circle_lt|circle_mul_pt|\" +\n        \"circle_ne|circle_out|circle_overabove|circle_overbelow|circle_overlap|circle_overleft|\" +\n        \"circle_overright|circle_recv|circle_right|circle_same|circle_send|circle_sub_pt|\" +\n        \"clock_timestamp|close_lb|close_ls|close_lseg|close_pb|close_pl|close_ps|close_sb|\" +\n        \"close_sl|col_description|concat|concat_ws|contjoinsel|contsel|convert|convert_from|\" +\n        \"convert_to|corr|cos|cot|count|covar_pop|covar_samp|cstring_in|cstring_out|cstring_recv|\" +\n        \"cstring_send|cume_dist|current_database|current_query|current_schema|current_schemas|\" +\n        \"current_setting|current_user|currtid|currtid2|currval|cursor_to_xml|\" +\n        \"cursor_to_xmlschema|database_to_xml|database_to_xml_and_xmlschema|\" +\n        \"database_to_xmlschema|date|date_cmp|date_cmp_timestamp|date_cmp_timestamptz|date_eq|\" +\n        \"date_eq_timestamp|date_eq_timestamptz|date_ge|date_ge_timestamp|date_ge_timestamptz|\" +\n        \"date_gt|date_gt_timestamp|date_gt_timestamptz|date_in|date_larger|date_le|\" +\n        \"date_le_timestamp|date_le_timestamptz|date_lt|date_lt_timestamp|date_lt_timestamptz|\" +\n        \"date_mi|date_mi_interval|date_mii|date_ne|date_ne_timestamp|date_ne_timestamptz|\" +\n        \"date_out|date_part|date_pl_interval|date_pli|date_recv|date_send|date_smaller|\" +\n        \"date_trunc|datetime_pl|datetimetz_pl|dcbrt|decode|degrees|dense_rank|dexp|diagonal|\" +\n        \"diameter|dispell_init|dispell_lexize|dist_cpoly|dist_lb|dist_pb|dist_pc|dist_pl|\" +\n        \"dist_ppath|dist_ps|dist_sb|dist_sl|div|dlog1|dlog10|domain_in|domain_recv|dpow|dround|\" +\n        \"dsimple_init|dsimple_lexize|dsnowball_init|dsnowball_lexize|dsqrt|dsynonym_init|\" +\n        \"dsynonym_lexize|dtrunc|encode|enum_cmp|enum_eq|enum_first|enum_ge|enum_gt|enum_in|\" +\n        \"enum_larger|enum_last|enum_le|enum_lt|enum_ne|enum_out|enum_range|enum_recv|enum_send|\" +\n        \"enum_smaller|eqjoinsel|eqsel|euc_cn_to_mic|euc_cn_to_utf8|\" +\n        \"euc_jis_2004_to_shift_jis_2004|euc_jis_2004_to_utf8|euc_jp_to_mic|euc_jp_to_sjis|\" +\n        \"euc_jp_to_utf8|euc_kr_to_mic|euc_kr_to_utf8|euc_tw_to_big5|euc_tw_to_mic|\" +\n        \"euc_tw_to_utf8|every|exp|factorial|family|fdw_handler_in|fdw_handler_out|first_value|\" +\n        \"float4|float48div|float48eq|float48ge|float48gt|float48le|float48lt|float48mi|float48mul|\" +\n        \"float48ne|float48pl|float4_accum|float4abs|float4div|float4eq|float4ge|float4gt|float4in|\" +\n        \"float4larger|float4le|float4lt|float4mi|float4mul|float4ne|float4out|float4pl|float4recv|\" +\n        \"float4send|float4smaller|float4um|float4up|float8|float84div|float84eq|float84ge|\" +\n        \"float84gt|float84le|float84lt|float84mi|float84mul|float84ne|float84pl|float8_accum|\" +\n        \"float8_avg|float8_corr|float8_covar_pop|float8_covar_samp|float8_regr_accum|\" +\n        \"float8_regr_avgx|float8_regr_avgy|float8_regr_intercept|float8_regr_r2|\" +\n        \"float8_regr_slope|float8_regr_sxx|float8_regr_sxy|float8_regr_syy|float8_stddev_pop|\" +\n        \"float8_stddev_samp|float8_var_pop|float8_var_samp|float8abs|float8div|float8eq|\" +\n        \"float8ge|float8gt|float8in|float8larger|float8le|float8lt|float8mi|float8mul|float8ne|\" +\n        \"float8out|float8pl|float8recv|float8send|float8smaller|float8um|float8up|floor|\" +\n        \"flt4_mul_cash|flt8_mul_cash|fmgr_c_validator|fmgr_internal_validator|\" +\n        \"fmgr_sql_validator|format|format_type|gb18030_to_utf8|gbk_to_utf8|generate_series|\" +\n        \"generate_subscripts|get_bit|get_byte|get_current_ts_config|getdatabaseencoding|\" +\n        \"getpgusername|gin_cmp_prefix|gin_cmp_tslexeme|gin_extract_tsquery|\" +\n        \"gin_extract_tsvector|gin_tsquery_consistent|ginarrayconsistent|ginarrayextract|\" +\n        \"ginbeginscan|ginbuild|ginbuildempty|ginbulkdelete|gincostestimate|ginendscan|\" +\n        \"gingetbitmap|gininsert|ginmarkpos|ginoptions|ginqueryarrayextract|ginrescan|\" +\n        \"ginrestrpos|ginvacuumcleanup|gist_box_compress|gist_box_consistent|\" +\n        \"gist_box_decompress|gist_box_penalty|gist_box_picksplit|gist_box_same|gist_box_union|\" +\n        \"gist_circle_compress|gist_circle_consistent|gist_point_compress|\" +\n        \"gist_point_consistent|gist_point_distance|gist_poly_compress|gist_poly_consistent|\" +\n        \"gistbeginscan|gistbuild|gistbuildempty|gistbulkdelete|gistcostestimate|gistendscan|\" +\n        \"gistgetbitmap|gistgettuple|gistinsert|gistmarkpos|gistoptions|gistrescan|gistrestrpos|\" +\n        \"gistvacuumcleanup|gtsquery_compress|gtsquery_consistent|gtsquery_decompress|\" +\n        \"gtsquery_penalty|gtsquery_picksplit|gtsquery_same|gtsquery_union|gtsvector_compress|\" +\n        \"gtsvector_consistent|gtsvector_decompress|gtsvector_penalty|gtsvector_picksplit|\" +\n        \"gtsvector_same|gtsvector_union|gtsvectorin|gtsvectorout|has_any_column_privilege|\" +\n        \"has_column_privilege|has_database_privilege|has_foreign_data_wrapper_privilege|\" +\n        \"has_function_privilege|has_language_privilege|has_schema_privilege|\" +\n        \"has_sequence_privilege|has_server_privilege|has_table_privilege|\" +\n        \"has_tablespace_privilege|hash_aclitem|hash_array|hash_numeric|hashbeginscan|\" +\n        \"hashbpchar|hashbuild|hashbuildempty|hashbulkdelete|hashchar|hashcostestimate|\" +\n        \"hashendscan|hashenum|hashfloat4|hashfloat8|hashgetbitmap|hashgettuple|hashinet|\" +\n        \"hashinsert|hashint2|hashint2vector|hashint4|hashint8|hashmacaddr|hashmarkpos|hashname|\" +\n        \"hashoid|hashoidvector|hashoptions|hashrescan|hashrestrpos|hashtext|hashvacuumcleanup|\" +\n        \"hashvarlena|height|host|hostmask|iclikejoinsel|iclikesel|icnlikejoinsel|icnlikesel|\" +\n        \"icregexeqjoinsel|icregexeqsel|icregexnejoinsel|icregexnesel|inet_client_addr|\" +\n        \"inet_client_port|inet_in|inet_out|inet_recv|inet_send|inet_server_addr|\" +\n        \"inet_server_port|inetand|inetmi|inetmi_int8|inetnot|inetor|inetpl|initcap|int2|int24div|\" +\n        \"int24eq|int24ge|int24gt|int24le|int24lt|int24mi|int24mul|int24ne|int24pl|int28div|int28eq|\" +\n        \"int28ge|int28gt|int28le|int28lt|int28mi|int28mul|int28ne|int28pl|int2_accum|\" +\n        \"int2_avg_accum|int2_mul_cash|int2_sum|int2abs|int2and|int2div|int2eq|int2ge|int2gt|int2in|\" +\n        \"int2larger|int2le|int2lt|int2mi|int2mod|int2mul|int2ne|int2not|int2or|int2out|int2pl|\" +\n        \"int2recv|int2send|int2shl|int2shr|int2smaller|int2um|int2up|int2vectoreq|int2vectorin|\" +\n        \"int2vectorout|int2vectorrecv|int2vectorsend|int2xor|int4|int42div|int42eq|int42ge|\" +\n        \"int42gt|int42le|int42lt|int42mi|int42mul|int42ne|int42pl|int48div|int48eq|int48ge|int48gt|\" +\n        \"int48le|int48lt|int48mi|int48mul|int48ne|int48pl|int4_accum|int4_avg_accum|int4_mul_cash|\" +\n        \"int4_sum|int4abs|int4and|int4div|int4eq|int4ge|int4gt|int4in|int4inc|int4larger|int4le|\" +\n        \"int4lt|int4mi|int4mod|int4mul|int4ne|int4not|int4or|int4out|int4pl|int4recv|int4send|\" +\n        \"int4shl|int4shr|int4smaller|int4um|int4up|int4xor|int8|int82div|int82eq|int82ge|int82gt|\" +\n        \"int82le|int82lt|int82mi|int82mul|int82ne|int82pl|int84div|int84eq|int84ge|int84gt|int84le|\" +\n        \"int84lt|int84mi|int84mul|int84ne|int84pl|int8_accum|int8_avg|int8_avg_accum|int8_sum|\" +\n        \"int8abs|int8and|int8div|int8eq|int8ge|int8gt|int8in|int8inc|int8inc_any|\" +\n        \"int8inc_float8_float8|int8larger|int8le|int8lt|int8mi|int8mod|int8mul|int8ne|int8not|\" +\n        \"int8or|int8out|int8pl|int8pl_inet|int8recv|int8send|int8shl|int8shr|int8smaller|int8um|\" +\n        \"int8up|int8xor|integer_pl_date|inter_lb|inter_sb|inter_sl|internal_in|internal_out|\" +\n        \"interval_accum|interval_avg|interval_cmp|interval_div|interval_eq|interval_ge|\" +\n        \"interval_gt|interval_hash|interval_in|interval_larger|interval_le|interval_lt|\" +\n        \"interval_mi|interval_mul|interval_ne|interval_out|interval_pl|interval_pl_date|\" +\n        \"interval_pl_time|interval_pl_timestamp|interval_pl_timestamptz|interval_pl_timetz|\" +\n        \"interval_recv|interval_send|interval_smaller|interval_um|intervaltypmodin|\" +\n        \"intervaltypmodout|intinterval|isclosed|isfinite|ishorizontal|iso8859_1_to_utf8|\" +\n        \"iso8859_to_utf8|iso_to_koi8r|iso_to_mic|iso_to_win1251|iso_to_win866|isopen|isparallel|\" +\n        \"isperp|isvertical|johab_to_utf8|justify_days|justify_hours|justify_interval|\" +\n        \"koi8r_to_iso|koi8r_to_mic|koi8r_to_utf8|koi8r_to_win1251|koi8r_to_win866|\" +\n        \"koi8u_to_utf8|lag|language_handler_in|language_handler_out|last_value|lastval|\" +\n        \"latin1_to_mic|latin2_to_mic|latin2_to_win1250|latin3_to_mic|latin4_to_mic|lead|left|\" +\n        \"length|like|like_escape|likejoinsel|likesel|line|line_distance|line_eq|line_horizontal|\" +\n        \"line_in|line_interpt|line_intersect|line_out|line_parallel|line_perp|line_recv|\" +\n        \"line_send|line_vertical|ln|lo_close|lo_creat|lo_create|lo_export|lo_import|lo_lseek|\" +\n        \"lo_open|lo_tell|lo_truncate|lo_unlink|log|loread|lower|lowrite|lpad|lseg|lseg_center|\" +\n        \"lseg_distance|lseg_eq|lseg_ge|lseg_gt|lseg_horizontal|lseg_in|lseg_interpt|\" +\n        \"lseg_intersect|lseg_le|lseg_length|lseg_lt|lseg_ne|lseg_out|lseg_parallel|lseg_perp|\" +\n        \"lseg_recv|lseg_send|lseg_vertical|ltrim|macaddr_cmp|macaddr_eq|macaddr_ge|macaddr_gt|\" +\n        \"macaddr_in|macaddr_le|macaddr_lt|macaddr_ne|macaddr_out|macaddr_recv|macaddr_send|\" +\n        \"makeaclitem|masklen|max|md5|mic_to_ascii|mic_to_big5|mic_to_euc_cn|mic_to_euc_jp|\" +\n        \"mic_to_euc_kr|mic_to_euc_tw|mic_to_iso|mic_to_koi8r|mic_to_latin1|mic_to_latin2|\" +\n        \"mic_to_latin3|mic_to_latin4|mic_to_sjis|mic_to_win1250|mic_to_win1251|mic_to_win866|\" +\n        \"min|mktinterval|mod|money|mul_d_interval|name|nameeq|namege|namegt|nameiclike|nameicnlike|\" +\n        \"nameicregexeq|nameicregexne|namein|namele|namelike|namelt|namene|namenlike|nameout|\" +\n        \"namerecv|nameregexeq|nameregexne|namesend|neqjoinsel|neqsel|netmask|network|network_cmp|\" +\n        \"network_eq|network_ge|network_gt|network_le|network_lt|network_ne|network_sub|\" +\n        \"network_subeq|network_sup|network_supeq|nextval|nlikejoinsel|nlikesel|notlike|now|\" +\n        \"npoints|nth_value|ntile|numeric_abs|numeric_accum|numeric_add|numeric_avg|\" +\n        \"numeric_avg_accum|numeric_cmp|numeric_div|numeric_div_trunc|numeric_eq|numeric_exp|\" +\n        \"numeric_fac|numeric_ge|numeric_gt|numeric_in|numeric_inc|numeric_larger|numeric_le|\" +\n        \"numeric_ln|numeric_log|numeric_lt|numeric_mod|numeric_mul|numeric_ne|numeric_out|\" +\n        \"numeric_power|numeric_recv|numeric_send|numeric_smaller|numeric_sqrt|\" +\n        \"numeric_stddev_pop|numeric_stddev_samp|numeric_sub|numeric_uminus|numeric_uplus|\" +\n        \"numeric_var_pop|numeric_var_samp|numerictypmodin|numerictypmodout|numnode|\" +\n        \"obj_description|octet_length|oid|oideq|oidge|oidgt|oidin|oidlarger|oidle|oidlt|oidne|oidout|\" +\n        \"oidrecv|oidsend|oidsmaller|oidvectoreq|oidvectorge|oidvectorgt|oidvectorin|oidvectorle|\" +\n        \"oidvectorlt|oidvectorne|oidvectorout|oidvectorrecv|oidvectorsend|oidvectortypes|on_pb|\" +\n        \"on_pl|on_ppath|on_ps|on_sb|on_sl|opaque_in|opaque_out|overlaps|overlay|path|path_add|\" +\n        \"path_add_pt|path_center|path_contain_pt|path_distance|path_div_pt|path_in|path_inter|\" +\n        \"path_length|path_mul_pt|path_n_eq|path_n_ge|path_n_gt|path_n_le|path_n_lt|path_npoints|\" +\n        \"path_out|path_recv|path_send|path_sub_pt|pclose|percent_rank|pg_advisory_lock|\" +\n        \"pg_advisory_lock_shared|pg_advisory_unlock|pg_advisory_unlock_all|\" +\n        \"pg_advisory_unlock_shared|pg_advisory_xact_lock|pg_advisory_xact_lock_shared|\" +\n        \"pg_available_extension_versions|pg_available_extensions|pg_backend_pid|\" +\n        \"pg_cancel_backend|pg_char_to_encoding|pg_client_encoding|pg_collation_is_visible|\" +\n        \"pg_column_size|pg_conf_load_time|pg_conversion_is_visible|pg_create_restore_point|\" +\n        \"pg_current_xlog_insert_location|pg_current_xlog_location|pg_cursor|pg_database_size|\" +\n        \"pg_describe_object|pg_encoding_max_length|pg_encoding_to_char|\" +\n        \"pg_extension_config_dump|pg_extension_update_paths|pg_function_is_visible|\" +\n        \"pg_get_constraintdef|pg_get_expr|pg_get_function_arguments|\" +\n        \"pg_get_function_identity_arguments|pg_get_function_result|pg_get_functiondef|\" +\n        \"pg_get_indexdef|pg_get_keywords|pg_get_ruledef|pg_get_serial_sequence|\" +\n        \"pg_get_triggerdef|pg_get_userbyid|pg_get_viewdef|pg_has_role|pg_indexes_size|\" +\n        \"pg_is_in_recovery|pg_is_other_temp_schema|pg_is_xlog_replay_paused|\" +\n        \"pg_last_xact_replay_timestamp|pg_last_xlog_receive_location|\" +\n        \"pg_last_xlog_replay_location|pg_listening_channels|pg_lock_status|pg_ls_dir|\" +\n        \"pg_my_temp_schema|pg_node_tree_in|pg_node_tree_out|pg_node_tree_recv|\" +\n        \"pg_node_tree_send|pg_notify|pg_opclass_is_visible|pg_operator_is_visible|\" +\n        \"pg_options_to_table|pg_postmaster_start_time|pg_prepared_statement|pg_prepared_xact|\" +\n        \"pg_read_binary_file|pg_read_file|pg_relation_filenode|pg_relation_filepath|\" +\n        \"pg_relation_size|pg_reload_conf|pg_rotate_logfile|pg_sequence_parameters|\" +\n        \"pg_show_all_settings|pg_size_pretty|pg_sleep|pg_start_backup|pg_stat_clear_snapshot|\" +\n        \"pg_stat_file|pg_stat_get_activity|pg_stat_get_analyze_count|\" +\n        \"pg_stat_get_autoanalyze_count|pg_stat_get_autovacuum_count|\" +\n        \"pg_stat_get_backend_activity|pg_stat_get_backend_activity_start|\" +\n        \"pg_stat_get_backend_client_addr|pg_stat_get_backend_client_port|\" +\n        \"pg_stat_get_backend_dbid|pg_stat_get_backend_idset|pg_stat_get_backend_pid|\" +\n        \"pg_stat_get_backend_start|pg_stat_get_backend_userid|pg_stat_get_backend_waiting|\" +\n        \"pg_stat_get_backend_xact_start|pg_stat_get_bgwriter_buf_written_checkpoints|\" +\n        \"pg_stat_get_bgwriter_buf_written_clean|pg_stat_get_bgwriter_maxwritten_clean|\" +\n        \"pg_stat_get_bgwriter_requested_checkpoints|pg_stat_get_bgwriter_stat_reset_time|\" +\n        \"pg_stat_get_bgwriter_timed_checkpoints|pg_stat_get_blocks_fetched|\" +\n        \"pg_stat_get_blocks_hit|pg_stat_get_buf_alloc|pg_stat_get_buf_fsync_backend|\" +\n        \"pg_stat_get_buf_written_backend|pg_stat_get_db_blocks_fetched|\" +\n        \"pg_stat_get_db_blocks_hit|pg_stat_get_db_conflict_all|\" +\n        \"pg_stat_get_db_conflict_bufferpin|pg_stat_get_db_conflict_lock|\" +\n        \"pg_stat_get_db_conflict_snapshot|pg_stat_get_db_conflict_startup_deadlock|\" +\n        \"pg_stat_get_db_conflict_tablespace|pg_stat_get_db_numbackends|\" +\n        \"pg_stat_get_db_stat_reset_time|pg_stat_get_db_tuples_deleted|\" +\n        \"pg_stat_get_db_tuples_fetched|pg_stat_get_db_tuples_inserted|\" +\n        \"pg_stat_get_db_tuples_returned|pg_stat_get_db_tuples_updated|\" +\n        \"pg_stat_get_db_xact_commit|pg_stat_get_db_xact_rollback|pg_stat_get_dead_tuples|\" +\n        \"pg_stat_get_function_calls|pg_stat_get_function_self_time|\" +\n        \"pg_stat_get_function_time|pg_stat_get_last_analyze_time|\" +\n        \"pg_stat_get_last_autoanalyze_time|pg_stat_get_last_autovacuum_time|\" +\n        \"pg_stat_get_last_vacuum_time|pg_stat_get_live_tuples|pg_stat_get_numscans|\" +\n        \"pg_stat_get_tuples_deleted|pg_stat_get_tuples_fetched|\" +\n        \"pg_stat_get_tuples_hot_updated|pg_stat_get_tuples_inserted|\" +\n        \"pg_stat_get_tuples_returned|pg_stat_get_tuples_updated|pg_stat_get_vacuum_count|\" +\n        \"pg_stat_get_wal_senders|pg_stat_get_xact_blocks_fetched|\" +\n        \"pg_stat_get_xact_blocks_hit|pg_stat_get_xact_function_calls|\" +\n        \"pg_stat_get_xact_function_self_time|pg_stat_get_xact_function_time|\" +\n        \"pg_stat_get_xact_numscans|pg_stat_get_xact_tuples_deleted|\" +\n        \"pg_stat_get_xact_tuples_fetched|pg_stat_get_xact_tuples_hot_updated|\" +\n        \"pg_stat_get_xact_tuples_inserted|pg_stat_get_xact_tuples_returned|\" +\n        \"pg_stat_get_xact_tuples_updated|pg_stat_reset|pg_stat_reset_shared|\" +\n        \"pg_stat_reset_single_function_counters|pg_stat_reset_single_table_counters|\" +\n        \"pg_stop_backup|pg_switch_xlog|pg_table_is_visible|pg_table_size|\" +\n        \"pg_tablespace_databases|pg_tablespace_size|pg_terminate_backend|pg_timezone_abbrevs|\" +\n        \"pg_timezone_names|pg_total_relation_size|pg_try_advisory_lock|\" +\n        \"pg_try_advisory_lock_shared|pg_try_advisory_xact_lock|\" +\n        \"pg_try_advisory_xact_lock_shared|pg_ts_config_is_visible|pg_ts_dict_is_visible|\" +\n        \"pg_ts_parser_is_visible|pg_ts_template_is_visible|pg_type_is_visible|pg_typeof|\" +\n        \"pg_xlog_replay_pause|pg_xlog_replay_resume|pg_xlogfile_name|pg_xlogfile_name_offset|\" +\n        \"pi|plainto_tsquery|plpgsql_call_handler|plpgsql_inline_handler|plpgsql_validator|\" +\n        \"point|point_above|point_add|point_below|point_distance|point_div|point_eq|point_horiz|\" +\n        \"point_in|point_left|point_mul|point_ne|point_out|point_recv|point_right|point_send|\" +\n        \"point_sub|point_vert|poly_above|poly_below|poly_center|poly_contain|poly_contain_pt|\" +\n        \"poly_contained|poly_distance|poly_in|poly_left|poly_npoints|poly_out|poly_overabove|\" +\n        \"poly_overbelow|poly_overlap|poly_overleft|poly_overright|poly_recv|poly_right|\" +\n        \"poly_same|poly_send|polygon|popen|position|positionjoinsel|positionsel|\" +\n        \"postgresql_fdw_validator|pow|power|prsd_end|prsd_headline|prsd_lextype|prsd_nexttoken|\" +\n        \"prsd_start|pt_contained_circle|pt_contained_poly|query_to_xml|\" +\n        \"query_to_xml_and_xmlschema|query_to_xmlschema|querytree|quote_ident|quote_literal|\" +\n        \"quote_nullable|radians|radius|random|rank|record_eq|record_ge|record_gt|record_in|\" +\n        \"record_le|record_lt|record_ne|record_out|record_recv|record_send|regclass|regclassin|\" +\n        \"regclassout|regclassrecv|regclasssend|regconfigin|regconfigout|regconfigrecv|\" +\n        \"regconfigsend|regdictionaryin|regdictionaryout|regdictionaryrecv|regdictionarysend|\" +\n        \"regexeqjoinsel|regexeqsel|regexnejoinsel|regexnesel|regexp_matches|regexp_replace|\" +\n        \"regexp_split_to_array|regexp_split_to_table|regoperatorin|regoperatorout|\" +\n        \"regoperatorrecv|regoperatorsend|regoperin|regoperout|regoperrecv|regopersend|\" +\n        \"regprocedurein|regprocedureout|regprocedurerecv|regproceduresend|regprocin|regprocout|\" +\n        \"regprocrecv|regprocsend|regr_avgx|regr_avgy|regr_count|regr_intercept|regr_r2|\" +\n        \"regr_slope|regr_sxx|regr_sxy|regr_syy|regtypein|regtypeout|regtyperecv|regtypesend|\" +\n        \"reltime|reltimeeq|reltimege|reltimegt|reltimein|reltimele|reltimelt|reltimene|reltimeout|\" +\n        \"reltimerecv|reltimesend|repeat|replace|reverse|right|round|row_number|rpad|rtrim|\" +\n        \"scalargtjoinsel|scalargtsel|scalarltjoinsel|scalarltsel|schema_to_xml|\" +\n        \"schema_to_xml_and_xmlschema|schema_to_xmlschema|session_user|set_bit|set_byte|\" +\n        \"set_config|set_masklen|setseed|setval|setweight|shell_in|shell_out|\" +\n        \"shift_jis_2004_to_euc_jis_2004|shift_jis_2004_to_utf8|shobj_description|sign|\" +\n        \"similar_escape|sin|sjis_to_euc_jp|sjis_to_mic|sjis_to_utf8|slope|smgreq|smgrin|smgrne|\" +\n        \"smgrout|split_part|sqrt|statement_timestamp|stddev|stddev_pop|stddev_samp|string_agg|\" +\n        \"string_agg_finalfn|string_agg_transfn|string_to_array|strip|strpos|substr|substring|sum|\" +\n        \"suppress_redundant_updates_trigger|table_to_xml|table_to_xml_and_xmlschema|\" +\n        \"table_to_xmlschema|tan|text|text_ge|text_gt|text_larger|text_le|text_lt|text_pattern_ge|\" +\n        \"text_pattern_gt|text_pattern_le|text_pattern_lt|text_smaller|textanycat|textcat|texteq|\" +\n        \"texticlike|texticnlike|texticregexeq|texticregexne|textin|textlen|textlike|textne|\" +\n        \"textnlike|textout|textrecv|textregexeq|textregexne|textsend|thesaurus_init|\" +\n        \"thesaurus_lexize|tideq|tidge|tidgt|tidin|tidlarger|tidle|tidlt|tidne|tidout|tidrecv|tidsend|\" +\n        \"tidsmaller|time_cmp|time_eq|time_ge|time_gt|time_hash|time_in|time_larger|time_le|time_lt|\" +\n        \"time_mi_interval|time_mi_time|time_ne|time_out|time_pl_interval|time_recv|time_send|\" +\n        \"time_smaller|timedate_pl|timemi|timenow|timeofday|timepl|timestamp_cmp|\" +\n        \"timestamp_cmp_date|timestamp_cmp_timestamptz|timestamp_eq|timestamp_eq_date|\" +\n        \"timestamp_eq_timestamptz|timestamp_ge|timestamp_ge_date|timestamp_ge_timestamptz|\" +\n        \"timestamp_gt|timestamp_gt_date|timestamp_gt_timestamptz|timestamp_hash|timestamp_in|\" +\n        \"timestamp_larger|timestamp_le|timestamp_le_date|timestamp_le_timestamptz|\" +\n        \"timestamp_lt|timestamp_lt_date|timestamp_lt_timestamptz|timestamp_mi|\" +\n        \"timestamp_mi_interval|timestamp_ne|timestamp_ne_date|timestamp_ne_timestamptz|\" +\n        \"timestamp_out|timestamp_pl_interval|timestamp_recv|timestamp_send|timestamp_smaller|\" +\n        \"timestamptypmodin|timestamptypmodout|timestamptz_cmp|timestamptz_cmp_date|\" +\n        \"timestamptz_cmp_timestamp|timestamptz_eq|timestamptz_eq_date|\" +\n        \"timestamptz_eq_timestamp|timestamptz_ge|timestamptz_ge_date|\" +\n        \"timestamptz_ge_timestamp|timestamptz_gt|timestamptz_gt_date|\" +\n        \"timestamptz_gt_timestamp|timestamptz_in|timestamptz_larger|timestamptz_le|\" +\n        \"timestamptz_le_date|timestamptz_le_timestamp|timestamptz_lt|timestamptz_lt_date|\" +\n        \"timestamptz_lt_timestamp|timestamptz_mi|timestamptz_mi_interval|timestamptz_ne|\" +\n        \"timestamptz_ne_date|timestamptz_ne_timestamp|timestamptz_out|\" +\n        \"timestamptz_pl_interval|timestamptz_recv|timestamptz_send|timestamptz_smaller|\" +\n        \"timestamptztypmodin|timestamptztypmodout|timetypmodin|timetypmodout|timetz_cmp|\" +\n        \"timetz_eq|timetz_ge|timetz_gt|timetz_hash|timetz_in|timetz_larger|timetz_le|timetz_lt|\" +\n        \"timetz_mi_interval|timetz_ne|timetz_out|timetz_pl_interval|timetz_recv|timetz_send|\" +\n        \"timetz_smaller|timetzdate_pl|timetztypmodin|timetztypmodout|timezone|tinterval|\" +\n        \"tintervalct|tintervalend|tintervaleq|tintervalge|tintervalgt|tintervalin|tintervalle|\" +\n        \"tintervalleneq|tintervallenge|tintervallengt|tintervallenle|tintervallenlt|\" +\n        \"tintervallenne|tintervallt|tintervalne|tintervalout|tintervalov|tintervalrecv|\" +\n        \"tintervalrel|tintervalsame|tintervalsend|tintervalstart|to_ascii|to_char|to_date|to_hex|\" +\n        \"to_number|to_timestamp|to_tsquery|to_tsvector|transaction_timestamp|translate|\" +\n        \"trigger_in|trigger_out|trunc|ts_debug|ts_headline|ts_lexize|ts_match_qv|ts_match_tq|\" +\n        \"ts_match_tt|ts_match_vq|ts_parse|ts_rank|ts_rank_cd|ts_rewrite|ts_stat|ts_token_type|\" +\n        \"ts_typanalyze|tsmatchjoinsel|tsmatchsel|tsq_mcontained|tsq_mcontains|tsquery_and|\" +\n        \"tsquery_cmp|tsquery_eq|tsquery_ge|tsquery_gt|tsquery_le|tsquery_lt|tsquery_ne|\" +\n        \"tsquery_not|tsquery_or|tsqueryin|tsqueryout|tsqueryrecv|tsquerysend|tsvector_cmp|\" +\n        \"tsvector_concat|tsvector_eq|tsvector_ge|tsvector_gt|tsvector_le|tsvector_lt|\" +\n        \"tsvector_ne|tsvector_update_trigger|tsvector_update_trigger_column|tsvectorin|\" +\n        \"tsvectorout|tsvectorrecv|tsvectorsend|txid_current|txid_current_snapshot|\" +\n        \"txid_snapshot_in|txid_snapshot_out|txid_snapshot_recv|txid_snapshot_send|\" +\n        \"txid_snapshot_xip|txid_snapshot_xmax|txid_snapshot_xmin|txid_visible_in_snapshot|\" +\n        \"uhc_to_utf8|unique_key_recheck|unknownin|unknownout|unknownrecv|unknownsend|unnest|\" +\n        \"upper|utf8_to_ascii|utf8_to_big5|utf8_to_euc_cn|utf8_to_euc_jis_2004|utf8_to_euc_jp|\" +\n        \"utf8_to_euc_kr|utf8_to_euc_tw|utf8_to_gb18030|utf8_to_gbk|utf8_to_iso8859|\" +\n        \"utf8_to_iso8859_1|utf8_to_johab|utf8_to_koi8r|utf8_to_koi8u|utf8_to_shift_jis_2004|\" +\n        \"utf8_to_sjis|utf8_to_uhc|utf8_to_win|uuid_cmp|uuid_eq|uuid_ge|uuid_gt|uuid_hash|uuid_in|\" +\n        \"uuid_le|uuid_lt|uuid_ne|uuid_out|uuid_recv|uuid_send|var_pop|var_samp|varbit_in|\" +\n        \"varbit_out|varbit_recv|varbit_send|varbitcmp|varbiteq|varbitge|varbitgt|varbitle|\" +\n        \"varbitlt|varbitne|varbittypmodin|varbittypmodout|varcharin|varcharout|varcharrecv|\" +\n        \"varcharsend|varchartypmodin|varchartypmodout|variance|version|void_in|void_out|\" +\n        \"void_recv|void_send|width|width_bucket|win1250_to_latin2|win1250_to_mic|win1251_to_iso|\" +\n        \"win1251_to_koi8r|win1251_to_mic|win1251_to_win866|win866_to_iso|win866_to_koi8r|\" +\n        \"win866_to_mic|win866_to_win1251|win_to_utf8|xideq|xideqint4|xidin|xidout|xidrecv|xidsend|\" +\n        \"xml|xml_in|xml_is_well_formed|xml_is_well_formed_content|xml_is_well_formed_document|\" +\n        \"xml_out|xml_recv|xml_send|xmlagg|xmlcomment|xmlconcat2|xmlexists|xmlvalidate|xpath|\" +\n        \"xpath_exists\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords,\n    }, \"identifier\", true);\n\n\n    var sqlRules = [\n        {\n            token : \"string\", // single line string -- assume dollar strings if multi-line for now\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : \"variable.language\", // pg identifier\n            regex : '\".*?\"'\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n              regex : \"[a-zA-Z_][a-zA-Z0-9_$]*\\\\b\" // TODO - Unicode in identifiers\n          }, {\n              token : \"keyword.operator\",\n              regex : \"!|!!|!~|!~\\\\*|!~~|!~~\\\\*|#|##|#<|#<=|#<>|#=|#>|#>=|%|\\\\&|\\\\&\\\\&|\\\\&<|\\\\&<\\\\||\\\\&>|\\\\*|\\\\+|\" +\n                      \"\\\\-|/|<|<#>|<\\\\->|<<|<<=|<<\\\\||<=|<>|<\\\\?>|<@|<\\\\^|=|>|>=|>>|>>=|>\\\\^|\\\\?#|\\\\?\\\\-|\\\\?\\\\-\\\\||\" +\n                      \"\\\\?\\\\||\\\\?\\\\|\\\\||@|@\\\\-@|@>|@@|@@@|\\\\^|\\\\||\\\\|\\\\&>|\\\\|/|\\\\|>>|\\\\|\\\\||\\\\|\\\\|/|~|~\\\\*|~<=~|~<~|\" +\n                      \"~=|~>=~|~>~|~~|~~\\\\*\"\n          }, {\n              token : \"paren.lparen\",\n              regex : \"[\\\\(]\"\n          }, {\n              token : \"paren.rparen\",\n              regex : \"[\\\\)]\"\n          }, {\n              token : \"text\",\n              regex : \"\\\\s+\"\n          }\n    ];\n\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"--.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi-line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            },{\n                token : \"keyword.statementBegin\",\n                regex : \"^[a-zA-Z]+\", // Could enumerate starting keywords but this allows things to work when new statements are added.\n                next : \"statement\"\n            },{\n                token : \"support.buildin\", // psql directive\n                regex : \"^\\\\\\\\[\\\\S]+.*$\"\n            }\n        ],\n\n        \"statement\" : [\n            {\n                token : \"comment\",\n                regex : \"--.*$\"\n            }, {\n                token : \"comment\", // multi-line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"commentStatement\"\n            }, {\n                token : \"statementEnd\",\n                regex : \";\",\n                next : \"start\"\n            }, {\n                token : \"string\", // perl, python, tcl are in the pg default dist (no tcl highlighter)\n                regex : \"\\\\$perl\\\\$\",\n                next : \"perl-start\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$python\\\\$\",\n                next : \"python-start\"\n            },{\n                token : \"string\",\n                regex : \"\\\\$[\\\\w_0-9]*\\\\$$\", // dollar quote at the end of a line\n                next : \"dollarSql\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"dollarStatementString\"\n            }\n        ].concat(sqlRules),\n\n        \"dollarSql\" : [\n            {\n                token : \"comment\",\n                regex : \"--.*$\"\n            }, {\n                token : \"comment\", // multi-line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"commentDollarSql\"\n            }, {\n                token : \"string\", // end quoting with dollar at the start of a line\n                regex : \"^\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"statement\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"dollarSqlString\"\n            }\n        ].concat(sqlRules),\n\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n\n        \"commentStatement\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"statement\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n\n        \"commentDollarSql\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"dollarSql\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n\n        \"dollarStatementString\" : [\n            {\n                token : \"string\", // closing dollarstring\n                regex : \".*?\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"statement\"\n            }, {\n                token : \"string\", // dollarstring spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n\n        \"dollarSqlString\" : [\n            {\n                token : \"string\", // closing dollarstring\n                regex : \".*?\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"dollarSql\"\n            }, {\n                token : \"string\", // dollarstring spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\", [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n    this.embedRules(PerlHighlightRules, \"perl-\", [{token : \"string\", regex : \"\\\\$perl\\\\$\", next : \"statement\"}]);\n    this.embedRules(PythonHighlightRules, \"python-\", [{token : \"string\", regex : \"\\\\$python\\\\$\", next : \"statement\"}]);\n};\n\noop.inherits(PgsqlHighlightRules, TextHighlightRules);\n\nexports.PgsqlHighlightRules = PgsqlHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/perl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PerlHighlightRules = function() {\n\n    var keywords = (\n        \"base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|\" +\n         \"no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars\"\n    );\n\n    var buildinConstants = (\"ARGV|ENV|INC|SIG\");\n\n    var builtinFunctions = (\n        \"getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|\" +\n         \"gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|\" +\n         \"getpeername|setpriority|getprotoent|setprotoent|getpriority|\" +\n         \"endprotoent|getservent|setservent|endservent|sethostent|socketpair|\" +\n         \"getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|\" +\n         \"localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|\" +\n         \"closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|\" +\n         \"shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|\" +\n         \"dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|\" +\n         \"setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|\" +\n         \"lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|\" +\n         \"waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|\" +\n         \"chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|\" +\n         \"unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|\" +\n         \"length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|\" +\n         \"undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|\" +\n         \"sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|\" +\n         \"BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|\" +\n         \"join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|\" +\n         \"keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|\" +\n         \"eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|\" +\n         \"map|die|uc|lc|do\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0x[0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"\\\\.\\\\.\\\\.|\\\\|\\\\|=|>>=|<<=|<=>|&&=|=>|!~|\\\\^=|&=|\\\\|=|\\\\.=|x=|%=|\\\\/=|\\\\*=|\\\\-=|\\\\+=|=~|\\\\*\\\\*|\\\\-\\\\-|\\\\.\\\\.|\\\\|\\\\||&&|\\\\+\\\\+|\\\\->|!=|==|>=|<=|>>|<<|,|=|\\\\?\\\\:|\\\\^|\\\\||x|%|\\\\/|\\\\*|<|&|\\\\\\\\|~|!|>|\\\\.|\\\\-|\\\\+|\\\\-C|\\\\-b|\\\\-S|\\\\-u|\\\\-t|\\\\-p|\\\\-l|\\\\-d|\\\\-f|\\\\-g|\\\\-s|\\\\-z|\\\\-k|\\\\-e|\\\\-O|\\\\-T|\\\\-B|\\\\-M|\\\\-A|\\\\-X|\\\\-W|\\\\-c|\\\\-R|\\\\-o|\\\\-x|\\\\-w|\\\\-r|\\\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(PerlHighlightRules, TextHighlightRules);\n\nexports.PerlHighlightRules = PerlHighlightRules;\n});\n/*\n * TODO: python delimiters\n */\n\ndefine('ace/mode/python_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PythonHighlightRules = function() {\n\n    var keywords = (\n        \"and|as|assert|break|class|continue|def|del|elif|else|except|exec|\" +\n        \"finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|\" +\n        \"raise|return|try|while|with|yield\"\n    );\n\n    var builtinConstants = (\n        \"True|False|None|NotImplemented|Ellipsis|__debug__\"\n    );\n\n    var builtinFunctions = (\n        \"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|\" +\n        \"eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|\" +\n        \"binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|\" +\n        \"float|list|raw_input|unichr|callable|format|locals|reduce|unicode|\" +\n        \"chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|\" +\n        \"cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|\" +\n        \"__import__|complex|hash|min|set|apply|delattr|help|next|setattr|\" +\n        \"buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern\"\n    );\n\n    //var futureReserved = \"\";\n    var keywordMapper = this.createKeywordMapper({\n        \"invalid.deprecated\": \"debugger\",\n        \"support.function\": builtinFunctions,\n        //\"invalid.illegal\": futureReserved,\n        \"constant.language\": builtinConstants,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    var strPre = \"(?:r|u|ur|R|U|UR|Ur|uR)?\";\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"#.*$\"\n        }, {\n            token : \"string\",           // \"\"\" string\n            regex : strPre + '\"{3}(?:[^\\\\\\\\]|\\\\\\\\.)*?\"{3}'\n        }, {\n            token : \"string\",           // multi line \"\"\" string start\n            merge : true,\n            regex : strPre + '\"{3}.*$',\n            next : \"qqstring\"\n        }, {\n            token : \"string\",           // \" string\n            regex : strPre + '\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'\n        }, {\n            token : \"string\",           // ''' string\n            regex : strPre + \"'{3}(?:[^\\\\\\\\]|\\\\\\\\.)*?'{3}\"\n        }, {\n            token : \"string\",           // multi line ''' string start\n            merge : true,\n            regex : strPre + \"'{3}.*$\",\n            next : \"qstring\"\n        }, {\n            token : \"string\",           // ' string\n            regex : strPre + \"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"\n        }, {\n            token : \"constant.numeric\", // imaginary\n            regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // long integer\n            regex : integer + \"[lL]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n        \"qqstring\" : [ {\n            token : \"string\", // multi line \"\"\" string end\n            regex : '(?:[^\\\\\\\\]|\\\\\\\\.)*?\"{3}',\n            next : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring\" : [ {\n            token : \"string\",  // multi line ''' string end\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?'{3}\",\n            next : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ]\n    };\n};\n\noop.inherits(PythonHighlightRules, TextHighlightRules);\n\nexports.PythonHighlightRules = PythonHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-php.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/php', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/php_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar PhpHighlightRules = require(\"./php_highlight_rules\").PhpHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new PhpHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"#\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/php_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules', 'ace/mode/html_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar PhpLangHighlightRules = function() {\n    var docComment = DocCommentHighlightRules;\n    // http://php.net/quickref.php\n    var builtinFunctions = lang.arrayToMap(\n        ('abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|' +\n        'aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|' +\n        'apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|' +\n        'apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|' +\n        'apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|' +\n        'apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|' +\n        'apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|' +\n        'apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|' +\n        'array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|' +\n        'array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|' +\n        'array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|' +\n        'array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|' +\n        'array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|' +\n        'array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|' +\n        'atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|' +\n        'bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|' +\n        'bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|' +\n        'bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|' +\n        'bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|' +\n        'bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|' +\n        'cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|' +\n        'cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|' +\n        'cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|' +\n        'cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|' +\n        'cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|' +\n        'cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|' +\n        'cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|' +\n        'cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|' +\n        'cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|' +\n        'cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|' +\n        'cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|' +\n        'cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|' +\n        'cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|' +\n        'cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|' +\n        'cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|' +\n        'cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|' +\n        'cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|' +\n        'cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|' +\n        'cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|' +\n        'cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|' +\n        'cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|' +\n        'cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|' +\n        'cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|' +\n        'cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|' +\n        'cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|' +\n        'cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|' +\n        'cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|' +\n        'cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|' +\n        'chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|' +\n        'class_parents|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|' +\n        'classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|' +\n        'com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|' +\n        'com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|' +\n        'convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|' +\n        'counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|' +\n        'crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|' +\n        'ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|' +\n        'cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|' +\n        'cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|' +\n        'cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|' +\n        'cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|' +\n        'cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|' +\n        'cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|' +\n        'cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|' +\n        'cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|' +\n        'cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|' +\n        'cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|' +\n        'cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|' +\n        'curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|' +\n        'curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|' +\n        'curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|' +\n        'date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|' +\n        'date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|' +\n        'date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|' +\n        'dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|' +\n        'db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|' +\n        'db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|' +\n        'db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|' +\n        'db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|' +\n        'db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|' +\n        'db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|' +\n        'dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|' +\n        'dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|' +\n        'dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|' +\n        'dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|' +\n        'dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|' +\n        'dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|' +\n        'dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|' +\n        'dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|' +\n        'dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|' +\n        'define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|' +\n        'dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|' +\n        'dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|' +\n        'domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|' +\n        'domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|' +\n        'domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|' +\n        'domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|' +\n        'domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|' +\n        'domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|' +\n        'domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|' +\n        'domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|' +\n        'domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|' +\n        'domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|' +\n        'domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|' +\n        'domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|' +\n        'domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|' +\n        'domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|' +\n        'domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|' +\n        'domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|' +\n        'domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|' +\n        'enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|' +\n        'enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|' +\n        'enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|' +\n        'enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|' +\n        'eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|' +\n        'event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|' +\n        'event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|' +\n        'event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|' +\n        'event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|' +\n        'expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|' +\n        'fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|' +\n        'fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|' +\n        'fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|' +\n        'fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|' +\n        'fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|' +\n        'fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|' +\n        'fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|' +\n        'fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|' +\n        'fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|' +\n        'fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|' +\n        'fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|' +\n        'fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|' +\n        'fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|' +\n        'file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|' +\n        'filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|' +\n        'filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|' +\n        'finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|' +\n        'forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|' +\n        'ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|' +\n        'ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|' +\n        'ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|' +\n        'func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|' +\n        'gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|' +\n        'geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|' +\n        'geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|' +\n        'get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|' +\n        'get_declared_interfaces|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|' +\n        'get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|' +\n        'get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|' +\n        'getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|' +\n        'gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|' +\n        'getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|' +\n        'getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|' +\n        'gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|' +\n        'gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|' +\n        'gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|' +\n        'gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|' +\n        'gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|' +\n        'gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|' +\n        'gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|' +\n        'grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|' +\n        'gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|' +\n        'gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|' +\n        'gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|' +\n        'gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|' +\n        'gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|' +\n        'gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|' +\n        'gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|' +\n        'gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|' +\n        'gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|' +\n        'gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|' +\n        'halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|' +\n        'haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|' +\n        'harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|' +\n        'harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|' +\n        'harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|' +\n        'harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|' +\n        'harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|' +\n        'harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|' +\n        'harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|' +\n        'harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|' +\n        'haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|' +\n        'harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|' +\n        'harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|' +\n        'haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|' +\n        'haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|' +\n        'harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|' +\n        'harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|' +\n        'harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|' +\n        'harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|' +\n        'harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|' +\n        'harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|' +\n        'harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|' +\n        'harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|' +\n        'harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|' +\n        'harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|' +\n        'harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|' +\n        'harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|' +\n        'harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|' +\n        'harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|' +\n        'hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|' +\n        'header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|' +\n        'html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|' +\n        'http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|' +\n        'http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|' +\n        'http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|' +\n        'http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|' +\n        'http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|' +\n        'http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|' +\n        'http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|' +\n        'http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|' +\n        'httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|' +\n        'httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|' +\n        'httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|' +\n        'httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|' +\n        'httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|' +\n        'httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|' +\n        'httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|' +\n        'httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|' +\n        'httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|' +\n        'httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|' +\n        'httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|' +\n        'httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|' +\n        'httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|' +\n        'httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|' +\n        'httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|' +\n        'httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|' +\n        'httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|' +\n        'httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|' +\n        'httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|' +\n        'httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|' +\n        'httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|' +\n        'httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|' +\n        'httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|' +\n        'httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|' +\n        'httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|' +\n        'httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|' +\n        'httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|' +\n        'httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|' +\n        'httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|' +\n        'hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|' +\n        'hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|' +\n        'hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|' +\n        'hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|' +\n        'hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|' +\n        'hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|' +\n        'hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|' +\n        'hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|' +\n        'hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|' +\n        'hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|' +\n        'hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|' +\n        'hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|' +\n        'hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|' +\n        'hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|' +\n        'ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|' +\n        'ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|' +\n        'ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|' +\n        'ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|' +\n        'ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|' +\n        'ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|' +\n        'ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|' +\n        'iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|' +\n        'id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|' +\n        'idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|' +\n        'ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|' +\n        'ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|' +\n        'ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|' +\n        'ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|' +\n        'iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|' +\n        'iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|' +\n        'iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|' +\n        'imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|' +\n        'imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|' +\n        'imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|' +\n        'imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|' +\n        'imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|' +\n        'imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|' +\n        'imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|' +\n        'imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|' +\n        'imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|' +\n        'imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|' +\n        'imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|' +\n        'imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|' +\n        'imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|' +\n        'imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|' +\n        'imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|' +\n        'imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|' +\n        'imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|' +\n        'imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|' +\n        'imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|' +\n        'imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|' +\n        'imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|' +\n        'imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|' +\n        'imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|' +\n        'imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|' +\n        'imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|' +\n        'imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|' +\n        'imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|' +\n        'imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|' +\n        'imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|' +\n        'imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|' +\n        'imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|' +\n        'imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|' +\n        'imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|' +\n        'imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|' +\n        'imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|' +\n        'imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|' +\n        'imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|' +\n        'imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|' +\n        'imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|' +\n        'imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|' +\n        'imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|' +\n        'imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|' +\n        'imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|' +\n        'imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|' +\n        'imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|' +\n        'imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|' +\n        'imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|' +\n        'imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|' +\n        'imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|' +\n        'imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|' +\n        'imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|' +\n        'imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|' +\n        'imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|' +\n        'imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|' +\n        'imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|' +\n        'imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|' +\n        'imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|' +\n        'imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|' +\n        'imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|' +\n        'imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|' +\n        'imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|' +\n        'imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|' +\n        'imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|' +\n        'imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|' +\n        'imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|' +\n        'imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|' +\n        'imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|' +\n        'imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|' +\n        'imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|' +\n        'imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|' +\n        'imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|' +\n        'imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|' +\n        'imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|' +\n        'imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|' +\n        'imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|' +\n        'imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|' +\n        'imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|' +\n        'imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|' +\n        'imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|' +\n        'imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|' +\n        'imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|' +\n        'imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|' +\n        'imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|' +\n        'imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|' +\n        'imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|' +\n        'imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|' +\n        'imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|' +\n        'imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|' +\n        'imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|' +\n        'imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|' +\n        'imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|' +\n        'imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|' +\n        'imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|' +\n        'imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|' +\n        'imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|' +\n        'imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|' +\n        'imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|' +\n        'imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|' +\n        'imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|' +\n        'imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|' +\n        'imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|' +\n        'imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|' +\n        'imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|' +\n        'imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|' +\n        'imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|' +\n        'imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|' +\n        'imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|' +\n        'imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|' +\n        'imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|' +\n        'imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|' +\n        'include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|' +\n        'ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|' +\n        'ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|' +\n        'ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|' +\n        'ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|' +\n        'ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|' +\n        'inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|' +\n        'intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|' +\n        'is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|' +\n        'is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|' +\n        'iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|' +\n        'iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|' +\n        'jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|' +\n        'json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|' +\n        'kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|' +\n        'kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|' +\n        'ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|' +\n        'ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|' +\n        'ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|' +\n        'ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|' +\n        'ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|' +\n        'libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|' +\n        'limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|' +\n        'lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|' +\n        'm_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|' +\n        'm_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|' +\n        'm_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|' +\n        'm_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|' +\n        'mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|' +\n        'mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|' +\n        'mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|' +\n        'maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|' +\n        'maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|' +\n        'maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|' +\n        'maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|' +\n        'maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|' +\n        'maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|' +\n        'maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|' +\n        'maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|' +\n        'maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|' +\n        'maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|' +\n        'maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|' +\n        'maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|' +\n        'maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|' +\n        'maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|' +\n        'maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|' +\n        'mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|' +\n        'mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|' +\n        'mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|' +\n        'mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|' +\n        'mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|' +\n        'mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|' +\n        'mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|' +\n        'mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|' +\n        'mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|' +\n        'mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|' +\n        'mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|' +\n        'mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|' +\n        'mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|' +\n        'mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|' +\n        'mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|' +\n        'ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|' +\n        'mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|' +\n        'mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|' +\n        'mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|' +\n        'mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|' +\n        'mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|' +\n        'msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|' +\n        'msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|' +\n        'msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|' +\n        'msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|' +\n        'msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|' +\n        'msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|' +\n        'msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|' +\n        'mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|' +\n        'mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|' +\n        'mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|' +\n        'mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|' +\n        'mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|' +\n        'mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|' +\n        'mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|' +\n        'mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|' +\n        'mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|' +\n        'mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|' +\n        'mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_bind_param|' +\n        'mysqli_bind_result|mysqli_client_encoding|mysqli_connect|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|' +\n        'mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_escape_string|mysqli_execute|mysqli_fetch|mysqli_get_metadata|' +\n        'mysqli_master_query|mysqli_param_count|mysqli_report|mysqli_result|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|' +\n        'mysqli_send_long_data|mysqli_send_query|mysqli_set_opt|mysqli_slave_query|mysqli_stmt|mysqli_warning|mysqlnd_ms_get_stats|' +\n        'mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|' +\n        'mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|' +\n        'ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|' +\n        'ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|' +\n        'ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|' +\n        'ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|' +\n        'ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|' +\n        'ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|' +\n        'ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|' +\n        'ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|' +\n        'ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|' +\n        'ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|' +\n        'ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|' +\n        'ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|' +\n        'ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|' +\n        'ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|' +\n        'ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|' +\n        'ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|' +\n        'ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|' +\n        'ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|' +\n        'ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|' +\n        'ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|' +\n        'ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|' +\n        'ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|' +\n        'newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|' +\n        'newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|' +\n        'newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|' +\n        'newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|' +\n        'newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|' +\n        'newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|' +\n        'newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|' +\n        'newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|' +\n        'newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|' +\n        'newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|' +\n        'newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|' +\n        'newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|' +\n        'newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|' +\n        'newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|' +\n        'newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|' +\n        'newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|' +\n        'newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|' +\n        'newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|' +\n        'newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|' +\n        'notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|' +\n        'notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|' +\n        'numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|' +\n        'ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|' +\n        'ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|' +\n        'oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|' +\n        'oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|' +\n        'oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|' +\n        'oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|' +\n        'oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|' +\n        'oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|' +\n        'oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|' +\n        'oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|' +\n        'oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|' +\n        'ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|' +\n        'ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|' +\n        'ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|' +\n        'ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|' +\n        'ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|' +\n        'octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|' +\n        'odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|' +\n        'odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|' +\n        'odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|' +\n        'odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|' +\n        'odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|' +\n        'openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|' +\n        'openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|' +\n        'openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|' +\n        'openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|' +\n        'openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|' +\n        'openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|' +\n        'openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|' +\n        'openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|' +\n        'openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|' +\n        'openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|' +\n        'openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|' +\n        'outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|' +\n        'ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|' +\n        'ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|' +\n        'ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|' +\n        'parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|' +\n        'pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|' +\n        'pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|' +\n        'pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|' +\n        'pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|' +\n        'pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|' +\n        'pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|' +\n        'pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|' +\n        'pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|' +\n        'pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|' +\n        'pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|' +\n        'pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|' +\n        'pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|' +\n        'pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|' +\n        'pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|' +\n        'pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|' +\n        'pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|' +\n        'pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|' +\n        'pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|' +\n        'pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|' +\n        'pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|' +\n        'pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|' +\n        'pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|' +\n        'pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|' +\n        'pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|' +\n        'pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|' +\n        'pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|' +\n        'pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|' +\n        'pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|' +\n        'pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|' +\n        'pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|' +\n        'pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|' +\n        'pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|' +\n        'pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|' +\n        'pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|' +\n        'pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|' +\n        'php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|' +\n        'png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|' +\n        'posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|' +\n        'posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|' +\n        'posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|' +\n        'preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|' +\n        'printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|' +\n        'printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|' +\n        'printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|' +\n        'printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|' +\n        'printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|' +\n        'ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|' +\n        'ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|' +\n        'ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|' +\n        'ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|' +\n        'ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|' +\n        'ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|' +\n        'ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|' +\n        'ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|' +\n        'ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|' +\n        'pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|' +\n        'pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|' +\n        'pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|' +\n        'px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|' +\n        'px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|' +\n        'px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|' +\n        'radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|' +\n        'radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|' +\n        'radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|' +\n        'radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|' +\n        'rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|' +\n        'readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|' +\n        'readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|' +\n        'readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|' +\n        'recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|' +\n        'recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|' +\n        'reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|' +\n        'regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|' +\n        'resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|' +\n        'rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|' +\n        'rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|' +\n        'runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|' +\n        'runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|' +\n        'runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|' +\n        'runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|' +\n        'samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|' +\n        'samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|' +\n        'sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|' +\n        'sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|' +\n        'sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|' +\n        'sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|' +\n        'sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|' +\n        'sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|' +\n        'sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|' +\n        'sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|' +\n        'sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|' +\n        'sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|' +\n        'sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|' +\n        'sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|' +\n        'sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|' +\n        'sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|' +\n        'sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|' +\n        'sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|' +\n        'sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|' +\n        'sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|' +\n        'sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|' +\n        'sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|' +\n        'session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|' +\n        'session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|' +\n        'session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|' +\n        'session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|' +\n        'set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|' +\n        'setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|' +\n        'shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|' +\n        'similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|' +\n        'snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|' +\n        'snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|' +\n        'snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|' +\n        'soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|' +\n        'socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|' +\n        'socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|' +\n        'socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|' +\n        'solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|' +\n        'solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|' +\n        'solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|' +\n        'spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|' +\n        'splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|' +\n        'splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|' +\n        'sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|' +\n        'sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|' +\n        'sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|' +\n        'sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|' +\n        'sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|' +\n        'sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|' +\n        'ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|' +\n        'ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|' +\n        'ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|' +\n        'ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|' +\n        'stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|' +\n        'stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|' +\n        'stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|' +\n        'stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|' +\n        'stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|' +\n        'stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|' +\n        'stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|' +\n        'stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|' +\n        'stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|' +\n        'stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|' +\n        'stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|' +\n        'stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|' +\n        'str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|' +\n        'stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|' +\n        'stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|' +\n        'stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|' +\n        'stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|' +\n        'stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|' +\n        'stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|' +\n        'stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|' +\n        'stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|' +\n        'stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|' +\n        'strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|' +\n        'svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|' +\n        'svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|' +\n        'svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|' +\n        'svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|' +\n        'svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|' +\n        'svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|' +\n        'swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|' +\n        'swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|' +\n        'swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|' +\n        'swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|' +\n        'swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|' +\n        'swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|' +\n        'swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|' +\n        'swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|' +\n        'swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|' +\n        'swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|' +\n        'swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|' +\n        'swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|' +\n        'swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|' +\n        'sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|' +\n        'sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|' +\n        'sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|' +\n        'sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|' +\n        'tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|' +\n        'tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|' +\n        'time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|' +\n        'timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|' +\n        'tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|transliterator|traversable|trigger_error|trim|uasort|ucfirst|' +\n        'ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|' +\n        'udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|' +\n        'udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|' +\n        'uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|' +\n        'urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|' +\n        'variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|' +\n        'variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|' +\n        'variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|' +\n        'vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|' +\n        'vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|' +\n        'vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|' +\n        'w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|' +\n        'wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|' +\n        'win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|' +\n        'win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|' +\n        'wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|' +\n        'wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|' +\n        'wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|' +\n        'wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|' +\n        'xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|' +\n        'xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|' +\n        'xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|' +\n        'xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|' +\n        'xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|' +\n        'xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|' +\n        'xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|' +\n        'xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|' +\n        'xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|' +\n        'xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|' +\n        'xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|' +\n        'xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|' +\n        'xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|' +\n        'xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|' +\n        'xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|' +\n        'xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|' +\n        'xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|' +\n        'xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|' +\n        'xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|' +\n        'xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|' +\n        'xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|' +\n        'xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|' +\n        'yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|' +\n        'yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|' +\n        'yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|' +\n        'yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|' +\n        'zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|' +\n        'ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|' +\n        'ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|' +\n        'ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|' +\n        'ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|' +\n        'ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|' +\n        'ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type').split('|')\n    );\n\n    // http://php.net/manual/en/reserved.keywords.php\n    var keywords = lang.arrayToMap(\n        ('abstract|and|array|as|break|case|catch|class|clone|const|continue|declare|default|do|else|elseif|enddeclare|endfor|endforeach|endif|' +\n        'endswitch|endwhile|extends|final|for|foreach|function|global|goto|if|implements|interface|instanceof|namespace|new|or|private|protected|' +\n        'public|static|switch|throw|try|use|var|while|xor').split('|')\n    );\n\n    // http://php.net/manual/en/reserved.keywords.php\n    var languageConstructs = lang.arrayToMap(\n        ('die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset').split('|')\n    );\n\n    var builtinConstants = lang.arrayToMap(\n        ('true|false|null|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__').split('|')\n    );\n\n    var builtinVariables = lang.arrayToMap(\n        ('$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|' +\n        '$http_response_header|$argc|$argv').split('|')\n    );\n\n    // Discovery done by downloading 'Many HTML files' from:  http://php.net/download-docs.php\n    // Then search for files containing 'deprecated' (case-insensitive) and look at each file that turns up.\n    var builtinFunctionsDeprecated = lang.arrayToMap(\n        ('key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|' +\n        'com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|' +\n        'cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|' +\n        'hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|' +\n        'maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|' +\n        'mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|' +\n        'mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|' +\n        'mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|' +\n        'mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|' +\n        'mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|' +\n        'mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|' +\n        'ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|' +\n        'ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|' +\n        'ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|' +\n        'ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|' +\n        'ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|' +\n        'PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|' +\n        'PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|' +\n        'PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|' +\n        'PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|' +\n        'PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|' +\n        'PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|' +\n        'PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|' +\n        'PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|' +\n        'px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregister' +\n        'set_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|' +\n        'sql_regcase').split('|')\n    );\n\n    var keywordsDeprecated = lang.arrayToMap(\n        ('cfunction|old_function').split('|')\n    );\n\n    var futureReserved = lang.arrayToMap([]);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n               token : \"comment\",\n               regex : \"#.*$\"\n            },\n            docComment.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/][gimy]*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // \" string start\n                regex : '\"',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // ' string start\n                regex : \"'\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language\", // constants\n                regex : \"\\\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|\" +\n                        \"ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|\" +\n                        \"HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|\" +\n                        \"L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|\" +\n                        \"VERSION))|__COMPILER_HALT_OFFSET__)\\\\b\"\n            }, {\n                token : \"constant.language\", // constants\n                regex : \"\\\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|\" +\n                        \"SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|\" +\n                        \"O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|\" +\n                        \"R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|\" +\n                        \"YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|\" +\n                        \"ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|\" +\n                        \"T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|\" +\n                        \"HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|\" +\n                        \"I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|\" +\n                        \"O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|\" +\n                        \"L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|\" +\n                        \"M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|\" +\n                        \"OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|\" +\n                        \"P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|\" +\n                        \"RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|\" +\n                        \"T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\\\b\"\n            }, {\n                token : function(value) {\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (builtinConstants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (builtinVariables.hasOwnProperty(value))\n                        return \"variable.language\";\n                    else if (futureReserved.hasOwnProperty(value))\n                        return \"invalid.illegal\";\n                    else if (builtinFunctions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (value == \"debugger\")\n                        return \"invalid.deprecated\";\n                    else\n                        if(value.match(/^(\\$[a-zA-Z][a-zA-Z0-9_]*|self|parent)$/))\n                            return \"variable\";\n                        return \"identifier\";\n                },\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : '\\\\\\\\(?:[nrtvef\\\\\\\\\"$]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})'\n            }, {\n                token : \"constant.language.escape\",\n                regex : /\\$[\\w\\d]+(?:\\[[\\w\\d]+\\])?/\n            }, {\n                token : \"constant.language.escape\",\n                regex : /\\$\\{[^\"\\}]+\\}?/           // this is wrong but ok for now\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+?'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : \"\\\\\\\\['\\\\\\\\]\"\n            }, {\n                token : \"string\",\n                regex : \"'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : \".+?\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(PhpLangHighlightRules, TextHighlightRules);\n\n\nvar PhpHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    for (var i in this.$rules) {\n        this.$rules[i].unshift({\n            token : \"support.php_tag\", // php open tag\n            regex : \"<\\\\?(?:php|\\\\=)\",\n            next  : \"php-start\"\n        });\n    }\n\n    this.embedRules(PhpLangHighlightRules, \"php-\");\n\n    this.$rules[\"php-start\"].unshift({\n        token : \"support.php_tag\", // php close tag\n        regex : \"\\\\?>\",\n        next  : \"start\"\n    });\n};\n\noop.inherits(PhpHighlightRules, HtmlHighlightRules);\n\nexports.PhpHighlightRules = PhpHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            merge : true,\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*script\\\\b)\",\n            next : \"script\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"<(?=\\s*style\\\\b)\",\n            next : \"style\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        } ],\n    \n        cdata : [ {\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            merge : true,\n            regex : \".+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        } ]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\", tagMap);\n    xmlUtil.tag(this.$rules, \"style\", \"css-start\", tagMap);\n    xmlUtil.tag(this.$rules, \"script\", \"js-start\", tagMap);\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n    \n    this.embedRules(CssHighlightRules, \"css-\", [{\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=style)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(HtmlHighlightRules, TextHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CssHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\",\n        \"support.function\": \"rgb|rgba|url|attr|counter|counters\",\n        \"support.constant\": \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\",\n        \"support.constant.color\": \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\",\n        \"support.constant.fonts\": \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\"\n    }, \"text\", true);\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    var pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\n    var pseudoClasses = \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\n    var base_ruleset = [\n        {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"ruleset_comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : [\"constant.numeric\"],\n            regex : \"([0-9]+)\"\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n      ];\n\n    var ruleset = lang.copyArray(base_ruleset);\n    ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"start\"\n    });\n\n    var media_ruleset = lang.copyArray( base_ruleset );\n    media_ruleset.unshift({\n        token : \"paren.rparen\",\n        regex : \"\\\\}\",\n        next:   \"media\"\n    });\n\n    var base_comment = [{\n          token : \"comment\", // comment spanning whole line\n          merge : true,\n          regex : \".+\"\n    }];\n\n    var comment = lang.copyArray(base_comment);\n    comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"start\"\n    });\n\n    var media_comment = lang.copyArray(base_comment);\n    media_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"media\"\n    });\n\n    var ruleset_comment = lang.copyArray(base_comment);\n    ruleset_comment.unshift({\n          token : \"comment\", // closing comment\n          regex : \".*?\\\\*\\\\/\",\n          next : \"ruleset\"\n    });\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            next:  \"media\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"media\" : [ {\n            token : \"comment\", // multi line comment\n            merge : true,\n            regex : \"\\\\/\\\\*\",\n            next : \"media_comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            next:  \"media_ruleset\"\n        },{\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"start\"\n        },{\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        },{\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        },{\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        },{\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }],\n\n        \"comment\" : comment,\n\n        \"ruleset\" : ruleset,\n        \"ruleset_comment\" : ruleset_comment,\n\n        \"media_ruleset\" : media_ruleset,\n        \"media_comment\" : media_comment\n    };\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-powershell.js",
    "content": "define('ace/mode/powershell', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/powershell_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar PowershellHighlightRules = require(\"./powershell_highlight_rules\").PowershellHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new PowershellHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n      \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\ndefine('ace/mode/powershell_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PowershellHighlightRules = function() {\n\n    var keywords = (\n      \"function|if|else|elseif|switch|while|default|for|do|until|break|continue|\" +\n       \"foreach|return|filter|in|trap|throw|param|begin|process|end\"\n    );\n\n    var builtinFunctions = (\n      \"Get-Alias|Import-Alias|New-Alias|Set-Alias|Get-AuthenticodeSignature|Set-AuthenticodeSignature|\" +\n       \"Set-Location|Get-ChildItem|Clear-Item|Get-Command|Measure-Command|Trace-Command|\" +\n       \"Add-Computer|Checkpoint-Computer|Remove-Computer|Restart-Computer|Restore-Computer|Stop-Computer|\" +\n       \"Reset-ComputerMachinePassword|Test-ComputerSecureChannel|Add-Content|Get-Content|Set-Content|Clear-Content|\" +\n       \"Get-Command|Invoke-Command|Enable-ComputerRestore|Disable-ComputerRestore|Get-ComputerRestorePoint|Test-Connection|\" +\n       \"ConvertFrom-CSV|ConvertTo-CSV|ConvertTo-Html|ConvertTo-Xml|ConvertFrom-SecureString|ConvertTo-SecureString|\" +\n       \"Copy-Item|Export-Counter|Get-Counter|Import-Counter|Get-Credential|Get-Culture|\" +\n       \"Get-ChildItem|Get-Date|Set-Date|Remove-Item|Compare-Object|Get-Event|\" +\n       \"Get-WinEvent|New-Event|Remove-Event|Unregister-Event|Wait-Event|Clear-EventLog|\" +\n       \"Get-Eventlog|Limit-EventLog|New-Eventlog|Remove-EventLog|Show-EventLog|Write-EventLog|\" +\n       \"Get-EventSubscriber|Register-EngineEvent|Register-ObjectEvent|Register-WmiEvent|Get-ExecutionPolicy|Set-ExecutionPolicy|\" +\n       \"Export-Alias|Export-Clixml|Export-Console|Export-Csv|ForEach-Object|Format-Custom|\" +\n       \"Format-List|Format-Table|Format-Wide|Export-FormatData|Get-FormatData|Get-Item|\" +\n       \"Get-ChildItem|Get-Help|Add-History|Clear-History|Get-History|Invoke-History|\" +\n       \"Get-Host|Read-Host|Write-Host|Get-HotFix|Import-Clixml|Import-Csv|\" +\n       \"Invoke-Command|Invoke-Expression|Get-Item|Invoke-Item|New-Item|Remove-Item|\" +\n       \"Set-Item|Clear-ItemProperty|Copy-ItemProperty|Get-ItemProperty|Move-ItemProperty|New-ItemProperty|\" +\n       \"Remove-ItemProperty|Rename-ItemProperty|Set-ItemProperty|Get-Job|Receive-Job|Remove-Job|\" +\n       \"Start-Job|Stop-Job|Wait-Job|Stop-Process|Update-List|Get-Location|\" +\n       \"Pop-Location|Push-Location|Set-Location|Send-MailMessage|Add-Member|Get-Member|\" +\n       \"Move-Item|Compare-Object|Group-Object|Measure-Object|New-Object|Select-Object|\" +\n       \"Sort-Object|Where-Object|Out-Default|Out-File|Out-GridView|Out-Host|\" +\n       \"Out-Null|Out-Printer|Out-String|Convert-Path|Join-Path|Resolve-Path|\" +\n       \"Split-Path|Test-Path|Get-Pfxcertificate|Pop-Location|Push-Location|Get-Process|\" +\n       \"Start-Process|Stop-Process|Wait-Process|Enable-PSBreakpoint|Disable-PSBreakpoint|Get-PSBreakpoint|\" +\n       \"Set-PSBreakpoint|Remove-PSBreakpoint|Get-PSDrive|New-PSDrive|Remove-PSDrive|Get-PSProvider|\" +\n       \"Set-PSdebug|Enter-PSSession|Exit-PSSession|Export-PSSession|Get-PSSession|Import-PSSession|\" +\n       \"New-PSSession|Remove-PSSession|Disable-PSSessionConfiguration|Enable-PSSessionConfiguration|Get-PSSessionConfiguration|Register-PSSessionConfiguration|\" +\n       \"Set-PSSessionConfiguration|Unregister-PSSessionConfiguration|New-PSSessionOption|Add-PsSnapIn|Get-PsSnapin|Remove-PSSnapin|\" +\n       \"Get-Random|Read-Host|Remove-Item|Rename-Item|Rename-ItemProperty|Select-Object|\" +\n       \"Select-XML|Send-MailMessage|Get-Service|New-Service|Restart-Service|Resume-Service|\" +\n       \"Set-Service|Start-Service|Stop-Service|Suspend-Service|Sort-Object|Start-Sleep|\" +\n       \"ConvertFrom-StringData|Select-String|Tee-Object|New-Timespan|Trace-Command|Get-Tracesource|\" +\n       \"Set-Tracesource|Start-Transaction|Complete-Transaction|Get-Transaction|Use-Transaction|Undo-Transaction|\" +\n       \"Start-Transcript|Stop-Transcript|Add-Type|Update-TypeData|Get-Uiculture|Get-Unique|\" +\n       \"Update-Formatdata|Update-Typedata|Clear-Variable|Get-Variable|New-Variable|Remove-Variable|\" +\n       \"Set-Variable|New-WebServiceProxy|Where-Object|Write-Debug|Write-Error|Write-Host|\" +\n       \"Write-Output|Write-Progress|Write-Verbose|Write-Warning|Set-WmiInstance|Invoke-WmiMethod|\" +\n       \"Get-WmiObject|Remove-WmiObject|Connect-WSMan|Disconnect-WSMan|Test-WSMan|Invoke-WSManAction|\" +\n       \"Disable-WSManCredSSP|Enable-WSManCredSSP|Get-WSManCredSSP|New-WSManInstance|Get-WSManInstance|Set-WSManInstance|\" +\n       \"Remove-WSManInstance|Set-WSManQuickConfig|New-WSManSessionOption\"\n       );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    var binaryOperatorsRe = \"eq|ne|ge|gt|lt|le|like|notlike|match|notmatch|replace|contains|notcontains|\" +\n                            \"ieq|ine|ige|igt|ile|ilt|ilike|inotlike|imatch|inotmatch|ireplace|icontains|inotcontains|\" +\n                            \"is|isnot|as|\" +\n                            \"and|or|band|bor|not\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"[$](?:[Tt]rue|[Ff]alse)\\\\b\"\n            }, {\n                token : \"constant.language\",\n                regex : \"[$][Nn]ull\\\\b\"\n            }, {\n                token : \"variable.instance\",\n                regex : \"[$][a-zA-Z][a-zA-Z0-9_]*\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$\\\\-]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"\\\\-(?:\" + binaryOperatorsRe + \")\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"&|\\\\*|\\\\+|\\\\-|\\\\=|\\\\+=|\\\\-=\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n};\n\noop.inherits(PowershellHighlightRules, TextHighlightRules);\n\nexports.PowershellHighlightRules = PowershellHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-python.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/python', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/python_highlight_rules', 'ace/mode/folding/pythonic', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar PythonHighlightRules = require(\"./python_highlight_rules\").PythonHighlightRules;\nvar PythonFoldMode = require(\"./folding/pythonic\").FoldMode;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules());\n    this.foldingRules = new PythonFoldMode(\"\\\\:\");\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"#\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    var outdents = {\n        \"pass\": 1,\n        \"return\": 1,\n        \"raise\": 1,\n        \"break\": 1,\n        \"continue\": 1\n    };\n    \n    this.checkOutdent = function(state, line, input) {\n        if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\")\n            return false;\n\n        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n        \n        if (!tokens)\n            return false;\n        \n        // ignore trailing comments\n        do {\n            var last = tokens.pop();\n        } while (last && (last.type == \"comment\" || (last.type == \"text\" && last.value.match(/^\\s+$/))));\n        \n        if (!last)\n            return false;\n        \n        return (last.type == \"keyword\" && outdents[last.value]);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        // outdenting in python is slightly different because it always applies\n        // to the next line and only of a new line is inserted\n        \n        row += 1;\n        var indent = this.$getIndent(doc.getLine(row));\n        var tab = doc.getTabString();\n        if (indent.slice(-tab.length) == tab)\n            doc.remove(new Range(row, indent.length-tab.length, row, indent.length));\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n/*\n * TODO: python delimiters\n */\n\ndefine('ace/mode/python_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PythonHighlightRules = function() {\n\n    var keywords = (\n        \"and|as|assert|break|class|continue|def|del|elif|else|except|exec|\" +\n        \"finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|\" +\n        \"raise|return|try|while|with|yield\"\n    );\n\n    var builtinConstants = (\n        \"True|False|None|NotImplemented|Ellipsis|__debug__\"\n    );\n\n    var builtinFunctions = (\n        \"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|\" +\n        \"eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|\" +\n        \"binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|\" +\n        \"float|list|raw_input|unichr|callable|format|locals|reduce|unicode|\" +\n        \"chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|\" +\n        \"cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|\" +\n        \"__import__|complex|hash|min|set|apply|delattr|help|next|setattr|\" +\n        \"buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern\"\n    );\n\n    //var futureReserved = \"\";\n    var keywordMapper = this.createKeywordMapper({\n        \"invalid.deprecated\": \"debugger\",\n        \"support.function\": builtinFunctions,\n        //\"invalid.illegal\": futureReserved,\n        \"constant.language\": builtinConstants,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    var strPre = \"(?:r|u|ur|R|U|UR|Ur|uR)?\";\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"#.*$\"\n        }, {\n            token : \"string\",           // \"\"\" string\n            regex : strPre + '\"{3}(?:[^\\\\\\\\]|\\\\\\\\.)*?\"{3}'\n        }, {\n            token : \"string\",           // multi line \"\"\" string start\n            merge : true,\n            regex : strPre + '\"{3}.*$',\n            next : \"qqstring\"\n        }, {\n            token : \"string\",           // \" string\n            regex : strPre + '\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'\n        }, {\n            token : \"string\",           // ''' string\n            regex : strPre + \"'{3}(?:[^\\\\\\\\]|\\\\\\\\.)*?'{3}\"\n        }, {\n            token : \"string\",           // multi line ''' string start\n            merge : true,\n            regex : strPre + \"'{3}.*$\",\n            next : \"qstring\"\n        }, {\n            token : \"string\",           // ' string\n            regex : strPre + \"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"\n        }, {\n            token : \"constant.numeric\", // imaginary\n            regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // long integer\n            regex : integer + \"[lL]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n        \"qqstring\" : [ {\n            token : \"string\", // multi line \"\"\" string end\n            regex : '(?:[^\\\\\\\\]|\\\\\\\\.)*?\"{3}',\n            next : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ],\n        \"qstring\" : [ {\n            token : \"string\",  // multi line ''' string end\n            regex : \"(?:[^\\\\\\\\]|\\\\\\\\.)*?'{3}\",\n            next : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ]\n    };\n};\n\noop.inherits(PythonHighlightRules, TextHighlightRules);\n\nexports.PythonHighlightRules = PythonHighlightRules;\n});\n\ndefine('ace/mode/folding/pythonic', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(markers) {\n    this.foldingStartMarker = new RegExp(\"([\\\\[{])(?:\\\\s*)$|(\" + markers + \")(?:\\\\s*)(?:#.*)?$\");\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, match.index);\n            if (match[2])\n                return this.indentationBlock(session, row, match.index + match[2].length);\n            return this.indentationBlock(session, row);\n        }\n    }\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-ruby.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/ruby', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ruby_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar RubyHighlightRules = require(\"./ruby_highlight_rules\").RubyHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"#\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/ruby_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar RubyHighlightRules = function() {\n\n    var builtinFunctions = (\n        \"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|\" +\n        \"assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|\" +\n        \"assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|\" +\n        \"assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|\" +\n        \"assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|\" +\n        \"assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|\" +\n        \"attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|\" +\n        \"caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|\" +\n        \"exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|\" +\n        \"gsub!|get_via_redirect|h|host!|https?|https!|include|Integer|lambda|link_to|\" +\n        \"link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|\" +\n        \"p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|\" +\n        \"raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|\" +\n        \"set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|\" +\n        \"throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|\" +\n        \"render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|\" +\n        \"content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|\" +\n        \"fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|\" +\n        \"time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|\" +\n        \"select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|\" +\n        \"file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|\" +\n        \"protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|\" +\n        \"send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|\" +\n        \"validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|\" +\n        \"validates_inclusion_of|validates_numericality_of|validates_with|validates_each|\" +\n        \"authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|\" +\n        \"filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|\" +\n        \"translate|localize|extract_locale_from_tld|t|l|caches_page|expire_page|caches_action|expire_action|\" +\n        \"cache|expire_fragment|expire_cache_for|observe|cache_sweeper|\" +\n        \"has_many|has_one|belongs_to|has_and_belongs_to_many\"\n    );\n\n    var keywords = (\n        \"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|\" +\n        \"__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|\" +\n        \"redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\"\n    );\n\n    var buildinConstants = (\n        \"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|\" +\n        \"RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\"\n    );\n\n    var builtinVariables = (\n        \"\\$DEBUG|\\$defout|\\$FILENAME|\\$LOAD_PATH|\\$SAFE|\\$stdin|\\$stdout|\\$stderr|\\$VERBOSE|\" +\n        \"$!|root_url|flash|session|cookies|params|request|response|logger|self\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"variable.language\": builtinVariables,\n        \"support.function\": builtinFunctions,\n        \"invalid.deprecated\": \"debugger\" // TODO is this a remnant from js mode?\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"^\\=begin$\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // backtick string\n                regex : \"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"\n            }, {\n                token : \"text\", // namespaces aren't symbols\n                regex : \"::\"\n            }, {\n                token : \"variable.instancce\", // instance variable\n                regex : \"@{1,2}(?:[a-zA-Z_]|\\d)+\"\n            }, {\n                token : \"variable.class\", // class name\n                regex : \"[A-Z](?:[a-zA-Z_]|\\d)+\"\n            }, {\n                token : \"string\", // symbol\n                regex : \"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"\n           }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"^\\=end$\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ]\n    };\n};\n\noop.inherits(RubyHighlightRules, TextHighlightRules);\n\nexports.RubyHighlightRules = RubyHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-scad.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/scad', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/scad_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar scadHighlightRules = require(\"./scad_highlight_rules\").scadHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new scadHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/scad_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar scadHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": \"module|if|else|for\",\n        \"constant.language\": \"NULL\",\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n              token : \"constant\", // <CONSTANT>\n              regex : \"<[a-zA-Z0-9.]+>\"\n            }, {\n              token : \"keyword\", // pre-compiler directivs\n              regex : \"(?:use|include)\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(scadHighlightRules, TextHighlightRules);\n\nexports.scadHighlightRules = scadHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-scala.js",
    "content": "define('ace/mode/scala', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/scala_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar ScalaHighlightRules = require(\"./scala_highlight_rules\").ScalaHighlightRules;\n\nvar Mode = function() {\n    JavaScriptMode.call(this);\n    \n    this.$tokenizer = new Tokenizer(new ScalaHighlightRules().getRules());\n};\noop.inherits(Mode, JavaScriptMode);\n\n(function() {\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\ndefine('ace/mode/scala_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ScalaHighlightRules = function() {\n\n    // taken from http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html\n    var keywords = (\n            \"case|default|do|else|for|if|match|while|throw|return|try|catch|finally|yield|\" +\n            \"abstract|class|def|extends|final|forSome|implicit|implicits|import|lazy|new|object|\" +\n            \"override|package|private|protected|sealed|super|this|trait|type|val|var|with\"\n    );\n\n    var buildinConstants = (\"true|false\");\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object|\" +\n        \"Unit|Any|AnyVal|AnyRef|Null|ScalaObject|Singleton|Seq|Iterable|List|\" +\n        \"Option|Array|Char|Byte|Short|Int|Long|Nothing\"\n\n\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"support.function\": langClasses,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\",\n                regex : '\"\"\"',\n                next : \"tstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)', // \" strings can't span multiple lines\n                next : \"string\"\n            }, {\n                token : \"symbol.constant\", // single line\n                regex : \"'[\\\\w\\\\d_]+\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                // TODO: Unicode escape sequences\n                // TODO: Unicode identifiers\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"string\" : [\n            {\n                token : \"escape\",\n                regex : '\\\\\\\\\"',\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '\"',\n                next : \"start\"\n            }, {\n                token : \"string.invalid\",\n                regex : '[^\"\\\\\\\\]*$',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }\n        ],\n        \"tstring\" : [\n            {\n                token : \"string\", // closing comment\n                regex : '\"{3,5}',\n                next : \"start\"\n            }, {\n                token : \"string\", // comment spanning whole line\n                merge : true,\n                regex : \".+?\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(ScalaHighlightRules, TextHighlightRules);\n\nexports.ScalaHighlightRules = ScalaHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-scss.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/scss', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/scss_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar ScssHighlightRules = require(\"./scss_highlight_rules\").ScssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new ScssHighlightRules().getRules(), \"i\");\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        // ignore braces in comments\n        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/scss_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ScssHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|\" +\n            \"bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n          \n        //The return array     \n        var ret = [];\n        \n        //All prefixProperties will get the browserPrefix in\n        //the begning by join the prefixProperties array with the value of browserPrefix\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        \n        //Add also prefixProperties and properties without any browser prefix\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|\" +\n         \"alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|\" + \n         \"floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|\" + \n         \"nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|\" +\n         \"scale_color|transparentize|type_of|unit|unitless|unqoute\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\").split(\"|\")\n    )\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token : \"variable\",\n                regex : \"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(ScssHighlightRules, TextHighlightRules);\n\nexports.ScssHighlightRules = ScssHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-sh.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/sh', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/sh_highlight_rules', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar ShHighlightRules = require(\"./sh_highlight_rules\").ShHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new ShHighlightRules().getRules());\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"#\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    var outdents = {\n        \"pass\": 1,\n        \"return\": 1,\n        \"raise\": 1,\n        \"break\": 1,\n        \"continue\": 1\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\")\n            return false;\n\n        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens)\n            return false;\n\n        // ignore trailing comments\n        do {\n            var last = tokens.pop();\n        } while (last && (last.type == \"comment\" || (last.type == \"text\" && last.value.match(/^\\s+$/))));\n\n        if (!last)\n            return false;\n\n        return (last.type == \"keyword\" && outdents[last.value]);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        // outdenting in sh is slightly different because it always applies\n        // to the next line and only of a new line is inserted\n\n        row += 1;\n        var indent = this.$getIndent(doc.getLine(row));\n        var tab = doc.getTabString();\n        if (indent.slice(-tab.length) == tab)\n            doc.remove(new Range(row, indent.length-tab.length, row, indent.length));\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/sh_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ShHighlightRules = function() {\n\n    var reservedKeywords = (\n        '!|{|}|case|do|done|elif|else|'+\n        'esac|fi|for|if|in|then|until|while|'+\n        '&|;|export|local|read|typeset|unset|'+\n        'elif|select|set'\n    );\n\n    var languageConstructs = (\n        '[|]|alias|bg|bind|break|builtin|'+\n         'cd|command|compgen|complete|continue|'+\n         'dirs|disown|echo|enable|eval|exec|'+\n         'exit|fc|fg|getopts|hash|help|history|'+\n         'jobs|kill|let|logout|popd|printf|pushd|'+\n         'pwd|return|set|shift|shopt|source|'+\n         'suspend|test|times|trap|type|ulimit|'+\n         'umask|unalias|wait'\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": reservedKeywords,\n        \"constant.language\": languageConstructs,\n        \"invalid.deprecated\": \"debugger\"\n    }, \"identifier\");\n\n    var integer = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    // var integer = \"(?:\" + decimalInteger + \")\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n    var fileDescriptor = \"(?:&\" + intPart + \")\";\n\n    var variableName = \"[a-zA-Z][a-zA-Z0-9_]*\";\n    var variable = \"(?:(?:\\\\$\" + variableName + \")|(?:\" + variableName + \"=))\";\n\n    var builtinVariable = \"(?:\\\\$(?:SHLVL|\\\\$|\\\\!|\\\\?))\";\n\n    var func = \"(?:\" + variableName + \"\\\\s*\\\\(\\\\))\";\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"#.*$\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'\n        }, {\n            token : \"variable.language\",\n            regex : builtinVariable\n        }, {\n            token : \"variable\",\n            regex : variable\n        }, {\n            token : \"support.function\",\n            regex : func,\n        }, {\n            token : \"support.function\",\n            regex : fileDescriptor\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|~|<|>|<=|=>|=|!=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ]\n    };\n};\n\noop.inherits(ShHighlightRules, TextHighlightRules);\n\nexports.ShHighlightRules = ShHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-sql.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/sql', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/sql_highlight_rules', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar SqlHighlightRules = require(\"./sql_highlight_rules\").SqlHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new SqlHighlightRules().getRules());\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var outentedRows = [];\n        var re = /^(\\s*)--/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"--\");\n        }\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/sql_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar SqlHighlightRules = function() {\n\n    var keywords = (\n        \"select|from|where|and|or|group|by|order|limit|offset|having|as|case|\" +\n        \"when|else|end|type|left|right|join|on|outer|desc|asc\"\n    );\n\n    var builtinConstants = (\n        \"true|false|null\"\n    );\n\n    var builtinFunctions = (\n        \"count|min|max|avg|sum|rank|now|coalesce\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants\n    }, \"identifier\", true);\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"--.*$\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'.*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\)]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ]\n    };\n};\n\noop.inherits(SqlHighlightRules, TextHighlightRules);\n\nexports.SqlHighlightRules = SqlHighlightRules;\n});\n\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-svg.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/svg', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/svg_highlight_rules', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar XmlMode = require(\"./xml\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar SvgHighlightRules = require(\"./svg_highlight_rules\").SvgHighlightRules;\nvar MixedFoldMode = require(\"./folding/mixed\").FoldMode;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    XmlMode.call(this);\n    \n    this.highlighter = new SvgHighlightRules();\n    this.$tokenizer = new Tokenizer(this.highlighter.getRules());\n    \n    this.$embeds = this.highlighter.getEmbeds();\n    this.createModeDelegates({\n        \"js-\": JavaScriptMode\n    });\n    \n    this.foldingRules = new MixedFoldMode(new XmlFoldMode({}), {\n        \"js-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(Mode, XmlMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n    \n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        }],\n        \n        cdata : [{\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"\n        }],\n\n        comment : [{\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        }]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\");\n};\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.indexOf(\"meta.tag\") === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = this.tagRe.exec(tag);\n        var column = this.tagRe.lastIndex || 0;\n        this.tagRe.lastIndex = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)\\/\\//;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"//\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\" || state == \"regex_allowed\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || state == \"regex_allowed\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n            \n        worker.on(\"jslint\", function(results) {\n            var errors = [];\n            for (var i=0; i<results.data.length; i++) {\n                var error = results.data[i];\n                if (error)\n                    errors.push({\n                        row: error.line-1,\n                        column: error.character-1,\n                        text: error.reason,\n                        type: \"warning\",\n                        lint: error\n                    });\n            }\n            session.setAnnotations(errors);\n        });\n        \n        worker.on(\"narcissus\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar unicode = require(\"../unicode\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"invalid.deprecated\":\n            \"__parent__|__count__|escape|unescape|with|__proto__|debugger\",\n        \"keyword\":\n            \"const|yield|import|get|set\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"invalid.illegal\":\n            \"class|enum|extends|super|export|implements|private|\" +\n            \"public|interface|package|protected|static\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n    }, \"identifier\");\n\n\n    // keywords which can be followed by regular expressions\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield\";\n\n    // TODO: Unicode escape sequences\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                // Sound.prototype.play =\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // play = function() {  }\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // Sound.play = function play() {  }\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // function myFunc(arg) { }\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // foobar: function() { }\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                // : function() { } (this is for issues with 'foo': function() { })\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : /(?:true|false)\\b/\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"regex_allowed\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"regex_allowed\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"regex_allowed\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        // regular expressions are only allowed after certain tokens. This\n        // makes sure we don't mix up regexps with the divison operator\n        \"regex_allowed\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                // immediately return to the start mode without matching\n                // anything\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex\": [\n            {\n                // escapes\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                // flag\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"start\",\n                merge: true\n            }, {\n                // invalid operators\n                token : \"invalid\",\n                regex: /\\{\\d+,?(?:\\d+)?}[+*]|[+*^$?][+*]|\\?\\?/ // |[^$][?]\n            }, {\n                // operators\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+,?(?:\\d+)?}|[+*]\\?|[(|)$^+*?]/\n            }, {\n                token: \"string.regexp\",\n                regex: /{|[^\\[\\\\{()$^+*?\\/]+/,\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\",\n                merge: true\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\",\n            }, {\n                token: \"string.regexp.charachterclass\",\n                regex: /[^\\]\\-\\\\]+/,\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\",\n                merge: true\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\",\n                merge: true\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"start\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"regex_allowed\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"TODO\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \"[^@\\\\*]+\"\n        }, {\n            token : \"comment.doc\",\n            merge : true,\n            regex : \".\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        merge : true,\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        merge : true,\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/svg_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules', 'ace/mode/xml_util'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar xmlUtil = require(\"./xml_util\");\n\nvar SvgHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.$rules.start.splice(3, 0, {\n        token : \"meta.tag\",\n        regex : \"<(?=\\s*script)\",\n        next : \"script\"\n    });\n    \n    xmlUtil.tag(this.$rules, \"script\", \"js-start\");\n    \n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"comment\",\n        regex: \"\\\\/\\\\/.*(?=<\\\\/script>)\",\n        next: \"tag\"\n    }, {\n        token: \"meta.tag\",\n        regex: \"<\\\\/(?=script)\",\n        next: \"tag\"\n    }]);\n};\n\noop.inherits(SvgHighlightRules, XmlHighlightRules);\n\nexports.SvgHighlightRules = SvgHighlightRules;\n});\n\ndefine('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-tcl.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/tcl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/folding/cstyle', 'ace/mode/tcl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar TclHighlightRules = require(\"./tcl_highlight_rules\").TclHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new TclHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var outdent = true;\n        var re = /^(\\s*)#/;\n\n        for (var i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        if (outdent) {\n            var deleteRange = new Range(0, 0, 0, 0);\n            for (var i=startRow; i<= endRow; i++)\n            {\n                var line = doc.getLine(i);\n                var m = line.match(re);\n                deleteRange.start.row = i;\n                deleteRange.end.row = i;\n                deleteRange.end.column = m[0].length;\n                doc.replace(deleteRange, m[1]);\n            }\n        }\n        else {\n            doc.indentRows(startRow, endRow, \"#\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n\n            var range = session.getCommentFoldRange(row, i + match[0].length);\n            range.end.column -= 2;\n            return range;\n        }\n\n        if (foldStyle !== \"markbeginend\")\n            return;\n            \n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[2]) {\n                var range = session.getCommentFoldRange(row, i);\n                range.end.column -= 2;\n                return range;\n            }\n\n            var end = {row: row, column: i};\n            var start = session.$findOpeningBracket(match[1], end);\n            \n            if (!start)\n                return;\n\n            start.column++;\n            end.column--;\n\n            return  Range.fromPoints(start, end);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/tcl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TclHighlightRules = function() {\n\n    //TODO var builtinFunctions = \"\";\n\n    this.$rules = {\n        \"start\" : [\n           {\n                token : \"comment\",\n                merge : true,\n                regex : \"#.*\\\\\\\\$\",\n                next  : \"commentfollow\"\n            }, {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"support.function\",\n                regex : '[\\\\\\\\]$',\n                next  : \"splitlineStart\"\n            }, {\n                token : \"text\",\n                regex : '[\\\\\\\\](?:[\"]|[{]|[}]|[[]|[]]|[$]|[\\])'\n            }, {\n                token : \"text\", // last value before command\n                regex : '^|[^{][;][^}]|[/\\r/]',\n                next  : \"commandItem\"\n            }, {\n                token : \"string\", // single line\n                regex : '[ ]*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line \"\"\" string start\n                merge : true,\n                regex : '[ ]*[\"]',\n                next  : \"qqstring\"\n            }, {\n                token : \"variable.instancce\", // variable xotcl with braces\n                merge : true,\n                regex : \"[$]\",\n                next  : \"variable\"\n            }, {\n                token : \"support.function\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|{\\\\*}|;|::\"\n            }, {\n                token : \"identifier\",\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[{]\",\n                next  : \"commandItem\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[(]\"\n            },  {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"commandItem\" : [\n            {\n                token : \"comment\",\n                merge : true,\n                regex : \"#.*\\\\\\\\$\",\n                next  : \"commentfollow\"\n            }, {\n                token : \"comment\",\n                regex : \"#.*$\",\n                next  : \"start\"\n            }, {\n                token : \"string\", // single line\n                regex : '[ ]*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"variable.instancce\", // variable xotcl with braces\n                merge : true,\n                regex : \"[$]\",\n                next  : \"variable\"\n            }, {\n                token : \"support.function\",\n                regex : \"(?:[:][:])[a-zA-Z0-9_/]+(?:[:][:])\",\n                next  : \"commandItem\"\n            }, {\n                token : \"support.function\",\n                regex : \"[a-zA-Z0-9_/]+(?:[:][:])\",\n                next  : \"commandItem\"\n            }, {\n                token : \"support.function\",\n                regex : \"(?:[:][:])\",\n                next  : \"commandItem\"\n            }, {\n                token : \"support.function\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|{\\\\*}|;|::\"\n            }, {\n                token : \"keyword\",\n                regex : \"[a-zA-Z0-9_/]+\",\n                next  : \"start\"\n            } ],\n        \"commentfollow\" : [ \n            {\n                token : \"comment\",\n                regex : \".*\\\\\\\\$\",\n                next  : \"commentfollow\"\n            }, {\n                token : \"comment\",\n                merge : true,\n                regex : '.+',\n                next  : \"start\"\n        } ],\n        \"splitlineStart\" : [ \n            {\n                token : \"text\",\n                regex : \"^.\",\n                next  : \"start\"\n            }],\n        \"variable\" : [ \n            {\n                token : \"variable.instancce\", // variable xotcl with braces\n                regex : \"(?:[:][:])?(?:[a-zA-Z_]|\\d)+(?:(?:[:][:])?(?:[a-zA-Z_]|\\d)+)?(?:[(](?:[a-zA-Z_]|\\d)+[)])?\",\n                next : \"start\"\n            }, {\n                token : \"variable.instancce\", // variable tcl\n                regex : \"(?:[a-zA-Z_]|\\d)+(?:[(](?:[a-zA-Z_]|\\d)+[)])?\",\n                next  : \"start\"\n            }, {\n                token : \"variable.instancce\", // variable tcl with braces\n                regex : \"{?(?:[a-zA-Z_]|\\d)+}?\",\n                next  : \"start\"\n            }],  \n        \"qqstring\" : [ {\n            token : \"string\", // multi line \"\"\" string end\n            regex : '(?:[^\\\\\\\\]|\\\\\\\\.)*?[\"]',\n            next : \"start\"\n        }, {\n            token : \"string\",\n            merge : true,\n            regex : '.+'\n        } ]\n    };\n};\n\noop.inherits(TclHighlightRules, TextHighlightRules);\n\nexports.TclHighlightRules = TclHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-text.js",
    "content": ""
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-textile.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/textile', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/textile_highlight_rules', 'ace/mode/matching_brace_outdent'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextileHighlightRules = require(\"./textile_highlight_rules\").TextileHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new TextileHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.getNextLineIndent = function(state, line, tab) {\n        if (state == \"intag\")\n            return tab;\n        \n        return \"\";\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/textile_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TextileHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : function(value) {\n                    if (value.charAt(0) == \"h\")\n                        return \"markup.heading.\" + value.charAt(1);\n                    else\n                        return \"markup.heading\";\n                },\n                regex : \"h1|h2|h3|h4|h5|h6|bq|p|bc|pre\",\n                next  : \"blocktag\"\n            },\n            {\n                token : \"keyword\",\n                regex : \"[\\\\*]+|[#]+\"\n            },\n            {\n                token : \"text\",\n                regex : \".+\"\n            }\n        ],\n        \"blocktag\" : [\n            {\n                token : \"keyword\",\n                regex : \"\\\\. \",\n                next  : \"start\"\n            },\n            {\n                token : \"keyword\",\n                regex : \"\\\\(\",\n                next  : \"blocktagproperties\"\n            }\n        ],\n        \"blocktagproperties\" : [\n            {\n                token : \"keyword\",\n                regex : \"\\\\)\",\n                next  : \"blocktag\"\n            },\n            {\n                token : \"string\",\n                regex : \"[a-zA-Z0-9\\\\-_]+\"\n            },\n            {\n                token : \"keyword\",\n                regex : \"#\"\n            }\n        ]\n    };\n};\n\noop.inherits(TextileHighlightRules, TextHighlightRules);\n\nexports.TextileHighlightRules = TextileHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-xml.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        start : [{\n            token : \"text\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\!.*?>\"\n        }, {\n            token : \"meta.tag\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"constant.character.entity\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"text\",\n            regex : \"[^<]+\"\n        }],\n        \n        cdata : [{\n            token : \"text\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"\n        }],\n\n        comment : [{\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            merge : true,\n            regex : \".+\"\n        }]\n    };\n    \n    xmlUtil.tag(this.$rules, \"tag\", \"start\");\n};\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\".*?\"'\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : '[\"].*',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'.*?'\"\n    }, {\n        token : \"string\", // multi line string start\n        merge : true,\n        regex : \"['].*\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [{\n        token : \"string\",\n        merge : true,\n        regex : \".*?\" + quote,\n        next : state\n    }, {\n        token : \"string\",\n        merge : true,\n        regex : '.+'\n    }];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        //token : \"meta.tag\",\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        merge : true,\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag\",\n        merge : true,\n        regex : \"\\/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {\n                return\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.indexOf(\"meta.tag\") === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = this.tagRe.exec(tag);\n        var column = this.tagRe.lastIndex || 0;\n        this.tagRe.lastIndex = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.indexOf(\"meta.tag\") === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-xquery.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\ndefine('ace/mode/xquery', ['require', 'exports', 'module' , 'ace/worker/worker_client', 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xquery_highlight_rules', 'ace/mode/behaviour/xquery', 'ace/range'], function(require, exports, module) {\n\n\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar XQueryHighlightRules = require(\"./xquery_highlight_rules\").XQueryHighlightRules;\nvar XQueryBehaviour = require(\"./behaviour/xquery\").XQueryBehaviour;\n//var XQueryBackgroundHighlighter = require(\"./xquery_background_highlighter\").XQueryBackgroundHighlighter;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function(parent) {\n    this.$tokenizer   = new Tokenizer(new XQueryHighlightRules().getRules());\n    this.$behaviour   = new XQueryBehaviour(parent);\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n      var indent = this.$getIndent(line);\n      var match = line.match(/\\s*(?:then|else|return|[{\\(]|<\\w+>)\\s*$/);\n      if (match)\n        indent += tab;\n        return indent;\n    };\n    \n    this.checkOutdent = function(state, line, input) {\n      if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*[\\}\\)]/.test(input);\n    };\n    \n    this.autoOutdent = function(state, doc, row) {\n      var line = doc.getLine(row);\n        var match = line.match(/^(\\s*[\\}\\)])/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n    \n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var i, line;\n        var outdent = true;\n        var re = /^\\s*\\(:(.*):\\)/;\n\n        for (i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        var range = new Range(0, 0, 0, 0);\n        for (i=startRow; i<= endRow; i++) {\n            line = doc.getLine(i);\n            range.start.row  = i;\n            range.end.row    = i;\n            range.end.column = line.length;\n\n            doc.replace(range, outdent ? line.match(re)[1] : \"(:\" + line + \":)\");\n        }\n    };\n    \n    this.createWorker = function(session) {\n        this.$deltas = [];\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/xquery_worker\", \"XQueryWorker\");\n        var that = this;\n\n        session.getDocument().on('change', function(evt){\n          that.$deltas.push(evt.data);\n        });\n\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"start\", function(e) {\n          //console.log(\"start\");\n          that.$deltas = [];\n        });\n\n        worker.on(\"error\", function(e) {\n          session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"ok\", function(e) {\n            session.clearAnnotations();\n        });\n        \n        worker.on(\"highlight\", function(tokens) {\n          var firstRow = 0;\n          var lastRow = session.getLength() - 1;\n          \n          var lines = tokens.data.lines;\n          var states = tokens.data.states;\n          \n          for(var i=0; i < that.$deltas.length; i++)\n          {\n            var delta = that.$deltas[i];\n         \n            if (delta.action === \"insertLines\")\n            {\n              var newLineCount = delta.lines.length;\n              for (var i = 0; i < newLineCount; i++) {\n                lines.splice(delta.range.start.row + i, 0, undefined);\n                states.splice(delta.range.start.row + i, 0, undefined);\n              }\n            }\n            else if (delta.action === \"insertText\")\n            {\n              if (session.getDocument().isNewLine(delta.text))\n              {\n                lines.splice(delta.range.end.row, 0, undefined);\n                states.splice(delta.range.end.row, 0, undefined);\n              } else {\n                lines[delta.range.start.row] = undefined;\n                states[delta.range.start.row] = undefined;\n              } \n            } else if (delta.action === \"removeLines\") {\n              var oldLineCount = delta.lines.length;\n              lines.splice(delta.range.start.row, oldLineCount);\n              states.splice(delta.range.start.row, oldLineCount);\n            } else if (delta.action === \"removeText\") {\n              if (session.getDocument().isNewLine(delta.text))\n              {\n                lines[delta.range.start.row] = undefined;\n                lines.splice(delta.range.end.row, 1);\n                states[delta.range.start.row] = undefined;\n                states.splice(delta.range.end.row, 1);\n              } else {\n                lines[delta.range.start.row] = undefined;\n                states[delta.range.start.row] = undefined;\n              }\n            }           \n          }\n          session.bgTokenizer.lines = lines;\n          session.bgTokenizer.states = states;\n          session.bgTokenizer.fireUpdateEvent(firstRow, lastRow);\n        });\n        \n        return worker;\n    };\n    \n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\ndefine('ace/mode/xquery_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XQueryHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        keyword: \"after|ancestor|ancestor-or-self|and|as|ascending|attribute|before|case|cast|castable|child|collation|comment|copy|count|declare|default|delete|descendant|descendant-or-self|descending|div|document|document-node|element|else|empty|empty-sequence|end|eq|every|except|first|following|following-sibling|for|function|ge|group|gt|idiv|if|import|insert|instance|intersect|into|is|item|last|le|let|lt|mod|modify|module|namespace|namespace-node|ne|node|only|or|order|ordered|parent|preceding|preceding-sibling|processing-instruction|rename|replace|return|satisfies|schema-attribute|schema-element|self|some|stable|start|switch|text|to|treat|try|typeswitch|union|unordered|validate|where|with|xquery|contains|paragraphs|sentences|times|words|by|collectionreturn|variable|version|option|when|encoding|toswitch|catch|tumbling|sliding|window|at|using|stemming|collection|schema|while|on|nodes|index|external|then|in|updating|value|of|containsbreak|loop|continue|exit|returning|append|json|position\"\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        start : [ {\n            token : \"text\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n    }, {\n      token : \"comment\",\n      regex : \"\\\\(:\",\n      next : \"comment\"\n        }, {\n            token : \"text\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"constant\", // number\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n            token : \"variable\", // variable\n            regex : \"\\\\$[a-zA-Z_][a-zA-Z0-9_\\\\-:]*\\\\b\"\n    }, {\n      token: \"string\",\n      regex : '\".*?\"'\n    }, {\n      token: \"string\",\n      regex : \"'.*?'\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"support.function\",\n            regex: \"\\\\w[\\\\w+_\\\\-:]+(?=\\\\()\"\n        }, {\n      token : keywordMapper,\n      regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n    }, {\n            token: \"keyword.operator\",\n            regex: \"\\\\*|=|<|>|\\\\-|\\\\+\"\n        }, {\n            token: \"lparen\",\n            regex: \"[[({]\"\n        }, {\n            token: \"rparen\",\n            regex: \"[\\\\])}]\"\n        } ],\n\n        tag : [ {\n            token : \"text\",\n            regex : \">\",\n            next : \"start\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"string\",\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",\n            regex : \"'.*?'\"\n        } ],\n\n        cdata : [ {\n            token : \"comment\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment\",\n            regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n      token: \"comment\",\n      regex : \".*:\\\\)\",\n      next : \"start\"\n        }, {\n            token : \"comment\",\n            regex : \".+\"\n    } ]\n    };\n};\n\noop.inherits(XQueryHighlightRules, TextHighlightRules);\n\nexports.XQueryHighlightRules = XQueryHighlightRules;\n});\ndefine('ace/mode/behaviour/xquery', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle'], function(require, exports, module) {\n\n\n  var oop = require(\"../../lib/oop\");\n  var Behaviour = require('../behaviour').Behaviour;\n  var CstyleBehaviour = require('./cstyle').CstyleBehaviour;\n\n  var XQueryBehaviour = function (parent) {\n      \n      this.inherit(CstyleBehaviour, [\"braces\", \"parens\", \"string_dquotes\"]); // Get string behaviour\n      this.parent = parent;\n      \n//      this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n//          if (text == \"\\n\") {\n//              var cursor = editor.getCursorPosition();\n//              var line = session.doc.getLine(cursor.row);\n//              var rightChars = line.substring(cursor.column, cursor.column + 2);\n//              if (rightChars == '</') {\n//                  var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n//                  var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n//\n//                  return {\n//                      text: '\\n' + indent + '\\n' + next_indent,\n//                      selection: [1, indent.length, 1, indent.length]\n//                  }\n//              }\n//          }\n//          return false;\n//      });\n\n      // Check for open tag if user enters / and auto-close it.\n//      this.add(\"slash\", \"insertion\", function (state, action, editor, session, text) {\n//        if (text == \"/\") {\n//          var cursor = editor.getCursorPosition();\n//        var line = session.doc.getLine(cursor.row);\n//        if (cursor.column > 0 && line.charAt(cursor.column - 1) == \"<\") {\n//          line = line.substring(0, cursor.column) + \"/\" + line.substring(cursor.column);\n//          var lines = session.doc.getAllLines();\n//          lines[cursor.row] = line;\n//          // call mode helper to close the tag if possible\n//          parent.exec(\"closeTag\", lines.join(session.doc.getNewLineCharacter()), cursor.row);\n//        }\n//        }\n//      return false;\n//      });\n  }\n  oop.inherits(XQueryBehaviour, Behaviour);\n\n  exports.XQueryBehaviour = XQueryBehaviour;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\n\nvar CstyleBehaviour = function () {\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '{}',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == '}') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());\n                var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else {\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null) {\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\") {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n\n                // We're escaped.\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n\n                // Find what token we're inside.\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n\n                // Try and be smart about when we auto insert.\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    // Ignore input and move right one if we're typing over the closing quote.\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == '\"') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/mode-yaml.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/yaml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/yaml_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/coffee'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar YamlHighlightRules = require(\"./yaml_highlight_rules\").YamlHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.$tokenizer = new Tokenizer(new YamlHighlightRules().getRules());\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n     this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/yaml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar YamlHighlightRules = function() {\n\n    // regexp must not have capturing parentheses. Use (?:) instead.\n    // regexps are ordered -> the first match is used\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"comment\",\n                regex : \"^---\"\n            }, {\n                token: \"variable\",\n                regex: \"[&\\\\*][a-zA-Z0-9-_]+\"\n            }, {\n                token: [\"identifier\", \"text\"],\n                regex: \"(\\\\w+\\\\s*:)(\\\\w*)\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<<\\\\w*:\\\\w*\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"-\\\\s*(?=[{])\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                merge : true,\n                regex : '[\\\\|>]\\\\w*',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single quoted string\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false|yes|no)\\\\b\"\n            }, {\n                token : \"invalid.illegal\", // comments are not allowed\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?=(?:(?:\\\\\\\\.)|(?:[^:]))*?:)',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                merge : true,\n                regex : '.+'\n            }\n        ]}\n\n};\n\noop.inherits(YamlHighlightRules, TextHighlightRules);\n\nexports.YamlHighlightRules = YamlHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n\n        // documentation comments\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n\n    // must return \"\" if there's no fold, to enable caching\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = this.getFoldWidget(session, end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-ambiance.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n * \n * Copyright 2011 Irakli Gozalishvili. All rights reserved.\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/ambiance', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-ambiance\";\nexports.cssText = \".ace-ambiance {\\\n  background-color: #202020;\\\n}\\\n\\\n.ace-ambiance .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159);\\\n}\\\n\\\n.ace-ambiance .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd;\\\n}\\\n\\\n.ace-ambiance .ace_gutter {\\\n  background-image: -moz-linear-gradient(left, #3D3D3D, #333);\\\n  background-image: -ms-linear-gradient(left, #3D3D3D, #333);\\\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));\\\n  background-image: -webkit-linear-gradient(left, #3D3D3D, #333);\\\n  background-image: -o-linear-gradient(left, #3D3D3D, #333);\\\n  background-image: linear-gradient(left, #3D3D3D, #333);\\\n  background-repeat: repeat-x;\\\n\\\n  text-shadow: 0px 1px 1px #4d4d4d;\\\n  color: #222;\\\n  border-right: 1px solid #4d4d4d;\\\n  overflow : hidden;\\\n}\\\n\\\n.ace-ambiance .ace_gutter-layer {\\\n  background: repeat left top;\\\n  width: 100%;\\\n  text-align: right;\\\n}\\\n\\\n.ace-ambiance .ace_gutter-layer .ace_gutter-cell .ace_fold-widget {\\\n  position: absolute;\\\n  right: 2px;\\\n  margin: 0;\\\n  vertical-align: middle;\\\n  height: inherit;\\\n  width: auto;\\\n  background: none;\\\n  border: none;\\\n  box-shadow: none;\\\n  outline: none;\\\n}\\\n\\\n.ace-ambiance .ace_gutter-layer .ace_gutter-cell .ace_fold-widget:hover {\\\n  color: #777;\\\n}\\\n\\\n.ace-ambiance .ace_gutter-layer .ace_gutter-cell .ace_fold-widget:hover {\\\n  color: #777;\\\n}\\\n\\\n.ace-ambiance .ace_gutter-layer .ace_gutter-cell .ace_fold-widget.open:after {\\\n  content: '▾'\\\n}\\\n\\\n.ace-ambiance .ace_gutter-layer .ace_gutter-cell .ace_fold-widget.closed:after {\\\n  content: '‣'\\\n}\\\n\\\n.ace-ambiance .ace_print_margin {\\\n  border-left: 1px dotted #2D2D2D;\\\n  width: 100%;\\\n  background: #262626;\\\n}\\\n\\\n.ace-ambiance .ace_scroller {\\\n  background-color: #202020;\\\n  -webkit-box-shadow: inset 0 0 10px black;\\\n  -moz-box-shadow: inset 0 0 10px black;\\\n  -o-box-shadow: inset 0 0 10px black;\\\n  box-shadow: inset 0 0 10px black;\\\n}\\\n\\\n.ace-ambiance .ace_text-layer {\\\n  cursor: text;\\\n  color: #E6E1DC;\\\n  background: url(\\\"noise.png\\\") repeat left top;\\\n}\\\n\\\n.ace-ambiance .ace_cursor {\\\n  border-left: 1px solid #7991E8;\\\n}\\\n\\\n.ace-ambiance .ace_cursor.ace_overwrite {\\\n  border: 1px solid #FFE300;\\\n  background: #766B13;\\\n}\\\n\\\n.ace-ambiance.normal-mode .ace_cursor-layer {\\\n  z-index: 0;\\\n}\\\n \\\n.ace-ambiance .ace_marker-layer .ace_selection {\\\n  background: rgba(221, 240, 255, 0.20);\\\n}\\\n\\\n.ace-ambiance .ace_marker-layer .ace_selected_word {\\\n  border-radius: 4px;\\\n  border: 8px solid #3f475d;\\\n  box-shadow: 0 0 4px black;\\\n}\\\n\\\n.ace-ambiance .ace_marker-layer .ace_step {\\\n  background: rgb(198, 219, 174);\\\n}\\\n\\\n.ace-ambiance .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(255, 255, 255, 0.25);\\\n}\\\n\\\n.ace-ambiance .ace_marker-layer .ace_active_line {\\\n  background: rgba(255, 255, 255, 0.031);\\\n}\\\n\\\n\\\n\\\n.ace-ambiance .ace_invisible {\\\n  color: #333;\\\n}\\\n\\\n.ace-ambiance .ace_paren {\\\n  color: #24C2C7;\\\n}\\\n\\\n.ace-ambiance .ace_keyword {\\\n  color: #cda869;\\\n}\\\n\\\n.ace-ambiance .ace_keyword.ace_operator {\\\n  color: #fa8d6a;\\\n}\\\n\\\n.ace-ambiance .ace_punctuation.ace_operator {\\\n  color: #fa8d6a;\\\n}\\\n\\\n.ace-ambiance .ace_identifier {\\\n}\\\n\\\n.ace-ambiance .ace-statement {\\\n  color: #cda869;\\\n}\\\n\\\n.ace-ambiance .ace_constant {\\\n  color: #CF7EA9;\\\n}\\\n\\\n.ace-ambiance .ace_constant.ace_language {\\\n  color: #CF7EA9;\\\n}\\\n\\\n.ace-ambiance .ace_constant.ace_library {\\\n  \\\n}\\\n\\\n.ace-ambiance .ace_constant.ace_numeric {\\\n  color: #78CF8A;\\\n}\\\n\\\n.ace-ambiance .ace_invalid {\\\n  text-decoration: underline;\\\n}\\\n\\\n.ace-ambiance .ace_invalid.ace_illegal {\\\n  color:#F8F8F8;\\\n  background-color: rgba(86, 45, 86, 0.75);\\\n}\\\n\\\n.ace-ambiance .ace_invalid,\\\n.ace-ambiance .ace_deprecated {\\\n  text-decoration: underline;\\\n  font-style: italic;\\\n  color: #D2A8A1;\\\n}\\\n\\\n.ace-ambiance .ace_support {\\\n  color: #9B859D;\\\n}\\\n\\\n.ace-ambiance .ace_support.ace_function {\\\n  color: #DAD085;\\\n}\\\n\\\n.ace-ambiance .ace_function.ace_buildin {\\\n  color: #9b859d;\\\n}\\\n\\\n.ace-ambiance .ace_string {\\\n  color: #8f9d6a;\\\n}\\\n\\\n.ace-ambiance .ace_string.ace_regexp {\\\n  color: #DAD085;\\\n}\\\n\\\n.ace-ambiance .ace_comment {\\\n  font-style: italic;\\\n  color: #555;\\\n}\\\n\\\n.ace-ambiance .ace_comment.ace_doc {\\\n}\\\n\\\n.ace-ambiance .ace_comment.ace_doc.ace_tag {\\\n  color: #666;\\\n  font-style: normal;\\\n}\\\n\\\n.ace-ambiance .ace_definition,\\\n.ace-ambiance .ace_type {\\\n  color: #aac6e3;\\\n}\\\n\\\n.ace-ambiance .ace_variable {\\\n  color: #9999cc;\\\n}\\\n\\\n.ace-ambiance .ace_variable.ace_language {\\\n  color: #9b859d;\\\n}\\\n\\\n.ace-ambiance .ace_xml_pe {\\\n  color: #494949;\\\n}\\\n\\\n.ace-ambiance .ace_gutter-layer,\\\n.ace-ambiance .ace_text-layer {\\\n  background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\\\");\\\n}\\\n\\\n.ace-ambiance .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\\\") right repeat-y;\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-chrome.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/chrome', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-chrome\";\nexports.cssText = \".ace-chrome .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159);\\\n}\\\n\\\n.ace-chrome .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd;\\\n}\\\n\\\n.ace-chrome .ace_gutter {\\\n  background: #ebebeb;\\\n  color: #333;\\\n  overflow : hidden;\\\n}\\\n\\\n.ace-chrome .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8;\\\n}\\\n\\\n.ace-chrome .ace_scroller {\\\n  background-color: #FFFFFF;\\\n}\\\n\\\n.ace-chrome .ace_cursor {\\\n  border-left: 2px solid black;\\\n}\\\n\\\n.ace-chrome .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid black;\\\n}\\\n\\\n.ace-chrome .ace_line .ace_invisible {\\\n  color: rgb(191, 191, 191);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_constant.ace_buildin {\\\n  color: rgb(88, 72, 246);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_constant.ace_language {\\\n  color: rgb(88, 92, 246);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_constant.ace_library {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_invalid {\\\n  background-color: rgb(153, 0, 0);\\\n  color: white;\\\n}\\\n\\\n.ace-chrome .ace_line .ace_fold {\\\n}\\\n\\\n.ace-chrome .ace_line .ace_support.ace_function {\\\n  color: rgb(60, 76, 114);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_support.ace_constant {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_support.ace_type,\\\n.ace-chrome .ace_line .ace_support.ace_class\\\n.ace-chrome .ace_line .ace_support.ace_other, {\\\n  color: rgb(109, 121, 222);\\\n}\\\n\\\n.ace-chrome .ace_variable.ace_parameter {\\\n  font-style:italic;\\\n  color:#FD971F;\\\n}\\\n.ace-chrome .ace_line .ace_keyword.ace_operator {\\\n  color: rgb(104, 118, 135);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_comment {\\\n  color: #236e24;\\\n}\\\n\\\n.ace-chrome .ace_line .ace_comment.ace_doc {\\\n  color: #236e24;\\\n}\\\n\\\n.ace-chrome .ace_line .ace_comment.ace_doc.ace_tag {\\\n  color: #236e24;\\\n}\\\n\\\n.ace-chrome .ace_line .ace_constant.ace_numeric {\\\n  color: rgb(0, 0, 205);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_variable {\\\n  color: rgb(49, 132, 149);\\\n}\\\n\\\n.ace-chrome .ace_line .ace_xml_pe {\\\n  color: rgb(104, 104, 91);\\\n}\\\n\\\n.ace-chrome .ace_entity.ace_name.ace_function {\\\n  color: #0000A2;\\\n}\\\n\\\n\\\n.ace-chrome .ace_markup.ace_heading {\\\n  color: rgb(12, 7, 255);\\\n}\\\n\\\n.ace-chrome .ace_markup.ace_list {\\\n  color:rgb(185, 6, 144);\\\n}\\\n\\\n.ace-chrome .ace_marker-layer .ace_selection {\\\n  background: rgb(181, 213, 255);\\\n}\\\n\\\n.ace-chrome .ace_marker-layer .ace_step {\\\n  background: rgb(252, 255, 0);\\\n}\\\n\\\n.ace-chrome .ace_marker-layer .ace_stack {\\\n  background: rgb(164, 229, 101);\\\n}\\\n\\\n.ace-chrome .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgb(192, 192, 192);\\\n}\\\n\\\n.ace-chrome .ace_marker-layer .ace_active_line {\\\n  background: rgba(0, 0, 0, 0.07);\\\n}\\\n\\\n.ace-chrome .ace_gutter_active_line {\\\n    background-color : #dcdcdc;\\\n}\\\n\\\n.ace-chrome .ace_marker-layer .ace_selected_word {\\\n  background: rgb(250, 250, 255);\\\n  border: 1px solid rgb(200, 200, 250);\\\n}\\\n\\\n.ace-chrome .ace_storage,\\\n.ace-chrome .ace_line .ace_keyword,\\\n.ace-chrome .ace_meta.ace_tag {\\\n  color: rgb(147, 15, 128);\\\n}\\\n\\\n.ace-chrome .ace_string.ace_regex {\\\n  color: rgb(255, 0, 0)\\\n}\\\n\\\n.ace-chrome .ace_line .ace_string {\\\n  color: #1A1AA6;\\\n}\\\n\\\n.ace-chrome .ace_entity.ace_other.ace_attribute-name {\\\n  color: #994409;\\\n}\\\n\\\n.ace-chrome .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-clouds.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/clouds', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-clouds\";\nexports.cssText = \".ace-clouds .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-clouds .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-clouds .ace_gutter {\\\n  background: #ebebeb;\\\n  color: #333\\\n}\\\n\\\n.ace-clouds .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8\\\n}\\\n\\\n.ace-clouds .ace_scroller {\\\n  background-color: #FFFFFF\\\n}\\\n\\\n.ace-clouds .ace_text-layer {\\\n  color: #000000\\\n}\\\n\\\n.ace-clouds .ace_cursor {\\\n  border-left: 2px solid #000000\\\n}\\\n\\\n.ace-clouds .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #000000\\\n}\\\n\\\n.ace-clouds .ace_marker-layer .ace_selection {\\\n  background: #BDD5FC\\\n}\\\n\\\n.ace-clouds.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #FFFFFF;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-clouds .ace_marker-layer .ace_step {\\\n  background: rgb(255, 255, 0)\\\n}\\\n\\\n.ace-clouds .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #BFBFBF\\\n}\\\n\\\n.ace-clouds .ace_marker-layer .ace_active_line {\\\n  background: #FFFBD1\\\n}\\\n\\\n.ace-clouds .ace_gutter_active_line {\\\n  background-color : #dcdcdc\\\n}\\\n\\\n.ace-clouds .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #BDD5FC\\\n}\\\n\\\n.ace-clouds .ace_invisible {\\\n  color: #BFBFBF\\\n}\\\n\\\n.ace-clouds .ace_keyword,\\\n.ace-clouds .ace_meta,\\\n.ace-clouds .ace_support.ace_constant.ace_property-value {\\\n  color: #AF956F\\\n}\\\n\\\n.ace-clouds .ace_keyword.ace_operator {\\\n  color: #484848\\\n}\\\n\\\n.ace-clouds .ace_keyword.ace_other.ace_unit {\\\n  color: #96DC5F\\\n}\\\n\\\n.ace-clouds .ace_constant.ace_language {\\\n  color: #39946A\\\n}\\\n\\\n.ace-clouds .ace_constant.ace_numeric {\\\n  color: #46A609\\\n}\\\n\\\n.ace-clouds .ace_constant.ace_character.ace_entity {\\\n  color: #BF78CC\\\n}\\\n\\\n.ace-clouds .ace_invalid {\\\n  background-color: #FF002A\\\n}\\\n\\\n.ace-clouds .ace_fold {\\\n  background-color: #AF956F;\\\n  border-color: #000000\\\n}\\\n\\\n.ace-clouds .ace_storage,\\\n.ace-clouds .ace_support.ace_class,\\\n.ace-clouds .ace_support.ace_function,\\\n.ace-clouds .ace_support.ace_other,\\\n.ace-clouds .ace_support.ace_type {\\\n  color: #C52727\\\n}\\\n\\\n.ace-clouds .ace_string {\\\n  color: #5D90CD\\\n}\\\n\\\n.ace-clouds .ace_comment {\\\n  color: #BCC8BA\\\n}\\\n\\\n.ace-clouds .ace_entity.ace_name.ace_tag,\\\n.ace-clouds .ace_entity.ace_other.ace_attribute-name {\\\n  color: #606060\\\n}\\\n\\\n.ace-clouds .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-clouds .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-clouds_midnight.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/clouds_midnight', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-clouds-midnight\";\nexports.cssText = \".ace-clouds-midnight .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-clouds-midnight .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-clouds-midnight .ace_gutter {\\\n  background: #232323;\\\n  color: #929292\\\n}\\\n\\\n.ace-clouds-midnight .ace_print_margin {\\\n  width: 1px;\\\n  background: #232323\\\n}\\\n\\\n.ace-clouds-midnight .ace_scroller {\\\n  background-color: #191919\\\n}\\\n\\\n.ace-clouds-midnight .ace_text-layer {\\\n  color: #929292\\\n}\\\n\\\n.ace-clouds-midnight .ace_cursor {\\\n  border-left: 2px solid #7DA5DC\\\n}\\\n\\\n.ace-clouds-midnight .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #7DA5DC\\\n}\\\n\\\n.ace-clouds-midnight .ace_marker-layer .ace_selection {\\\n  background: #000000\\\n}\\\n\\\n.ace-clouds-midnight.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #191919;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-clouds-midnight .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-clouds-midnight .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #BFBFBF\\\n}\\\n\\\n.ace-clouds-midnight .ace_marker-layer .ace_active_line {\\\n  background: rgba(215, 215, 215, 0.031)\\\n}\\\n\\\n.ace-clouds-midnight .ace_gutter_active_line {\\\n  background-color: rgba(215, 215, 215, 0.031)\\\n}\\\n\\\n.ace-clouds-midnight .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #000000\\\n}\\\n\\\n.ace-clouds-midnight .ace_invisible {\\\n  color: #BFBFBF\\\n}\\\n\\\n.ace-clouds-midnight .ace_keyword,\\\n.ace-clouds-midnight .ace_meta,\\\n.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\\\n  color: #927C5D\\\n}\\\n\\\n.ace-clouds-midnight .ace_keyword.ace_operator {\\\n  color: #4B4B4B\\\n}\\\n\\\n.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\\\n  color: #366F1A\\\n}\\\n\\\n.ace-clouds-midnight .ace_constant.ace_language {\\\n  color: #39946A\\\n}\\\n\\\n.ace-clouds-midnight .ace_constant.ace_numeric {\\\n  color: #46A609\\\n}\\\n\\\n.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\\\n  color: #A165AC\\\n}\\\n\\\n.ace-clouds-midnight .ace_invalid {\\\n  color: #FFFFFF;\\\n  background-color: #E92E2E\\\n}\\\n\\\n.ace-clouds-midnight .ace_fold {\\\n  background-color: #927C5D;\\\n  border-color: #929292\\\n}\\\n\\\n.ace-clouds-midnight .ace_storage,\\\n.ace-clouds-midnight .ace_support.ace_class,\\\n.ace-clouds-midnight .ace_support.ace_function,\\\n.ace-clouds-midnight .ace_support.ace_other,\\\n.ace-clouds-midnight .ace_support.ace_type {\\\n  color: #E92E2E\\\n}\\\n\\\n.ace-clouds-midnight .ace_string {\\\n  color: #5D90CD\\\n}\\\n\\\n.ace-clouds-midnight .ace_comment {\\\n  color: #3C403B\\\n}\\\n\\\n.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\\\n.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\\\n  color: #606060\\\n}\\\n\\\n.ace-clouds-midnight .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-clouds-midnight .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQlJT8z1BeXv4fAA2KA6+h9Z+2AAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-cobalt.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/cobalt', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-cobalt\";\nexports.cssText = \".ace-cobalt .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-cobalt .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-cobalt .ace_gutter {\\\n  background: #011e3a;\\\n  color: #fff\\\n}\\\n\\\n.ace-cobalt .ace_print_margin {\\\n  width: 1px;\\\n  background: #011e3a\\\n}\\\n\\\n.ace-cobalt .ace_scroller {\\\n  background-color: #002240\\\n}\\\n\\\n.ace-cobalt .ace_text-layer {\\\n  color: #FFFFFF\\\n}\\\n\\\n.ace-cobalt .ace_cursor {\\\n  border-left: 2px solid #FFFFFF\\\n}\\\n\\\n.ace-cobalt .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #FFFFFF\\\n}\\\n\\\n.ace-cobalt .ace_marker-layer .ace_selection {\\\n  background: rgba(179, 101, 57, 0.75)\\\n}\\\n\\\n.ace-cobalt.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #002240;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-cobalt .ace_marker-layer .ace_step {\\\n  background: rgb(127, 111, 19)\\\n}\\\n\\\n.ace-cobalt .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(255, 255, 255, 0.15)\\\n}\\\n\\\n.ace-cobalt .ace_marker-layer .ace_active_line {\\\n  background: rgba(0, 0, 0, 0.35)\\\n}\\\n\\\n.ace-cobalt .ace_gutter_active_line {\\\n  background-color: rgba(0, 0, 0, 0.35)\\\n}\\\n\\\n.ace-cobalt .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgba(179, 101, 57, 0.75)\\\n}\\\n\\\n.ace-cobalt .ace_invisible {\\\n  color: rgba(255, 255, 255, 0.15)\\\n}\\\n\\\n.ace-cobalt .ace_keyword,\\\n.ace-cobalt .ace_meta {\\\n  color: #FF9D00\\\n}\\\n\\\n.ace-cobalt .ace_constant,\\\n.ace-cobalt .ace_constant.ace_character,\\\n.ace-cobalt .ace_constant.ace_character.ace_escape,\\\n.ace-cobalt .ace_constant.ace_other {\\\n  color: #FF628C\\\n}\\\n\\\n.ace-cobalt .ace_invalid {\\\n  color: #F8F8F8;\\\n  background-color: #800F00\\\n}\\\n\\\n.ace-cobalt .ace_support {\\\n  color: #80FFBB\\\n}\\\n\\\n.ace-cobalt .ace_support.ace_constant {\\\n  color: #EB939A\\\n}\\\n\\\n.ace-cobalt .ace_fold {\\\n  background-color: #FF9D00;\\\n  border-color: #FFFFFF\\\n}\\\n\\\n.ace-cobalt .ace_support.ace_function {\\\n  color: #FFB054\\\n}\\\n\\\n.ace-cobalt .ace_storage {\\\n  color: #FFEE80\\\n}\\\n\\\n.ace-cobalt .ace_string.ace_regexp {\\\n  color: #80FFC2\\\n}\\\n\\\n.ace-cobalt .ace_comment {\\\n  font-style: italic;\\\n  color: #0088FF\\\n}\\\n\\\n.ace-cobalt .ace_variable {\\\n  color: #CCCCCC\\\n}\\\n\\\n.ace-cobalt .ace_variable.ace_language {\\\n  color: #FF80E1\\\n}\\\n\\\n.ace-cobalt .ace_meta.ace_tag {\\\n  color: #9EFFFF\\\n}\\\n\\\n.ace-cobalt .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-cobalt .ace_markup.ace_heading {\\\n  color: #C8E4FD;\\\n  background-color: #001221\\\n}\\\n\\\n.ace-cobalt .ace_markup.ace_list {\\\n  background-color: #130D26\\\n}\\\n\\\n.ace-cobalt .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgUHL4zzBz5sz/AA80BCzv+WXhAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-crimson_editor.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/crimson_editor', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\nexports.isDark = false;\nexports.cssText = \".ace-crimson-editor .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159);\\\n}\\\n\\\n.ace-crimson-editor .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd;\\\n}\\\n\\\n.ace-crimson-editor .ace_gutter {\\\n  background: #ebebeb;\\\n  color: #333;\\\n  overflow : hidden;\\\n}\\\n\\\n.ace-crimson-editor .ace_gutter-layer {\\\n  width: 100%;\\\n  text-align: right;\\\n}\\\n\\\n.ace-crimson-editor .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8;\\\n}\\\n\\\n.ace-crimson-editor .ace_scroller {\\\n  background-color: #FFFFFF;\\\n}\\\n\\\n.ace-crimson-editor .ace_text-layer {\\\n  color: rgb(64, 64, 64);\\\n}\\\n\\\n.ace-crimson-editor .ace_cursor {\\\n  border-left: 2px solid black;\\\n}\\\n\\\n.ace-crimson-editor .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid black;\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_invisible {\\\n  color: rgb(191, 191, 191);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_identifier {\\\n  color: black;\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_keyword {\\\n  color: blue;\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_constant.ace_buildin {\\\n  color: rgb(88, 72, 246);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_constant.ace_language {\\\n  color: rgb(255, 156, 0);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_constant.ace_library {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_invalid {\\\n  text-decoration: line-through;\\\n  color: rgb(224, 0, 0);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_fold {\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_support.ace_function {\\\n  color: rgb(192, 0, 0);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_support.ace_constant {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_support.ace_type,\\\n.ace-crimson-editor .ace_line .ace_support.ace_class {\\\n  color: rgb(109, 121, 222);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_keyword.ace_operator {\\\n  color: rgb(49, 132, 149);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_string {\\\n  color: rgb(128, 0, 128);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_comment {\\\n  color: rgb(76, 136, 107);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_comment.ace_doc {\\\n  color: rgb(0, 102, 255);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_comment.ace_doc.ace_tag {\\\n  color: rgb(128, 159, 191);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_constant.ace_numeric {\\\n  color: rgb(0, 0, 64);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_variable {\\\n  color: rgb(0, 64, 128);\\\n}\\\n\\\n.ace-crimson-editor .ace_line .ace_xml_pe {\\\n  color: rgb(104, 104, 91);\\\n}\\\n\\\n.ace-crimson-editor .ace_marker-layer .ace_selection {\\\n  background: rgb(181, 213, 255);\\\n}\\\n\\\n.ace-crimson-editor .ace_marker-layer .ace_step {\\\n  background: rgb(252, 255, 0);\\\n}\\\n\\\n.ace-crimson-editor .ace_marker-layer .ace_stack {\\\n  background: rgb(164, 229, 101);\\\n}\\\n\\\n.ace-crimson-editor .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgb(192, 192, 192);\\\n}\\\n\\\n.ace-crimson-editor .ace_marker-layer .ace_active_line {\\\n  background: rgb(232, 242, 254);\\\n}\\\n\\\n.ace-crimson-editor .ace_gutter_active_line {\\\n    background-color : #dcdcdc;\\\n}\\\n\\\n.ace-crimson-editor .ace_meta.ace_tag {\\\n  color:rgb(28, 2, 255);\\\n}\\\n\\\n.ace-crimson-editor .ace_marker-layer .ace_selected_word {\\\n  background: rgb(250, 250, 255);\\\n  border: 1px solid rgb(200, 200, 250);\\\n}\\\n\\\n.ace-crimson-editor .ace_string.ace_regex {\\\n  color: rgb(192, 0, 192);\\\n}\\\n\\\n.ace-crimson-editor .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\nexports.cssClass = \"ace-crimson-editor\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-dawn.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/dawn', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-dawn\";\nexports.cssText = \".ace-dawn .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-dawn .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-dawn .ace_gutter {\\\n  background: #ebebeb;\\\n  color: #333\\\n}\\\n\\\n.ace-dawn .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8\\\n}\\\n\\\n.ace-dawn .ace_scroller {\\\n  background-color: #F9F9F9\\\n}\\\n\\\n.ace-dawn .ace_text-layer {\\\n  color: #080808\\\n}\\\n\\\n.ace-dawn .ace_cursor {\\\n  border-left: 2px solid #000000\\\n}\\\n\\\n.ace-dawn .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #000000\\\n}\\\n\\\n.ace-dawn .ace_marker-layer .ace_selection {\\\n  background: rgba(39, 95, 255, 0.30)\\\n}\\\n\\\n.ace-dawn.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #F9F9F9;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-dawn .ace_marker-layer .ace_step {\\\n  background: rgb(255, 255, 0)\\\n}\\\n\\\n.ace-dawn .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(75, 75, 126, 0.50)\\\n}\\\n\\\n.ace-dawn .ace_marker-layer .ace_active_line {\\\n  background: rgba(36, 99, 180, 0.12)\\\n}\\\n\\\n.ace-dawn .ace_gutter_active_line {\\\n  background-color : #dcdcdc\\\n}\\\n\\\n.ace-dawn .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgba(39, 95, 255, 0.30)\\\n}\\\n\\\n.ace-dawn .ace_invisible {\\\n  color: rgba(75, 75, 126, 0.50)\\\n}\\\n\\\n.ace-dawn .ace_keyword,\\\n.ace-dawn .ace_meta {\\\n  color: #794938\\\n}\\\n\\\n.ace-dawn .ace_constant,\\\n.ace-dawn .ace_constant.ace_character,\\\n.ace-dawn .ace_constant.ace_character.ace_escape,\\\n.ace-dawn .ace_constant.ace_other {\\\n  color: #811F24\\\n}\\\n\\\n.ace-dawn .ace_invalid.ace_illegal {\\\n  text-decoration: underline;\\\n  font-style: italic;\\\n  color: #F8F8F8;\\\n  background-color: #B52A1D\\\n}\\\n\\\n.ace-dawn .ace_invalid.ace_deprecated {\\\n  text-decoration: underline;\\\n  font-style: italic;\\\n  color: #B52A1D\\\n}\\\n\\\n.ace-dawn .ace_support {\\\n  color: #691C97\\\n}\\\n\\\n.ace-dawn .ace_support.ace_constant {\\\n  color: #B4371F\\\n}\\\n\\\n.ace-dawn .ace_fold {\\\n  background-color: #794938;\\\n  border-color: #080808\\\n}\\\n\\\n.ace-dawn .ace_markup.ace_list,\\\n.ace-dawn .ace_support.ace_function {\\\n  color: #693A17\\\n}\\\n\\\n.ace-dawn .ace_storage {\\\n  font-style: italic;\\\n  color: #A71D5D\\\n}\\\n\\\n.ace-dawn .ace_string {\\\n  color: #0B6125\\\n}\\\n\\\n.ace-dawn .ace_string.ace_regexp {\\\n  color: #CF5628\\\n}\\\n\\\n.ace-dawn .ace_comment {\\\n  font-style: italic;\\\n  color: #5A525F\\\n}\\\n\\\n.ace-dawn .ace_variable {\\\n  color: #234A97\\\n}\\\n\\\n.ace-dawn .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-dawn .ace_markup.ace_heading {\\\n  color: #19356D\\\n}\\\n\\\n.ace-dawn .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4+fPnf4ZVq1b9BwAkVQboFQv98gAAAABJRU5ErkJggg==) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-dreamweaver.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/dreamweaver', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\nexports.isDark = false;\nexports.cssClass = \"ace-dreamweaver\";\nexports.cssText = \".ace-dreamweaver .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159);\\\n}\\\n\\\n.ace-dreamweaver .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd;\\\n}\\\n\\\n.ace-dreamweaver .ace_gutter {\\\n  background: #e8e8e8;\\\n  color: #333;\\\n}\\\n\\\n.ace-dreamweaver .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8;\\\n}\\\n\\\n.ace-dreamweaver .ace_scroller {\\\n  background-color: #FFFFFF;\\\n}\\\n\\\n.ace-dreamweaver .ace_fold {\\\n    background-color: #757AD8;\\\n}\\\n\\\n.ace-dreamweaver .ace_text-layer {\\\n}\\\n\\\n.ace-dreamweaver .ace_cursor {\\\n  border-left: 2px solid black;\\\n}\\\n\\\n.ace-dreamweaver .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid black;\\\n}\\\n        \\\n.ace-dreamweaver .ace_line .ace_invisible {\\\n  color: rgb(191, 191, 191);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_storage,\\\n.ace-dreamweaver .ace_line .ace_keyword {\\\n  color: blue;\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_constant.ace_buildin {\\\n  color: rgb(88, 72, 246);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_constant.ace_language {\\\n  color: rgb(88, 92, 246);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_constant.ace_library {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_invalid {\\\n  background-color: rgb(153, 0, 0);\\\n  color: white;\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_support.ace_function {\\\n  color: rgb(60, 76, 114);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_support.ace_constant {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_support.ace_type,\\\n.ace-dreamweaver .ace_line .ace_support.ace_class {\\\n  color: #009;\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_support.ace_php_tag {\\\n  color: #f00;\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_keyword.ace_operator {\\\n  color: rgb(104, 118, 135);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_string {\\\n  color: #00F;\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_comment {\\\n  color: rgb(76, 136, 107);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_comment.ace_doc {\\\n  color: rgb(0, 102, 255);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_comment.ace_doc.ace_tag {\\\n  color: rgb(128, 159, 191);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_constant.ace_numeric {\\\n  color: rgb(0, 0, 205);\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_variable {\\\n  color: #06F\\\n}\\\n\\\n.ace-dreamweaver .ace_line .ace_xml_pe {\\\n  color: rgb(104, 104, 91);\\\n}\\\n\\\n.ace-dreamweaver .ace_entity.ace_name.ace_function {\\\n  color: #00F;\\\n}\\\n\\\n\\\n.ace-dreamweaver .ace_markup.ace_heading {\\\n  color: rgb(12, 7, 255);\\\n}\\\n\\\n.ace-dreamweaver .ace_markup.ace_list {\\\n  color:rgb(185, 6, 144);\\\n}\\\n\\\n.ace-dreamweaver .ace_marker-layer .ace_selection {\\\n  background: rgb(181, 213, 255);\\\n}\\\n\\\n.ace-dreamweaver .ace_marker-layer .ace_step {\\\n  background: rgb(252, 255, 0);\\\n}\\\n\\\n.ace-dreamweaver .ace_marker-layer .ace_stack {\\\n  background: rgb(164, 229, 101);\\\n}\\\n\\\n.ace-dreamweaver .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgb(192, 192, 192);\\\n}\\\n\\\n.ace-dreamweaver .ace_marker-layer .ace_active_line {\\\n  background: rgba(0, 0, 0, 0.07);\\\n}\\\n\\\n.ace-dreamweaver .ace_marker-layer .ace_selected_word {\\\n  background: rgb(250, 250, 255);\\\n  border: 1px solid rgb(200, 200, 250);\\\n}\\\n\\\n.ace-dreamweaver .ace_meta.ace_tag {\\\n  color:#009;\\\n}\\\n\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\\\n  color:#060;\\\n}\\\n\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_form {\\\n  color:#F90;\\\n}\\\n\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_image {\\\n  color:#909;\\\n}\\\n\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_script {\\\n  color:#900;\\\n}\\\n\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_style {\\\n  color:#909;\\\n}\\\n\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_table {\\\n  color:#099;\\\n}\\\n\\\n.ace-dreamweaver .ace_string.ace_regex {\\\n  color: rgb(255, 0, 0)\\\n}\\\n\\\n.ace-dreamweaver .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-eclipse.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/eclipse', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\n\nexports.isDark = false;\nexports.cssText = \".ace-eclipse .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159);\\\n}\\\n\\\n.ace-eclipse .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd;\\\n}\\\n\\\n.ace-eclipse .ace_gutter {\\\n  background: #ebebeb;\\\n  border-right: 1px solid rgb(159, 159, 159);\\\n  color: rgb(136, 136, 136);\\\n}\\\n\\\n.ace-eclipse .ace_print_margin {\\\n  width: 1px;\\\n  background: #ebebeb;\\\n}\\\n\\\n.ace-eclipse .ace_scroller {\\\n  background-color: #FFFFFF;\\\n}\\\n\\\n.ace-eclipse .ace_fold {\\\n    background-color: rgb(60, 76, 114);\\\n}\\\n\\\n.ace-eclipse .ace_text-layer {\\\n}\\\n\\\n.ace-eclipse .ace_cursor {\\\n  border-left: 2px solid black;\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_storage,\\\n.ace-eclipse .ace_line .ace_keyword,\\\n.ace-eclipse .ace_line .ace_variable {\\\n  color: rgb(127, 0, 85);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_constant.ace_buildin {\\\n  color: rgb(88, 72, 246);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_constant.ace_library {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_function {\\\n  color: rgb(60, 76, 114);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_string {\\\n  color: rgb(42, 0, 255);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_comment {\\\n  color: rgb(63, 127, 95);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_comment.ace_doc {\\\n  color: rgb(63, 95, 191);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_comment.ace_doc.ace_tag {\\\n  color: rgb(127, 159, 191);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_constant.ace_numeric {\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_tag {\\\n  color: rgb(63, 127, 127);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_type {\\\n  color: rgb(127, 0, 127);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_xml_pe {\\\n  color: rgb(104, 104, 91);\\\n}\\\n\\\n.ace-eclipse .ace_marker-layer .ace_selection {\\\n  background: rgb(181, 213, 255);\\\n}\\\n\\\n.ace-eclipse .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgb(192, 192, 192);\\\n}\\\n\\\n.ace-eclipse .ace_line .ace_meta.ace_tag {\\\n  color:rgb(63, 127, 127);\\\n}\\\n\\\n.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\\\n  color:rgb(127, 0, 127);\\\n}\\\n.ace-eclipse .ace_marker-layer .ace_step {\\\n  background: rgb(255, 255, 0);\\\n}\\\n\\\n.ace-eclipse .ace_marker-layer .ace_active_line {\\\n  background: rgb(232, 242, 254);\\\n}\\\n\\\n.ace-eclipse .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgb(181, 213, 255);\\\n}\\\n\\\n.ace-eclipse .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\nexports.cssClass = \"ace-eclipse\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-github.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/github', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-github\";\nexports.cssText = \"/* CSS style content from github's default pygments highlighter template.\\\n   Cursor and selection styles from textmate.css. */\\\n.ace-github .ace_editor {\\\n  color: #333;\\\n  background-color: #F8F8F8;\\\n  border: 1px solid #CCC;\\\n  font: 13px 'Bitstream Vera Sans Mono', Courier, monospace !important;\\\n  line-height: 19px !important;\\\n  overflow: auto;\\\n  padding: 6px 10px;\\\n  border-radius: 3px;\\\n  position: relative;\\\n  margin-bottom: 15px;\\\n}\\\n\\\n.ace-github .ace_gutter {\\\n  background: #e8e8e8;\\\n  color: #AAA;\\\n}\\\n\\\n.ace-github .ace_scroller {\\\n  background: #fff;\\\n}\\\n\\\n.ace-github .ace_keyword {\\\n  font-weight: bold;\\\n}\\\n\\\n.ace-github .ace_string {\\\n  color: #D14;\\\n}\\\n\\\n.ace-github .ace_variable.ace_class {\\\n  color: teal;\\\n}\\\n\\\n.ace-github .ace_constant.ace_numeric {\\\n  color: #099;\\\n}\\\n\\\n.ace-github .ace_constant.ace_buildin {\\\n  color: #0086B3;\\\n}\\\n\\\n.ace-github .ace_support.ace_function {\\\n  color: #0086B3;\\\n}\\\n\\\n.ace-github .ace_comment {\\\n  color: #998;\\\n  font-style: italic;\\\n}\\\n\\\n.ace-github .ace_variable.ace_language  {\\\n  color: #0086B3;\\\n}\\\n\\\n.ace-github .ace_paren {\\\n  font-weight: bold;\\\n}\\\n\\\n.ace-github .ace_boolean {\\\n  font-weight: bold;\\\n}\\\n\\\n.ace-github .ace_string.ace_regexp {\\\n  color: #009926;\\\n  font-weight: normal;\\\n}\\\n\\\n.ace-github .ace_variable.ace_instancce {\\\n  color: teal;\\\n}\\\n\\\n.ace-github .ace_constant.ace_language {\\\n  font-weight: bold;\\\n}\\\n\\\n.ace-github .ace_text-layer {\\\n}\\\n\\\n.ace-github .ace_cursor {\\\n  border-left: 2px solid black;\\\n}\\\n\\\n.ace-github .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid black;\\\n}\\\n\\\n.ace-github .ace_marker-layer .ace_active_line {\\\n  background: rgb(255, 255, 204);\\\n}\\\n.ace-github .ace_marker-layer .ace_selection {\\\n  background: rgb(181, 213, 255);\\\n}\\\n.ace-github.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px white;\\\n  border-radius: 2px;\\\n}\\\n/* bold keywords cause cursor issues for some fonts */\\\n/* this disables bold style for editor and keeps for static highlighter */\\\n.ace-github.ace_editor .ace_line > span {\\\n    font-weight: normal !important;\\\n}\\\n\\\n.ace-github .ace_marker-layer .ace_step {\\\n  background: rgb(252, 255, 0);\\\n}\\\n\\\n.ace-github .ace_marker-layer .ace_stack {\\\n  background: rgb(164, 229, 101);\\\n}\\\n\\\n.ace-github .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgb(192, 192, 192);\\\n}\\\n\\\n.ace-github .ace_gutter_active_line {\\\n    background-color : rgba(0, 0, 0, 0.07);\\\n}\\\n\\\n.ace-github .ace_marker-layer .ace_selected_word {\\\n  background: rgb(250, 250, 255);\\\n  border: 1px solid rgb(200, 200, 250);\\\n\\\n}\\\n\\\n.ace-github .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8;\\\n}\\\n\\\n.ace-github .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\n    var dom = require(\"../lib/dom\");\n    dom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-idle_fingers.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/idle_fingers', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-idle-fingers\";\nexports.cssText = \".ace-idle-fingers .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-idle-fingers .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-idle-fingers .ace_gutter {\\\n  background: #3b3b3b;\\\n  color: #fff\\\n}\\\n\\\n.ace-idle-fingers .ace_print_margin {\\\n  width: 1px;\\\n  background: #3b3b3b\\\n}\\\n\\\n.ace-idle-fingers .ace_scroller {\\\n  background-color: #323232\\\n}\\\n\\\n.ace-idle-fingers .ace_text-layer {\\\n  color: #FFFFFF\\\n}\\\n\\\n.ace-idle-fingers .ace_cursor {\\\n  border-left: 2px solid #91FF00\\\n}\\\n\\\n.ace-idle-fingers .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #91FF00\\\n}\\\n\\\n.ace-idle-fingers .ace_marker-layer .ace_selection {\\\n  background: rgba(90, 100, 126, 0.88)\\\n}\\\n\\\n.ace-idle-fingers.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #323232;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-idle-fingers .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-idle-fingers .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #404040\\\n}\\\n\\\n.ace-idle-fingers .ace_marker-layer .ace_active_line {\\\n  background: #353637\\\n}\\\n\\\n.ace-idle-fingers .ace_gutter_active_line {\\\n  background-color: #353637\\\n}\\\n\\\n.ace-idle-fingers .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgba(90, 100, 126, 0.88)\\\n}\\\n\\\n.ace-idle-fingers .ace_invisible {\\\n  color: #404040\\\n}\\\n\\\n.ace-idle-fingers .ace_keyword,\\\n.ace-idle-fingers .ace_meta {\\\n  color: #CC7833\\\n}\\\n\\\n.ace-idle-fingers .ace_constant,\\\n.ace-idle-fingers .ace_constant.ace_character,\\\n.ace-idle-fingers .ace_constant.ace_character.ace_escape,\\\n.ace-idle-fingers .ace_constant.ace_other,\\\n.ace-idle-fingers .ace_support.ace_constant {\\\n  color: #6C99BB\\\n}\\\n\\\n.ace-idle-fingers .ace_invalid {\\\n  color: #FFFFFF;\\\n  background-color: #FF0000\\\n}\\\n\\\n.ace-idle-fingers .ace_fold {\\\n  background-color: #CC7833;\\\n  border-color: #FFFFFF\\\n}\\\n\\\n.ace-idle-fingers .ace_support.ace_function {\\\n  color: #B83426\\\n}\\\n\\\n.ace-idle-fingers .ace_variable.ace_parameter {\\\n  font-style: italic\\\n}\\\n\\\n.ace-idle-fingers .ace_string {\\\n  color: #A5C261\\\n}\\\n\\\n.ace-idle-fingers .ace_string.ace_regexp {\\\n  color: #CCCC33\\\n}\\\n\\\n.ace-idle-fingers .ace_comment {\\\n  font-style: italic;\\\n  color: #BC9458\\\n}\\\n\\\n.ace-idle-fingers .ace_meta.ace_tag {\\\n  color: #FFE5BB\\\n}\\\n\\\n.ace-idle-fingers .ace_entity.ace_name {\\\n  color: #FFC66D\\\n}\\\n\\\n.ace-idle-fingers .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-idle-fingers .ace_collab.ace_user1 {\\\n  color: #323232;\\\n  background-color: #FFF980\\\n}\\\n\\\n.ace-idle-fingers .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjL6zzBz5sz/ABEUBGCqhK6UAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-kr_theme.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/kr_theme', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-kr-theme\";\nexports.cssText = \".ace-kr-theme .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-kr-theme .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-kr-theme .ace_gutter {\\\n  background: #1c1917;\\\n  color: #FCFFE0\\\n}\\\n\\\n.ace-kr-theme .ace_print_margin {\\\n  width: 1px;\\\n  background: #1c1917\\\n}\\\n\\\n.ace-kr-theme .ace_scroller {\\\n  background-color: #0B0A09\\\n}\\\n\\\n.ace-kr-theme .ace_text-layer {\\\n  color: #FCFFE0\\\n}\\\n\\\n.ace-kr-theme .ace_cursor {\\\n  border-left: 2px solid #FF9900\\\n}\\\n\\\n.ace-kr-theme .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #FF9900\\\n}\\\n\\\n.ace-kr-theme .ace_marker-layer .ace_selection {\\\n  background: rgba(170, 0, 255, 0.45)\\\n}\\\n\\\n.ace-kr-theme.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #0B0A09;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-kr-theme .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-kr-theme .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(255, 177, 111, 0.32)\\\n}\\\n\\\n.ace-kr-theme .ace_marker-layer .ace_active_line {\\\n  background: #38403D\\\n}\\\n\\\n.ace-kr-theme .ace_gutter_active_line {\\\n  background-color : #38403D\\\n}\\\n\\\n.ace-kr-theme .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgba(170, 0, 255, 0.45)\\\n}\\\n\\\n.ace-kr-theme .ace_invisible {\\\n  color: rgba(255, 177, 111, 0.32)\\\n}\\\n\\\n.ace-kr-theme .ace_keyword,\\\n.ace-kr-theme .ace_meta {\\\n  color: #949C8B\\\n}\\\n\\\n.ace-kr-theme .ace_constant,\\\n.ace-kr-theme .ace_constant.ace_character,\\\n.ace-kr-theme .ace_constant.ace_character.ace_escape,\\\n.ace-kr-theme .ace_constant.ace_other {\\\n  color: rgba(210, 117, 24, 0.76)\\\n}\\\n\\\n.ace-kr-theme .ace_invalid {\\\n  color: #F8F8F8;\\\n  background-color: #A41300\\\n}\\\n\\\n.ace-kr-theme .ace_support {\\\n  color: #9FC28A\\\n}\\\n\\\n.ace-kr-theme .ace_support.ace_constant {\\\n  color: #C27E66\\\n}\\\n\\\n.ace-kr-theme .ace_fold {\\\n  background-color: #949C8B;\\\n  border-color: #FCFFE0\\\n}\\\n\\\n.ace-kr-theme .ace_support.ace_function {\\\n  color: #85873A\\\n}\\\n\\\n.ace-kr-theme .ace_storage {\\\n  color: #FFEE80\\\n}\\\n\\\n.ace-kr-theme .ace_string.ace_regexp {\\\n  color: rgba(125, 255, 192, 0.65)\\\n}\\\n\\\n.ace-kr-theme .ace_comment {\\\n  font-style: italic;\\\n  color: #706D5B\\\n}\\\n\\\n.ace-kr-theme .ace_variable {\\\n  color: #D1A796\\\n}\\\n\\\n.ace-kr-theme .ace_variable.ace_language {\\\n  color: #FF80E1\\\n}\\\n\\\n.ace-kr-theme .ace_meta.ace_tag {\\\n  color: #BABD9C\\\n}\\\n\\\n.ace-kr-theme .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-kr-theme .ace_markup.ace_list {\\\n  background-color: #0F0040\\\n}\\\n\\\n.ace-kr-theme .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPg5uL8zzBz5sz/AA1WA+hUYIqjAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-merbivore.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/merbivore', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-merbivore\";\nexports.cssText = \".ace-merbivore .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-merbivore .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-merbivore .ace_gutter {\\\n  background: #202020;\\\n  color: #E6E1DC\\\n}\\\n\\\n.ace-merbivore .ace_print_margin {\\\n  width: 1px;\\\n  background: #555651\\\n}\\\n\\\n.ace-merbivore .ace_scroller {\\\n  background-color: #161616\\\n}\\\n\\\n.ace-merbivore .ace_text-layer {\\\n  color: #E6E1DC\\\n}\\\n\\\n.ace-merbivore .ace_cursor {\\\n  border-left: 2px solid #FFFFFF\\\n}\\\n\\\n.ace-merbivore .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #FFFFFF\\\n}\\\n\\\n.ace-merbivore .ace_marker-layer .ace_selection {\\\n  background: #454545\\\n}\\\n\\\n.ace-merbivore.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #161616;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-merbivore .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-merbivore .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #404040\\\n}\\\n\\\n.ace-merbivore .ace_marker-layer .ace_active_line {\\\n  background: #333435\\\n}\\\n\\\n.ace-merbivore .ace_gutter_active_line {\\\n  background-color: #333435\\\n}\\\n\\\n.ace-merbivore .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #454545\\\n}\\\n\\\n.ace-merbivore .ace_invisible {\\\n  color: #404040\\\n}\\\n\\\n.ace-merbivore .ace_entity.ace_name.ace_tag,\\\n.ace-merbivore .ace_keyword,\\\n.ace-merbivore .ace_meta,\\\n.ace-merbivore .ace_meta.ace_tag,\\\n.ace-merbivore .ace_storage,\\\n.ace-merbivore .ace_support.ace_function {\\\n  color: #FC6F09\\\n}\\\n\\\n.ace-merbivore .ace_constant,\\\n.ace-merbivore .ace_constant.ace_character,\\\n.ace-merbivore .ace_constant.ace_character.ace_escape,\\\n.ace-merbivore .ace_constant.ace_other,\\\n.ace-merbivore .ace_support.ace_type {\\\n  color: #1EDAFB\\\n}\\\n\\\n.ace-merbivore .ace_constant.ace_character.ace_escape {\\\n  color: #519F50\\\n}\\\n\\\n.ace-merbivore .ace_constant.ace_language {\\\n  color: #FDC251\\\n}\\\n\\\n.ace-merbivore .ace_constant.ace_library,\\\n.ace-merbivore .ace_string,\\\n.ace-merbivore .ace_support.ace_constant {\\\n  color: #8DFF0A\\\n}\\\n\\\n.ace-merbivore .ace_constant.ace_numeric {\\\n  color: #58C554\\\n}\\\n\\\n.ace-merbivore .ace_invalid {\\\n  color: #FFFFFF;\\\n  background-color: #990000\\\n}\\\n\\\n.ace-merbivore .ace_fold {\\\n  background-color: #FC6F09;\\\n  border-color: #E6E1DC\\\n}\\\n\\\n.ace-merbivore .ace_comment {\\\n  font-style: italic;\\\n  color: #AD2EA4\\\n}\\\n\\\n.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\\\n  color: #FFFF89\\\n}\\\n\\\n.ace-merbivore .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-merbivore .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQExP7zzBz5sz/AA50BAyDznYhAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-merbivore_soft.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/merbivore_soft', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-merbivore-soft\";\nexports.cssText = \".ace-merbivore-soft .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-merbivore-soft .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-merbivore-soft .ace_gutter {\\\n  background: #262424;\\\n  color: #E6E1DC\\\n}\\\n\\\n.ace-merbivore-soft .ace_print_margin {\\\n  width: 1px;\\\n  background: #262424\\\n}\\\n\\\n.ace-merbivore-soft .ace_scroller {\\\n  background-color: #1C1C1C\\\n}\\\n\\\n.ace-merbivore-soft .ace_text-layer {\\\n  color: #E6E1DC\\\n}\\\n\\\n.ace-merbivore-soft .ace_cursor {\\\n  border-left: 2px solid #FFFFFF\\\n}\\\n\\\n.ace-merbivore-soft .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #FFFFFF\\\n}\\\n\\\n.ace-merbivore-soft .ace_marker-layer .ace_selection {\\\n  background: #494949\\\n}\\\n\\\n.ace-merbivore-soft.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #1C1C1C;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-merbivore-soft .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-merbivore-soft .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #404040\\\n}\\\n\\\n.ace-merbivore-soft .ace_marker-layer .ace_active_line {\\\n  background: #333435\\\n}\\\n\\\n.ace-merbivore-soft .ace_gutter_active_line {\\\n  background-color: #333435\\\n}\\\n\\\n.ace-merbivore-soft .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #494949\\\n}\\\n\\\n.ace-merbivore-soft .ace_invisible {\\\n  color: #404040\\\n}\\\n\\\n.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\\\n.ace-merbivore-soft .ace_keyword,\\\n.ace-merbivore-soft .ace_meta,\\\n.ace-merbivore-soft .ace_meta.ace_tag,\\\n.ace-merbivore-soft .ace_storage {\\\n  color: #FC803A\\\n}\\\n\\\n.ace-merbivore-soft .ace_constant,\\\n.ace-merbivore-soft .ace_constant.ace_character,\\\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\\\n.ace-merbivore-soft .ace_constant.ace_other,\\\n.ace-merbivore-soft .ace_support.ace_type {\\\n  color: #68C1D8\\\n}\\\n\\\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\\\n  color: #B3E5B4\\\n}\\\n\\\n.ace-merbivore-soft .ace_constant.ace_language {\\\n  color: #E1C582\\\n}\\\n\\\n.ace-merbivore-soft .ace_constant.ace_library,\\\n.ace-merbivore-soft .ace_string,\\\n.ace-merbivore-soft .ace_support.ace_constant {\\\n  color: #8EC65F\\\n}\\\n\\\n.ace-merbivore-soft .ace_constant.ace_numeric {\\\n  color: #7FC578\\\n}\\\n\\\n.ace-merbivore-soft .ace_invalid,\\\n.ace-merbivore-soft .ace_invalid.ace_deprecated {\\\n  color: #FFFFFF;\\\n  background-color: #FE3838\\\n}\\\n\\\n.ace-merbivore-soft .ace_fold {\\\n  background-color: #FC803A;\\\n  border-color: #E6E1DC\\\n}\\\n\\\n.ace-merbivore-soft .ace_comment,\\\n.ace-merbivore-soft .ace_meta {\\\n  font-style: italic;\\\n  color: #AC4BB8\\\n}\\\n\\\n.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\\\n  color: #EAF1A3\\\n}\\\n\\\n.ace-merbivore-soft .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-merbivore-soft .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkZH5zzBz5sz/AA8EBB6crd1rAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-mono_industrial.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/mono_industrial', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-mono-industrial\";\nexports.cssText = \".ace-mono-industrial .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-mono-industrial .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-mono-industrial .ace_gutter {\\\n  background: #1d2521;\\\n  color: #C5C9C9\\\n}\\\n\\\n.ace-mono-industrial .ace_print_margin {\\\n  width: 1px;\\\n  background: #555651\\\n}\\\n\\\n.ace-mono-industrial .ace_scroller {\\\n  background-color: #222C28\\\n}\\\n\\\n.ace-mono-industrial .ace_text-layer {\\\n  color: #FFFFFF\\\n}\\\n\\\n.ace-mono-industrial .ace_cursor {\\\n  border-left: 2px solid #FFFFFF\\\n}\\\n\\\n.ace-mono-industrial .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #FFFFFF\\\n}\\\n\\\n.ace-mono-industrial .ace_marker-layer .ace_selection {\\\n  background: rgba(145, 153, 148, 0.40)\\\n}\\\n\\\n.ace-mono-industrial.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #222C28;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-mono-industrial .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-mono-industrial .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(102, 108, 104, 0.50)\\\n}\\\n\\\n.ace-mono-industrial .ace_marker-layer .ace_active_line {\\\n  background: rgba(12, 13, 12, 0.25)\\\n}\\\n\\\n.ace-mono-industrial .ace_gutter_active_line {\\\n  background-color: rgba(12, 13, 12, 0.25)\\\n}\\\n\\\n.ace-mono-industrial .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgba(145, 153, 148, 0.40)\\\n}\\\n\\\n.ace-mono-industrial .ace_invisible {\\\n  color: rgba(102, 108, 104, 0.50)\\\n}\\\n\\\n.ace-mono-industrial .ace_keyword,\\\n.ace-mono-industrial .ace_meta {\\\n  color: #A39E64\\\n}\\\n\\\n.ace-mono-industrial .ace_constant,\\\n.ace-mono-industrial .ace_constant.ace_character,\\\n.ace-mono-industrial .ace_constant.ace_character.ace_escape,\\\n.ace-mono-industrial .ace_constant.ace_numeric,\\\n.ace-mono-industrial .ace_constant.ace_other {\\\n  color: #E98800\\\n}\\\n\\\n.ace-mono-industrial .ace_entity.ace_name.ace_function,\\\n.ace-mono-industrial .ace_keyword.ace_operator,\\\n.ace-mono-industrial .ace_variable {\\\n  color: #A8B3AB\\\n}\\\n\\\n.ace-mono-industrial .ace_invalid {\\\n  color: #FFFFFF;\\\n  background-color: rgba(153, 0, 0, 0.68)\\\n}\\\n\\\n.ace-mono-industrial .ace_support.ace_constant {\\\n  color: #C87500\\\n}\\\n\\\n.ace-mono-industrial .ace_fold {\\\n  background-color: #A8B3AB;\\\n  border-color: #FFFFFF\\\n}\\\n\\\n.ace-mono-industrial .ace_support.ace_function {\\\n  color: #588E60\\\n}\\\n\\\n.ace-mono-industrial .ace_entity.ace_name,\\\n.ace-mono-industrial .ace_support.ace_class,\\\n.ace-mono-industrial .ace_support.ace_type {\\\n  color: #5778B6\\\n}\\\n\\\n.ace-mono-industrial .ace_storage {\\\n  color: #C23B00\\\n}\\\n\\\n.ace-mono-industrial .ace_variable.ace_language,\\\n.ace-mono-industrial .ace_variable.ace_parameter {\\\n  color: #648BD2\\\n}\\\n\\\n.ace-mono-industrial .ace_comment {\\\n  color: #666C68;\\\n  background-color: #151C19\\\n}\\\n\\\n.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\\\n  color: #909993\\\n}\\\n\\\n.ace-mono-industrial .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-mono-industrial .ace_entity.ace_name.ace_tag {\\\n  color: #A65EFF\\\n}\\\n\\\n.ace-mono-industrial .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ0tH4zzBz5sz/ABAOBECKH+evAAAAAElFTkSuQmCC) right repeat-y\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-monokai.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/monokai', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-monokai\";\nexports.cssText = \".ace-monokai .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-monokai .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-monokai .ace_gutter {\\\n  background: #2f3129;\\\n  color: #f1f1f1\\\n}\\\n\\\n.ace-monokai .ace_print_margin {\\\n  width: 1px;\\\n  background: #555651\\\n}\\\n\\\n.ace-monokai .ace_scroller {\\\n  background-color: #272822\\\n}\\\n\\\n.ace-monokai .ace_text-layer {\\\n  color: #F8F8F2\\\n}\\\n\\\n.ace-monokai .ace_cursor {\\\n  border-left: 2px solid #F8F8F0\\\n}\\\n\\\n.ace-monokai .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #F8F8F0\\\n}\\\n\\\n.ace-monokai .ace_marker-layer .ace_selection {\\\n  background: #49483E\\\n}\\\n\\\n.ace-monokai.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #272822;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-monokai .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-monokai .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #49483E\\\n}\\\n\\\n.ace-monokai .ace_marker-layer .ace_active_line {\\\n  background: #202020\\\n}\\\n\\\n.ace-monokai .ace_gutter_active_line {\\\n  background-color: #272727\\\n}\\\n\\\n.ace-monokai .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #49483E\\\n}\\\n\\\n.ace-monokai .ace_invisible {\\\n  color: #49483E\\\n}\\\n\\\n.ace-monokai .ace_entity.ace_name.ace_tag,\\\n.ace-monokai .ace_keyword,\\\n.ace-monokai .ace_meta,\\\n.ace-monokai .ace_storage {\\\n  color: #F92672\\\n}\\\n\\\n.ace-monokai .ace_constant.ace_character,\\\n.ace-monokai .ace_constant.ace_language,\\\n.ace-monokai .ace_constant.ace_numeric,\\\n.ace-monokai .ace_constant.ace_other {\\\n  color: #AE81FF\\\n}\\\n\\\n.ace-monokai .ace_invalid {\\\n  color: #F8F8F0;\\\n  background-color: #F92672\\\n}\\\n\\\n.ace-monokai .ace_invalid.ace_deprecated {\\\n  color: #F8F8F0;\\\n  background-color: #AE81FF\\\n}\\\n\\\n.ace-monokai .ace_support.ace_constant,\\\n.ace-monokai .ace_support.ace_function {\\\n  color: #66D9EF\\\n}\\\n\\\n.ace-monokai .ace_fold {\\\n  background-color: #A6E22E;\\\n  border-color: #F8F8F2\\\n}\\\n\\\n.ace-monokai .ace_storage.ace_type,\\\n.ace-monokai .ace_support.ace_class,\\\n.ace-monokai .ace_support.ace_type {\\\n  font-style: italic;\\\n  color: #66D9EF\\\n}\\\n\\\n.ace-monokai .ace_entity.ace_name.ace_function,\\\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\\\n.ace-monokai .ace_variable {\\\n  color: #A6E22E\\\n}\\\n\\\n.ace-monokai .ace_variable.ace_parameter {\\\n  font-style: italic;\\\n  color: #FD971F\\\n}\\\n\\\n.ace-monokai .ace_string {\\\n  color: #E6DB74\\\n}\\\n\\\n.ace-monokai .ace_comment {\\\n  color: #75715E\\\n}\\\n\\\n.ace-monokai .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-monokai .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ11D6z7Bq1ar/ABCKBG6g04U2AAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-pastel_on_dark.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/pastel_on_dark', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-pastel-on-dark\";\nexports.cssText = \".ace-pastel-on-dark .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-pastel-on-dark .ace_gutter {\\\n  background: #353030;\\\n  color: #8F938F\\\n}\\\n\\\n.ace-pastel-on-dark .ace_print_margin {\\\n  width: 1px;\\\n  background: #353030\\\n}\\\n\\\n.ace-pastel-on-dark .ace_scroller {\\\n  background-color: #2C2828\\\n}\\\n\\\n.ace-pastel-on-dark .ace_text-layer {\\\n  color: #8F938F\\\n}\\\n\\\n.ace-pastel-on-dark .ace_cursor {\\\n  border-left: 2px solid #A7A7A7\\\n}\\\n\\\n.ace-pastel-on-dark .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #A7A7A7\\\n}\\\n\\\n.ace-pastel-on-dark .ace_marker-layer .ace_selection {\\\n  background: rgba(221, 240, 255, 0.20)\\\n}\\\n\\\n.ace-pastel-on-dark.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #2C2828;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-pastel-on-dark .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(255, 255, 255, 0.25)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_marker-layer .ace_active_line {\\\n  background: rgba(255, 255, 255, 0.031)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_gutter_active_line {\\\n  background-color: rgba(255, 255, 255, 0.031)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgba(221, 240, 255, 0.20)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_invisible {\\\n  color: rgba(255, 255, 255, 0.25)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_keyword,\\\n.ace-pastel-on-dark .ace_meta {\\\n  color: #757aD8\\\n}\\\n\\\n.ace-pastel-on-dark .ace_constant,\\\n.ace-pastel-on-dark .ace_constant.ace_character,\\\n.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\\\n.ace-pastel-on-dark .ace_constant.ace_other {\\\n  color: #4FB7C5\\\n}\\\n\\\n.ace-pastel-on-dark .ace_keyword.ace_operator {\\\n  color: #797878\\\n}\\\n\\\n.ace-pastel-on-dark .ace_constant.ace_character {\\\n  color: #AFA472\\\n}\\\n\\\n.ace-pastel-on-dark .ace_constant.ace_language {\\\n  color: #DE8E30\\\n}\\\n\\\n.ace-pastel-on-dark .ace_constant.ace_numeric {\\\n  color: #CCCCCC\\\n}\\\n\\\n.ace-pastel-on-dark .ace_invalid,\\\n.ace-pastel-on-dark .ace_invalid.ace_illegal {\\\n  color: #F8F8F8;\\\n  background-color: rgba(86, 45, 86, 0.75)\\\n}\\\n\\\n.ace-pastel-on-dark .ace_invalid.ace_deprecated {\\\n  text-decoration: underline;\\\n  font-style: italic;\\\n  color: #D2A8A1\\\n}\\\n\\\n.ace-pastel-on-dark .ace_fold {\\\n  background-color: #757aD8;\\\n  border-color: #8F938F\\\n}\\\n\\\n.ace-pastel-on-dark .ace_support.ace_function {\\\n  color: #AEB2F8\\\n}\\\n\\\n.ace-pastel-on-dark .ace_string {\\\n  color: #66A968\\\n}\\\n\\\n.ace-pastel-on-dark .ace_string.ace_regexp {\\\n  color: #E9C062\\\n}\\\n\\\n.ace-pastel-on-dark .ace_comment {\\\n  color: #A6C6FF\\\n}\\\n\\\n.ace-pastel-on-dark .ace_variable {\\\n  color: #BEBF55\\\n}\\\n\\\n.ace-pastel-on-dark .ace_variable.ace_language {\\\n  color: #C1C144\\\n}\\\n\\\n.ace-pastel-on-dark .ace_xml_pe {\\\n  color: #494949\\\n}\\\n\\\n.ace-pastel-on-dark .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-pastel-on-dark .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0dD4z9DR0fEfAA+vBBPqhbn1AAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-solarized_dark.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/solarized_dark', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-solarized-dark\";\nexports.cssText = \".ace-solarized-dark .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-solarized-dark .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-solarized-dark .ace_gutter {\\\n  background: #01313f;\\\n  color: #d0edf7\\\n}\\\n\\\n.ace-solarized-dark .ace_print_margin {\\\n  width: 1px;\\\n  background: #33555E\\\n}\\\n\\\n.ace-solarized-dark .ace_scroller {\\\n  background-color: #002B36\\\n}\\\n\\\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\\\n.ace-solarized-dark .ace_storage,\\\n.ace-solarized-dark .ace_text-layer {\\\n  color: #93A1A1\\\n}\\\n\\\n.ace-solarized-dark .ace_cursor {\\\n  border-left: 2px solid #D30102\\\n}\\\n\\\n.ace-solarized-dark .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #D30102\\\n}\\\n\\\n.ace-solarized-dark .ace_marker-layer .ace_active_line,\\\n.ace-solarized-dark .ace_marker-layer .ace_selection {\\\n  background: rgba(255, 255, 255, 0.1)\\\n}\\\n\\\n.ace-solarized-dark.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #002B36;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-solarized-dark .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(147, 161, 161, 0.50)\\\n}\\\n\\\n.ace-solarized-dark .ace_gutter_active_line {\\\n  background-color: #0d3440\\\n}\\\n\\\n.ace-solarized-dark .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #073642\\\n}\\\n\\\n.ace-solarized-dark .ace_invisible {\\\n  color: rgba(147, 161, 161, 0.50)\\\n}\\\n\\\n.ace-solarized-dark .ace_keyword,\\\n.ace-solarized-dark .ace_meta,\\\n.ace-solarized-dark .ace_support.ace_class,\\\n.ace-solarized-dark .ace_support.ace_type {\\\n  color: #859900\\\n}\\\n\\\n.ace-solarized-dark .ace_constant.ace_character,\\\n.ace-solarized-dark .ace_constant.ace_other {\\\n  color: #CB4B16\\\n}\\\n\\\n.ace-solarized-dark .ace_constant.ace_language {\\\n  color: #B58900\\\n}\\\n\\\n.ace-solarized-dark .ace_constant.ace_numeric {\\\n  color: #D33682\\\n}\\\n\\\n.ace-solarized-dark .ace_fold {\\\n  background-color: #268BD2;\\\n  border-color: #93A1A1\\\n}\\\n\\\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\\\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\\\n.ace-solarized-dark .ace_support.ace_function,\\\n.ace-solarized-dark .ace_variable,\\\n.ace-solarized-dark .ace_variable.ace_language {\\\n  color: #268BD2\\\n}\\\n\\\n.ace-solarized-dark .ace_string {\\\n  color: #2AA198\\\n}\\\n\\\n.ace-solarized-dark .ace_string.ace_regexp {\\\n  color: #D30102\\\n}\\\n\\\n.ace-solarized-dark .ace_comment {\\\n  font-style: italic;\\\n  color: #657B83\\\n}\\\n\\\n.ace-solarized-dark .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-solarized-dark .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db7zzBz5sz/AA82BCv7wOIDAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-solarized_light.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/solarized_light', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-solarized-light\";\nexports.cssText = \".ace-solarized-light .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-solarized-light .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-solarized-light .ace_gutter {\\\n  background: #fbf1d3;\\\n  color: #333\\\n}\\\n\\\n.ace-solarized-light .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8\\\n}\\\n\\\n.ace-solarized-light .ace_scroller {\\\n  background-color: #FDF6E3\\\n}\\\n\\\n.ace-solarized-light .ace_text-layer {\\\n  color: #586E75\\\n}\\\n\\\n.ace-solarized-light .ace_cursor {\\\n  border-left: 2px solid #000000\\\n}\\\n\\\n.ace-solarized-light .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #000000\\\n}\\\n\\\n.ace-solarized-light .ace_marker-layer .ace_selection {\\\n  background: #073642\\\n}\\\n\\\n.ace-solarized-light.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #FDF6E3;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-solarized-light .ace_marker-layer .ace_step {\\\n  background: rgb(255, 255, 0)\\\n}\\\n\\\n.ace-solarized-light .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(147, 161, 161, 0.50)\\\n}\\\n\\\n.ace-solarized-light .ace_marker-layer .ace_active_line {\\\n  background: #EEE8D5\\\n}\\\n\\\n.ace-solarized-light .ace_gutter_active_line {\\\n  background-color : #dcdcdc\\\n}\\\n\\\n.ace-solarized-light .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #073642\\\n}\\\n\\\n.ace-solarized-light .ace_invisible {\\\n  color: rgba(147, 161, 161, 0.50)\\\n}\\\n\\\n.ace-solarized-light .ace_keyword,\\\n.ace-solarized-light .ace_meta,\\\n.ace-solarized-light .ace_support.ace_class,\\\n.ace-solarized-light .ace_support.ace_type {\\\n  color: #859900\\\n}\\\n\\\n.ace-solarized-light .ace_constant.ace_character,\\\n.ace-solarized-light .ace_constant.ace_other {\\\n  color: #CB4B16\\\n}\\\n\\\n.ace-solarized-light .ace_constant.ace_language {\\\n  color: #B58900\\\n}\\\n\\\n.ace-solarized-light .ace_constant.ace_numeric {\\\n  color: #D33682\\\n}\\\n\\\n.ace-solarized-light .ace_fold {\\\n  background-color: #268BD2;\\\n  border-color: #586E75\\\n}\\\n\\\n.ace-solarized-light .ace_entity.ace_name.ace_function,\\\n.ace-solarized-light .ace_entity.ace_name.ace_tag,\\\n.ace-solarized-light .ace_support.ace_function,\\\n.ace-solarized-light .ace_variable,\\\n.ace-solarized-light .ace_variable.ace_language {\\\n  color: #268BD2\\\n}\\\n\\\n.ace-solarized-light .ace_storage {\\\n  color: #073642\\\n}\\\n\\\n.ace-solarized-light .ace_string {\\\n  color: #2AA198\\\n}\\\n\\\n.ace-solarized-light .ace_string.ace_regexp {\\\n  color: #D30102\\\n}\\\n\\\n.ace-solarized-light .ace_comment,\\\n.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\\\n  color: #93A1A1\\\n}\\\n\\\n.ace-solarized-light .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-solarized-light .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4++3xf4ZVq1b9BwAjxwbT1g3hiwAAAABJRU5ErkJggg==) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-textmate.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/textmate', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159);\\\n}\\\n\\\n.ace-tm .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd;\\\n}\\\n\\\n.ace-tm .ace_gutter {\\\n  background: #f0f0f0;\\\n  color: #333;\\\n}\\\n\\\n.ace-tm .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8;\\\n}\\\n\\\n.ace-tm .ace_fold {\\\n    background-color: #6B72E6;\\\n}\\\n\\\n.ace-tm .ace_scroller {\\\n  background-color: #FFFFFF;\\\n}\\\n\\\n.ace-tm .ace_cursor {\\\n  border-left: 2px solid black;\\\n}\\\n\\\n.ace-tm .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid black;\\\n}\\\n        \\\n.ace-tm .ace_line .ace_invisible {\\\n  color: rgb(191, 191, 191);\\\n}\\\n\\\n.ace-tm .ace_line .ace_storage,\\\n.ace-tm .ace_line .ace_keyword {\\\n  color: blue;\\\n}\\\n\\\n.ace-tm .ace_line .ace_constant {\\\n  color: rgb(197, 6, 11);\\\n}\\\n\\\n.ace-tm .ace_line .ace_constant.ace_buildin {\\\n  color: rgb(88, 72, 246);\\\n}\\\n\\\n.ace-tm .ace_line .ace_constant.ace_language {\\\n  color: rgb(88, 92, 246);\\\n}\\\n\\\n.ace-tm .ace_line .ace_constant.ace_library {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-tm .ace_line .ace_invalid {\\\n  background-color: rgba(255, 0, 0, 0.1);\\\n  color: red;\\\n}\\\n\\\n.ace-tm .ace_line .ace_support.ace_function {\\\n  color: rgb(60, 76, 114);\\\n}\\\n\\\n.ace-tm .ace_line .ace_support.ace_constant {\\\n  color: rgb(6, 150, 14);\\\n}\\\n\\\n.ace-tm .ace_line .ace_support.ace_type,\\\n.ace-tm .ace_line .ace_support.ace_class {\\\n  color: rgb(109, 121, 222);\\\n}\\\n\\\n.ace-tm .ace_line .ace_keyword.ace_operator {\\\n  color: rgb(104, 118, 135);\\\n}\\\n\\\n.ace-tm .ace_line .ace_string {\\\n  color: rgb(3, 106, 7);\\\n}\\\n\\\n.ace-tm .ace_line .ace_comment {\\\n  color: rgb(76, 136, 107);\\\n}\\\n\\\n.ace-tm .ace_line .ace_comment.ace_doc {\\\n  color: rgb(0, 102, 255);\\\n}\\\n\\\n.ace-tm .ace_line .ace_comment.ace_doc.ace_tag {\\\n  color: rgb(128, 159, 191);\\\n}\\\n\\\n.ace-tm .ace_line .ace_constant.ace_numeric {\\\n  color: rgb(0, 0, 205);\\\n}\\\n\\\n.ace-tm .ace_line .ace_variable {\\\n  color: rgb(49, 132, 149);\\\n}\\\n\\\n.ace-tm .ace_line .ace_xml_pe {\\\n  color: rgb(104, 104, 91);\\\n}\\\n\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\n  color: #0000A2;\\\n}\\\n\\\n\\\n.ace-tm .ace_markup.ace_heading {\\\n  color: rgb(12, 7, 255);\\\n}\\\n\\\n.ace-tm .ace_markup.ace_list {\\\n  color:rgb(185, 6, 144);\\\n}\\\n\\\n.ace-tm .ace_meta.ace_tag {\\\n  color:rgb(0, 22, 142);\\\n}\\\n\\\n.ace-tm .ace_string.ace_regex {\\\n  color: rgb(255, 0, 0)\\\n}\\\n\\\n.ace-tm .ace_marker-layer .ace_selection {\\\n  background: rgb(181, 213, 255);\\\n}\\\n.ace-tm.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px white;\\\n  border-radius: 2px;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\n  background: rgb(252, 255, 0);\\\n}\\\n\\\n.ace-tm .ace_marker-layer .ace_stack {\\\n  background: rgb(164, 229, 101);\\\n}\\\n\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgb(192, 192, 192);\\\n}\\\n\\\n.ace-tm .ace_marker-layer .ace_active_line {\\\n  background: rgba(0, 0, 0, 0.07);\\\n}\\\n\\\n.ace-tm .ace_gutter_active_line {\\\n    background-color : #dcdcdc;\\\n}\\\n\\\n.ace-tm .ace_marker-layer .ace_selected_word {\\\n  background: rgb(250, 250, 255);\\\n  border: 1px solid rgb(200, 200, 250);\\\n}\\\n\\\n.ace-tm .ace_indent-guide {\\\n  background: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-tomorrow.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/tomorrow', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-tomorrow\";\nexports.cssText = \".ace-tomorrow .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-tomorrow .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-tomorrow .ace_gutter {\\\n  background: #f6f6f6;\\\n  color: #4D4D4C\\\n}\\\n\\\n.ace-tomorrow .ace_print_margin {\\\n  width: 1px;\\\n  background: #f6f6f6\\\n}\\\n\\\n.ace-tomorrow .ace_scroller {\\\n  background-color: #FFFFFF\\\n}\\\n\\\n.ace-tomorrow .ace_text-layer {\\\n  color: #4D4D4C\\\n}\\\n\\\n.ace-tomorrow .ace_cursor {\\\n  border-left: 2px solid #AEAFAD\\\n}\\\n\\\n.ace-tomorrow .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #AEAFAD\\\n}\\\n\\\n.ace-tomorrow .ace_marker-layer .ace_selection {\\\n  background: #D6D6D6\\\n}\\\n\\\n.ace-tomorrow.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #FFFFFF;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-tomorrow .ace_marker-layer .ace_step {\\\n  background: rgb(255, 255, 0)\\\n}\\\n\\\n.ace-tomorrow .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #D1D1D1\\\n}\\\n\\\n.ace-tomorrow .ace_marker-layer .ace_active_line {\\\n  background: #EFEFEF\\\n}\\\n\\\n.ace-tomorrow .ace_gutter_active_line {\\\n  background-color : #dcdcdc\\\n}\\\n\\\n.ace-tomorrow .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #D6D6D6\\\n}\\\n\\\n.ace-tomorrow .ace_invisible {\\\n  color: #D1D1D1\\\n}\\\n\\\n.ace-tomorrow .ace_keyword,\\\n.ace-tomorrow .ace_meta,\\\n.ace-tomorrow .ace_storage,\\\n.ace-tomorrow .ace_storage.ace_type,\\\n.ace-tomorrow .ace_support.ace_type {\\\n  color: #8959A8\\\n}\\\n\\\n.ace-tomorrow .ace_keyword.ace_operator {\\\n  color: #3E999F\\\n}\\\n\\\n.ace-tomorrow .ace_constant.ace_character,\\\n.ace-tomorrow .ace_constant.ace_language,\\\n.ace-tomorrow .ace_constant.ace_numeric,\\\n.ace-tomorrow .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow .ace_support.ace_constant,\\\n.ace-tomorrow .ace_variable.ace_parameter {\\\n  color: #F5871F\\\n}\\\n\\\n.ace-tomorrow .ace_constant.ace_other {\\\n  color: #666969\\\n}\\\n\\\n.ace-tomorrow .ace_invalid {\\\n  color: #FFFFFF;\\\n  background-color: #C82829\\\n}\\\n\\\n.ace-tomorrow .ace_invalid.ace_deprecated {\\\n  color: #FFFFFF;\\\n  background-color: #8959A8\\\n}\\\n\\\n.ace-tomorrow .ace_fold {\\\n  background-color: #4271AE;\\\n  border-color: #4D4D4C\\\n}\\\n\\\n.ace-tomorrow .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow .ace_support.ace_function,\\\n.ace-tomorrow .ace_variable {\\\n  color: #4271AE\\\n}\\\n\\\n.ace-tomorrow .ace_support.ace_class,\\\n.ace-tomorrow .ace_support.ace_type {\\\n  color: #C99E00\\\n}\\\n\\\n.ace-tomorrow .ace_markup.ace_heading,\\\n.ace-tomorrow .ace_string {\\\n  color: #718C00\\\n}\\\n\\\n.ace-tomorrow .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow .ace_meta.ace_tag,\\\n.ace-tomorrow .ace_string.ace_regexp,\\\n.ace-tomorrow .ace_variable {\\\n  color: #C82829\\\n}\\\n\\\n.ace-tomorrow .ace_comment {\\\n  color: #8E908C\\\n}\\\n\\\n.ace-tomorrow .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-tomorrow .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-tomorrow_night.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/tomorrow_night', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night\";\nexports.cssText = \".ace-tomorrow-night .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-tomorrow-night .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-tomorrow-night .ace_gutter {\\\n  background: #25282c;\\\n  color: #C5C8C6\\\n}\\\n\\\n.ace-tomorrow-night .ace_print_margin {\\\n  width: 1px;\\\n  background: #25282c\\\n}\\\n\\\n.ace-tomorrow-night .ace_scroller {\\\n  background-color: #1D1F21\\\n}\\\n\\\n.ace-tomorrow-night .ace_text-layer {\\\n  color: #C5C8C6\\\n}\\\n\\\n.ace-tomorrow-night .ace_cursor {\\\n  border-left: 2px solid #AEAFAD\\\n}\\\n\\\n.ace-tomorrow-night .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #AEAFAD\\\n}\\\n\\\n.ace-tomorrow-night .ace_marker-layer .ace_selection {\\\n  background: #373B41\\\n}\\\n\\\n.ace-tomorrow-night.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #1D1F21;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-tomorrow-night .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-tomorrow-night .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #4B4E55\\\n}\\\n\\\n.ace-tomorrow-night .ace_marker-layer .ace_active_line {\\\n  background: #282A2E\\\n}\\\n\\\n.ace-tomorrow-night .ace_gutter_active_line {\\\n  background-color: #282A2E\\\n}\\\n\\\n.ace-tomorrow-night .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #373B41\\\n}\\\n\\\n.ace-tomorrow-night .ace_invisible {\\\n  color: #4B4E55\\\n}\\\n\\\n.ace-tomorrow-night .ace_keyword,\\\n.ace-tomorrow-night .ace_meta,\\\n.ace-tomorrow-night .ace_storage,\\\n.ace-tomorrow-night .ace_storage.ace_type,\\\n.ace-tomorrow-night .ace_support.ace_type {\\\n  color: #B294BB\\\n}\\\n\\\n.ace-tomorrow-night .ace_keyword.ace_operator {\\\n  color: #8ABEB7\\\n}\\\n\\\n.ace-tomorrow-night .ace_constant.ace_character,\\\n.ace-tomorrow-night .ace_constant.ace_language,\\\n.ace-tomorrow-night .ace_constant.ace_numeric,\\\n.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night .ace_support.ace_constant,\\\n.ace-tomorrow-night .ace_variable.ace_parameter {\\\n  color: #DE935F\\\n}\\\n\\\n.ace-tomorrow-night .ace_constant.ace_other {\\\n  color: #CED1CF\\\n}\\\n\\\n.ace-tomorrow-night .ace_invalid {\\\n  color: #CED2CF;\\\n  background-color: #DF5F5F\\\n}\\\n\\\n.ace-tomorrow-night .ace_invalid.ace_deprecated {\\\n  color: #CED2CF;\\\n  background-color: #B798BF\\\n}\\\n\\\n.ace-tomorrow-night .ace_fold {\\\n  background-color: #81A2BE;\\\n  border-color: #C5C8C6\\\n}\\\n\\\n.ace-tomorrow-night .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night .ace_support.ace_function,\\\n.ace-tomorrow-night .ace_variable {\\\n  color: #81A2BE\\\n}\\\n\\\n.ace-tomorrow-night .ace_support.ace_class,\\\n.ace-tomorrow-night .ace_support.ace_type {\\\n  color: #F0C674\\\n}\\\n\\\n.ace-tomorrow-night .ace_markup.ace_heading,\\\n.ace-tomorrow-night .ace_string {\\\n  color: #B5BD68\\\n}\\\n\\\n.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night .ace_meta.ace_tag,\\\n.ace-tomorrow-night .ace_string.ace_regexp,\\\n.ace-tomorrow-night .ace_variable {\\\n  color: #CC6666\\\n}\\\n\\\n.ace-tomorrow-night .ace_comment {\\\n  color: #969896\\\n}\\\n\\\n.ace-tomorrow-night .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-tomorrow-night .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQlVf8z7Bq1ar/AA/hBFp7egmpAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-tomorrow_night_blue.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/tomorrow_night_blue', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night-blue\";\nexports.cssText = \".ace-tomorrow-night-blue .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_gutter {\\\n  background: #00204b;\\\n  color: #7388b5\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_print_margin {\\\n  width: 1px;\\\n  background: #00204b\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_scroller {\\\n  background-color: #002451\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_constant.ace_other,\\\n.ace-tomorrow-night-blue .ace_text-layer {\\\n  color: #FFFFFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_cursor {\\\n  border-left: 2px solid #FFFFFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #FFFFFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\\\n  background: #003F8E\\\n}\\\n\\\n.ace-tomorrow-night-blue.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #002451;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\\\n  background: rgb(127, 111, 19)\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #404F7D\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_active_line {\\\n  background: #00346E\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_gutter_active_line {\\\n  background-color: #022040\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #003F8E\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_invisible {\\\n  color: #404F7D\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_keyword,\\\n.ace-tomorrow-night-blue .ace_meta,\\\n.ace-tomorrow-night-blue .ace_storage,\\\n.ace-tomorrow-night-blue .ace_storage.ace_type,\\\n.ace-tomorrow-night-blue .ace_support.ace_type {\\\n  color: #EBBBFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_keyword.ace_operator {\\\n  color: #99FFFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_constant.ace_character,\\\n.ace-tomorrow-night-blue .ace_constant.ace_language,\\\n.ace-tomorrow-night-blue .ace_constant.ace_numeric,\\\n.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night-blue .ace_support.ace_constant,\\\n.ace-tomorrow-night-blue .ace_variable.ace_parameter {\\\n  color: #FFC58F\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_invalid {\\\n  color: #FFFFFF;\\\n  background-color: #F99DA5\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\\\n  color: #FFFFFF;\\\n  background-color: #EBBBFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_fold {\\\n  background-color: #BBDAFF;\\\n  border-color: #FFFFFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night-blue .ace_support.ace_function,\\\n.ace-tomorrow-night-blue .ace_variable {\\\n  color: #BBDAFF\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_support.ace_class,\\\n.ace-tomorrow-night-blue .ace_support.ace_type {\\\n  color: #FFEEAD\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_markup.ace_heading,\\\n.ace-tomorrow-night-blue .ace_string {\\\n  color: #D1F1A9\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night-blue .ace_meta.ace_tag,\\\n.ace-tomorrow-night-blue .ace_string.ace_regexp,\\\n.ace-tomorrow-night-blue .ace_variable {\\\n  color: #FF9DA4\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_comment {\\\n  color: #7285B7\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-tomorrow-night-blue .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgUAn8z7Bq1ar/ABBUBHJ4/r3JAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-tomorrow_night_bright.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/tomorrow_night_bright', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night-bright\";\nexports.cssText = \".ace-tomorrow-night-bright .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_gutter {\\\n  background: #1a1a1a;\\\n  color: #DEDEDE\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_print_margin {\\\n  width: 1px;\\\n  background: #1a1a1a\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_scroller {\\\n  background-color: #000000\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_text-layer {\\\n  color: #DEDEDE\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_cursor {\\\n  border-left: 2px solid #9F9F9F\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #9F9F9F\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\\\n  background: #424242\\\n}\\\n\\\n.ace-tomorrow-night-bright.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #000000;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #343434\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_active_line {\\\n  background: #2A2A2A\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_gutter_active_line {\\\n  background-color: #2A2A2A\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #424242\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_invisible {\\\n  color: #343434\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_keyword,\\\n.ace-tomorrow-night-bright .ace_meta,\\\n.ace-tomorrow-night-bright .ace_storage,\\\n.ace-tomorrow-night-bright .ace_storage.ace_type,\\\n.ace-tomorrow-night-bright .ace_support.ace_type {\\\n  color: #C397D8\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_keyword.ace_operator {\\\n  color: #70C0B1\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_constant.ace_character,\\\n.ace-tomorrow-night-bright .ace_constant.ace_language,\\\n.ace-tomorrow-night-bright .ace_constant.ace_numeric,\\\n.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night-bright .ace_support.ace_constant,\\\n.ace-tomorrow-night-bright .ace_variable.ace_parameter {\\\n  color: #E78C45\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_constant.ace_other {\\\n  color: #EEEEEE\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_invalid {\\\n  color: #CED2CF;\\\n  background-color: #DF5F5F\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\\\n  color: #CED2CF;\\\n  background-color: #B798BF\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_fold {\\\n  background-color: #7AA6DA;\\\n  border-color: #DEDEDE\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night-bright .ace_support.ace_function,\\\n.ace-tomorrow-night-bright .ace_variable {\\\n  color: #7AA6DA\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_support.ace_class,\\\n.ace-tomorrow-night-bright .ace_support.ace_type {\\\n  color: #E7C547\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_markup.ace_heading,\\\n.ace-tomorrow-night-bright .ace_string {\\\n  color: #B9CA4A\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night-bright .ace_meta.ace_tag,\\\n.ace-tomorrow-night-bright .ace_string.ace_regexp,\\\n.ace-tomorrow-night-bright .ace_variable {\\\n  color: #D54E53\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_comment {\\\n  color: #969896\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-tomorrow-night-bright .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGD4z7Bq1ar/AAz9A/2naJQKAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-tomorrow_night_eighties.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/tomorrow_night_eighties', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night-eighties\";\nexports.cssText = \".ace-tomorrow-night-eighties .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_gutter {\\\n  background: #272727;\\\n  color: #CCC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_print_margin {\\\n  width: 1px;\\\n  background: #272727\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_scroller {\\\n  background-color: #2D2D2D\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_constant.ace_other,\\\n.ace-tomorrow-night-eighties .ace_text-layer {\\\n  color: #CCCCCC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_cursor {\\\n  border-left: 2px solid #CCCCCC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #CCCCCC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\\\n  background: #515151\\\n}\\\n\\\n.ace-tomorrow-night-eighties.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #2D2D2D;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #6A6A6A\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_active_line {\\\n  background: #393939\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_gutter_active_line {\\\n  background-color: #393939\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #515151\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_invisible {\\\n  color: #6A6A6A\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_keyword,\\\n.ace-tomorrow-night-eighties .ace_meta,\\\n.ace-tomorrow-night-eighties .ace_storage,\\\n.ace-tomorrow-night-eighties .ace_storage.ace_type,\\\n.ace-tomorrow-night-eighties .ace_support.ace_type {\\\n  color: #CC99CC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\\\n  color: #66CCCC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_constant.ace_character,\\\n.ace-tomorrow-night-eighties .ace_constant.ace_language,\\\n.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\\\n.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night-eighties .ace_support.ace_constant,\\\n.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\\\n  color: #F99157\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_invalid {\\\n  color: #CDCDCD;\\\n  background-color: #F2777A\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\\\n  color: #CDCDCD;\\\n  background-color: #CC99CC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_fold {\\\n  background-color: #6699CC;\\\n  border-color: #CCCCCC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night-eighties .ace_support.ace_function,\\\n.ace-tomorrow-night-eighties .ace_variable {\\\n  color: #6699CC\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_support.ace_class,\\\n.ace-tomorrow-night-eighties .ace_support.ace_type {\\\n  color: #FFCC66\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_markup.ace_heading,\\\n.ace-tomorrow-night-eighties .ace_string {\\\n  color: #99CC99\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_comment {\\\n  color: #999999\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night-eighties .ace_meta.ace_tag,\\\n.ace-tomorrow-night-eighties .ace_variable {\\\n  color: #F2777A\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-tomorrow-night-eighties .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ1dX9z7Bq1ar/ABE1BITwhhuFAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-twilight.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/twilight', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-twilight\";\nexports.cssText = \".ace-twilight .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-twilight .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-twilight .ace_gutter {\\\n  background: #232323;\\\n  color: #E2E2E2\\\n}\\\n\\\n.ace-twilight .ace_print_margin {\\\n  width: 1px;\\\n  background: #232323\\\n}\\\n\\\n.ace-twilight .ace_scroller {\\\n  background-color: #141414\\\n}\\\n\\\n.ace-twilight .ace_text-layer {\\\n  color: #F8F8F8\\\n}\\\n\\\n.ace-twilight .ace_cursor {\\\n  border-left: 2px solid #A7A7A7\\\n}\\\n\\\n.ace-twilight .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #A7A7A7\\\n}\\\n\\\n.ace-twilight .ace_marker-layer .ace_selection {\\\n  background: rgba(221, 240, 255, 0.20)\\\n}\\\n\\\n.ace-twilight.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #141414;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-twilight .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-twilight .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid rgba(255, 255, 255, 0.25)\\\n}\\\n\\\n.ace-twilight .ace_marker-layer .ace_active_line {\\\n  background: rgba(255, 255, 255, 0.031)\\\n}\\\n\\\n.ace-twilight .ace_gutter_active_line {\\\n  background-color: rgba(255, 255, 255, 0.031)\\\n}\\\n\\\n.ace-twilight .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid rgba(221, 240, 255, 0.20)\\\n}\\\n\\\n.ace-twilight .ace_invisible {\\\n  color: rgba(255, 255, 255, 0.25)\\\n}\\\n\\\n.ace-twilight .ace_keyword,\\\n.ace-twilight .ace_meta {\\\n  color: #CDA869\\\n}\\\n\\\n.ace-twilight .ace_constant,\\\n.ace-twilight .ace_constant.ace_character,\\\n.ace-twilight .ace_constant.ace_character.ace_escape,\\\n.ace-twilight .ace_constant.ace_other,\\\n.ace-twilight .ace_markup.ace_heading,\\\n.ace-twilight .ace_support.ace_constant {\\\n  color: #CF6A4C\\\n}\\\n\\\n.ace-twilight .ace_invalid.ace_illegal {\\\n  color: #F8F8F8;\\\n  background-color: rgba(86, 45, 86, 0.75)\\\n}\\\n\\\n.ace-twilight .ace_invalid.ace_deprecated {\\\n  text-decoration: underline;\\\n  font-style: italic;\\\n  color: #D2A8A1\\\n}\\\n\\\n.ace-twilight .ace_support {\\\n  color: #9B859D\\\n}\\\n\\\n.ace-twilight .ace_fold {\\\n  background-color: #AC885B;\\\n  border-color: #F8F8F8\\\n}\\\n\\\n.ace-twilight .ace_support.ace_function {\\\n  color: #DAD085\\\n}\\\n\\\n.ace-twilight .ace_markup.ace_list,\\\n.ace-twilight .ace_storage {\\\n  color: #F9EE98\\\n}\\\n\\\n.ace-twilight .ace_entity.ace_name.ace_function,\\\n.ace-twilight .ace_meta.ace_tag,\\\n.ace-twilight .ace_variable {\\\n  color: #AC885B\\\n}\\\n\\\n.ace-twilight .ace_string {\\\n  color: #8F9D6A\\\n}\\\n\\\n.ace-twilight .ace_string.ace_regexp {\\\n  color: #E9C062\\\n}\\\n\\\n.ace-twilight .ace_comment {\\\n  font-style: italic;\\\n  color: #5F5A60\\\n}\\\n\\\n.ace-twilight .ace_variable {\\\n  color: #7587A6\\\n}\\\n\\\n.ace-twilight .ace_xml_pe {\\\n  color: #494949\\\n}\\\n\\\n.ace-twilight .ace_markup.ace_underline {\\\n  text-decoration: underline\\\n}\\\n\\\n.ace-twilight .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERH5zzBz5sz/AA5EBAYqeZXWAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-vibrant_ink.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/vibrant_ink', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-vibrant-ink\";\nexports.cssText = \".ace-vibrant-ink .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-vibrant-ink .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-vibrant-ink .ace_gutter {\\\n  background: #1a1a1a;\\\n  color: #BEBEBE\\\n}\\\n\\\n.ace-vibrant-ink .ace_print_margin {\\\n  width: 1px;\\\n  background: #1a1a1a\\\n}\\\n\\\n.ace-vibrant-ink .ace_scroller {\\\n  background-color: #0F0F0F\\\n}\\\n\\\n.ace-vibrant-ink .ace_text-layer {\\\n  color: #FFFFFF\\\n}\\\n\\\n.ace-vibrant-ink .ace_cursor {\\\n  border-left: 2px solid #FFFFFF\\\n}\\\n\\\n.ace-vibrant-ink .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #FFFFFF\\\n}\\\n\\\n.ace-vibrant-ink .ace_marker-layer .ace_selection {\\\n  background: #6699CC\\\n}\\\n\\\n.ace-vibrant-ink.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #0F0F0F;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-vibrant-ink .ace_marker-layer .ace_step {\\\n  background: rgb(102, 82, 0)\\\n}\\\n\\\n.ace-vibrant-ink .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #404040\\\n}\\\n\\\n.ace-vibrant-ink .ace_marker-layer .ace_active_line {\\\n  background: #333333\\\n}\\\n\\\n.ace-vibrant-ink .ace_gutter_active_line {\\\n  background-color: #333333\\\n}\\\n\\\n.ace-vibrant-ink .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #6699CC\\\n}\\\n\\\n.ace-vibrant-ink .ace_invisible {\\\n  color: #404040\\\n}\\\n\\\n.ace-vibrant-ink .ace_keyword,\\\n.ace-vibrant-ink .ace_meta {\\\n  color: #FF6600\\\n}\\\n\\\n.ace-vibrant-ink .ace_constant,\\\n.ace-vibrant-ink .ace_constant.ace_character,\\\n.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\\\n.ace-vibrant-ink .ace_constant.ace_other {\\\n  color: #339999\\\n}\\\n\\\n.ace-vibrant-ink .ace_constant.ace_numeric {\\\n  color: #99CC99\\\n}\\\n\\\n.ace-vibrant-ink .ace_invalid,\\\n.ace-vibrant-ink .ace_invalid.ace_deprecated {\\\n  color: #CCFF33;\\\n  background-color: #000000\\\n}\\\n\\\n.ace-vibrant-ink .ace_fold {\\\n  background-color: #FFCC00;\\\n  border-color: #FFFFFF\\\n}\\\n\\\n.ace-vibrant-ink .ace_entity.ace_name.ace_function,\\\n.ace-vibrant-ink .ace_support.ace_function,\\\n.ace-vibrant-ink .ace_variable {\\\n  color: #FFCC00\\\n}\\\n\\\n.ace-vibrant-ink .ace_variable.ace_parameter {\\\n  font-style: italic\\\n}\\\n\\\n.ace-vibrant-ink .ace_string {\\\n  color: #66FF00\\\n}\\\n\\\n.ace-vibrant-ink .ace_string.ace_regexp {\\\n  color: #44B4CC\\\n}\\\n\\\n.ace-vibrant-ink .ace_comment {\\\n  color: #9933CC\\\n}\\\n\\\n.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\\\n  font-style: italic;\\\n  color: #99CC99\\\n}\\\n\\\n.ace-vibrant-ink .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPg5+f/z7Bq1ar/AA5lBCqoLxsgAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/theme-xcode.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/xcode', ['require', 'exports', 'module', 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-xcode\";\nexports.cssText = \"/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */\\\n.ace-xcode .ace_editor {\\\n  border: 2px solid rgb(159, 159, 159)\\\n}\\\n\\\n.ace-xcode .ace_editor.ace_focus {\\\n  border: 2px solid #327fbd\\\n}\\\n\\\n.ace-xcode .ace_gutter {\\\n  background: #e8e8e8;\\\n  color: #333\\\n}\\\n\\\n.ace-xcode .ace_print_margin {\\\n  width: 1px;\\\n  background: #e8e8e8\\\n}\\\n\\\n.ace-xcode .ace_scroller {\\\n  background-color: #FFFFFF\\\n}\\\n\\\n.ace-xcode .ace_text-layer {\\\n  color: #000000\\\n}\\\n\\\n.ace-xcode .ace_cursor {\\\n  border-left: 2px solid #000000\\\n}\\\n\\\n.ace-xcode .ace_cursor.ace_overwrite {\\\n  border-left: 0px;\\\n  border-bottom: 1px solid #000000\\\n}\\\n\\\n.ace-xcode .ace_marker-layer .ace_selection {\\\n  background: #B5D5FF\\\n}\\\n\\\n.ace-xcode.multiselect .ace_selection.start {\\\n  box-shadow: 0 0 3px 0px #FFFFFF;\\\n  border-radius: 2px\\\n}\\\n\\\n.ace-xcode .ace_marker-layer .ace_step {\\\n  background: rgb(198, 219, 174)\\\n}\\\n\\\n.ace-xcode .ace_marker-layer .ace_bracket {\\\n  margin: -1px 0 0 -1px;\\\n  border: 1px solid #BFBFBF\\\n}\\\n\\\n.ace-xcode .ace_marker-layer .ace_active_line {\\\n  background: rgba(0, 0, 0, 0.071)\\\n}\\\n\\\n.ace-xcode .ace_gutter_active_line {\\\n  background-color: rgba(0, 0, 0, 0.071)\\\n}\\\n\\\n.ace-xcode .ace_marker-layer .ace_selected_word {\\\n  border: 1px solid #B5D5FF\\\n}\\\n\\\n.ace-xcode .ace_constant.ace_language,\\\n.ace-xcode .ace_keyword,\\\n.ace-xcode .ace_meta,\\\n.ace-xcode .ace_variable.ace_language {\\\n  color: #C800A4\\\n}\\\n\\\n.ace-xcode .ace_invisible {\\\n  color: #BFBFBF\\\n}\\\n\\\n.ace-xcode .ace_constant.ace_character,\\\n.ace-xcode .ace_constant.ace_other {\\\n  color: #275A5E\\\n}\\\n\\\n.ace-xcode .ace_constant.ace_numeric {\\\n  color: #3A00DC\\\n}\\\n\\\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\\\n.ace-xcode .ace_support.ace_constant,\\\n.ace-xcode .ace_support.ace_function {\\\n  color: #450084\\\n}\\\n\\\n.ace-xcode .ace_fold {\\\n  background-color: #C800A4;\\\n  border-color: #000000\\\n}\\\n\\\n.ace-xcode .ace_entity.ace_name.ace_tag,\\\n.ace-xcode .ace_support.ace_class,\\\n.ace-xcode .ace_support.ace_type {\\\n  color: #790EAD\\\n}\\\n\\\n.ace-xcode .ace_storage {\\\n  color: #C900A4\\\n}\\\n\\\n.ace-xcode .ace_string {\\\n  color: #DF0002\\\n}\\\n\\\n.ace-xcode .ace_comment {\\\n  color: #008E00\\\n}\\\n\\\n.ace-xcode .ace_indent-guide {\\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y;\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/worker-coffee.js",
    "content": "\"no use strict\";\n\nvar console = {\n    log: function(msgs) {\n        postMessage({type: \"log\", data: arguments.join(\" \")});\n    }\n};\nvar window = {\n    console: console\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        var moduleName = base + \"/\" + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            var moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nvar require = function(parentId, id) {\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    var id = normalizeModule(parentId, id);\n    \n    var module = require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    require.id = id;\n    importScripts(path);\n    return require(parentId, id);    \n};\n\nrequire.modules = {};\nrequire.tlns = {};\n\nvar define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        id = require.id;\n    }\n\n    if (id.indexOf(\"text!\") === 0) \n        return;\n    \n    var req = function(deps, factory) {\n        return require(id, deps, factory);\n    };\n\n    require.modules[id] = {\n        factory: function() {\n            var module = {\n                exports: {}\n            };\n            var returnExports = factory(req, module.exports, module);\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\n\nfunction initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n}\n\nfunction initSender() {\n\n    var EventEmitter = require(null, \"ace/lib/event_emitter\").EventEmitter;\n    var oop = require(null, \"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n}\n\nvar main;\nvar sender;\n\nonmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        main[msg.command].apply(main, msg.args);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(null, \"ace/lib/fixoldbrowsers\");\n        sender = initSender();\n        var clazz = require(null, msg.module)[msg.classname];\n        main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._emit(msg.event, msg.data);\n    }\n};\n// vim:set ts=4 sts=4 sw=4 st:\n// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright(C) 2010 XXX No License Specified\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Irakli Gozalishvili Copyright (C) 2010 MIT License\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n \ndefine('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n\n    //---------------------------------\n    //  Overriden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n\n    // Don't override `test` if it won't change anything\n    if (!compliantLastIndexIncrement) {\n        // Fix browser bug in native method\n        RegExp.prototype.test = function (str) {\n            // Use the native `exec` to skip some processing overhead, even though the overriden\n            // `exec` would take care of the `lastIndex` fix\n            var match = real.exec.call(this, str);\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n// vim: ts=4 sts=4 sw=4 expandtab\n// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License\n// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License\n// -- kossnocorp Sasha Koss XXX TODO License or CLA\n// -- bryanforbes Bryan Forbes XXX TODO License or CLA\n// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence\n// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License\n// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License\n// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain)\n// -- iwyg XXX TODO License or CLA\n// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License\n// -- xavierm02 Montillet Xavier XXX TODO License or CLA\n// -- Raynos Raynos XXX TODO License or CLA\n// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License\n// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License\n// -- lexer Alexey Zakharov XXX TODO License or CLA\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n/*\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: http://es5.github.com/ (specific links below)\n * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n *\n * @module\n */\n\n/*whatsupdoc*/\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        // 1. Let Target be the this value.\n        var target = this;\n        // 2. If IsCallable(Target) is false, throw a TypeError exception.\n        if (typeof target != \"function\")\n            throw new TypeError(); // TODO message\n        // 3. Let A be a new (possibly empty) internal list of all of the\n        //   argument values provided after thisArg (arg1, arg2 etc), in order.\n        // XXX slicedArgs will stand in for \"A\" if used\n        var args = slice.call(arguments, 1); // for normal call\n        // 4. Let F be a new native ECMAScript object.\n        // 11. Set the [[Prototype]] internal property of F to the standard\n        //   built-in Function prototype object as specified in 15.3.3.1.\n        // 12. Set the [[Call]] internal property of F as described in\n        //   15.3.4.5.1.\n        // 13. Set the [[Construct]] internal property of F as described in\n        //   15.3.4.5.2.\n        // 14. Set the [[HasInstance]] internal property of F as described in\n        //   15.3.4.5.3.\n        var bound = function () {\n\n            if (this instanceof bound) {\n                // 15.3.4.5.2 [[Construct]]\n                // When the [[Construct]] internal method of a function object,\n                // F that was created using the bind function is called with a\n                // list of arguments ExtraArgs, the following steps are taken:\n                // 1. Let target be the value of F's [[TargetFunction]]\n                //   internal property.\n                // 2. If target has no [[Construct]] internal method, a\n                //   TypeError exception is thrown.\n                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Construct]] internal \n                //   method of target providing args as the arguments.\n\n                var F = function(){};\n                F.prototype = target.prototype;\n                var self = new F;\n\n                var result = target.apply(\n                    self,\n                    args.concat(slice.call(arguments))\n                );\n                if (result !== null && Object(result) === result)\n                    return result;\n                return self;\n\n            } else {\n                // 15.3.4.5.1 [[Call]]\n                // When the [[Call]] internal method of a function object, F,\n                // which was created using the bind function is called with a\n                // this value and a list of arguments ExtraArgs, the following\n                // steps are taken:\n                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                //   property.\n                // 3. Let target be the value of F's [[TargetFunction]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the \n                //   list boundArgs in the same order followed by the same \n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Call]] internal method \n                //   of target providing boundThis as the this value and \n                //   providing args as the arguments.\n\n                // equiv: target.call(this, ...boundArgs, ...args)\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        // XXX bound.length is never writable, so don't even try\n        //\n        // 15. If the [[Class]] internal property of Target is \"Function\", then\n        //     a. Let L be the length property of Target minus the length of A.\n        //     b. Set the length own property of F to either 0 or L, whichever is \n        //       larger.\n        // 16. Else set the length own property of F to 0.\n        // 17. Set the attributes of the length own property of F to the values\n        //   specified in 15.3.5.1.\n\n        // TODO\n        // 18. Set the [[Extensible]] internal property of F to true.\n        \n        // TODO\n        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n        // 20. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and \n        //   false.\n        // 21. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower, \n        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n        //   and false.\n\n        // TODO\n        // NOTE Function objects created using Function.prototype.bind do not \n        // have a prototype property or the [[Code]], [[FormalParameters]], and\n        // [[Scope]] internal properties.\n        // XXX can't delete prototype in pure-js.\n\n        // 22. Return F.\n        return bound;\n    };\n}\n\n// Shortcut to an often accessed properties, in order to avoid multiple\n// dereference that costs universally.\n// _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n// us it in defining shortcuts.\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\n\n// If JS engine supports accessors creating shortcuts.\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\n\n//\n// Array\n// =====\n//\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return toString(obj) == \"[object Array]\";\n    };\n}\n\n// The IsCallable() check in the Array functions\n// has been replaced with a strict check on the\n// internal class of the object to trap cases where\n// the provided function was actually a regular\n// expression literal, which in V8 and\n// JavaScriptCore is a typeof \"function\".  Only in\n// V8 are regular expression literals permitted as\n// reduce parameters, so it is desirable in the\n// general case for the shim to match the more\n// strict and common behavior of rejecting regular\n// expressions.\n\n// ES5 15.4.4.18\n// http://es5.github.com/#x15.4.4.18\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var self = toObject(this),\n            thisp = arguments[1],\n            i = 0,\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (i < length) {\n            if (i in self) {\n                // Invoke the callback function with call, passing arguments:\n                // context, property value, property key, thisArg object context\n                fun.call(thisp, self[i], i, self);\n            }\n            i++;\n        }\n    };\n}\n\n// ES5 15.4.4.19\n// http://es5.github.com/#x15.4.4.19\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, self);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.20\n// http://es5.github.com/#x15.4.4.20\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = [],\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                result.push(self[i]);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.16\n// http://es5.github.com/#x15.4.4.16\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, self))\n                return false;\n        }\n        return true;\n    };\n}\n\n// ES5 15.4.4.17\n// http://es5.github.com/#x15.4.4.17\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                return true;\n        }\n        return false;\n    };\n}\n\n// ES5 15.4.4.21\n// http://es5.github.com/#x15.4.4.21\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value and an empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (++i >= length)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self)\n                result = fun.call(void 0, result, self[i], i, self);\n        }\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.22\n// http://es5.github.com/#x15.4.4.22\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value, empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (--i < 0)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        do {\n            if (i in this)\n                result = fun.call(void 0, result, self[i], i, self);\n        } while (i--);\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n\n        var i = 0;\n        if (arguments.length > 1)\n            i = toInteger(arguments[1]);\n\n        // handle negative indices\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\n// ES5 15.4.4.15\n// http://es5.github.com/#x15.4.4.15\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\nif (!Array.prototype.lastIndexOf) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n        var i = length - 1;\n        if (arguments.length > 1)\n            i = Math.min(i, toInteger(arguments[1]));\n        // handle negative indices\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i])\n                return i;\n        }\n        return -1;\n    };\n}\n\n//\n// Object\n// ======\n//\n\n// ES5 15.2.3.2\n// http://es5.github.com/#x15.2.3.2\nif (!Object.getPrototypeOf) {\n    // https://github.com/kriskowal/es5-shim/issues#issue/2\n    // http://ejohn.org/blog/objectgetprototypeof/\n    // recommended by fschaefer on github\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\n\n// ES5 15.2.3.3\n// http://es5.github.com/#x15.2.3.3\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        // If object does not owns property return undefined immediately.\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n\n        // If object has a property then it's for sure both `enumerable` and\n        // `configurable`.\n        descriptor =  { enumerable: true, configurable: true };\n\n        // If JS engine supports accessor properties then property may be a\n        // getter or setter.\n        if (supportsAccessors) {\n            // Unfortunately `__lookupGetter__` will return a getter even\n            // if object has own non getter property along with a same named\n            // inherited getter. To avoid misbehavior we temporary remove\n            // `__proto__` so that `__lookupGetter__` will return getter only\n            // if it's owned by an object.\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n\n            // Once we have getter and setter we can put values back.\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n\n                // If it was accessor property we're done and return here\n                // in order to avoid adding `value` to the descriptor.\n                return descriptor;\n            }\n        }\n\n        // If we got this far we know that object has an own property that is\n        // not an accessor so we set it as a value and return descriptor.\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\n\n// ES5 15.2.3.4\n// http://es5.github.com/#x15.2.3.4\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\n\n// ES5 15.2.3.5\n// http://es5.github.com/#x15.2.3.5\nif (!Object.create) {\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = { \"__proto__\": null };\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            // IE has no built-in implementation of `Object.getPrototypeOf`\n            // neither `__proto__`, but this manually setting `__proto__` will\n            // guarantee that `Object.getPrototypeOf` will work as expected with\n            // objects created using `Object.create`\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\n// ES5 15.2.3.6\n// http://es5.github.com/#x15.2.3.6\n\n// Patch for WebKit and IE8 standard mode\n// Designed by hax <hax.github.com>\n// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5\n// IE8 Reference:\n//     http://msdn.microsoft.com/en-us/library/dd282900.aspx\n//     http://msdn.microsoft.com/en-us/library/dd229916.aspx\n// WebKit Bugs:\n//     https://bugs.webkit.org/show_bug.cgi?id=36423\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n        // returns falsy\n    }\n}\n\n// check whether defineProperty works if it's given. Otherwise,\n// shim partially.\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n\n        // make a valiant attempt to use the real defineProperty\n        // for I8's DOM elements.\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n                // try the shim if the real one doesn't work\n            }\n        }\n\n        // If it's a data property.\n        if (owns(descriptor, \"value\")) {\n            // fail silently if \"writable\", \"enumerable\", or \"configurable\"\n            // are requested but not supported\n            /*\n            // alternate approach:\n            if ( // can't implement these features; allow false but not true\n                !(owns(descriptor, \"writable\") ? descriptor.writable : true) ||\n                !(owns(descriptor, \"enumerable\") ? descriptor.enumerable : true) ||\n                !(owns(descriptor, \"configurable\") ? descriptor.configurable : true)\n            )\n                throw new RangeError(\n                    \"This implementation of Object.defineProperty does not \" +\n                    \"support configurable, enumerable, or writable.\"\n                );\n            */\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                // As accessors are supported only on engines implementing\n                // `__proto__` we can safely override `__proto__` while defining\n                // a property to make sure that we don't hit an inherited\n                // accessor.\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                // Deleting a property anyway since getter / setter may be\n                // defined on object itself.\n                delete object[property];\n                object[property] = descriptor.value;\n                // Setting original `__proto__` back now.\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            // If we got that far then getters and setters can be defined !!\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\n\n// ES5 15.2.3.7\n// http://es5.github.com/#x15.2.3.7\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\n\n// ES5 15.2.3.8\n// http://es5.github.com/#x15.2.3.8\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.9\n// http://es5.github.com/#x15.2.3.9\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// detect a Rhino bug and patch it\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\n\n// ES5 15.2.3.10\n// http://es5.github.com/#x15.2.3.10\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.11\n// http://es5.github.com/#x15.2.3.11\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.12\n// http://es5.github.com/#x15.2.3.12\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.13\n// http://es5.github.com/#x15.2.3.13\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        // 1. If Type(O) is not Object throw a TypeError exception.\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        // 2. Return the Boolean value of the [[Extensible]] internal property of O.\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\n\n// ES5 15.2.3.14\n// http://es5.github.com/#x15.2.3.14\nif (!Object.keys) {\n    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null})\n        hasDontEnumBug = false;\n\n    Object.keys = function keys(object) {\n\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(\"Object.keys called on a non-object\");\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n\n        return keys;\n    };\n\n}\n\n//\n// Date\n// ====\n//\n\n// ES5 15.9.5.43\n// http://es5.github.com/#x15.9.5.43\n// This function returns a String value represent the instance in time \n// represented by this Date object. The format of the String is the Date Time \n// string format defined in 15.9.1.15. All fields are present in the String. \n// The time zone is always UTC, denoted by the suffix Z. If the time value of \n// this object is not a finite Number a RangeError exception is thrown.\nif (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) {\n    Date.prototype.toISOString = function toISOString() {\n        var result, length, value, year;\n        if (!isFinite(this))\n            throw new RangeError;\n\n        // the date time string format is specified in 15.9.1.15.\n        result = [this.getUTCMonth() + 1, this.getUTCDate(),\n            this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];\n        year = this.getUTCFullYear();\n        year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6);\n\n        length = result.length;\n        while (length--) {\n            value = result[length];\n            // pad months, days, hours, minutes, and seconds to have two digits.\n            if (value < 10)\n                result[length] = \"0\" + value;\n        }\n        // pad milliseconds to have three digits.\n        return year + \"-\" + result.slice(0, 2).join(\"-\") + \"T\" + result.slice(2).join(\":\") + \".\" +\n            (\"000\" + this.getUTCMilliseconds()).slice(-3) + \"Z\";\n    }\n}\n\n// ES5 15.9.4.4\n// http://es5.github.com/#x15.9.4.4\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\n\n// ES5 15.9.5.44\n// http://es5.github.com/#x15.9.5.44\n// This function provides a String representation of a Date object for use by \n// JSON.stringify (15.12.3).\nif (!Date.prototype.toJSON) {\n    Date.prototype.toJSON = function toJSON(key) {\n        // When the toJSON method is called with argument key, the following \n        // steps are taken:\n\n        // 1.  Let O be the result of calling ToObject, giving it the this\n        // value as its argument.\n        // 2. Let tv be ToPrimitive(O, hint Number).\n        // 3. If tv is a Number and is not finite, return null.\n        // XXX\n        // 4. Let toISO be the result of calling the [[Get]] internal method of\n        // O with argument \"toISOString\".\n        // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n        if (typeof this.toISOString != \"function\")\n            throw new TypeError(); // TODO message\n        // 6. Return the result of calling the [[Call]] internal method of\n        //  toISO with O as the this value and an empty argument list.\n        return this.toISOString();\n\n        // NOTE 1 The argument is ignored.\n\n        // NOTE 2 The toJSON function is intentionally generic; it does not\n        // require that its this value be a Date object. Therefore, it can be\n        // transferred to other kinds of objects for use as a method. However,\n        // it does require that any such object have a toISOString method. An\n        // object is free to use the argument key to filter its\n        // stringification.\n    };\n}\n\n// ES5 15.9.4.2\n// http://es5.github.com/#x15.9.4.2\n// based on work shared by Daniel Friesen (dantman)\n// http://gist.github.com/303249\nif (Date.parse(\"+275760-09-13T00:00:00.000Z\") !== 8.64e15) {\n    // XXX global assignment won't work in embeddings that use\n    // an alternate object for the context.\n    Date = (function(NativeDate) {\n\n        // Date.length === 7\n        var Date = function Date(Y, M, D, h, m, s, ms) {\n            var length = arguments.length;\n            if (this instanceof NativeDate) {\n                var date = length == 1 && String(Y) === Y ? // isString(Y)\n                    // We explicitly pass it through parse:\n                    new NativeDate(Date.parse(Y)) :\n                    // We have to manually make calls depending on argument\n                    // length here\n                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\n                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\n                    length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                    length >= 4 ? new NativeDate(Y, M, D, h) :\n                    length >= 3 ? new NativeDate(Y, M, D) :\n                    length >= 2 ? new NativeDate(Y, M) :\n                    length >= 1 ? new NativeDate(Y) :\n                                  new NativeDate();\n                // Prevent mixups with unfixed Date object\n                date.constructor = Date;\n                return date;\n            }\n            return NativeDate.apply(this, arguments);\n        };\n\n        // 15.9.1.15 Date Time String Format.\n        var isoDateExpression = new RegExp(\"^\" +\n            \"(\\\\d{4}|[\\+\\-]\\\\d{6})\" + // four-digit year capture or sign + 6-digit extended year\n            \"(?:-(\\\\d{2})\" + // optional month capture\n            \"(?:-(\\\\d{2})\" + // optional day capture\n            \"(?:\" + // capture hours:minutes:seconds.milliseconds\n                \"T(\\\\d{2})\" + // hours capture\n                \":(\\\\d{2})\" + // minutes capture\n                \"(?:\" + // optional :seconds.milliseconds\n                    \":(\\\\d{2})\" + // seconds capture\n                    \"(?:\\\\.(\\\\d{3}))?\" + // milliseconds capture\n                \")?\" +\n            \"(?:\" + // capture UTC offset component\n                \"Z|\" + // UTC capture\n                \"(?:\" + // offset specifier +/-hours:minutes\n                    \"([-+])\" + // sign capture\n                    \"(\\\\d{2})\" + // hours offset capture\n                    \":(\\\\d{2})\" + // minutes offset capture\n                \")\" +\n            \")?)?)?)?\" +\n        \"$\");\n\n        // Copy any custom methods a 3rd party library may have added\n        for (var key in NativeDate)\n            Date[key] = NativeDate[key];\n\n        // Copy \"native\" methods explicitly; they may be non-enumerable\n        Date.now = NativeDate.now;\n        Date.UTC = NativeDate.UTC;\n        Date.prototype = NativeDate.prototype;\n        Date.prototype.constructor = Date;\n\n        // Upgrade Date.parse to handle simplified ISO 8601 strings\n        Date.parse = function parse(string) {\n            var match = isoDateExpression.exec(string);\n            if (match) {\n                match.shift(); // kill match[0], the full match\n                // parse months, days, hours, minutes, seconds, and milliseconds\n                for (var i = 1; i < 7; i++) {\n                    // provide default values if necessary\n                    match[i] = +(match[i] || (i < 3 ? 1 : 0));\n                    // match[1] is the month. Months are 0-11 in JavaScript\n                    // `Date` objects, but 1-12 in ISO notation, so we\n                    // decrement.\n                    if (i == 1)\n                        match[i]--;\n                }\n\n                // parse the UTC offset component\n                var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop();\n\n                // compute the explicit time zone offset if specified\n                var offset = 0;\n                if (sign) {\n                    // detect invalid offsets and return early\n                    if (hourOffset > 23 || minuteOffset > 59)\n                        return NaN;\n\n                    // express the provided time zone offset in minutes. The offset is\n                    // negative for time zones west of UTC; positive otherwise.\n                    offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == \"+\" ? -1 : 1);\n                }\n\n                // Date.UTC for years between 0 and 99 converts year to 1900 + year\n                // The Gregorian calendar has a 400-year cycle, so \n                // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...),\n                // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years\n                var year = +match[0];\n                if (0 <= year && year <= 99) {\n                    match[0] = year + 400;\n                    return NativeDate.UTC.apply(this, match) + offset - 12622780800000;\n                }\n\n                // compute a new UTC date value, accounting for the optional offset\n                return NativeDate.UTC.apply(this, match) + offset;\n            }\n            return NativeDate.parse.apply(this, arguments);\n        };\n\n        return Date;\n    })(Date);\n}\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.20\n// http://es5.github.com/#x15.5.4.20\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n    // http://perfectionkills.com/whitespace-deviations/\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\n//\n// Util\n// ======\n//\n\n// ES5 9.4\n// http://es5.github.com/#x9.4\n// http://jsperf.com/to-integer\nvar toInteger = function (n) {\n    n = +n;\n    if (n !== n) // isNaN\n        n = 0;\n    else if (n !== 0 && n !== (1/0) && n !== -(1/0))\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    return n;\n};\n\nvar prepareString = \"a\"[0] != \"a\",\n    // ES5 9.9\n    // http://es5.github.com/#x9.9\n    toObject = function (o) {\n        if (o == null) { // this matches both null and undefined\n            throw new TypeError(); // TODO message\n        }\n        // If the implementation doesn't support by-index access of\n        // string characters (ex. IE < 7), split the string\n        if (prepareString && typeof o == \"string\" && o) {\n            return o.split(\"\");\n        }\n        return Object(o);\n    };\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry = this._eventRegistry || {};\n    this._defaultHandlers = this._defaultHandlers || {};\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    \n    if (!e.stopPropagation) {\n        e.stopPropagation = function() {\n            this.propagationStopped = true;\n        };\n    }\n    \n    if (!e.preventDefault) {\n        e.preventDefault = function() {\n            this.defaultPrevented = true;\n        };\n    }\n\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e);\n};\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    this._defaultHandlers = this._defaultHandlers || {};\n    \n    if (this._defaultHandlers[eventName])\n        throw new Error(\"The default handler for '\" + eventName + \"' is already set\");\n        \n    this._defaultHandlers[eventName] = callback;\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners.push(callback);\n};\n\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var tempCtor = function() {};\n    return function(ctor, superCtor) {\n        tempCtor.prototype = superCtor.prototype;\n        ctor.super_ = superCtor.prototype;\n        ctor.prototype = new tempCtor();\n        ctor.prototype.constructor = ctor;\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\ndefine('ace/mode/coffee_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/coffee/coffee-script'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar coffee = require(\"../mode/coffee/coffee-script\");\n\nwindow.addEventListener = function() {};\n\n\nvar Worker = exports.Worker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(200);\n};\n\noop.inherits(Worker, Mirror);\n\n(function() {\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n\n        try {\n            coffee.parse(value);\n        } catch(e) {\n            var m = e.message.match(/Parse error on line (\\d+): (.*)/);\n            if (m) {\n                this.sender.emit(\"error\", {\n                    row: parseInt(m[1], 10) - 1,\n                    column: null,\n                    text: m[2],\n                    type: \"error\"\n                });\n                return;\n            }\n\n            if (e instanceof SyntaxError) {\n                var m = e.message.match(/ on line (\\d+)/);\n                if (m) {\n                    this.sender.emit(\"error\", {\n                        row: parseInt(m[1], 10) - 1,\n                        column: null,\n                        text: e.message.replace(m[0], \"\"),\n                        type: \"error\"\n                    });\n                }\n            }\n            return;\n        }\n        this.sender.emit(\"ok\");\n    };\n\n}).call(Worker.prototype);\n\n});\ndefine('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas([e.data]);        \n        deferredUpdate.schedule(_self.$timeout);\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n        // abstract method\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\n /**\n * new Document([text])\n * - text (String | Array): The starting text\n *\n * Creates a new `Document`. If `text` is included, the `Document` contains those strings; otherwise, it's empty.\n *\n **/\n\nvar Document = function(text) {\n    this.$lines = [];\n\n    // There has to be one line at least in the document. If you pass an empty\n    // string to the insert function, nothing will happen. Workaround.\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this.insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n\n    // check for IE split bug\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getNewLineCharacter = function() {\n      switch (this.$newLineMode) {\n          case \"windows\":\n              return \"\\r\\n\";\n\n          case \"unix\":\n              return \"\\n\";\n\n          case \"auto\":\n              return this.$autoNewLine;\n      }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.$lines[range.start.row].substring(range.start.column,\n                                                         range.end.column);\n        }\n        else {\n            var lines = this.getLines(range.start.row+1, range.end.row-1);\n            lines.unshift((this.$lines[range.start.row] || \"\").substring(range.start.column));\n            lines.push((this.$lines[range.end.row] || \"\").substring(0, range.end.column));\n            return lines.join(this.getNewLineCharacter());\n        }\n    };\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        }\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n\n        // only detect new lines if the document has no line break yet\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this.insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    /**\n     * Document@change(e)\n     * - e (Object): Contains at least one property called `\"action\"`. `\"action\"` indicates the action that triggered the change. Each action also has a set of additional properties.\n     *\n     * Fires whenever the document changes.\n     *\n     * Several methods trigger different `\"change\"` events. Below is a list of each action type, followed by each property that's also available:\n     *\n     *  * `\"insertLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that are changing\n     *  * `\"insertText\"` (emitted by [[Document.insertNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being added\n     *  * `\"removeLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that were removed\n     *    * `nl`: the new line character (as defined by [[Document.getNewLineCharacter]])\n     *  * `\"removeText\"` (emitted by [[Document.removeInLine]] and [[Document.removeNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being removed\n     *\n     **/\n    this.insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n\n        // apply doesn't work for big arrays (smallest threshold is on safari 0xFFFF)\n        // to circumvent that we have to break huge inserts into smaller chunks here\n        if (lines.length > 0xFFFF) {\n            var end = this.insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        // clip to document\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this.removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n\n        // Shortcut: If the text we want to insert is the same as it is already\n        // in the document, we don't have to replace anything.\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Range\n *\n * This object is used in various places to indicate a region within the editor. To better visualize how this works, imagine a rectangle. Each quadrant of the rectangle is analogus to a range, as ranges contain a starting row and starting column, and an ending row, and ending column.\n *\n **/\n\n/**\n * new Range(startRow, startColumn, endRow, endColumn)\n * - startRow (Number): The starting row\n * - startColumn (Number): The starting column\n * - endRow (Number): The ending row\n * - endColumn (Number): The ending column\n *\n * Creates a new `Range` object with the given starting and ending row and column points.\n *\n **/\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    /**\n     * Range.isEqual(range) -> Boolean\n     * - range (Range): A range to check against\n     *\n     * Returns `true` if and only if the starting row and column, and ending tow and column, are equivalent to those given by `range`.\n     *\n     **/ \n    this.isEqual = function(range) {\n        return this.start.row == range.start.row &&\n            this.end.row == range.end.row &&\n            this.start.column == range.start.column &&\n            this.end.column == range.end.column\n    }; \n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    }; \n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    }; \n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.comparePoint(p) -> Number\n     * - p (Range): A point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1<br/>\n     *\n     * Checks the row and column points of `p` with the row and column points of the calling range.\n     *\n     * \n     *\n     **/ \n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    }\n\n    /** related to: Range.comparePoint\n     * Range.containsRange(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Checks the start and end points of `range` and compares them to the calling range. Returns `true` if the `range` is contained within the caller's range.\n     *\n     **/ \n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    }\n\n    /**\n     * Range.intersects(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Returns `true` if passed in `range` intersects with the one calling this method.\n     *\n     **/\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    }\n\n    /**\n     * Range.isEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's ending row point is the same as `row`, and if the caller's ending column is the same as `column`.\n     *\n     **/\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    }\n\n    /**\n     * Range.isStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's starting row point is the same as `row`, and if the caller's starting column is the same as `column`.\n     *\n     **/ \n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    }\n\n    /**\n     * Range.setStart(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    }\n\n    /**\n     * Range.setEnd(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.inside(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range.\n     *\n     **/ \n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's starting points.\n     *\n     **/ \n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's ending points.\n     *\n     **/ \n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** \n     * Range.compare(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal <br/>\n     * * `-1` if `p.row` is less then the calling range <br/>\n     * * `1` if `p.row` is greater than the calling range <br/>\n     *  <br/>\n     * If the starting row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     * <br/>\n     * If the ending row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0` <br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /**\n     * Range.compareEnd(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range, or if `isEnd` is `true.<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.compareInside(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `1` if the ending row of the calling range is equal to `row`, and the ending column of the calling range is equal to `column`<br/>\n     * * `-1` if the starting row of the calling range is equal to `row`, and the starting column of the calling range is equal to `column`<br/>\n     * <br/>\n     * Otherwise, it returns the value after calling [[Range.compare `compare()`]].\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     *\n     **/\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.clipRows(firstRow, lastRow) -> Range\n     * - firstRow (Number): The starting row\n     * - lastRow (Number): The ending row\n     *\n     * Returns the part of the current `Range` that occurs within the boundaries of `firstRow` and `lastRow` as a new `Range` object.\n     *\n    **/\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow) {\n            var end = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row > lastRow) {\n            var start = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row < firstRow) {\n            var start = {\n                row: firstRow,\n                column: 0\n            };\n        }\n\n        if (this.end.row < firstRow) {\n            var end = {\n                row: firstRow,\n                column: 0\n            };\n        }\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row == this.end.row && this.start.column == this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart =\n            session.documentToScreenPosition(this.start);\n        var screenPosEnd =\n            session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\n\nexports.Range = Range;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n/**\n * new Anchor(doc, row, column)\n * - doc (Document): The document to associate with the anchor\n * - row (Number): The starting row position\n * - column (Number): The starting column position\n *\n * Creates a new `Anchor` and associates it with a document.\n *\n **/\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.document = doc;\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n\n    this.$onChange = this.onChange.bind(this);\n    doc.on(\"change\", this.$onChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n        \n    this.getDocument = function() {\n        return this.document;\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n            \n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n            \n        if (range.start.row > this.row)\n            return;\n            \n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n    \n        var row = this.row;\n        var column = this.column;\n        \n        if (delta.action === \"insertText\") {\n            if (range.start.row === row && range.start.column <= column) {\n                if (range.start.row === range.end.row) {\n                    column += range.end.column - range.start.column;\n                }\n                else {\n                    column -= range.start.column;\n                    row += range.end.row - range.start.row;\n                }\n            }\n            else if (range.start.row !== range.end.row && range.start.row < row) {\n                row += range.end.row - range.start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (range.start.row <= row) {\n                row += range.end.row - range.start.row;\n            }\n        }\n        else if (delta.action == \"removeText\") {\n            if (range.start.row == row && range.start.column < column) {\n                if (range.end.column >= column)\n                    column = range.start.column;\n                else\n                    column = Math.max(0, column - (range.end.column - range.start.column));\n                \n            } else if (range.start.row !== range.end.row && range.start.row < row) {\n                if (range.end.row == row) {\n                    column = Math.max(0, column - range.end.column) + range.start.column;\n                }\n                row -= (range.end.row - range.start.row);\n            }\n            else if (range.end.row == row) {\n                row -= range.end.row - range.start.row;\n                column = Math.max(0, column - range.end.column) + range.start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (range.start.row <= row) {\n                if (range.end.row <= row)\n                    row -= range.end.row - range.start.row;\n                else {\n                    row = range.start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        }\n        else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n        \n        if (this.row == pos.row && this.column == pos.column)\n            return;\n            \n        var old = {\n            row: this.row,\n            column: this.column\n        };\n        \n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n    \n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n        \n        if (column < 0)\n            pos.column = 0;\n            \n        return pos;\n    };\n    \n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n     return new Array(count + 1).join(string);\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj != \"object\") {\n        return obj;\n    }\n    \n    var copy = obj.constructor();\n    for (var key in obj) {\n        if (typeof obj[key] == \"object\") {\n            copy[key] = this.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\n\n\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n\n    return deferred;\n};\n\n});\n \ndefine('ace/mode/coffee/coffee-script', ['require', 'exports', 'module' , 'ace/mode/coffee/lexer', 'ace/mode/coffee/parser', 'ace/mode/coffee/nodes'], function(require, exports, module) {\n    \n    var Lexer = require(\"./lexer\").Lexer;\n    var parser = require(\"./parser\");\n\n    var lexer = new Lexer();\n    parser.lexer = {\n        lex: function() {\n            var tag, _ref2;\n            _ref2 = this.tokens[this.pos++] || [''], tag = _ref2[0], this.yytext = _ref2[1], this.yylineno = _ref2[2];\n            return tag;\n        },\n        setInput: function(tokens) {\n            this.tokens = tokens;\n            return this.pos = 0;\n        },\n        upcomingInput: function() {\n            return \"\";\n        }\n    };\n    parser.yy = require('./nodes');\n    \n    exports.parse = function(code) {\n        return parser.parse(lexer.tokenize(code));\n    };\n});\n\ndefine('ace/mode/coffee/lexer', ['require', 'exports', 'module' , 'ace/mode/coffee/rewriter', 'ace/mode/coffee/helpers'], function(require, exports, module) {\n// Generated by CoffeeScript 1.2.1-pre\n\n  var BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref, _ref1,\n    __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n  _ref = require('./rewriter'), Rewriter = _ref.Rewriter, INVERSES = _ref.INVERSES;\n\n  _ref1 = require('./helpers'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last;\n\n  exports.Lexer = Lexer = (function() {\n\n    Lexer.name = 'Lexer';\n\n    function Lexer() {}\n\n    Lexer.prototype.tokenize = function(code, opts) {\n      var i, tag;\n      if (opts == null) opts = {};\n      if (WHITESPACE.test(code)) code = \"\\n\" + code;\n      code = code.replace(/\\r/g, '').replace(TRAILING_SPACES, '');\n      this.code = code;\n      this.line = opts.line || 0;\n      this.indent = 0;\n      this.indebt = 0;\n      this.outdebt = 0;\n      this.indents = [];\n      this.ends = [];\n      this.tokens = [];\n      i = 0;\n      while (this.chunk = code.slice(i)) {\n        i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken();\n      }\n      this.closeIndentation();\n      if (tag = this.ends.pop()) this.error(\"missing \" + tag);\n      if (opts.rewrite === false) return this.tokens;\n      return (new Rewriter).rewrite(this.tokens);\n    };\n\n    Lexer.prototype.identifierToken = function() {\n      var colon, forcedIdentifier, id, input, match, prev, tag, _ref2, _ref3;\n      if (!(match = IDENTIFIER.exec(this.chunk))) return 0;\n      input = match[0], id = match[1], colon = match[2];\n      if (id === 'own' && this.tag() === 'FOR') {\n        this.token('OWN', id);\n        return id.length;\n      }\n      forcedIdentifier = colon || (prev = last(this.tokens)) && (((_ref2 = prev[0]) === '.' || _ref2 === '?.' || _ref2 === '::') || !prev.spaced && prev[0] === '@');\n      tag = 'IDENTIFIER';\n      if (!forcedIdentifier && (__indexOf.call(JS_KEYWORDS, id) >= 0 || __indexOf.call(COFFEE_KEYWORDS, id) >= 0)) {\n        tag = id.toUpperCase();\n        if (tag === 'WHEN' && (_ref3 = this.tag(), __indexOf.call(LINE_BREAK, _ref3) >= 0)) {\n          tag = 'LEADING_WHEN';\n        } else if (tag === 'FOR') {\n          this.seenFor = true;\n        } else if (tag === 'UNLESS') {\n          tag = 'IF';\n        } else if (__indexOf.call(UNARY, tag) >= 0) {\n          tag = 'UNARY';\n        } else if (__indexOf.call(RELATION, tag) >= 0) {\n          if (tag !== 'INSTANCEOF' && this.seenFor) {\n            tag = 'FOR' + tag;\n            this.seenFor = false;\n          } else {\n            tag = 'RELATION';\n            if (this.value() === '!') {\n              this.tokens.pop();\n              id = '!' + id;\n            }\n          }\n        }\n      }\n      if (__indexOf.call(JS_FORBIDDEN, id) >= 0) {\n        if (forcedIdentifier) {\n          tag = 'IDENTIFIER';\n          id = new String(id);\n          id.reserved = true;\n        } else if (__indexOf.call(RESERVED, id) >= 0) {\n          this.error(\"reserved word \\\"\" + id + \"\\\"\");\n        }\n      }\n      if (!forcedIdentifier) {\n        if (__indexOf.call(COFFEE_ALIASES, id) >= 0) id = COFFEE_ALIAS_MAP[id];\n        tag = (function() {\n          switch (id) {\n            case '!':\n              return 'UNARY';\n            case '==':\n            case '!=':\n              return 'COMPARE';\n            case '&&':\n            case '||':\n              return 'LOGIC';\n            case 'true':\n            case 'false':\n            case 'null':\n            case 'undefined':\n              return 'BOOL';\n            case 'break':\n            case 'continue':\n              return 'STATEMENT';\n            default:\n              return tag;\n          }\n        })();\n      }\n      this.token(tag, id);\n      if (colon) this.token(':', ':');\n      return input.length;\n    };\n\n    Lexer.prototype.numberToken = function() {\n      var binaryLiteral, lexedLength, match, number, octalLiteral;\n      if (!(match = NUMBER.exec(this.chunk))) return 0;\n      number = match[0];\n      if (/E/.test(number)) {\n        this.error(\"exponential notation '\" + number + \"' must be indicated with a lowercase 'e'\");\n      } else if (/[BOX]/.test(number)) {\n        this.error(\"radix prefix '\" + number + \"' must be lowercase\");\n      } else if (/^0[89]/.test(number)) {\n        this.error(\"decimal literal '\" + number + \"' must not be prefixed with '0'\");\n      } else if (/^0[0-7]/.test(number)) {\n        this.error(\"octal literal '\" + number + \"' must be prefixed with '0o'\");\n      }\n      lexedLength = number.length;\n      if (octalLiteral = /0o([0-7]+)/.exec(number)) {\n        number = (parseInt(octalLiteral[1], 8)).toString();\n      }\n      if (binaryLiteral = /0b([01]+)/.exec(number)) {\n        number = (parseInt(binaryLiteral[1], 2)).toString();\n      }\n      this.token('NUMBER', number);\n      return lexedLength;\n    };\n\n    Lexer.prototype.stringToken = function() {\n      var match, octalEsc, string;\n      switch (this.chunk.charAt(0)) {\n        case \"'\":\n          if (!(match = SIMPLESTR.exec(this.chunk))) return 0;\n          this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\\\\n'));\n          break;\n        case '\"':\n          if (!(string = this.balancedString(this.chunk, '\"'))) return 0;\n          if (0 < string.indexOf('#{', 1)) {\n            this.interpolateString(string.slice(1, -1));\n          } else {\n            this.token('STRING', this.escapeLines(string));\n          }\n          break;\n        default:\n          return 0;\n      }\n      if (octalEsc = /^(?:\\\\.|[^\\\\])*\\\\[0-7]/.test(string)) {\n        this.error(\"octal escape sequences \" + string + \" are not allowed\");\n      }\n      this.line += count(string, '\\n');\n      return string.length;\n    };\n\n    Lexer.prototype.heredocToken = function() {\n      var doc, heredoc, match, quote;\n      if (!(match = HEREDOC.exec(this.chunk))) return 0;\n      heredoc = match[0];\n      quote = heredoc.charAt(0);\n      doc = this.sanitizeHeredoc(match[2], {\n        quote: quote,\n        indent: null\n      });\n      if (quote === '\"' && 0 <= doc.indexOf('#{')) {\n        this.interpolateString(doc, {\n          heredoc: true\n        });\n      } else {\n        this.token('STRING', this.makeString(doc, quote, true));\n      }\n      this.line += count(heredoc, '\\n');\n      return heredoc.length;\n    };\n\n    Lexer.prototype.commentToken = function() {\n      var comment, here, match;\n      if (!(match = this.chunk.match(COMMENT))) return 0;\n      comment = match[0], here = match[1];\n      if (here) {\n        this.token('HERECOMMENT', this.sanitizeHeredoc(here, {\n          herecomment: true,\n          indent: Array(this.indent + 1).join(' ')\n        }));\n      }\n      this.line += count(comment, '\\n');\n      return comment.length;\n    };\n\n    Lexer.prototype.jsToken = function() {\n      var match, script;\n      if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) {\n        return 0;\n      }\n      this.token('JS', (script = match[0]).slice(1, -1));\n      return script.length;\n    };\n\n    Lexer.prototype.regexToken = function() {\n      var flags, length, match, prev, regex, _ref2, _ref3;\n      if (this.chunk.charAt(0) !== '/') return 0;\n      if (match = HEREGEX.exec(this.chunk)) {\n        length = this.heregexToken(match);\n        this.line += count(match[0], '\\n');\n        return length;\n      }\n      prev = last(this.tokens);\n      if (prev && (_ref2 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref2) >= 0)) {\n        return 0;\n      }\n      if (!(match = REGEX.exec(this.chunk))) return 0;\n      _ref3 = match, match = _ref3[0], regex = _ref3[1], flags = _ref3[2];\n      if (regex.slice(0, 2) === '/*') {\n        this.error('regular expressions cannot begin with `*`');\n      }\n      if (regex === '//') regex = '/(?:)/';\n      this.token('REGEX', \"\" + regex + flags);\n      return match.length;\n    };\n\n    Lexer.prototype.heregexToken = function(match) {\n      var body, flags, heregex, re, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4, _ref5;\n      heregex = match[0], body = match[1], flags = match[2];\n      if (0 > body.indexOf('#{')) {\n        re = body.replace(HEREGEX_OMIT, '').replace(/\\//g, '\\\\/');\n        if (re.match(/^\\*/)) {\n          this.error('regular expressions cannot begin with `*`');\n        }\n        this.token('REGEX', \"/\" + (re || '(?:)') + \"/\" + flags);\n        return heregex.length;\n      }\n      this.token('IDENTIFIER', 'RegExp');\n      this.tokens.push(['CALL_START', '(']);\n      tokens = [];\n      _ref2 = this.interpolateString(body, {\n        regex: true\n      });\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        _ref3 = _ref2[_i], tag = _ref3[0], value = _ref3[1];\n        if (tag === 'TOKENS') {\n          tokens.push.apply(tokens, value);\n        } else {\n          if (!(value = value.replace(HEREGEX_OMIT, ''))) continue;\n          value = value.replace(/\\\\/g, '\\\\\\\\');\n          tokens.push(['STRING', this.makeString(value, '\"', true)]);\n        }\n        tokens.push(['+', '+']);\n      }\n      tokens.pop();\n      if (((_ref4 = tokens[0]) != null ? _ref4[0] : void 0) !== 'STRING') {\n        this.tokens.push(['STRING', '\"\"'], ['+', '+']);\n      }\n      (_ref5 = this.tokens).push.apply(_ref5, tokens);\n      if (flags) this.tokens.push([',', ','], ['STRING', '\"' + flags + '\"']);\n      this.token(')', ')');\n      return heregex.length;\n    };\n\n    Lexer.prototype.lineToken = function() {\n      var diff, indent, match, noNewlines, prev, size;\n      if (!(match = MULTI_DENT.exec(this.chunk))) return 0;\n      indent = match[0];\n      this.line += count(indent, '\\n');\n      this.seenFor = false;\n      prev = last(this.tokens, 1);\n      size = indent.length - 1 - indent.lastIndexOf('\\n');\n      noNewlines = this.unfinished();\n      if (size - this.indebt === this.indent) {\n        if (noNewlines) {\n          this.suppressNewlines();\n        } else {\n          this.newlineToken();\n        }\n        return indent.length;\n      }\n      if (size > this.indent) {\n        if (noNewlines) {\n          this.indebt = size - this.indent;\n          this.suppressNewlines();\n          return indent.length;\n        }\n        diff = size - this.indent + this.outdebt;\n        this.token('INDENT', diff);\n        this.indents.push(diff);\n        this.ends.push('OUTDENT');\n        this.outdebt = this.indebt = 0;\n      } else {\n        this.indebt = 0;\n        this.outdentToken(this.indent - size, noNewlines);\n      }\n      this.indent = size;\n      return indent.length;\n    };\n\n    Lexer.prototype.outdentToken = function(moveOut, noNewlines) {\n      var dent, len;\n      while (moveOut > 0) {\n        len = this.indents.length - 1;\n        if (this.indents[len] === void 0) {\n          moveOut = 0;\n        } else if (this.indents[len] === this.outdebt) {\n          moveOut -= this.outdebt;\n          this.outdebt = 0;\n        } else if (this.indents[len] < this.outdebt) {\n          this.outdebt -= this.indents[len];\n          moveOut -= this.indents[len];\n        } else {\n          dent = this.indents.pop() - this.outdebt;\n          moveOut -= dent;\n          this.outdebt = 0;\n          this.pair('OUTDENT');\n          this.token('OUTDENT', dent);\n        }\n      }\n      if (dent) this.outdebt -= moveOut;\n      while (this.value() === ';') {\n        this.tokens.pop();\n      }\n      if (!(this.tag() === 'TERMINATOR' || noNewlines)) {\n        this.token('TERMINATOR', '\\n');\n      }\n      return this;\n    };\n\n    Lexer.prototype.whitespaceToken = function() {\n      var match, nline, prev;\n      if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\\n'))) {\n        return 0;\n      }\n      prev = last(this.tokens);\n      if (prev) prev[match ? 'spaced' : 'newLine'] = true;\n      if (match) {\n        return match[0].length;\n      } else {\n        return 0;\n      }\n    };\n\n    Lexer.prototype.newlineToken = function() {\n      while (this.value() === ';') {\n        this.tokens.pop();\n      }\n      if (this.tag() !== 'TERMINATOR') this.token('TERMINATOR', '\\n');\n      return this;\n    };\n\n    Lexer.prototype.suppressNewlines = function() {\n      if (this.value() === '\\\\') this.tokens.pop();\n      return this;\n    };\n\n    Lexer.prototype.literalToken = function() {\n      var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5;\n      if (match = OPERATOR.exec(this.chunk)) {\n        value = match[0];\n        if (CODE.test(value)) this.tagParameters();\n      } else {\n        value = this.chunk.charAt(0);\n      }\n      tag = value;\n      prev = last(this.tokens);\n      if (value === '=' && prev) {\n        if (!prev[1].reserved && (_ref2 = prev[1], __indexOf.call(JS_FORBIDDEN, _ref2) >= 0)) {\n          this.error(\"reserved word \\\"\" + (this.value()) + \"\\\" can't be assigned\");\n        }\n        if ((_ref3 = prev[1]) === '||' || _ref3 === '&&') {\n          prev[0] = 'COMPOUND_ASSIGN';\n          prev[1] += '=';\n          return value.length;\n        }\n      }\n      if (value === ';') {\n        this.seenFor = false;\n        tag = 'TERMINATOR';\n      } else if (__indexOf.call(MATH, value) >= 0) {\n        tag = 'MATH';\n      } else if (__indexOf.call(COMPARE, value) >= 0) {\n        tag = 'COMPARE';\n      } else if (__indexOf.call(COMPOUND_ASSIGN, value) >= 0) {\n        tag = 'COMPOUND_ASSIGN';\n      } else if (__indexOf.call(UNARY, value) >= 0) {\n        tag = 'UNARY';\n      } else if (__indexOf.call(SHIFT, value) >= 0) {\n        tag = 'SHIFT';\n      } else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) {\n        tag = 'LOGIC';\n      } else if (prev && !prev.spaced) {\n        if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) {\n          if (prev[0] === '?') prev[0] = 'FUNC_EXIST';\n          tag = 'CALL_START';\n        } else if (value === '[' && (_ref5 = prev[0], __indexOf.call(INDEXABLE, _ref5) >= 0)) {\n          tag = 'INDEX_START';\n          switch (prev[0]) {\n            case '?':\n              prev[0] = 'INDEX_SOAK';\n          }\n        }\n      }\n      switch (value) {\n        case '(':\n        case '{':\n        case '[':\n          this.ends.push(INVERSES[value]);\n          break;\n        case ')':\n        case '}':\n        case ']':\n          this.pair(value);\n      }\n      this.token(tag, value);\n      return value.length;\n    };\n\n    Lexer.prototype.sanitizeHeredoc = function(doc, options) {\n      var attempt, herecomment, indent, match, _ref2;\n      indent = options.indent, herecomment = options.herecomment;\n      if (herecomment) {\n        if (HEREDOC_ILLEGAL.test(doc)) {\n          this.error(\"block comment cannot contain \\\"*/\\\", starting\");\n        }\n        if (doc.indexOf('\\n') <= 0) return doc;\n      } else {\n        while (match = HEREDOC_INDENT.exec(doc)) {\n          attempt = match[1];\n          if (indent === null || (0 < (_ref2 = attempt.length) && _ref2 < indent.length)) {\n            indent = attempt;\n          }\n        }\n      }\n      if (indent) doc = doc.replace(RegExp(\"\\\\n\" + indent, \"g\"), '\\n');\n      if (!herecomment) doc = doc.replace(/^\\n/, '');\n      return doc;\n    };\n\n    Lexer.prototype.tagParameters = function() {\n      var i, stack, tok, tokens;\n      if (this.tag() !== ')') return this;\n      stack = [];\n      tokens = this.tokens;\n      i = tokens.length;\n      tokens[--i][0] = 'PARAM_END';\n      while (tok = tokens[--i]) {\n        switch (tok[0]) {\n          case ')':\n            stack.push(tok);\n            break;\n          case '(':\n          case 'CALL_START':\n            if (stack.length) {\n              stack.pop();\n            } else if (tok[0] === '(') {\n              tok[0] = 'PARAM_START';\n              return this;\n            } else {\n              return this;\n            }\n        }\n      }\n      return this;\n    };\n\n    Lexer.prototype.closeIndentation = function() {\n      return this.outdentToken(this.indent);\n    };\n\n    Lexer.prototype.balancedString = function(str, end) {\n      var continueCount, i, letter, match, prev, stack, _i, _ref2;\n      continueCount = 0;\n      stack = [end];\n      for (i = _i = 1, _ref2 = str.length; 1 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 1 <= _ref2 ? ++_i : --_i) {\n        if (continueCount) {\n          --continueCount;\n          continue;\n        }\n        switch (letter = str.charAt(i)) {\n          case '\\\\':\n            ++continueCount;\n            continue;\n          case end:\n            stack.pop();\n            if (!stack.length) return str.slice(0, i + 1 || 9e9);\n            end = stack[stack.length - 1];\n            continue;\n        }\n        if (end === '}' && (letter === '\"' || letter === \"'\")) {\n          stack.push(end = letter);\n        } else if (end === '}' && letter === '/' && (match = HEREGEX.exec(str.slice(i)) || REGEX.exec(str.slice(i)))) {\n          continueCount += match[0].length - 1;\n        } else if (end === '}' && letter === '{') {\n          stack.push(end = '}');\n        } else if (end === '\"' && prev === '#' && letter === '{') {\n          stack.push(end = '}');\n        }\n        prev = letter;\n      }\n      return this.error(\"missing \" + (stack.pop()) + \", starting\");\n    };\n\n    Lexer.prototype.interpolateString = function(str, options) {\n      var expr, heredoc, i, inner, interpolated, len, letter, nested, pi, regex, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4;\n      if (options == null) options = {};\n      heredoc = options.heredoc, regex = options.regex;\n      tokens = [];\n      pi = 0;\n      i = -1;\n      while (letter = str.charAt(i += 1)) {\n        if (letter === '\\\\') {\n          i += 1;\n          continue;\n        }\n        if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), '}')))) {\n          continue;\n        }\n        if (pi < i) tokens.push(['NEOSTRING', str.slice(pi, i)]);\n        inner = expr.slice(1, -1);\n        if (inner.length) {\n          nested = new Lexer().tokenize(inner, {\n            line: this.line,\n            rewrite: false\n          });\n          nested.pop();\n          if (((_ref2 = nested[0]) != null ? _ref2[0] : void 0) === 'TERMINATOR') {\n            nested.shift();\n          }\n          if (len = nested.length) {\n            if (len > 1) {\n              nested.unshift(['(', '(', this.line]);\n              nested.push([')', ')', this.line]);\n            }\n            tokens.push(['TOKENS', nested]);\n          }\n        }\n        i += expr.length;\n        pi = i + 1;\n      }\n      if ((i > pi && pi < str.length)) tokens.push(['NEOSTRING', str.slice(pi)]);\n      if (regex) return tokens;\n      if (!tokens.length) return this.token('STRING', '\"\"');\n      if (tokens[0][0] !== 'NEOSTRING') tokens.unshift(['', '']);\n      if (interpolated = tokens.length > 1) this.token('(', '(');\n      for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) {\n        _ref3 = tokens[i], tag = _ref3[0], value = _ref3[1];\n        if (i) this.token('+', '+');\n        if (tag === 'TOKENS') {\n          (_ref4 = this.tokens).push.apply(_ref4, value);\n        } else {\n          this.token('STRING', this.makeString(value, '\"', heredoc));\n        }\n      }\n      if (interpolated) this.token(')', ')');\n      return tokens;\n    };\n\n    Lexer.prototype.pair = function(tag) {\n      var size, wanted;\n      if (tag !== (wanted = last(this.ends))) {\n        if ('OUTDENT' !== wanted) this.error(\"unmatched \" + tag);\n        this.indent -= size = last(this.indents);\n        this.outdentToken(size, true);\n        return this.pair(tag);\n      }\n      return this.ends.pop();\n    };\n\n    Lexer.prototype.token = function(tag, value) {\n      return this.tokens.push([tag, value, this.line]);\n    };\n\n    Lexer.prototype.tag = function(index, tag) {\n      var tok;\n      return (tok = last(this.tokens, index)) && (tag ? tok[0] = tag : tok[0]);\n    };\n\n    Lexer.prototype.value = function(index, val) {\n      var tok;\n      return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]);\n    };\n\n    Lexer.prototype.unfinished = function() {\n      var _ref2;\n      return LINE_CONTINUER.test(this.chunk) || ((_ref2 = this.tag()) === '\\\\' || _ref2 === '.' || _ref2 === '?.' || _ref2 === 'UNARY' || _ref2 === 'MATH' || _ref2 === '+' || _ref2 === '-' || _ref2 === 'SHIFT' || _ref2 === 'RELATION' || _ref2 === 'COMPARE' || _ref2 === 'LOGIC' || _ref2 === 'THROW' || _ref2 === 'EXTENDS');\n    };\n\n    Lexer.prototype.escapeLines = function(str, heredoc) {\n      return str.replace(MULTILINER, heredoc ? '\\\\n' : '');\n    };\n\n    Lexer.prototype.makeString = function(body, quote, heredoc) {\n      if (!body) return quote + quote;\n      body = body.replace(/\\\\([\\s\\S])/g, function(match, contents) {\n        if (contents === '\\n' || contents === quote) {\n          return contents;\n        } else {\n          return match;\n        }\n      });\n      body = body.replace(RegExp(\"\" + quote, \"g\"), '\\\\$&');\n      return quote + this.escapeLines(body, heredoc) + quote;\n    };\n\n    Lexer.prototype.error = function(message) {\n      throw SyntaxError(\"\" + message + \" on line \" + (this.line + 1));\n    };\n\n    return Lexer;\n\n  })();\n\n  JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super'];\n\n  COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when'];\n\n  COFFEE_ALIAS_MAP = {\n    and: '&&',\n    or: '||',\n    is: '==',\n    isnt: '!=',\n    not: '!',\n    yes: 'true',\n    no: 'false',\n    on: 'true',\n    off: 'false'\n  };\n\n  COFFEE_ALIASES = (function() {\n    var _results;\n    _results = [];\n    for (key in COFFEE_ALIAS_MAP) {\n      _results.push(key);\n    }\n    return _results;\n  })();\n\n  COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES);\n\n  RESERVED = ['case', 'default', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'export', 'import', 'native', '__hasProp', '__extends', '__slice', '__bind', '__indexOf', 'implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static', 'yield'];\n\n  STRICT_PROSCRIBED = ['arguments', 'eval'];\n\n  JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED);\n\n  exports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS).concat(STRICT_PROSCRIBED);\n\n  exports.STRICT_PROSCRIBED = STRICT_PROSCRIBED;\n\n  IDENTIFIER = /^([$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*)([^\\n\\S]*:(?!:))?/;\n\n  NUMBER = /^0b[01]+|^0o[0-7]+|^0x[\\da-f]+|^\\d*\\.?\\d+(?:e[+-]?\\d+)?/i;\n\n  HEREDOC = /^(\"\"\"|''')([\\s\\S]*?)(?:\\n[^\\n\\S]*)?\\1/;\n\n  OPERATOR = /^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>])\\2=?|\\?\\.|\\.{2,3})/;\n\n  WHITESPACE = /^[^\\n\\S]+/;\n\n  COMMENT = /^###([^#][\\s\\S]*?)(?:###[^\\n\\S]*|(?:###)?$)|^(?:\\s*#(?!##[^#]).*)+/;\n\n  CODE = /^[-=]>/;\n\n  MULTI_DENT = /^(?:\\n[^\\n\\S]*)+/;\n\n  SIMPLESTR = /^'[^\\\\']*(?:\\\\.[^\\\\']*)*'/;\n\n  JSTOKEN = /^`[^\\\\`]*(?:\\\\.[^\\\\`]*)*`/;\n\n  REGEX = /^(\\/(?![\\s=])[^[\\/\\n\\\\]*(?:(?:\\\\[\\s\\S]|\\[[^\\]\\n\\\\]*(?:\\\\[\\s\\S][^\\]\\n\\\\]*)*])[^[\\/\\n\\\\]*)*\\/)([imgy]{0,4})(?!\\w)/;\n\n  HEREGEX = /^\\/{3}([\\s\\S]+?)\\/{3}([imgy]{0,4})(?!\\w)/;\n\n  HEREGEX_OMIT = /\\s+(?:#.*)?/g;\n\n  MULTILINER = /\\n/g;\n\n  HEREDOC_INDENT = /\\n+([^\\n\\S]*)/g;\n\n  HEREDOC_ILLEGAL = /\\*\\//;\n\n  LINE_CONTINUER = /^\\s*(?:,|\\??\\.(?![.\\d])|::)/;\n\n  TRAILING_SPACES = /\\s+$/;\n\n  COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|='];\n\n  UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO'];\n\n  LOGIC = ['&&', '||', '&', '|', '^'];\n\n  SHIFT = ['<<', '>>', '>>>'];\n\n  COMPARE = ['==', '!=', '<', '>', '<=', '>='];\n\n  MATH = ['*', '/', '%'];\n\n  RELATION = ['IN', 'OF', 'INSTANCEOF'];\n\n  BOOL = ['TRUE', 'FALSE', 'NULL', 'UNDEFINED'];\n\n  NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', '++', '--', ']'];\n\n  NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING');\n\n  CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER'];\n\n  INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL');\n\n  LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR'];\n\n\n});\n\ndefine('ace/mode/coffee/rewriter', ['require', 'exports', 'module' ], function(require, exports, module) {\n// Generated by CoffeeScript 1.2.1-pre\n\n  var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref,\n    __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n    __slice = [].slice;\n\n  exports.Rewriter = (function() {\n\n    Rewriter.name = 'Rewriter';\n\n    function Rewriter() {}\n\n    Rewriter.prototype.rewrite = function(tokens) {\n      this.tokens = tokens;\n      this.removeLeadingNewlines();\n      this.removeMidExpressionNewlines();\n      this.closeOpenCalls();\n      this.closeOpenIndexes();\n      this.addImplicitIndentation();\n      this.tagPostfixConditionals();\n      this.addImplicitBraces();\n      this.addImplicitParentheses();\n      return this.tokens;\n    };\n\n    Rewriter.prototype.scanTokens = function(block) {\n      var i, token, tokens;\n      tokens = this.tokens;\n      i = 0;\n      while (token = tokens[i]) {\n        i += block.call(this, token, i, tokens);\n      }\n      return true;\n    };\n\n    Rewriter.prototype.detectEnd = function(i, condition, action) {\n      var levels, token, tokens, _ref, _ref1;\n      tokens = this.tokens;\n      levels = 0;\n      while (token = tokens[i]) {\n        if (levels === 0 && condition.call(this, token, i)) {\n          return action.call(this, token, i);\n        }\n        if (!token || levels < 0) return action.call(this, token, i - 1);\n        if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) {\n          levels += 1;\n        } else if (_ref1 = token[0], __indexOf.call(EXPRESSION_END, _ref1) >= 0) {\n          levels -= 1;\n        }\n        i += 1;\n      }\n      return i - 1;\n    };\n\n    Rewriter.prototype.removeLeadingNewlines = function() {\n      var i, tag, _i, _len, _ref;\n      _ref = this.tokens;\n      for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\n        tag = _ref[i][0];\n        if (tag !== 'TERMINATOR') break;\n      }\n      if (i) return this.tokens.splice(0, i);\n    };\n\n    Rewriter.prototype.removeMidExpressionNewlines = function() {\n      return this.scanTokens(function(token, i, tokens) {\n        var _ref;\n        if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) {\n          return 1;\n        }\n        tokens.splice(i, 1);\n        return 0;\n      });\n    };\n\n    Rewriter.prototype.closeOpenCalls = function() {\n      var action, condition;\n      condition = function(token, i) {\n        var _ref;\n        return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')';\n      };\n      action = function(token, i) {\n        return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END';\n      };\n      return this.scanTokens(function(token, i) {\n        if (token[0] === 'CALL_START') this.detectEnd(i + 1, condition, action);\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.closeOpenIndexes = function() {\n      var action, condition;\n      condition = function(token, i) {\n        var _ref;\n        return (_ref = token[0]) === ']' || _ref === 'INDEX_END';\n      };\n      action = function(token, i) {\n        return token[0] = 'INDEX_END';\n      };\n      return this.scanTokens(function(token, i) {\n        if (token[0] === 'INDEX_START') this.detectEnd(i + 1, condition, action);\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.addImplicitBraces = function() {\n      var action, condition, sameLine, stack, start, startIndent, startsLine;\n      stack = [];\n      start = null;\n      startsLine = null;\n      sameLine = true;\n      startIndent = 0;\n      condition = function(token, i) {\n        var one, tag, three, two, _ref, _ref1;\n        _ref = this.tokens.slice(i + 1, (i + 3) + 1 || 9e9), one = _ref[0], two = _ref[1], three = _ref[2];\n        if ('HERECOMMENT' === (one != null ? one[0] : void 0)) return false;\n        tag = token[0];\n        if (__indexOf.call(LINEBREAKS, tag) >= 0) sameLine = false;\n        return (((tag === 'TERMINATOR' || tag === 'OUTDENT') || (__indexOf.call(IMPLICIT_END, tag) >= 0 && sameLine)) && ((!startsLine && this.tag(i - 1) !== ',') || !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':'))) || (tag === ',' && one && ((_ref1 = one[0]) !== 'IDENTIFIER' && _ref1 !== 'NUMBER' && _ref1 !== 'STRING' && _ref1 !== '@' && _ref1 !== 'TERMINATOR' && _ref1 !== 'OUTDENT'));\n      };\n      action = function(token, i) {\n        var tok;\n        tok = this.generate('}', '}', token[2]);\n        return this.tokens.splice(i, 0, tok);\n      };\n      return this.scanTokens(function(token, i, tokens) {\n        var ago, idx, prevTag, tag, tok, value, _ref, _ref1;\n        if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) {\n          stack.push([(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag), i]);\n          return 1;\n        }\n        if (__indexOf.call(EXPRESSION_END, tag) >= 0) {\n          start = stack.pop();\n          return 1;\n        }\n        if (!(tag === ':' && ((ago = this.tag(i - 2)) === ':' || ((_ref1 = stack[stack.length - 1]) != null ? _ref1[0] : void 0) !== '{'))) {\n          return 1;\n        }\n        sameLine = true;\n        stack.push(['{']);\n        idx = ago === '@' ? i - 2 : i - 1;\n        while (this.tag(idx - 2) === 'HERECOMMENT') {\n          idx -= 2;\n        }\n        prevTag = this.tag(idx - 1);\n        startsLine = !prevTag || (__indexOf.call(LINEBREAKS, prevTag) >= 0);\n        value = new String('{');\n        value.generated = true;\n        tok = this.generate('{', value, token[2]);\n        tokens.splice(idx, 0, tok);\n        this.detectEnd(i + 2, condition, action);\n        return 2;\n      });\n    };\n\n    Rewriter.prototype.addImplicitParentheses = function() {\n      var action, condition, noCall, seenControl, seenSingle;\n      noCall = seenSingle = seenControl = false;\n      condition = function(token, i) {\n        var post, tag, _ref, _ref1;\n        tag = token[0];\n        if (!seenSingle && token.fromThen) return true;\n        if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>' || tag === 'CLASS') {\n          seenSingle = true;\n        }\n        if (tag === 'IF' || tag === 'ELSE' || tag === 'SWITCH' || tag === 'TRY' || tag === '=') {\n          seenControl = true;\n        }\n        if ((tag === '.' || tag === '?.' || tag === '::') && this.tag(i - 1) === 'OUTDENT') {\n          return true;\n        }\n        return !token.generated && this.tag(i - 1) !== ',' && (__indexOf.call(IMPLICIT_END, tag) >= 0 || (tag === 'INDENT' && !seenControl)) && (tag !== 'INDENT' || (((_ref = this.tag(i - 2)) !== 'CLASS' && _ref !== 'EXTENDS') && (_ref1 = this.tag(i - 1), __indexOf.call(IMPLICIT_BLOCK, _ref1) < 0) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{')));\n      };\n      action = function(token, i) {\n        return this.tokens.splice(i, 0, this.generate('CALL_END', ')', token[2]));\n      };\n      return this.scanTokens(function(token, i, tokens) {\n        var callObject, current, next, prev, tag, _ref, _ref1, _ref2;\n        tag = token[0];\n        if (tag === 'CLASS' || tag === 'IF' || tag === 'FOR' || tag === 'WHILE') {\n          noCall = true;\n        }\n        _ref = tokens.slice(i - 1, (i + 1) + 1 || 9e9), prev = _ref[0], current = _ref[1], next = _ref[2];\n        callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref1 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref1) >= 0);\n        seenSingle = false;\n        seenControl = false;\n        if (__indexOf.call(LINEBREAKS, tag) >= 0) noCall = false;\n        if (prev && !prev.spaced && tag === '?') token.call = true;\n        if (token.fromThen) return 1;\n        if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) {\n          return 1;\n        }\n        tokens.splice(i, 0, this.generate('CALL_START', '(', token[2]));\n        this.detectEnd(i + 1, condition, action);\n        if (prev[0] === '?') prev[0] = 'FUNC_EXIST';\n        return 2;\n      });\n    };\n\n    Rewriter.prototype.addImplicitIndentation = function() {\n      var action, condition, indent, outdent, starter;\n      starter = indent = outdent = null;\n      condition = function(token, i) {\n        var _ref;\n        return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'ELSE' && (starter !== 'IF' && starter !== 'THEN'));\n      };\n      action = function(token, i) {\n        return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent);\n      };\n      return this.scanTokens(function(token, i, tokens) {\n        var tag, _ref, _ref1;\n        tag = token[0];\n        if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') {\n          tokens.splice(i, 1);\n          return 0;\n        }\n        if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {\n          tokens.splice.apply(tokens, [i, 0].concat(__slice.call(this.indentation(token))));\n          return 2;\n        }\n        if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) {\n          tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation(token))));\n          return 4;\n        }\n        if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {\n          starter = tag;\n          _ref1 = this.indentation(token, true), indent = _ref1[0], outdent = _ref1[1];\n          if (starter === 'THEN') indent.fromThen = true;\n          tokens.splice(i + 1, 0, indent);\n          this.detectEnd(i + 2, condition, action);\n          if (tag === 'THEN') tokens.splice(i, 1);\n          return 1;\n        }\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.tagPostfixConditionals = function() {\n      var action, condition, original;\n      original = null;\n      condition = function(token, i) {\n        var _ref;\n        return (_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT';\n      };\n      action = function(token, i) {\n        if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) {\n          return original[0] = 'POST_' + original[0];\n        }\n      };\n      return this.scanTokens(function(token, i) {\n        if (token[0] !== 'IF') return 1;\n        original = token;\n        this.detectEnd(i + 1, condition, action);\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.indentation = function(token, implicit) {\n      var indent, outdent;\n      if (implicit == null) implicit = false;\n      indent = ['INDENT', 2, token[2]];\n      outdent = ['OUTDENT', 2, token[2]];\n      if (implicit) indent.generated = outdent.generated = true;\n      return [indent, outdent];\n    };\n\n    Rewriter.prototype.generate = function(tag, value, line) {\n      var tok;\n      tok = [tag, value, line];\n      tok.generated = true;\n      return tok;\n    };\n\n    Rewriter.prototype.tag = function(i) {\n      var _ref;\n      return (_ref = this.tokens[i]) != null ? _ref[0] : void 0;\n    };\n\n    return Rewriter;\n\n  })();\n\n  BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']];\n\n  exports.INVERSES = INVERSES = {};\n\n  EXPRESSION_START = [];\n\n  EXPRESSION_END = [];\n\n  for (_i = 0, _len = BALANCED_PAIRS.length; _i < _len; _i++) {\n    _ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1];\n    EXPRESSION_START.push(INVERSES[rite] = left);\n    EXPRESSION_END.push(INVERSES[left] = rite);\n  }\n\n  EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);\n\n  IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS'];\n\n  IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'UNARY', 'SUPER', '@', '->', '=>', '[', '(', '{', '--', '++'];\n\n  IMPLICIT_UNSPACED_CALL = ['+', '-'];\n\n  IMPLICIT_BLOCK = ['->', '=>', '{', '[', ','];\n\n  IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR'];\n\n  SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN'];\n\n  SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN'];\n\n  LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT'];\n\n\n});\n\ndefine('ace/mode/coffee/helpers', ['require', 'exports', 'module' ], function(require, exports, module) {\n// Generated by CoffeeScript 1.2.1-pre\n\n  var extend, flatten;\n\n  exports.starts = function(string, literal, start) {\n    return literal === string.substr(start, literal.length);\n  };\n\n  exports.ends = function(string, literal, back) {\n    var len;\n    len = literal.length;\n    return literal === string.substr(string.length - len - (back || 0), len);\n  };\n\n  exports.compact = function(array) {\n    var item, _i, _len, _results;\n    _results = [];\n    for (_i = 0, _len = array.length; _i < _len; _i++) {\n      item = array[_i];\n      if (item) _results.push(item);\n    }\n    return _results;\n  };\n\n  exports.count = function(string, substr) {\n    var num, pos;\n    num = pos = 0;\n    if (!substr.length) return 1 / 0;\n    while (pos = 1 + string.indexOf(substr, pos)) {\n      num++;\n    }\n    return num;\n  };\n\n  exports.merge = function(options, overrides) {\n    return extend(extend({}, options), overrides);\n  };\n\n  extend = exports.extend = function(object, properties) {\n    var key, val;\n    for (key in properties) {\n      val = properties[key];\n      object[key] = val;\n    }\n    return object;\n  };\n\n  exports.flatten = flatten = function(array) {\n    var element, flattened, _i, _len;\n    flattened = [];\n    for (_i = 0, _len = array.length; _i < _len; _i++) {\n      element = array[_i];\n      if (element instanceof Array) {\n        flattened = flattened.concat(flatten(element));\n      } else {\n        flattened.push(element);\n      }\n    }\n    return flattened;\n  };\n\n  exports.del = function(obj, key) {\n    var val;\n    val = obj[key];\n    delete obj[key];\n    return val;\n  };\n\n  exports.last = function(array, back) {\n    return array[array.length - (back || 0) - 1];\n  };\n\n\n});\n\ndefine('ace/mode/coffee/parser', ['require', 'exports', 'module' ], function(require, exports, module) {\n/* Jison generated parser */\n\nundefined\nvar parser = {trace: function trace() { },\nyy: {},\nsymbols_: {\"error\":2,\"Root\":3,\"Body\":4,\"Block\":5,\"TERMINATOR\":6,\"Line\":7,\"Expression\":8,\"Statement\":9,\"Return\":10,\"Comment\":11,\"STATEMENT\":12,\"Value\":13,\"Invocation\":14,\"Code\":15,\"Operation\":16,\"Assign\":17,\"If\":18,\"Try\":19,\"While\":20,\"For\":21,\"Switch\":22,\"Class\":23,\"Throw\":24,\"INDENT\":25,\"OUTDENT\":26,\"Identifier\":27,\"IDENTIFIER\":28,\"AlphaNumeric\":29,\"NUMBER\":30,\"STRING\":31,\"Literal\":32,\"JS\":33,\"REGEX\":34,\"DEBUGGER\":35,\"BOOL\":36,\"Assignable\":37,\"=\":38,\"AssignObj\":39,\"ObjAssignable\":40,\":\":41,\"ThisProperty\":42,\"RETURN\":43,\"HERECOMMENT\":44,\"PARAM_START\":45,\"ParamList\":46,\"PARAM_END\":47,\"FuncGlyph\":48,\"->\":49,\"=>\":50,\"OptComma\":51,\",\":52,\"Param\":53,\"ParamVar\":54,\"...\":55,\"Array\":56,\"Object\":57,\"Splat\":58,\"SimpleAssignable\":59,\"Accessor\":60,\"Parenthetical\":61,\"Range\":62,\"This\":63,\".\":64,\"?.\":65,\"::\":66,\"Index\":67,\"INDEX_START\":68,\"IndexValue\":69,\"INDEX_END\":70,\"INDEX_SOAK\":71,\"Slice\":72,\"{\":73,\"AssignList\":74,\"}\":75,\"CLASS\":76,\"EXTENDS\":77,\"OptFuncExist\":78,\"Arguments\":79,\"SUPER\":80,\"FUNC_EXIST\":81,\"CALL_START\":82,\"CALL_END\":83,\"ArgList\":84,\"THIS\":85,\"@\":86,\"[\":87,\"]\":88,\"RangeDots\":89,\"..\":90,\"Arg\":91,\"SimpleArgs\":92,\"TRY\":93,\"Catch\":94,\"FINALLY\":95,\"CATCH\":96,\"THROW\":97,\"(\":98,\")\":99,\"WhileSource\":100,\"WHILE\":101,\"WHEN\":102,\"UNTIL\":103,\"Loop\":104,\"LOOP\":105,\"ForBody\":106,\"FOR\":107,\"ForStart\":108,\"ForSource\":109,\"ForVariables\":110,\"OWN\":111,\"ForValue\":112,\"FORIN\":113,\"FOROF\":114,\"BY\":115,\"SWITCH\":116,\"Whens\":117,\"ELSE\":118,\"When\":119,\"LEADING_WHEN\":120,\"IfBlock\":121,\"IF\":122,\"POST_IF\":123,\"UNARY\":124,\"-\":125,\"+\":126,\"--\":127,\"++\":128,\"?\":129,\"MATH\":130,\"SHIFT\":131,\"COMPARE\":132,\"LOGIC\":133,\"RELATION\":134,\"COMPOUND_ASSIGN\":135,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"TERMINATOR\",12:\"STATEMENT\",25:\"INDENT\",26:\"OUTDENT\",28:\"IDENTIFIER\",30:\"NUMBER\",31:\"STRING\",33:\"JS\",34:\"REGEX\",35:\"DEBUGGER\",36:\"BOOL\",38:\"=\",41:\":\",43:\"RETURN\",44:\"HERECOMMENT\",45:\"PARAM_START\",47:\"PARAM_END\",49:\"->\",50:\"=>\",52:\",\",55:\"...\",64:\".\",65:\"?.\",66:\"::\",68:\"INDEX_START\",70:\"INDEX_END\",71:\"INDEX_SOAK\",73:\"{\",75:\"}\",76:\"CLASS\",77:\"EXTENDS\",80:\"SUPER\",81:\"FUNC_EXIST\",82:\"CALL_START\",83:\"CALL_END\",85:\"THIS\",86:\"@\",87:\"[\",88:\"]\",90:\"..\",93:\"TRY\",95:\"FINALLY\",96:\"CATCH\",97:\"THROW\",98:\"(\",99:\")\",101:\"WHILE\",102:\"WHEN\",103:\"UNTIL\",105:\"LOOP\",107:\"FOR\",111:\"OWN\",113:\"FORIN\",114:\"FOROF\",115:\"BY\",116:\"SWITCH\",118:\"ELSE\",120:\"LEADING_WHEN\",122:\"IF\",123:\"POST_IF\",124:\"UNARY\",125:\"-\",126:\"+\",127:\"--\",128:\"++\",129:\"?\",130:\"MATH\",131:\"SHIFT\",132:\"COMPARE\",133:\"LOGIC\",134:\"RELATION\",135:\"COMPOUND_ASSIGN\"},\nproductions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[39,1],[39,3],[39,5],[39,1],[40,1],[40,1],[40,1],[10,2],[10,1],[11,1],[15,5],[15,2],[48,1],[48,1],[51,0],[51,1],[46,0],[46,1],[46,3],[53,1],[53,2],[53,3],[54,1],[54,1],[54,1],[54,1],[58,2],[59,1],[59,2],[59,2],[59,1],[37,1],[37,1],[37,1],[13,1],[13,1],[13,1],[13,1],[13,1],[60,2],[60,2],[60,2],[60,1],[60,1],[67,3],[67,2],[69,1],[69,1],[57,4],[74,0],[74,1],[74,3],[74,4],[74,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[78,0],[78,1],[79,2],[79,4],[63,1],[63,1],[42,2],[56,2],[56,4],[89,1],[89,1],[62,5],[72,3],[72,2],[72,2],[72,1],[84,1],[84,3],[84,4],[84,4],[84,6],[91,1],[91,1],[92,1],[92,3],[19,2],[19,3],[19,4],[19,5],[94,3],[24,2],[61,3],[61,5],[100,2],[100,4],[100,2],[100,4],[20,2],[20,2],[20,2],[20,1],[104,2],[104,2],[21,2],[21,2],[21,2],[106,2],[106,2],[108,2],[108,3],[112,1],[112,1],[112,1],[110,1],[110,3],[109,2],[109,2],[109,4],[109,4],[109,4],[109,6],[109,6],[22,5],[22,7],[22,4],[22,6],[117,1],[117,2],[119,3],[119,4],[121,3],[121,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,3]],\nperformAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:return this.$ = new yy.Block;\nbreak;\ncase 2:return this.$ = $$[$0];\nbreak;\ncase 3:return this.$ = $$[$0-1];\nbreak;\ncase 4:this.$ = yy.Block.wrap([$$[$0]]);\nbreak;\ncase 5:this.$ = $$[$0-2].push($$[$0]);\nbreak;\ncase 6:this.$ = $$[$0-1];\nbreak;\ncase 7:this.$ = $$[$0];\nbreak;\ncase 8:this.$ = $$[$0];\nbreak;\ncase 9:this.$ = $$[$0];\nbreak;\ncase 10:this.$ = $$[$0];\nbreak;\ncase 11:this.$ = new yy.Literal($$[$0]);\nbreak;\ncase 12:this.$ = $$[$0];\nbreak;\ncase 13:this.$ = $$[$0];\nbreak;\ncase 14:this.$ = $$[$0];\nbreak;\ncase 15:this.$ = $$[$0];\nbreak;\ncase 16:this.$ = $$[$0];\nbreak;\ncase 17:this.$ = $$[$0];\nbreak;\ncase 18:this.$ = $$[$0];\nbreak;\ncase 19:this.$ = $$[$0];\nbreak;\ncase 20:this.$ = $$[$0];\nbreak;\ncase 21:this.$ = $$[$0];\nbreak;\ncase 22:this.$ = $$[$0];\nbreak;\ncase 23:this.$ = $$[$0];\nbreak;\ncase 24:this.$ = new yy.Block;\nbreak;\ncase 25:this.$ = $$[$0-1];\nbreak;\ncase 26:this.$ = new yy.Literal($$[$0]);\nbreak;\ncase 27:this.$ = new yy.Literal($$[$0]);\nbreak;\ncase 28:this.$ = new yy.Literal($$[$0]);\nbreak;\ncase 29:this.$ = $$[$0];\nbreak;\ncase 30:this.$ = new yy.Literal($$[$0]);\nbreak;\ncase 31:this.$ = new yy.Literal($$[$0]);\nbreak;\ncase 32:this.$ = new yy.Literal($$[$0]);\nbreak;\ncase 33:this.$ = (function () {\n        var val;\n        val = new yy.Literal($$[$0]);\n        if ($$[$0] === 'undefined') val.isUndefined = true;\n        return val;\n      }());\nbreak;\ncase 34:this.$ = new yy.Assign($$[$0-2], $$[$0]);\nbreak;\ncase 35:this.$ = new yy.Assign($$[$0-3], $$[$0]);\nbreak;\ncase 36:this.$ = new yy.Assign($$[$0-4], $$[$0-1]);\nbreak;\ncase 37:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 38:this.$ = new yy.Assign(new yy.Value($$[$0-2]), $$[$0], 'object');\nbreak;\ncase 39:this.$ = new yy.Assign(new yy.Value($$[$0-4]), $$[$0-1], 'object');\nbreak;\ncase 40:this.$ = $$[$0];\nbreak;\ncase 41:this.$ = $$[$0];\nbreak;\ncase 42:this.$ = $$[$0];\nbreak;\ncase 43:this.$ = $$[$0];\nbreak;\ncase 44:this.$ = new yy.Return($$[$0]);\nbreak;\ncase 45:this.$ = new yy.Return;\nbreak;\ncase 46:this.$ = new yy.Comment($$[$0]);\nbreak;\ncase 47:this.$ = new yy.Code($$[$0-3], $$[$0], $$[$0-1]);\nbreak;\ncase 48:this.$ = new yy.Code([], $$[$0], $$[$0-1]);\nbreak;\ncase 49:this.$ = 'func';\nbreak;\ncase 50:this.$ = 'boundfunc';\nbreak;\ncase 51:this.$ = $$[$0];\nbreak;\ncase 52:this.$ = $$[$0];\nbreak;\ncase 53:this.$ = [];\nbreak;\ncase 54:this.$ = [$$[$0]];\nbreak;\ncase 55:this.$ = $$[$0-2].concat($$[$0]);\nbreak;\ncase 56:this.$ = new yy.Param($$[$0]);\nbreak;\ncase 57:this.$ = new yy.Param($$[$0-1], null, true);\nbreak;\ncase 58:this.$ = new yy.Param($$[$0-2], $$[$0]);\nbreak;\ncase 59:this.$ = $$[$0];\nbreak;\ncase 60:this.$ = $$[$0];\nbreak;\ncase 61:this.$ = $$[$0];\nbreak;\ncase 62:this.$ = $$[$0];\nbreak;\ncase 63:this.$ = new yy.Splat($$[$0-1]);\nbreak;\ncase 64:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 65:this.$ = $$[$0-1].add($$[$0]);\nbreak;\ncase 66:this.$ = new yy.Value($$[$0-1], [].concat($$[$0]));\nbreak;\ncase 67:this.$ = $$[$0];\nbreak;\ncase 68:this.$ = $$[$0];\nbreak;\ncase 69:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 70:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 71:this.$ = $$[$0];\nbreak;\ncase 72:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 73:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 74:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 75:this.$ = $$[$0];\nbreak;\ncase 76:this.$ = new yy.Access($$[$0]);\nbreak;\ncase 77:this.$ = new yy.Access($$[$0], 'soak');\nbreak;\ncase 78:this.$ = [new yy.Access(new yy.Literal('prototype')), new yy.Access($$[$0])];\nbreak;\ncase 79:this.$ = new yy.Access(new yy.Literal('prototype'));\nbreak;\ncase 80:this.$ = $$[$0];\nbreak;\ncase 81:this.$ = $$[$0-1];\nbreak;\ncase 82:this.$ = yy.extend($$[$0], {\n          soak: true\n        });\nbreak;\ncase 83:this.$ = new yy.Index($$[$0]);\nbreak;\ncase 84:this.$ = new yy.Slice($$[$0]);\nbreak;\ncase 85:this.$ = new yy.Obj($$[$0-2], $$[$0-3].generated);\nbreak;\ncase 86:this.$ = [];\nbreak;\ncase 87:this.$ = [$$[$0]];\nbreak;\ncase 88:this.$ = $$[$0-2].concat($$[$0]);\nbreak;\ncase 89:this.$ = $$[$0-3].concat($$[$0]);\nbreak;\ncase 90:this.$ = $$[$0-5].concat($$[$0-2]);\nbreak;\ncase 91:this.$ = new yy.Class;\nbreak;\ncase 92:this.$ = new yy.Class(null, null, $$[$0]);\nbreak;\ncase 93:this.$ = new yy.Class(null, $$[$0]);\nbreak;\ncase 94:this.$ = new yy.Class(null, $$[$0-1], $$[$0]);\nbreak;\ncase 95:this.$ = new yy.Class($$[$0]);\nbreak;\ncase 96:this.$ = new yy.Class($$[$0-1], null, $$[$0]);\nbreak;\ncase 97:this.$ = new yy.Class($$[$0-2], $$[$0]);\nbreak;\ncase 98:this.$ = new yy.Class($$[$0-3], $$[$0-1], $$[$0]);\nbreak;\ncase 99:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]);\nbreak;\ncase 100:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]);\nbreak;\ncase 101:this.$ = new yy.Call('super', [new yy.Splat(new yy.Literal('arguments'))]);\nbreak;\ncase 102:this.$ = new yy.Call('super', $$[$0]);\nbreak;\ncase 103:this.$ = false;\nbreak;\ncase 104:this.$ = true;\nbreak;\ncase 105:this.$ = [];\nbreak;\ncase 106:this.$ = $$[$0-2];\nbreak;\ncase 107:this.$ = new yy.Value(new yy.Literal('this'));\nbreak;\ncase 108:this.$ = new yy.Value(new yy.Literal('this'));\nbreak;\ncase 109:this.$ = new yy.Value(new yy.Literal('this'), [new yy.Access($$[$0])], 'this');\nbreak;\ncase 110:this.$ = new yy.Arr([]);\nbreak;\ncase 111:this.$ = new yy.Arr($$[$0-2]);\nbreak;\ncase 112:this.$ = 'inclusive';\nbreak;\ncase 113:this.$ = 'exclusive';\nbreak;\ncase 114:this.$ = new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]);\nbreak;\ncase 115:this.$ = new yy.Range($$[$0-2], $$[$0], $$[$0-1]);\nbreak;\ncase 116:this.$ = new yy.Range($$[$0-1], null, $$[$0]);\nbreak;\ncase 117:this.$ = new yy.Range(null, $$[$0], $$[$0-1]);\nbreak;\ncase 118:this.$ = new yy.Range(null, null, $$[$0]);\nbreak;\ncase 119:this.$ = [$$[$0]];\nbreak;\ncase 120:this.$ = $$[$0-2].concat($$[$0]);\nbreak;\ncase 121:this.$ = $$[$0-3].concat($$[$0]);\nbreak;\ncase 122:this.$ = $$[$0-2];\nbreak;\ncase 123:this.$ = $$[$0-5].concat($$[$0-2]);\nbreak;\ncase 124:this.$ = $$[$0];\nbreak;\ncase 125:this.$ = $$[$0];\nbreak;\ncase 126:this.$ = $$[$0];\nbreak;\ncase 127:this.$ = [].concat($$[$0-2], $$[$0]);\nbreak;\ncase 128:this.$ = new yy.Try($$[$0]);\nbreak;\ncase 129:this.$ = new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]);\nbreak;\ncase 130:this.$ = new yy.Try($$[$0-2], null, null, $$[$0]);\nbreak;\ncase 131:this.$ = new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]);\nbreak;\ncase 132:this.$ = [$$[$0-1], $$[$0]];\nbreak;\ncase 133:this.$ = new yy.Throw($$[$0]);\nbreak;\ncase 134:this.$ = new yy.Parens($$[$0-1]);\nbreak;\ncase 135:this.$ = new yy.Parens($$[$0-2]);\nbreak;\ncase 136:this.$ = new yy.While($$[$0]);\nbreak;\ncase 137:this.$ = new yy.While($$[$0-2], {\n          guard: $$[$0]\n        });\nbreak;\ncase 138:this.$ = new yy.While($$[$0], {\n          invert: true\n        });\nbreak;\ncase 139:this.$ = new yy.While($$[$0-2], {\n          invert: true,\n          guard: $$[$0]\n        });\nbreak;\ncase 140:this.$ = $$[$0-1].addBody($$[$0]);\nbreak;\ncase 141:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]]));\nbreak;\ncase 142:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]]));\nbreak;\ncase 143:this.$ = $$[$0];\nbreak;\ncase 144:this.$ = new yy.While(new yy.Literal('true')).addBody($$[$0]);\nbreak;\ncase 145:this.$ = new yy.While(new yy.Literal('true')).addBody(yy.Block.wrap([$$[$0]]));\nbreak;\ncase 146:this.$ = new yy.For($$[$0-1], $$[$0]);\nbreak;\ncase 147:this.$ = new yy.For($$[$0-1], $$[$0]);\nbreak;\ncase 148:this.$ = new yy.For($$[$0], $$[$0-1]);\nbreak;\ncase 149:this.$ = {\n          source: new yy.Value($$[$0])\n        };\nbreak;\ncase 150:this.$ = (function () {\n        $$[$0].own = $$[$0-1].own;\n        $$[$0].name = $$[$0-1][0];\n        $$[$0].index = $$[$0-1][1];\n        return $$[$0];\n      }());\nbreak;\ncase 151:this.$ = $$[$0];\nbreak;\ncase 152:this.$ = (function () {\n        $$[$0].own = true;\n        return $$[$0];\n      }());\nbreak;\ncase 153:this.$ = $$[$0];\nbreak;\ncase 154:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 155:this.$ = new yy.Value($$[$0]);\nbreak;\ncase 156:this.$ = [$$[$0]];\nbreak;\ncase 157:this.$ = [$$[$0-2], $$[$0]];\nbreak;\ncase 158:this.$ = {\n          source: $$[$0]\n        };\nbreak;\ncase 159:this.$ = {\n          source: $$[$0],\n          object: true\n        };\nbreak;\ncase 160:this.$ = {\n          source: $$[$0-2],\n          guard: $$[$0]\n        };\nbreak;\ncase 161:this.$ = {\n          source: $$[$0-2],\n          guard: $$[$0],\n          object: true\n        };\nbreak;\ncase 162:this.$ = {\n          source: $$[$0-2],\n          step: $$[$0]\n        };\nbreak;\ncase 163:this.$ = {\n          source: $$[$0-4],\n          guard: $$[$0-2],\n          step: $$[$0]\n        };\nbreak;\ncase 164:this.$ = {\n          source: $$[$0-4],\n          step: $$[$0-2],\n          guard: $$[$0]\n        };\nbreak;\ncase 165:this.$ = new yy.Switch($$[$0-3], $$[$0-1]);\nbreak;\ncase 166:this.$ = new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]);\nbreak;\ncase 167:this.$ = new yy.Switch(null, $$[$0-1]);\nbreak;\ncase 168:this.$ = new yy.Switch(null, $$[$0-3], $$[$0-1]);\nbreak;\ncase 169:this.$ = $$[$0];\nbreak;\ncase 170:this.$ = $$[$0-1].concat($$[$0]);\nbreak;\ncase 171:this.$ = [[$$[$0-1], $$[$0]]];\nbreak;\ncase 172:this.$ = [[$$[$0-2], $$[$0-1]]];\nbreak;\ncase 173:this.$ = new yy.If($$[$0-1], $$[$0], {\n          type: $$[$0-2]\n        });\nbreak;\ncase 174:this.$ = $$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], {\n          type: $$[$0-2]\n        }));\nbreak;\ncase 175:this.$ = $$[$0];\nbreak;\ncase 176:this.$ = $$[$0-2].addElse($$[$0]);\nbreak;\ncase 177:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), {\n          type: $$[$0-1],\n          statement: true\n        });\nbreak;\ncase 178:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), {\n          type: $$[$0-1],\n          statement: true\n        });\nbreak;\ncase 179:this.$ = new yy.Op($$[$0-1], $$[$0]);\nbreak;\ncase 180:this.$ = new yy.Op('-', $$[$0]);\nbreak;\ncase 181:this.$ = new yy.Op('+', $$[$0]);\nbreak;\ncase 182:this.$ = new yy.Op('--', $$[$0]);\nbreak;\ncase 183:this.$ = new yy.Op('++', $$[$0]);\nbreak;\ncase 184:this.$ = new yy.Op('--', $$[$0-1], null, true);\nbreak;\ncase 185:this.$ = new yy.Op('++', $$[$0-1], null, true);\nbreak;\ncase 186:this.$ = new yy.Existence($$[$0-1]);\nbreak;\ncase 187:this.$ = new yy.Op('+', $$[$0-2], $$[$0]);\nbreak;\ncase 188:this.$ = new yy.Op('-', $$[$0-2], $$[$0]);\nbreak;\ncase 189:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);\nbreak;\ncase 190:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);\nbreak;\ncase 191:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);\nbreak;\ncase 192:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);\nbreak;\ncase 193:this.$ = (function () {\n        if ($$[$0-1].charAt(0) === '!') {\n          return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert();\n        } else {\n          return new yy.Op($$[$0-1], $$[$0-2], $$[$0]);\n        }\n      }());\nbreak;\ncase 194:this.$ = new yy.Assign($$[$0-2], $$[$0], $$[$0-1]);\nbreak;\ncase 195:this.$ = new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]);\nbreak;\ncase 196:this.$ = new yy.Extends($$[$0-2], $$[$0]);\nbreak;\n}\n},\ntable: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[3]},{1:[2,2],6:[1,72]},{6:[1,73]},{1:[2,4],6:[2,4],26:[2,4],99:[2,4]},{4:75,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,74],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,7],6:[2,7],26:[2,7],99:[2,7],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,8],6:[2,8],26:[2,8],99:[2,8],100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],47:[2,12],52:[2,12],55:[2,12],60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,12],71:[1,98],75:[2,12],78:90,81:[1,92],82:[2,103],83:[2,12],88:[2,12],90:[2,12],99:[2,12],101:[2,12],102:[2,12],103:[2,12],107:[2,12],115:[2,12],123:[2,12],125:[2,12],126:[2,12],129:[2,12],130:[2,12],131:[2,12],132:[2,12],133:[2,12],134:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],47:[2,13],52:[2,13],55:[2,13],60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,13],71:[1,98],75:[2,13],78:99,81:[1,92],82:[2,103],83:[2,13],88:[2,13],90:[2,13],99:[2,13],101:[2,13],102:[2,13],103:[2,13],107:[2,13],115:[2,13],123:[2,13],125:[2,13],126:[2,13],129:[2,13],130:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],47:[2,14],52:[2,14],55:[2,14],70:[2,14],75:[2,14],83:[2,14],88:[2,14],90:[2,14],99:[2,14],101:[2,14],102:[2,14],103:[2,14],107:[2,14],115:[2,14],123:[2,14],125:[2,14],126:[2,14],129:[2,14],130:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],47:[2,15],52:[2,15],55:[2,15],70:[2,15],75:[2,15],83:[2,15],88:[2,15],90:[2,15],99:[2,15],101:[2,15],102:[2,15],103:[2,15],107:[2,15],115:[2,15],123:[2,15],125:[2,15],126:[2,15],129:[2,15],130:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],47:[2,16],52:[2,16],55:[2,16],70:[2,16],75:[2,16],83:[2,16],88:[2,16],90:[2,16],99:[2,16],101:[2,16],102:[2,16],103:[2,16],107:[2,16],115:[2,16],123:[2,16],125:[2,16],126:[2,16],129:[2,16],130:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],47:[2,17],52:[2,17],55:[2,17],70:[2,17],75:[2,17],83:[2,17],88:[2,17],90:[2,17],99:[2,17],101:[2,17],102:[2,17],103:[2,17],107:[2,17],115:[2,17],123:[2,17],125:[2,17],126:[2,17],129:[2,17],130:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],47:[2,18],52:[2,18],55:[2,18],70:[2,18],75:[2,18],83:[2,18],88:[2,18],90:[2,18],99:[2,18],101:[2,18],102:[2,18],103:[2,18],107:[2,18],115:[2,18],123:[2,18],125:[2,18],126:[2,18],129:[2,18],130:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],47:[2,19],52:[2,19],55:[2,19],70:[2,19],75:[2,19],83:[2,19],88:[2,19],90:[2,19],99:[2,19],101:[2,19],102:[2,19],103:[2,19],107:[2,19],115:[2,19],123:[2,19],125:[2,19],126:[2,19],129:[2,19],130:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],47:[2,20],52:[2,20],55:[2,20],70:[2,20],75:[2,20],83:[2,20],88:[2,20],90:[2,20],99:[2,20],101:[2,20],102:[2,20],103:[2,20],107:[2,20],115:[2,20],123:[2,20],125:[2,20],126:[2,20],129:[2,20],130:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],47:[2,21],52:[2,21],55:[2,21],70:[2,21],75:[2,21],83:[2,21],88:[2,21],90:[2,21],99:[2,21],101:[2,21],102:[2,21],103:[2,21],107:[2,21],115:[2,21],123:[2,21],125:[2,21],126:[2,21],129:[2,21],130:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],47:[2,22],52:[2,22],55:[2,22],70:[2,22],75:[2,22],83:[2,22],88:[2,22],90:[2,22],99:[2,22],101:[2,22],102:[2,22],103:[2,22],107:[2,22],115:[2,22],123:[2,22],125:[2,22],126:[2,22],129:[2,22],130:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],47:[2,23],52:[2,23],55:[2,23],70:[2,23],75:[2,23],83:[2,23],88:[2,23],90:[2,23],99:[2,23],101:[2,23],102:[2,23],103:[2,23],107:[2,23],115:[2,23],123:[2,23],125:[2,23],126:[2,23],129:[2,23],130:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23]},{1:[2,9],6:[2,9],26:[2,9],99:[2,9],101:[2,9],103:[2,9],107:[2,9],123:[2,9]},{1:[2,10],6:[2,10],26:[2,10],99:[2,10],101:[2,10],103:[2,10],107:[2,10],123:[2,10]},{1:[2,11],6:[2,11],26:[2,11],99:[2,11],101:[2,11],103:[2,11],107:[2,11],123:[2,11]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],38:[1,101],47:[2,71],52:[2,71],55:[2,71],64:[2,71],65:[2,71],66:[2,71],68:[2,71],70:[2,71],71:[2,71],75:[2,71],81:[2,71],82:[2,71],83:[2,71],88:[2,71],90:[2,71],99:[2,71],101:[2,71],102:[2,71],103:[2,71],107:[2,71],115:[2,71],123:[2,71],125:[2,71],126:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],47:[2,72],52:[2,72],55:[2,72],64:[2,72],65:[2,72],66:[2,72],68:[2,72],70:[2,72],71:[2,72],75:[2,72],81:[2,72],82:[2,72],83:[2,72],88:[2,72],90:[2,72],99:[2,72],101:[2,72],102:[2,72],103:[2,72],107:[2,72],115:[2,72],123:[2,72],125:[2,72],126:[2,72],129:[2,72],130:[2,72],131:[2,72],132:[2,72],133:[2,72],134:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],47:[2,73],52:[2,73],55:[2,73],64:[2,73],65:[2,73],66:[2,73],68:[2,73],70:[2,73],71:[2,73],75:[2,73],81:[2,73],82:[2,73],83:[2,73],88:[2,73],90:[2,73],99:[2,73],101:[2,73],102:[2,73],103:[2,73],107:[2,73],115:[2,73],123:[2,73],125:[2,73],126:[2,73],129:[2,73],130:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],47:[2,74],52:[2,74],55:[2,74],64:[2,74],65:[2,74],66:[2,74],68:[2,74],70:[2,74],71:[2,74],75:[2,74],81:[2,74],82:[2,74],83:[2,74],88:[2,74],90:[2,74],99:[2,74],101:[2,74],102:[2,74],103:[2,74],107:[2,74],115:[2,74],123:[2,74],125:[2,74],126:[2,74],129:[2,74],130:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],47:[2,75],52:[2,75],55:[2,75],64:[2,75],65:[2,75],66:[2,75],68:[2,75],70:[2,75],71:[2,75],75:[2,75],81:[2,75],82:[2,75],83:[2,75],88:[2,75],90:[2,75],99:[2,75],101:[2,75],102:[2,75],103:[2,75],107:[2,75],115:[2,75],123:[2,75],125:[2,75],126:[2,75],129:[2,75],130:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],47:[2,101],52:[2,101],55:[2,101],64:[2,101],65:[2,101],66:[2,101],68:[2,101],70:[2,101],71:[2,101],75:[2,101],79:102,81:[2,101],82:[1,103],83:[2,101],88:[2,101],90:[2,101],99:[2,101],101:[2,101],102:[2,101],103:[2,101],107:[2,101],115:[2,101],123:[2,101],125:[2,101],126:[2,101],129:[2,101],130:[2,101],131:[2,101],132:[2,101],133:[2,101],134:[2,101]},{27:107,28:[1,71],42:108,46:104,47:[2,53],52:[2,53],53:105,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{5:113,25:[1,5]},{8:114,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:116,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:117,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:118,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:122,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],38:[2,68],47:[2,68],52:[2,68],55:[2,68],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,68],71:[2,68],75:[2,68],77:[1,126],81:[2,68],82:[2,68],83:[2,68],88:[2,68],90:[2,68],99:[2,68],101:[2,68],102:[2,68],103:[2,68],107:[2,68],115:[2,68],123:[2,68],125:[2,68],126:[2,68],127:[1,123],128:[1,124],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[1,125]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],47:[2,175],52:[2,175],55:[2,175],70:[2,175],75:[2,175],83:[2,175],88:[2,175],90:[2,175],99:[2,175],101:[2,175],102:[2,175],103:[2,175],107:[2,175],115:[2,175],118:[1,127],123:[2,175],125:[2,175],126:[2,175],129:[2,175],130:[2,175],131:[2,175],132:[2,175],133:[2,175],134:[2,175]},{5:128,25:[1,5]},{5:129,25:[1,5]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],47:[2,143],52:[2,143],55:[2,143],70:[2,143],75:[2,143],83:[2,143],88:[2,143],90:[2,143],99:[2,143],101:[2,143],102:[2,143],103:[2,143],107:[2,143],115:[2,143],123:[2,143],125:[2,143],126:[2,143],129:[2,143],130:[2,143],131:[2,143],132:[2,143],133:[2,143],134:[2,143]},{5:130,25:[1,5]},{8:131,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,132],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,91],5:133,6:[2,91],13:119,14:120,25:[1,5],26:[2,91],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,47:[2,91],52:[2,91],55:[2,91],56:47,57:48,59:135,61:25,62:26,63:27,70:[2,91],73:[1,68],75:[2,91],77:[1,134],80:[1,28],83:[2,91],85:[1,56],86:[1,57],87:[1,55],88:[2,91],90:[2,91],98:[1,54],99:[2,91],101:[2,91],102:[2,91],103:[2,91],107:[2,91],115:[2,91],123:[2,91],125:[2,91],126:[2,91],129:[2,91],130:[2,91],131:[2,91],132:[2,91],133:[2,91],134:[2,91]},{8:136,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,45],6:[2,45],8:137,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,45],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,45],100:39,101:[2,45],103:[2,45],104:40,105:[1,65],106:41,107:[2,45],108:67,116:[1,42],121:37,122:[1,62],123:[2,45],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,46],6:[2,46],25:[2,46],26:[2,46],52:[2,46],75:[2,46],99:[2,46],101:[2,46],103:[2,46],107:[2,46],123:[2,46]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],38:[2,69],47:[2,69],52:[2,69],55:[2,69],64:[2,69],65:[2,69],66:[2,69],68:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],38:[2,70],47:[2,70],52:[2,70],55:[2,70],64:[2,70],65:[2,70],66:[2,70],68:[2,70],70:[2,70],71:[2,70],75:[2,70],81:[2,70],82:[2,70],83:[2,70],88:[2,70],90:[2,70],99:[2,70],101:[2,70],102:[2,70],103:[2,70],107:[2,70],115:[2,70],123:[2,70],125:[2,70],126:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],47:[2,29],52:[2,29],55:[2,29],64:[2,29],65:[2,29],66:[2,29],68:[2,29],70:[2,29],71:[2,29],75:[2,29],81:[2,29],82:[2,29],83:[2,29],88:[2,29],90:[2,29],99:[2,29],101:[2,29],102:[2,29],103:[2,29],107:[2,29],115:[2,29],123:[2,29],125:[2,29],126:[2,29],129:[2,29],130:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],47:[2,30],52:[2,30],55:[2,30],64:[2,30],65:[2,30],66:[2,30],68:[2,30],70:[2,30],71:[2,30],75:[2,30],81:[2,30],82:[2,30],83:[2,30],88:[2,30],90:[2,30],99:[2,30],101:[2,30],102:[2,30],103:[2,30],107:[2,30],115:[2,30],123:[2,30],125:[2,30],126:[2,30],129:[2,30],130:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],47:[2,31],52:[2,31],55:[2,31],64:[2,31],65:[2,31],66:[2,31],68:[2,31],70:[2,31],71:[2,31],75:[2,31],81:[2,31],82:[2,31],83:[2,31],88:[2,31],90:[2,31],99:[2,31],101:[2,31],102:[2,31],103:[2,31],107:[2,31],115:[2,31],123:[2,31],125:[2,31],126:[2,31],129:[2,31],130:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],47:[2,32],52:[2,32],55:[2,32],64:[2,32],65:[2,32],66:[2,32],68:[2,32],70:[2,32],71:[2,32],75:[2,32],81:[2,32],82:[2,32],83:[2,32],88:[2,32],90:[2,32],99:[2,32],101:[2,32],102:[2,32],103:[2,32],107:[2,32],115:[2,32],123:[2,32],125:[2,32],126:[2,32],129:[2,32],130:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],47:[2,33],52:[2,33],55:[2,33],64:[2,33],65:[2,33],66:[2,33],68:[2,33],70:[2,33],71:[2,33],75:[2,33],81:[2,33],82:[2,33],83:[2,33],88:[2,33],90:[2,33],99:[2,33],101:[2,33],102:[2,33],103:[2,33],107:[2,33],115:[2,33],123:[2,33],125:[2,33],126:[2,33],129:[2,33],130:[2,33],131:[2,33],132:[2,33],133:[2,33],134:[2,33]},{4:138,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,139],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:140,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],47:[2,107],52:[2,107],55:[2,107],64:[2,107],65:[2,107],66:[2,107],68:[2,107],70:[2,107],71:[2,107],75:[2,107],81:[2,107],82:[2,107],83:[2,107],88:[2,107],90:[2,107],99:[2,107],101:[2,107],102:[2,107],103:[2,107],107:[2,107],115:[2,107],123:[2,107],125:[2,107],126:[2,107],129:[2,107],130:[2,107],131:[2,107],132:[2,107],133:[2,107],134:[2,107]},{1:[2,108],6:[2,108],25:[2,108],26:[2,108],27:146,28:[1,71],47:[2,108],52:[2,108],55:[2,108],64:[2,108],65:[2,108],66:[2,108],68:[2,108],70:[2,108],71:[2,108],75:[2,108],81:[2,108],82:[2,108],83:[2,108],88:[2,108],90:[2,108],99:[2,108],101:[2,108],102:[2,108],103:[2,108],107:[2,108],115:[2,108],123:[2,108],125:[2,108],126:[2,108],129:[2,108],130:[2,108],131:[2,108],132:[2,108],133:[2,108],134:[2,108]},{25:[2,49]},{25:[2,50]},{1:[2,64],6:[2,64],25:[2,64],26:[2,64],38:[2,64],47:[2,64],52:[2,64],55:[2,64],64:[2,64],65:[2,64],66:[2,64],68:[2,64],70:[2,64],71:[2,64],75:[2,64],77:[2,64],81:[2,64],82:[2,64],83:[2,64],88:[2,64],90:[2,64],99:[2,64],101:[2,64],102:[2,64],103:[2,64],107:[2,64],115:[2,64],123:[2,64],125:[2,64],126:[2,64],127:[2,64],128:[2,64],129:[2,64],130:[2,64],131:[2,64],132:[2,64],133:[2,64],134:[2,64],135:[2,64]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],38:[2,67],47:[2,67],52:[2,67],55:[2,67],64:[2,67],65:[2,67],66:[2,67],68:[2,67],70:[2,67],71:[2,67],75:[2,67],77:[2,67],81:[2,67],82:[2,67],83:[2,67],88:[2,67],90:[2,67],99:[2,67],101:[2,67],102:[2,67],103:[2,67],107:[2,67],115:[2,67],123:[2,67],125:[2,67],126:[2,67],127:[2,67],128:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67],135:[2,67]},{8:147,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:148,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:149,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:150,8:151,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{27:156,28:[1,71],56:157,57:158,62:152,73:[1,68],87:[1,55],110:153,111:[1,154],112:155},{109:159,113:[1,160],114:[1,161]},{6:[2,86],11:165,25:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:162,75:[2,86],86:[1,111]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],41:[2,27],47:[2,27],52:[2,27],55:[2,27],64:[2,27],65:[2,27],66:[2,27],68:[2,27],70:[2,27],71:[2,27],75:[2,27],81:[2,27],82:[2,27],83:[2,27],88:[2,27],90:[2,27],99:[2,27],101:[2,27],102:[2,27],103:[2,27],107:[2,27],115:[2,27],123:[2,27],125:[2,27],126:[2,27],129:[2,27],130:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],41:[2,28],47:[2,28],52:[2,28],55:[2,28],64:[2,28],65:[2,28],66:[2,28],68:[2,28],70:[2,28],71:[2,28],75:[2,28],81:[2,28],82:[2,28],83:[2,28],88:[2,28],90:[2,28],99:[2,28],101:[2,28],102:[2,28],103:[2,28],107:[2,28],115:[2,28],123:[2,28],125:[2,28],126:[2,28],129:[2,28],130:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],38:[2,26],41:[2,26],47:[2,26],52:[2,26],55:[2,26],64:[2,26],65:[2,26],66:[2,26],68:[2,26],70:[2,26],71:[2,26],75:[2,26],77:[2,26],81:[2,26],82:[2,26],83:[2,26],88:[2,26],90:[2,26],99:[2,26],101:[2,26],102:[2,26],103:[2,26],107:[2,26],113:[2,26],114:[2,26],115:[2,26],123:[2,26],125:[2,26],126:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26]},{1:[2,6],6:[2,6],7:169,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,6],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],47:[2,24],52:[2,24],55:[2,24],70:[2,24],75:[2,24],83:[2,24],88:[2,24],90:[2,24],95:[2,24],96:[2,24],99:[2,24],101:[2,24],102:[2,24],103:[2,24],107:[2,24],115:[2,24],118:[2,24],120:[2,24],123:[2,24],125:[2,24],126:[2,24],129:[2,24],130:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24]},{6:[1,72],26:[1,170]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],47:[2,186],52:[2,186],55:[2,186],70:[2,186],75:[2,186],83:[2,186],88:[2,186],90:[2,186],99:[2,186],101:[2,186],102:[2,186],103:[2,186],107:[2,186],115:[2,186],123:[2,186],125:[2,186],126:[2,186],129:[2,186],130:[2,186],131:[2,186],132:[2,186],133:[2,186],134:[2,186]},{8:171,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:172,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:173,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:174,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:175,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:176,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:177,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:178,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],47:[2,142],52:[2,142],55:[2,142],70:[2,142],75:[2,142],83:[2,142],88:[2,142],90:[2,142],99:[2,142],101:[2,142],102:[2,142],103:[2,142],107:[2,142],115:[2,142],123:[2,142],125:[2,142],126:[2,142],129:[2,142],130:[2,142],131:[2,142],132:[2,142],133:[2,142],134:[2,142]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],47:[2,147],52:[2,147],55:[2,147],70:[2,147],75:[2,147],83:[2,147],88:[2,147],90:[2,147],99:[2,147],101:[2,147],102:[2,147],103:[2,147],107:[2,147],115:[2,147],123:[2,147],125:[2,147],126:[2,147],129:[2,147],130:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147]},{8:179,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],47:[2,141],52:[2,141],55:[2,141],70:[2,141],75:[2,141],83:[2,141],88:[2,141],90:[2,141],99:[2,141],101:[2,141],102:[2,141],103:[2,141],107:[2,141],115:[2,141],123:[2,141],125:[2,141],126:[2,141],129:[2,141],130:[2,141],131:[2,141],132:[2,141],133:[2,141],134:[2,141]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],47:[2,146],52:[2,146],55:[2,146],70:[2,146],75:[2,146],83:[2,146],88:[2,146],90:[2,146],99:[2,146],101:[2,146],102:[2,146],103:[2,146],107:[2,146],115:[2,146],123:[2,146],125:[2,146],126:[2,146],129:[2,146],130:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146]},{79:180,82:[1,103]},{1:[2,65],6:[2,65],25:[2,65],26:[2,65],38:[2,65],47:[2,65],52:[2,65],55:[2,65],64:[2,65],65:[2,65],66:[2,65],68:[2,65],70:[2,65],71:[2,65],75:[2,65],77:[2,65],81:[2,65],82:[2,65],83:[2,65],88:[2,65],90:[2,65],99:[2,65],101:[2,65],102:[2,65],103:[2,65],107:[2,65],115:[2,65],123:[2,65],125:[2,65],126:[2,65],127:[2,65],128:[2,65],129:[2,65],130:[2,65],131:[2,65],132:[2,65],133:[2,65],134:[2,65],135:[2,65]},{82:[2,104]},{27:181,28:[1,71]},{27:182,28:[1,71]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],27:183,28:[1,71],38:[2,79],47:[2,79],52:[2,79],55:[2,79],64:[2,79],65:[2,79],66:[2,79],68:[2,79],70:[2,79],71:[2,79],75:[2,79],77:[2,79],81:[2,79],82:[2,79],83:[2,79],88:[2,79],90:[2,79],99:[2,79],101:[2,79],102:[2,79],103:[2,79],107:[2,79],115:[2,79],123:[2,79],125:[2,79],126:[2,79],127:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],38:[2,80],47:[2,80],52:[2,80],55:[2,80],64:[2,80],65:[2,80],66:[2,80],68:[2,80],70:[2,80],71:[2,80],75:[2,80],77:[2,80],81:[2,80],82:[2,80],83:[2,80],88:[2,80],90:[2,80],99:[2,80],101:[2,80],102:[2,80],103:[2,80],107:[2,80],115:[2,80],123:[2,80],125:[2,80],126:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80]},{8:185,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],55:[1,189],56:47,57:48,59:36,61:25,62:26,63:27,69:184,72:186,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],89:187,90:[1,188],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{67:190,68:[1,97],71:[1,98]},{79:191,82:[1,103]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],38:[2,66],47:[2,66],52:[2,66],55:[2,66],64:[2,66],65:[2,66],66:[2,66],68:[2,66],70:[2,66],71:[2,66],75:[2,66],77:[2,66],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],127:[2,66],128:[2,66],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66],135:[2,66]},{6:[1,193],8:192,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,194],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],47:[2,102],52:[2,102],55:[2,102],64:[2,102],65:[2,102],66:[2,102],68:[2,102],70:[2,102],71:[2,102],75:[2,102],81:[2,102],82:[2,102],83:[2,102],88:[2,102],90:[2,102],99:[2,102],101:[2,102],102:[2,102],103:[2,102],107:[2,102],115:[2,102],123:[2,102],125:[2,102],126:[2,102],129:[2,102],130:[2,102],131:[2,102],132:[2,102],133:[2,102],134:[2,102]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[1,195],84:196,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{47:[1,198],52:[1,199]},{47:[2,54],52:[2,54]},{38:[1,201],47:[2,56],52:[2,56],55:[1,200]},{38:[2,59],47:[2,59],52:[2,59],55:[2,59]},{38:[2,60],47:[2,60],52:[2,60],55:[2,60]},{38:[2,61],47:[2,61],52:[2,61],55:[2,61]},{38:[2,62],47:[2,62],52:[2,62],55:[2,62]},{27:146,28:[1,71]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],47:[2,48],52:[2,48],55:[2,48],70:[2,48],75:[2,48],83:[2,48],88:[2,48],90:[2,48],99:[2,48],101:[2,48],102:[2,48],103:[2,48],107:[2,48],115:[2,48],123:[2,48],125:[2,48],126:[2,48],129:[2,48],130:[2,48],131:[2,48],132:[2,48],133:[2,48],134:[2,48]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],47:[2,179],52:[2,179],55:[2,179],70:[2,179],75:[2,179],83:[2,179],88:[2,179],90:[2,179],99:[2,179],100:85,101:[2,179],102:[2,179],103:[2,179],106:86,107:[2,179],108:67,115:[2,179],123:[2,179],125:[2,179],126:[2,179],129:[1,76],130:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179]},{100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],47:[2,180],52:[2,180],55:[2,180],70:[2,180],75:[2,180],83:[2,180],88:[2,180],90:[2,180],99:[2,180],100:85,101:[2,180],102:[2,180],103:[2,180],106:86,107:[2,180],108:67,115:[2,180],123:[2,180],125:[2,180],126:[2,180],129:[1,76],130:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],47:[2,181],52:[2,181],55:[2,181],70:[2,181],75:[2,181],83:[2,181],88:[2,181],90:[2,181],99:[2,181],100:85,101:[2,181],102:[2,181],103:[2,181],106:86,107:[2,181],108:67,115:[2,181],123:[2,181],125:[2,181],126:[2,181],129:[1,76],130:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],47:[2,182],52:[2,182],55:[2,182],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,182],71:[2,68],75:[2,182],81:[2,68],82:[2,68],83:[2,182],88:[2,182],90:[2,182],99:[2,182],101:[2,182],102:[2,182],103:[2,182],107:[2,182],115:[2,182],123:[2,182],125:[2,182],126:[2,182],129:[2,182],130:[2,182],131:[2,182],132:[2,182],133:[2,182],134:[2,182]},{60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:90,81:[1,92],82:[2,103]},{60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:99,81:[1,92],82:[2,103]},{64:[2,71],65:[2,71],66:[2,71],68:[2,71],71:[2,71],81:[2,71],82:[2,71]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],47:[2,183],52:[2,183],55:[2,183],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,183],71:[2,68],75:[2,183],81:[2,68],82:[2,68],83:[2,183],88:[2,183],90:[2,183],99:[2,183],101:[2,183],102:[2,183],103:[2,183],107:[2,183],115:[2,183],123:[2,183],125:[2,183],126:[2,183],129:[2,183],130:[2,183],131:[2,183],132:[2,183],133:[2,183],134:[2,183]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],47:[2,184],52:[2,184],55:[2,184],70:[2,184],75:[2,184],83:[2,184],88:[2,184],90:[2,184],99:[2,184],101:[2,184],102:[2,184],103:[2,184],107:[2,184],115:[2,184],123:[2,184],125:[2,184],126:[2,184],129:[2,184],130:[2,184],131:[2,184],132:[2,184],133:[2,184],134:[2,184]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],47:[2,185],52:[2,185],55:[2,185],70:[2,185],75:[2,185],83:[2,185],88:[2,185],90:[2,185],99:[2,185],101:[2,185],102:[2,185],103:[2,185],107:[2,185],115:[2,185],123:[2,185],125:[2,185],126:[2,185],129:[2,185],130:[2,185],131:[2,185],132:[2,185],133:[2,185],134:[2,185]},{8:202,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,203],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:204,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:205,25:[1,5],122:[1,206]},{1:[2,128],6:[2,128],25:[2,128],26:[2,128],47:[2,128],52:[2,128],55:[2,128],70:[2,128],75:[2,128],83:[2,128],88:[2,128],90:[2,128],94:207,95:[1,208],96:[1,209],99:[2,128],101:[2,128],102:[2,128],103:[2,128],107:[2,128],115:[2,128],123:[2,128],125:[2,128],126:[2,128],129:[2,128],130:[2,128],131:[2,128],132:[2,128],133:[2,128],134:[2,128]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],47:[2,140],52:[2,140],55:[2,140],70:[2,140],75:[2,140],83:[2,140],88:[2,140],90:[2,140],99:[2,140],101:[2,140],102:[2,140],103:[2,140],107:[2,140],115:[2,140],123:[2,140],125:[2,140],126:[2,140],129:[2,140],130:[2,140],131:[2,140],132:[2,140],133:[2,140],134:[2,140]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],47:[2,148],52:[2,148],55:[2,148],70:[2,148],75:[2,148],83:[2,148],88:[2,148],90:[2,148],99:[2,148],101:[2,148],102:[2,148],103:[2,148],107:[2,148],115:[2,148],123:[2,148],125:[2,148],126:[2,148],129:[2,148],130:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148]},{25:[1,210],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{117:211,119:212,120:[1,213]},{1:[2,92],6:[2,92],25:[2,92],26:[2,92],47:[2,92],52:[2,92],55:[2,92],70:[2,92],75:[2,92],83:[2,92],88:[2,92],90:[2,92],99:[2,92],101:[2,92],102:[2,92],103:[2,92],107:[2,92],115:[2,92],123:[2,92],125:[2,92],126:[2,92],129:[2,92],130:[2,92],131:[2,92],132:[2,92],133:[2,92],134:[2,92]},{8:214,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,95],5:215,6:[2,95],25:[1,5],26:[2,95],47:[2,95],52:[2,95],55:[2,95],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,95],71:[2,68],75:[2,95],77:[1,216],81:[2,68],82:[2,68],83:[2,95],88:[2,95],90:[2,95],99:[2,95],101:[2,95],102:[2,95],103:[2,95],107:[2,95],115:[2,95],123:[2,95],125:[2,95],126:[2,95],129:[2,95],130:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],47:[2,133],52:[2,133],55:[2,133],70:[2,133],75:[2,133],83:[2,133],88:[2,133],90:[2,133],99:[2,133],100:85,101:[2,133],102:[2,133],103:[2,133],106:86,107:[2,133],108:67,115:[2,133],123:[2,133],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,44],6:[2,44],26:[2,44],99:[2,44],100:85,101:[2,44],103:[2,44],106:86,107:[2,44],108:67,123:[2,44],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,72],99:[1,217]},{4:218,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,124],25:[2,124],52:[2,124],55:[1,220],88:[2,124],89:219,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],38:[2,110],47:[2,110],52:[2,110],55:[2,110],64:[2,110],65:[2,110],66:[2,110],68:[2,110],70:[2,110],71:[2,110],75:[2,110],81:[2,110],82:[2,110],83:[2,110],88:[2,110],90:[2,110],99:[2,110],101:[2,110],102:[2,110],103:[2,110],107:[2,110],113:[2,110],114:[2,110],115:[2,110],123:[2,110],125:[2,110],126:[2,110],129:[2,110],130:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110]},{6:[2,51],25:[2,51],51:221,52:[1,222],88:[2,51]},{6:[2,119],25:[2,119],26:[2,119],52:[2,119],83:[2,119],88:[2,119]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:223,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,125],25:[2,125],26:[2,125],52:[2,125],83:[2,125],88:[2,125]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],38:[2,109],41:[2,109],47:[2,109],52:[2,109],55:[2,109],64:[2,109],65:[2,109],66:[2,109],68:[2,109],70:[2,109],71:[2,109],75:[2,109],77:[2,109],81:[2,109],82:[2,109],83:[2,109],88:[2,109],90:[2,109],99:[2,109],101:[2,109],102:[2,109],103:[2,109],107:[2,109],115:[2,109],123:[2,109],125:[2,109],126:[2,109],127:[2,109],128:[2,109],129:[2,109],130:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109]},{5:224,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],47:[2,136],52:[2,136],55:[2,136],70:[2,136],75:[2,136],83:[2,136],88:[2,136],90:[2,136],99:[2,136],100:85,101:[1,63],102:[1,225],103:[1,64],106:86,107:[1,66],108:67,115:[2,136],123:[2,136],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],47:[2,138],52:[2,138],55:[2,138],70:[2,138],75:[2,138],83:[2,138],88:[2,138],90:[2,138],99:[2,138],100:85,101:[1,63],102:[1,226],103:[1,64],106:86,107:[1,66],108:67,115:[2,138],123:[2,138],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],47:[2,144],52:[2,144],55:[2,144],70:[2,144],75:[2,144],83:[2,144],88:[2,144],90:[2,144],99:[2,144],101:[2,144],102:[2,144],103:[2,144],107:[2,144],115:[2,144],123:[2,144],125:[2,144],126:[2,144],129:[2,144],130:[2,144],131:[2,144],132:[2,144],133:[2,144],134:[2,144]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],47:[2,145],52:[2,145],55:[2,145],70:[2,145],75:[2,145],83:[2,145],88:[2,145],90:[2,145],99:[2,145],100:85,101:[1,63],102:[2,145],103:[1,64],106:86,107:[1,66],108:67,115:[2,145],123:[2,145],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],47:[2,149],52:[2,149],55:[2,149],70:[2,149],75:[2,149],83:[2,149],88:[2,149],90:[2,149],99:[2,149],101:[2,149],102:[2,149],103:[2,149],107:[2,149],115:[2,149],123:[2,149],125:[2,149],126:[2,149],129:[2,149],130:[2,149],131:[2,149],132:[2,149],133:[2,149],134:[2,149]},{113:[2,151],114:[2,151]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],110:227,112:155},{52:[1,228],113:[2,156],114:[2,156]},{52:[2,153],113:[2,153],114:[2,153]},{52:[2,154],113:[2,154],114:[2,154]},{52:[2,155],113:[2,155],114:[2,155]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],47:[2,150],52:[2,150],55:[2,150],70:[2,150],75:[2,150],83:[2,150],88:[2,150],90:[2,150],99:[2,150],101:[2,150],102:[2,150],103:[2,150],107:[2,150],115:[2,150],123:[2,150],125:[2,150],126:[2,150],129:[2,150],130:[2,150],131:[2,150],132:[2,150],133:[2,150],134:[2,150]},{8:229,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:230,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],51:231,52:[1,232],75:[2,51]},{6:[2,87],25:[2,87],26:[2,87],52:[2,87],75:[2,87]},{6:[2,37],25:[2,37],26:[2,37],41:[1,233],52:[2,37],75:[2,37]},{6:[2,40],25:[2,40],26:[2,40],52:[2,40],75:[2,40]},{6:[2,41],25:[2,41],26:[2,41],41:[2,41],52:[2,41],75:[2,41]},{6:[2,42],25:[2,42],26:[2,42],41:[2,42],52:[2,42],75:[2,42]},{6:[2,43],25:[2,43],26:[2,43],41:[2,43],52:[2,43],75:[2,43]},{1:[2,5],6:[2,5],26:[2,5],99:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],47:[2,25],52:[2,25],55:[2,25],70:[2,25],75:[2,25],83:[2,25],88:[2,25],90:[2,25],95:[2,25],96:[2,25],99:[2,25],101:[2,25],102:[2,25],103:[2,25],107:[2,25],115:[2,25],118:[2,25],120:[2,25],123:[2,25],125:[2,25],126:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],47:[2,187],52:[2,187],55:[2,187],70:[2,187],75:[2,187],83:[2,187],88:[2,187],90:[2,187],99:[2,187],100:85,101:[2,187],102:[2,187],103:[2,187],106:86,107:[2,187],108:67,115:[2,187],123:[2,187],125:[2,187],126:[2,187],129:[1,76],130:[1,79],131:[2,187],132:[2,187],133:[2,187],134:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],47:[2,188],52:[2,188],55:[2,188],70:[2,188],75:[2,188],83:[2,188],88:[2,188],90:[2,188],99:[2,188],100:85,101:[2,188],102:[2,188],103:[2,188],106:86,107:[2,188],108:67,115:[2,188],123:[2,188],125:[2,188],126:[2,188],129:[1,76],130:[1,79],131:[2,188],132:[2,188],133:[2,188],134:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],47:[2,189],52:[2,189],55:[2,189],70:[2,189],75:[2,189],83:[2,189],88:[2,189],90:[2,189],99:[2,189],100:85,101:[2,189],102:[2,189],103:[2,189],106:86,107:[2,189],108:67,115:[2,189],123:[2,189],125:[2,189],126:[2,189],129:[1,76],130:[2,189],131:[2,189],132:[2,189],133:[2,189],134:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],47:[2,190],52:[2,190],55:[2,190],70:[2,190],75:[2,190],83:[2,190],88:[2,190],90:[2,190],99:[2,190],100:85,101:[2,190],102:[2,190],103:[2,190],106:86,107:[2,190],108:67,115:[2,190],123:[2,190],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[2,190],132:[2,190],133:[2,190],134:[2,190]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],47:[2,191],52:[2,191],55:[2,191],70:[2,191],75:[2,191],83:[2,191],88:[2,191],90:[2,191],99:[2,191],100:85,101:[2,191],102:[2,191],103:[2,191],106:86,107:[2,191],108:67,115:[2,191],123:[2,191],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,191],133:[2,191],134:[1,83]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],47:[2,192],52:[2,192],55:[2,192],70:[2,192],75:[2,192],83:[2,192],88:[2,192],90:[2,192],99:[2,192],100:85,101:[2,192],102:[2,192],103:[2,192],106:86,107:[2,192],108:67,115:[2,192],123:[2,192],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[2,192],134:[1,83]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],47:[2,193],52:[2,193],55:[2,193],70:[2,193],75:[2,193],83:[2,193],88:[2,193],90:[2,193],99:[2,193],100:85,101:[2,193],102:[2,193],103:[2,193],106:86,107:[2,193],108:67,115:[2,193],123:[2,193],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,193],133:[2,193],134:[2,193]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],47:[2,178],52:[2,178],55:[2,178],70:[2,178],75:[2,178],83:[2,178],88:[2,178],90:[2,178],99:[2,178],100:85,101:[1,63],102:[2,178],103:[1,64],106:86,107:[1,66],108:67,115:[2,178],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,177],6:[2,177],25:[2,177],26:[2,177],47:[2,177],52:[2,177],55:[2,177],70:[2,177],75:[2,177],83:[2,177],88:[2,177],90:[2,177],99:[2,177],100:85,101:[1,63],102:[2,177],103:[1,64],106:86,107:[1,66],108:67,115:[2,177],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],47:[2,99],52:[2,99],55:[2,99],64:[2,99],65:[2,99],66:[2,99],68:[2,99],70:[2,99],71:[2,99],75:[2,99],81:[2,99],82:[2,99],83:[2,99],88:[2,99],90:[2,99],99:[2,99],101:[2,99],102:[2,99],103:[2,99],107:[2,99],115:[2,99],123:[2,99],125:[2,99],126:[2,99],129:[2,99],130:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],38:[2,76],47:[2,76],52:[2,76],55:[2,76],64:[2,76],65:[2,76],66:[2,76],68:[2,76],70:[2,76],71:[2,76],75:[2,76],77:[2,76],81:[2,76],82:[2,76],83:[2,76],88:[2,76],90:[2,76],99:[2,76],101:[2,76],102:[2,76],103:[2,76],107:[2,76],115:[2,76],123:[2,76],125:[2,76],126:[2,76],127:[2,76],128:[2,76],129:[2,76],130:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],38:[2,77],47:[2,77],52:[2,77],55:[2,77],64:[2,77],65:[2,77],66:[2,77],68:[2,77],70:[2,77],71:[2,77],75:[2,77],77:[2,77],81:[2,77],82:[2,77],83:[2,77],88:[2,77],90:[2,77],99:[2,77],101:[2,77],102:[2,77],103:[2,77],107:[2,77],115:[2,77],123:[2,77],125:[2,77],126:[2,77],127:[2,77],128:[2,77],129:[2,77],130:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],38:[2,78],47:[2,78],52:[2,78],55:[2,78],64:[2,78],65:[2,78],66:[2,78],68:[2,78],70:[2,78],71:[2,78],75:[2,78],77:[2,78],81:[2,78],82:[2,78],83:[2,78],88:[2,78],90:[2,78],99:[2,78],101:[2,78],102:[2,78],103:[2,78],107:[2,78],115:[2,78],123:[2,78],125:[2,78],126:[2,78],127:[2,78],128:[2,78],129:[2,78],130:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78]},{70:[1,234]},{55:[1,189],70:[2,83],89:235,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{70:[2,84]},{8:236,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,70:[2,118],73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{12:[2,112],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],36:[2,112],43:[2,112],44:[2,112],45:[2,112],49:[2,112],50:[2,112],70:[2,112],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{12:[2,113],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],70:[2,113],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],38:[2,82],47:[2,82],52:[2,82],55:[2,82],64:[2,82],65:[2,82],66:[2,82],68:[2,82],70:[2,82],71:[2,82],75:[2,82],77:[2,82],81:[2,82],82:[2,82],83:[2,82],88:[2,82],90:[2,82],99:[2,82],101:[2,82],102:[2,82],103:[2,82],107:[2,82],115:[2,82],123:[2,82],125:[2,82],126:[2,82],127:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],47:[2,100],52:[2,100],55:[2,100],64:[2,100],65:[2,100],66:[2,100],68:[2,100],70:[2,100],71:[2,100],75:[2,100],81:[2,100],82:[2,100],83:[2,100],88:[2,100],90:[2,100],99:[2,100],101:[2,100],102:[2,100],103:[2,100],107:[2,100],115:[2,100],123:[2,100],125:[2,100],126:[2,100],129:[2,100],130:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],47:[2,34],52:[2,34],55:[2,34],70:[2,34],75:[2,34],83:[2,34],88:[2,34],90:[2,34],99:[2,34],100:85,101:[2,34],102:[2,34],103:[2,34],106:86,107:[2,34],108:67,115:[2,34],123:[2,34],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:237,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:238,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],47:[2,105],52:[2,105],55:[2,105],64:[2,105],65:[2,105],66:[2,105],68:[2,105],70:[2,105],71:[2,105],75:[2,105],81:[2,105],82:[2,105],83:[2,105],88:[2,105],90:[2,105],99:[2,105],101:[2,105],102:[2,105],103:[2,105],107:[2,105],115:[2,105],123:[2,105],125:[2,105],126:[2,105],129:[2,105],130:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105]},{6:[2,51],25:[2,51],51:239,52:[1,222],83:[2,51]},{6:[2,124],25:[2,124],26:[2,124],52:[2,124],55:[1,240],83:[2,124],88:[2,124],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{48:241,49:[1,58],50:[1,59]},{27:107,28:[1,71],42:108,53:242,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{47:[2,57],52:[2,57]},{8:243,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],47:[2,194],52:[2,194],55:[2,194],70:[2,194],75:[2,194],83:[2,194],88:[2,194],90:[2,194],99:[2,194],100:85,101:[2,194],102:[2,194],103:[2,194],106:86,107:[2,194],108:67,115:[2,194],123:[2,194],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:244,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],47:[2,196],52:[2,196],55:[2,196],70:[2,196],75:[2,196],83:[2,196],88:[2,196],90:[2,196],99:[2,196],100:85,101:[2,196],102:[2,196],103:[2,196],106:86,107:[2,196],108:67,115:[2,196],123:[2,196],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],47:[2,176],52:[2,176],55:[2,176],70:[2,176],75:[2,176],83:[2,176],88:[2,176],90:[2,176],99:[2,176],101:[2,176],102:[2,176],103:[2,176],107:[2,176],115:[2,176],123:[2,176],125:[2,176],126:[2,176],129:[2,176],130:[2,176],131:[2,176],132:[2,176],133:[2,176],134:[2,176]},{8:245,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,129],6:[2,129],25:[2,129],26:[2,129],47:[2,129],52:[2,129],55:[2,129],70:[2,129],75:[2,129],83:[2,129],88:[2,129],90:[2,129],95:[1,246],99:[2,129],101:[2,129],102:[2,129],103:[2,129],107:[2,129],115:[2,129],123:[2,129],125:[2,129],126:[2,129],129:[2,129],130:[2,129],131:[2,129],132:[2,129],133:[2,129],134:[2,129]},{5:247,25:[1,5]},{27:248,28:[1,71]},{117:249,119:212,120:[1,213]},{26:[1,250],118:[1,251],119:252,120:[1,213]},{26:[2,169],118:[2,169],120:[2,169]},{8:254,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],92:253,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,93],5:255,6:[2,93],25:[1,5],26:[2,93],47:[2,93],52:[2,93],55:[2,93],70:[2,93],75:[2,93],83:[2,93],88:[2,93],90:[2,93],99:[2,93],100:85,101:[1,63],102:[2,93],103:[1,64],106:86,107:[1,66],108:67,115:[2,93],123:[2,93],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],47:[2,96],52:[2,96],55:[2,96],70:[2,96],75:[2,96],83:[2,96],88:[2,96],90:[2,96],99:[2,96],101:[2,96],102:[2,96],103:[2,96],107:[2,96],115:[2,96],123:[2,96],125:[2,96],126:[2,96],129:[2,96],130:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96]},{8:256,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],47:[2,134],52:[2,134],55:[2,134],64:[2,134],65:[2,134],66:[2,134],68:[2,134],70:[2,134],71:[2,134],75:[2,134],81:[2,134],82:[2,134],83:[2,134],88:[2,134],90:[2,134],99:[2,134],101:[2,134],102:[2,134],103:[2,134],107:[2,134],115:[2,134],123:[2,134],125:[2,134],126:[2,134],129:[2,134],130:[2,134],131:[2,134],132:[2,134],133:[2,134],134:[2,134]},{6:[1,72],26:[1,257]},{8:258,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,63],12:[2,113],25:[2,63],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],52:[2,63],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],88:[2,63],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{6:[1,260],25:[1,261],88:[1,259]},{6:[2,52],8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,52],26:[2,52],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[2,52],85:[1,56],86:[1,57],87:[1,55],88:[2,52],91:262,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],26:[2,51],51:263,52:[1,222]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],47:[2,173],52:[2,173],55:[2,173],70:[2,173],75:[2,173],83:[2,173],88:[2,173],90:[2,173],99:[2,173],101:[2,173],102:[2,173],103:[2,173],107:[2,173],115:[2,173],118:[2,173],123:[2,173],125:[2,173],126:[2,173],129:[2,173],130:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173]},{8:264,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:265,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{113:[2,152],114:[2,152]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],112:266},{1:[2,158],6:[2,158],25:[2,158],26:[2,158],47:[2,158],52:[2,158],55:[2,158],70:[2,158],75:[2,158],83:[2,158],88:[2,158],90:[2,158],99:[2,158],100:85,101:[2,158],102:[1,267],103:[2,158],106:86,107:[2,158],108:67,115:[1,268],123:[2,158],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,159],6:[2,159],25:[2,159],26:[2,159],47:[2,159],52:[2,159],55:[2,159],70:[2,159],75:[2,159],83:[2,159],88:[2,159],90:[2,159],99:[2,159],100:85,101:[2,159],102:[1,269],103:[2,159],106:86,107:[2,159],108:67,115:[2,159],123:[2,159],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,271],25:[1,272],75:[1,270]},{6:[2,52],11:165,25:[2,52],26:[2,52],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:273,40:164,42:168,44:[1,46],75:[2,52],86:[1,111]},{8:274,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,275],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],38:[2,81],47:[2,81],52:[2,81],55:[2,81],64:[2,81],65:[2,81],66:[2,81],68:[2,81],70:[2,81],71:[2,81],75:[2,81],77:[2,81],81:[2,81],82:[2,81],83:[2,81],88:[2,81],90:[2,81],99:[2,81],101:[2,81],102:[2,81],103:[2,81],107:[2,81],115:[2,81],123:[2,81],125:[2,81],126:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81]},{8:276,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,70:[2,116],73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,117],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],47:[2,35],52:[2,35],55:[2,35],70:[2,35],75:[2,35],83:[2,35],88:[2,35],90:[2,35],99:[2,35],100:85,101:[2,35],102:[2,35],103:[2,35],106:86,107:[2,35],108:67,115:[2,35],123:[2,35],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,277],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],83:[1,278]},{6:[2,63],25:[2,63],26:[2,63],52:[2,63],83:[2,63],88:[2,63]},{5:279,25:[1,5]},{47:[2,55],52:[2,55]},{47:[2,58],52:[2,58],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,280],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:281,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:282,25:[1,5]},{1:[2,130],6:[2,130],25:[2,130],26:[2,130],47:[2,130],52:[2,130],55:[2,130],70:[2,130],75:[2,130],83:[2,130],88:[2,130],90:[2,130],99:[2,130],101:[2,130],102:[2,130],103:[2,130],107:[2,130],115:[2,130],123:[2,130],125:[2,130],126:[2,130],129:[2,130],130:[2,130],131:[2,130],132:[2,130],133:[2,130],134:[2,130]},{5:283,25:[1,5]},{26:[1,284],118:[1,285],119:252,120:[1,213]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],47:[2,167],52:[2,167],55:[2,167],70:[2,167],75:[2,167],83:[2,167],88:[2,167],90:[2,167],99:[2,167],101:[2,167],102:[2,167],103:[2,167],107:[2,167],115:[2,167],123:[2,167],125:[2,167],126:[2,167],129:[2,167],130:[2,167],131:[2,167],132:[2,167],133:[2,167],134:[2,167]},{5:286,25:[1,5]},{26:[2,170],118:[2,170],120:[2,170]},{5:287,25:[1,5],52:[1,288]},{25:[2,126],52:[2,126],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,94],6:[2,94],25:[2,94],26:[2,94],47:[2,94],52:[2,94],55:[2,94],70:[2,94],75:[2,94],83:[2,94],88:[2,94],90:[2,94],99:[2,94],101:[2,94],102:[2,94],103:[2,94],107:[2,94],115:[2,94],123:[2,94],125:[2,94],126:[2,94],129:[2,94],130:[2,94],131:[2,94],132:[2,94],133:[2,94],134:[2,94]},{1:[2,97],5:289,6:[2,97],25:[1,5],26:[2,97],47:[2,97],52:[2,97],55:[2,97],70:[2,97],75:[2,97],83:[2,97],88:[2,97],90:[2,97],99:[2,97],100:85,101:[1,63],102:[2,97],103:[1,64],106:86,107:[1,66],108:67,115:[2,97],123:[2,97],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{99:[1,290]},{88:[1,291],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],38:[2,111],47:[2,111],52:[2,111],55:[2,111],64:[2,111],65:[2,111],66:[2,111],68:[2,111],70:[2,111],71:[2,111],75:[2,111],81:[2,111],82:[2,111],83:[2,111],88:[2,111],90:[2,111],99:[2,111],101:[2,111],102:[2,111],103:[2,111],107:[2,111],113:[2,111],114:[2,111],115:[2,111],123:[2,111],125:[2,111],126:[2,111],129:[2,111],130:[2,111],131:[2,111],132:[2,111],133:[2,111],134:[2,111]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],91:292,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:293,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,120],25:[2,120],26:[2,120],52:[2,120],83:[2,120],88:[2,120]},{6:[1,260],25:[1,261],26:[1,294]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],47:[2,137],52:[2,137],55:[2,137],70:[2,137],75:[2,137],83:[2,137],88:[2,137],90:[2,137],99:[2,137],100:85,101:[1,63],102:[2,137],103:[1,64],106:86,107:[1,66],108:67,115:[2,137],123:[2,137],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],47:[2,139],52:[2,139],55:[2,139],70:[2,139],75:[2,139],83:[2,139],88:[2,139],90:[2,139],99:[2,139],100:85,101:[1,63],102:[2,139],103:[1,64],106:86,107:[1,66],108:67,115:[2,139],123:[2,139],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{113:[2,157],114:[2,157]},{8:295,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:296,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:297,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],38:[2,85],47:[2,85],52:[2,85],55:[2,85],64:[2,85],65:[2,85],66:[2,85],68:[2,85],70:[2,85],71:[2,85],75:[2,85],81:[2,85],82:[2,85],83:[2,85],88:[2,85],90:[2,85],99:[2,85],101:[2,85],102:[2,85],103:[2,85],107:[2,85],113:[2,85],114:[2,85],115:[2,85],123:[2,85],125:[2,85],126:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85]},{11:165,27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:298,40:164,42:168,44:[1,46],86:[1,111]},{6:[2,86],11:165,25:[2,86],26:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:299,86:[1,111]},{6:[2,88],25:[2,88],26:[2,88],52:[2,88],75:[2,88]},{6:[2,38],25:[2,38],26:[2,38],52:[2,38],75:[2,38],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:300,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,115],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],47:[2,36],52:[2,36],55:[2,36],70:[2,36],75:[2,36],83:[2,36],88:[2,36],90:[2,36],99:[2,36],101:[2,36],102:[2,36],103:[2,36],107:[2,36],115:[2,36],123:[2,36],125:[2,36],126:[2,36],129:[2,36],130:[2,36],131:[2,36],132:[2,36],133:[2,36],134:[2,36]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],47:[2,106],52:[2,106],55:[2,106],64:[2,106],65:[2,106],66:[2,106],68:[2,106],70:[2,106],71:[2,106],75:[2,106],81:[2,106],82:[2,106],83:[2,106],88:[2,106],90:[2,106],99:[2,106],101:[2,106],102:[2,106],103:[2,106],107:[2,106],115:[2,106],123:[2,106],125:[2,106],126:[2,106],129:[2,106],130:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106]},{1:[2,47],6:[2,47],25:[2,47],26:[2,47],47:[2,47],52:[2,47],55:[2,47],70:[2,47],75:[2,47],83:[2,47],88:[2,47],90:[2,47],99:[2,47],101:[2,47],102:[2,47],103:[2,47],107:[2,47],115:[2,47],123:[2,47],125:[2,47],126:[2,47],129:[2,47],130:[2,47],131:[2,47],132:[2,47],133:[2,47],134:[2,47]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],47:[2,195],52:[2,195],55:[2,195],70:[2,195],75:[2,195],83:[2,195],88:[2,195],90:[2,195],99:[2,195],101:[2,195],102:[2,195],103:[2,195],107:[2,195],115:[2,195],123:[2,195],125:[2,195],126:[2,195],129:[2,195],130:[2,195],131:[2,195],132:[2,195],133:[2,195],134:[2,195]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],47:[2,174],52:[2,174],55:[2,174],70:[2,174],75:[2,174],83:[2,174],88:[2,174],90:[2,174],99:[2,174],101:[2,174],102:[2,174],103:[2,174],107:[2,174],115:[2,174],118:[2,174],123:[2,174],125:[2,174],126:[2,174],129:[2,174],130:[2,174],131:[2,174],132:[2,174],133:[2,174],134:[2,174]},{1:[2,131],6:[2,131],25:[2,131],26:[2,131],47:[2,131],52:[2,131],55:[2,131],70:[2,131],75:[2,131],83:[2,131],88:[2,131],90:[2,131],99:[2,131],101:[2,131],102:[2,131],103:[2,131],107:[2,131],115:[2,131],123:[2,131],125:[2,131],126:[2,131],129:[2,131],130:[2,131],131:[2,131],132:[2,131],133:[2,131],134:[2,131]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],47:[2,132],52:[2,132],55:[2,132],70:[2,132],75:[2,132],83:[2,132],88:[2,132],90:[2,132],95:[2,132],99:[2,132],101:[2,132],102:[2,132],103:[2,132],107:[2,132],115:[2,132],123:[2,132],125:[2,132],126:[2,132],129:[2,132],130:[2,132],131:[2,132],132:[2,132],133:[2,132],134:[2,132]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],47:[2,165],52:[2,165],55:[2,165],70:[2,165],75:[2,165],83:[2,165],88:[2,165],90:[2,165],99:[2,165],101:[2,165],102:[2,165],103:[2,165],107:[2,165],115:[2,165],123:[2,165],125:[2,165],126:[2,165],129:[2,165],130:[2,165],131:[2,165],132:[2,165],133:[2,165],134:[2,165]},{5:301,25:[1,5]},{26:[1,302]},{6:[1,303],26:[2,171],118:[2,171],120:[2,171]},{8:304,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],47:[2,98],52:[2,98],55:[2,98],70:[2,98],75:[2,98],83:[2,98],88:[2,98],90:[2,98],99:[2,98],101:[2,98],102:[2,98],103:[2,98],107:[2,98],115:[2,98],123:[2,98],125:[2,98],126:[2,98],129:[2,98],130:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],47:[2,135],52:[2,135],55:[2,135],64:[2,135],65:[2,135],66:[2,135],68:[2,135],70:[2,135],71:[2,135],75:[2,135],81:[2,135],82:[2,135],83:[2,135],88:[2,135],90:[2,135],99:[2,135],101:[2,135],102:[2,135],103:[2,135],107:[2,135],115:[2,135],123:[2,135],125:[2,135],126:[2,135],129:[2,135],130:[2,135],131:[2,135],132:[2,135],133:[2,135],134:[2,135]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],47:[2,114],52:[2,114],55:[2,114],64:[2,114],65:[2,114],66:[2,114],68:[2,114],70:[2,114],71:[2,114],75:[2,114],81:[2,114],82:[2,114],83:[2,114],88:[2,114],90:[2,114],99:[2,114],101:[2,114],102:[2,114],103:[2,114],107:[2,114],115:[2,114],123:[2,114],125:[2,114],126:[2,114],129:[2,114],130:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114]},{6:[2,121],25:[2,121],26:[2,121],52:[2,121],83:[2,121],88:[2,121]},{6:[2,51],25:[2,51],26:[2,51],51:305,52:[1,222]},{6:[2,122],25:[2,122],26:[2,122],52:[2,122],83:[2,122],88:[2,122]},{1:[2,160],6:[2,160],25:[2,160],26:[2,160],47:[2,160],52:[2,160],55:[2,160],70:[2,160],75:[2,160],83:[2,160],88:[2,160],90:[2,160],99:[2,160],100:85,101:[2,160],102:[2,160],103:[2,160],106:86,107:[2,160],108:67,115:[1,306],123:[2,160],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,162],6:[2,162],25:[2,162],26:[2,162],47:[2,162],52:[2,162],55:[2,162],70:[2,162],75:[2,162],83:[2,162],88:[2,162],90:[2,162],99:[2,162],100:85,101:[2,162],102:[1,307],103:[2,162],106:86,107:[2,162],108:67,115:[2,162],123:[2,162],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,161],6:[2,161],25:[2,161],26:[2,161],47:[2,161],52:[2,161],55:[2,161],70:[2,161],75:[2,161],83:[2,161],88:[2,161],90:[2,161],99:[2,161],100:85,101:[2,161],102:[2,161],103:[2,161],106:86,107:[2,161],108:67,115:[2,161],123:[2,161],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,89],25:[2,89],26:[2,89],52:[2,89],75:[2,89]},{6:[2,51],25:[2,51],26:[2,51],51:308,52:[1,232]},{26:[1,309],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,310]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],47:[2,168],52:[2,168],55:[2,168],70:[2,168],75:[2,168],83:[2,168],88:[2,168],90:[2,168],99:[2,168],101:[2,168],102:[2,168],103:[2,168],107:[2,168],115:[2,168],123:[2,168],125:[2,168],126:[2,168],129:[2,168],130:[2,168],131:[2,168],132:[2,168],133:[2,168],134:[2,168]},{26:[2,172],118:[2,172],120:[2,172]},{25:[2,127],52:[2,127],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],26:[1,311]},{8:312,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:313,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[1,271],25:[1,272],26:[1,314]},{6:[2,39],25:[2,39],26:[2,39],52:[2,39],75:[2,39]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],47:[2,166],52:[2,166],55:[2,166],70:[2,166],75:[2,166],83:[2,166],88:[2,166],90:[2,166],99:[2,166],101:[2,166],102:[2,166],103:[2,166],107:[2,166],115:[2,166],123:[2,166],125:[2,166],126:[2,166],129:[2,166],130:[2,166],131:[2,166],132:[2,166],133:[2,166],134:[2,166]},{6:[2,123],25:[2,123],26:[2,123],52:[2,123],83:[2,123],88:[2,123]},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],47:[2,163],52:[2,163],55:[2,163],70:[2,163],75:[2,163],83:[2,163],88:[2,163],90:[2,163],99:[2,163],100:85,101:[2,163],102:[2,163],103:[2,163],106:86,107:[2,163],108:67,115:[2,163],123:[2,163],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],47:[2,164],52:[2,164],55:[2,164],70:[2,164],75:[2,164],83:[2,164],88:[2,164],90:[2,164],99:[2,164],100:85,101:[2,164],102:[2,164],103:[2,164],106:86,107:[2,164],108:67,115:[2,164],123:[2,164],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,90],25:[2,90],26:[2,90],52:[2,90],75:[2,90]}],\ndefaultActions: {58:[2,49],59:[2,50],73:[2,3],92:[2,104],186:[2,84]},\nparseError: function parseError(str, hash) {\n    throw new Error(str);\n},\nparse: function parse(input) {\n    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = \"\", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n    this.lexer.setInput(input);\n    this.lexer.yy = this.yy;\n    this.yy.lexer = this.lexer;\n    if (typeof this.lexer.yylloc == \"undefined\")\n        this.lexer.yylloc = {};\n    var yyloc = this.lexer.yylloc;\n    lstack.push(yyloc);\n    if (typeof this.yy.parseError === \"function\")\n        this.parseError = this.yy.parseError;\n    function popStack(n) {\n        stack.length = stack.length - 2 * n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n    }\n    function lex() {\n        var token;\n        token = self.lexer.lex() || 1;\n        if (typeof token !== \"number\") {\n            token = self.symbols_[token] || token;\n        }\n        return token;\n    }\n    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n    while (true) {\n        state = stack[stack.length - 1];\n        if (this.defaultActions[state]) {\n            action = this.defaultActions[state];\n        } else {\n            if (symbol == null)\n                symbol = lex();\n            action = table[state] && table[state][symbol];\n        }\n        if (typeof action === \"undefined\" || !action.length || !action[0]) {\n            if (!recovering) {\n                expected = [];\n                for (p in table[state])\n                    if (this.terminals_[p] && p > 2) {\n                        expected.push(\"'\" + this.terminals_[p] + \"'\");\n                    }\n                var errStr = \"\";\n                if (this.lexer.showPosition) {\n                    errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + expected.join(\", \") + \", got '\" + this.terminals_[symbol] + \"'\";\n                } else {\n                    errStr = \"Parse error on line \" + (yylineno + 1) + \": Unexpected \" + (symbol == 1?\"end of input\":\"'\" + (this.terminals_[symbol] || symbol) + \"'\");\n                }\n                this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});\n            }\n        }\n        if (action[0] instanceof Array && action.length > 1) {\n            throw new Error(\"Parse Error: multiple actions possible at state: \" + state + \", token: \" + symbol);\n        }\n        switch (action[0]) {\n        case 1:\n            stack.push(symbol);\n            vstack.push(this.lexer.yytext);\n            lstack.push(this.lexer.yylloc);\n            stack.push(action[1]);\n            symbol = null;\n            if (!preErrorSymbol) {\n                yyleng = this.lexer.yyleng;\n                yytext = this.lexer.yytext;\n                yylineno = this.lexer.yylineno;\n                yyloc = this.lexer.yylloc;\n                if (recovering > 0)\n                    recovering--;\n            } else {\n                symbol = preErrorSymbol;\n                preErrorSymbol = null;\n            }\n            break;\n        case 2:\n            len = this.productions_[action[1]][1];\n            yyval.$ = vstack[vstack.length - len];\n            yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};\n            r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n            if (typeof r !== \"undefined\") {\n                return r;\n            }\n            if (len) {\n                stack = stack.slice(0, -1 * len * 2);\n                vstack = vstack.slice(0, -1 * len);\n                lstack = lstack.slice(0, -1 * len);\n            }\n            stack.push(this.productions_[action[1]][0]);\n            vstack.push(yyval.$);\n            lstack.push(yyval._$);\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n            stack.push(newState);\n            break;\n        case 3:\n            return true;\n        }\n    }\n    return true;\n}\n};\n\nmodule.exports = parser;\n\n\n});\n\ndefine('ace/mode/coffee/nodes', ['require', 'exports', 'module' , 'ace/mode/coffee/scope', 'ace/mode/coffee/lexer', 'ace/mode/coffee/helpers'], function(require, exports, module) {\n// Generated by CoffeeScript 1.2.1-pre\n\n  var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, Comment, Existence, Extends, For, IDENTIFIER, IDENTIFIER_STR, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, STRICT_PROSCRIBED, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, compact, del, ends, extend, flatten, last, merge, multident, starts, unfoldSoak, utility, _ref, _ref1,\n    __hasProp = {}.hasOwnProperty,\n    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; },\n    __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n  Scope = require('./scope').Scope;\n\n  _ref = require('./lexer'), RESERVED = _ref.RESERVED, STRICT_PROSCRIBED = _ref.STRICT_PROSCRIBED;\n\n  _ref1 = require('./helpers'), compact = _ref1.compact, flatten = _ref1.flatten, extend = _ref1.extend, merge = _ref1.merge, del = _ref1.del, starts = _ref1.starts, ends = _ref1.ends, last = _ref1.last;\n\n  exports.extend = extend;\n\n  YES = function() {\n    return true;\n  };\n\n  NO = function() {\n    return false;\n  };\n\n  THIS = function() {\n    return this;\n  };\n\n  NEGATE = function() {\n    this.negated = !this.negated;\n    return this;\n  };\n\n  exports.Base = Base = (function() {\n\n    Base.name = 'Base';\n\n    function Base() {}\n\n    Base.prototype.compile = function(o, lvl) {\n      var node;\n      o = extend({}, o);\n      if (lvl) o.level = lvl;\n      node = this.unfoldSoak(o) || this;\n      node.tab = o.indent;\n      if (o.level === LEVEL_TOP || !node.isStatement(o)) {\n        return node.compileNode(o);\n      } else {\n        return node.compileClosure(o);\n      }\n    };\n\n    Base.prototype.compileClosure = function(o) {\n      if (this.jumps()) {\n        throw SyntaxError('cannot use a pure statement in an expression.');\n      }\n      o.sharedScope = true;\n      return Closure.wrap(this).compileNode(o);\n    };\n\n    Base.prototype.cache = function(o, level, reused) {\n      var ref, sub;\n      if (!this.isComplex()) {\n        ref = level ? this.compile(o, level) : this;\n        return [ref, ref];\n      } else {\n        ref = new Literal(reused || o.scope.freeVariable('ref'));\n        sub = new Assign(ref, this);\n        if (level) {\n          return [sub.compile(o, level), ref.value];\n        } else {\n          return [sub, ref];\n        }\n      }\n    };\n\n    Base.prototype.compileLoopReference = function(o, name) {\n      var src, tmp;\n      src = tmp = this.compile(o, LEVEL_LIST);\n      if (!((-Infinity < +src && +src < Infinity) || IDENTIFIER.test(src) && o.scope.check(src, true))) {\n        src = \"\" + (tmp = o.scope.freeVariable(name)) + \" = \" + src;\n      }\n      return [src, tmp];\n    };\n\n    Base.prototype.makeReturn = function(res) {\n      var me;\n      me = this.unwrapAll();\n      if (res) {\n        return new Call(new Literal(\"\" + res + \".push\"), [me]);\n      } else {\n        return new Return(me);\n      }\n    };\n\n    Base.prototype.contains = function(pred) {\n      var contains;\n      contains = false;\n      this.traverseChildren(false, function(node) {\n        if (pred(node)) {\n          contains = true;\n          return false;\n        }\n      });\n      return contains;\n    };\n\n    Base.prototype.containsType = function(type) {\n      return this instanceof type || this.contains(function(node) {\n        return node instanceof type;\n      });\n    };\n\n    Base.prototype.lastNonComment = function(list) {\n      var i;\n      i = list.length;\n      while (i--) {\n        if (!(list[i] instanceof Comment)) return list[i];\n      }\n      return null;\n    };\n\n    Base.prototype.toString = function(idt, name) {\n      var tree;\n      if (idt == null) idt = '';\n      if (name == null) name = this.constructor.name;\n      tree = '\\n' + idt + name;\n      if (this.soak) tree += '?';\n      this.eachChild(function(node) {\n        return tree += node.toString(idt + TAB);\n      });\n      return tree;\n    };\n\n    Base.prototype.eachChild = function(func) {\n      var attr, child, _i, _j, _len, _len1, _ref2, _ref3;\n      if (!this.children) return this;\n      _ref2 = this.children;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        attr = _ref2[_i];\n        if (this[attr]) {\n          _ref3 = flatten([this[attr]]);\n          for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n            child = _ref3[_j];\n            if (func(child) === false) return this;\n          }\n        }\n      }\n      return this;\n    };\n\n    Base.prototype.traverseChildren = function(crossScope, func) {\n      return this.eachChild(function(child) {\n        if (func(child) === false) return false;\n        return child.traverseChildren(crossScope, func);\n      });\n    };\n\n    Base.prototype.invert = function() {\n      return new Op('!', this);\n    };\n\n    Base.prototype.unwrapAll = function() {\n      var node;\n      node = this;\n      while (node !== (node = node.unwrap())) {\n        continue;\n      }\n      return node;\n    };\n\n    Base.prototype.children = [];\n\n    Base.prototype.isStatement = NO;\n\n    Base.prototype.jumps = NO;\n\n    Base.prototype.isComplex = YES;\n\n    Base.prototype.isChainable = NO;\n\n    Base.prototype.isAssignable = NO;\n\n    Base.prototype.unwrap = THIS;\n\n    Base.prototype.unfoldSoak = NO;\n\n    Base.prototype.assigns = NO;\n\n    return Base;\n\n  })();\n\n  exports.Block = Block = (function(_super) {\n\n    __extends(Block, _super);\n\n    Block.name = 'Block';\n\n    function Block(nodes) {\n      this.expressions = compact(flatten(nodes || []));\n    }\n\n    Block.prototype.children = ['expressions'];\n\n    Block.prototype.push = function(node) {\n      this.expressions.push(node);\n      return this;\n    };\n\n    Block.prototype.pop = function() {\n      return this.expressions.pop();\n    };\n\n    Block.prototype.unshift = function(node) {\n      this.expressions.unshift(node);\n      return this;\n    };\n\n    Block.prototype.unwrap = function() {\n      if (this.expressions.length === 1) {\n        return this.expressions[0];\n      } else {\n        return this;\n      }\n    };\n\n    Block.prototype.isEmpty = function() {\n      return !this.expressions.length;\n    };\n\n    Block.prototype.isStatement = function(o) {\n      var exp, _i, _len, _ref2;\n      _ref2 = this.expressions;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        exp = _ref2[_i];\n        if (exp.isStatement(o)) return true;\n      }\n      return false;\n    };\n\n    Block.prototype.jumps = function(o) {\n      var exp, _i, _len, _ref2;\n      _ref2 = this.expressions;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        exp = _ref2[_i];\n        if (exp.jumps(o)) return exp;\n      }\n    };\n\n    Block.prototype.makeReturn = function(res) {\n      var expr, len;\n      len = this.expressions.length;\n      while (len--) {\n        expr = this.expressions[len];\n        if (!(expr instanceof Comment)) {\n          this.expressions[len] = expr.makeReturn(res);\n          if (expr instanceof Return && !expr.expression) {\n            this.expressions.splice(len, 1);\n          }\n          break;\n        }\n      }\n      return this;\n    };\n\n    Block.prototype.compile = function(o, level) {\n      if (o == null) o = {};\n      if (o.scope) {\n        return Block.__super__.compile.call(this, o, level);\n      } else {\n        return this.compileRoot(o);\n      }\n    };\n\n    Block.prototype.compileNode = function(o) {\n      var code, codes, node, top, _i, _len, _ref2;\n      this.tab = o.indent;\n      top = o.level === LEVEL_TOP;\n      codes = [];\n      _ref2 = this.expressions;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        node = _ref2[_i];\n        node = node.unwrapAll();\n        node = node.unfoldSoak(o) || node;\n        if (node instanceof Block) {\n          codes.push(node.compileNode(o));\n        } else if (top) {\n          node.front = true;\n          code = node.compile(o);\n          if (!node.isStatement(o)) {\n            code = \"\" + this.tab + code + \";\";\n            if (node instanceof Literal) code = \"\" + code + \"\\n\";\n          }\n          codes.push(code);\n        } else {\n          codes.push(node.compile(o, LEVEL_LIST));\n        }\n      }\n      if (top) {\n        if (this.spaced) {\n          return \"\\n\" + (codes.join('\\n\\n')) + \"\\n\";\n        } else {\n          return codes.join('\\n');\n        }\n      }\n      code = codes.join(', ') || 'void 0';\n      if (codes.length > 1 && o.level >= LEVEL_LIST) {\n        return \"(\" + code + \")\";\n      } else {\n        return code;\n      }\n    };\n\n    Block.prototype.compileRoot = function(o) {\n      var code, exp, i, prelude, preludeExps, rest;\n      o.indent = o.bare ? '' : TAB;\n      o.scope = new Scope(null, this, null);\n      o.level = LEVEL_TOP;\n      this.spaced = true;\n      prelude = \"\";\n      if (!o.bare) {\n        preludeExps = (function() {\n          var _i, _len, _ref2, _results;\n          _ref2 = this.expressions;\n          _results = [];\n          for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {\n            exp = _ref2[i];\n            if (!(exp.unwrap() instanceof Comment)) break;\n            _results.push(exp);\n          }\n          return _results;\n        }).call(this);\n        rest = this.expressions.slice(preludeExps.length);\n        this.expressions = preludeExps;\n        if (preludeExps.length) {\n          prelude = \"\" + (this.compileNode(merge(o, {\n            indent: ''\n          }))) + \"\\n\";\n        }\n        this.expressions = rest;\n      }\n      code = this.compileWithDeclarations(o);\n      if (o.bare) return code;\n      return \"\" + prelude + \"(function() {\\n\" + code + \"\\n}).call(this);\\n\";\n    };\n\n    Block.prototype.compileWithDeclarations = function(o) {\n      var assigns, code, declars, exp, i, post, rest, scope, spaced, _i, _len, _ref2, _ref3, _ref4;\n      code = post = '';\n      _ref2 = this.expressions;\n      for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {\n        exp = _ref2[i];\n        exp = exp.unwrap();\n        if (!(exp instanceof Comment || exp instanceof Literal)) break;\n      }\n      o = merge(o, {\n        level: LEVEL_TOP\n      });\n      if (i) {\n        rest = this.expressions.splice(i, 9e9);\n        _ref3 = [this.spaced, false], spaced = _ref3[0], this.spaced = _ref3[1];\n        _ref4 = [this.compileNode(o), spaced], code = _ref4[0], this.spaced = _ref4[1];\n        this.expressions = rest;\n      }\n      post = this.compileNode(o);\n      scope = o.scope;\n      if (scope.expressions === this) {\n        declars = o.scope.hasDeclarations();\n        assigns = scope.hasAssignments;\n        if (declars || assigns) {\n          if (i) code += '\\n';\n          code += \"\" + this.tab + \"var \";\n          if (declars) code += scope.declaredVariables().join(', ');\n          if (assigns) {\n            if (declars) code += \",\\n\" + (this.tab + TAB);\n            code += scope.assignedVariables().join(\",\\n\" + (this.tab + TAB));\n          }\n          code += ';\\n';\n        }\n      }\n      return code + post;\n    };\n\n    Block.wrap = function(nodes) {\n      if (nodes.length === 1 && nodes[0] instanceof Block) return nodes[0];\n      return new Block(nodes);\n    };\n\n    return Block;\n\n  })(Base);\n\n  exports.Literal = Literal = (function(_super) {\n\n    __extends(Literal, _super);\n\n    Literal.name = 'Literal';\n\n    function Literal(value) {\n      this.value = value;\n    }\n\n    Literal.prototype.makeReturn = function() {\n      if (this.isStatement()) {\n        return this;\n      } else {\n        return Literal.__super__.makeReturn.apply(this, arguments);\n      }\n    };\n\n    Literal.prototype.isAssignable = function() {\n      return IDENTIFIER.test(this.value);\n    };\n\n    Literal.prototype.isStatement = function() {\n      var _ref2;\n      return (_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger';\n    };\n\n    Literal.prototype.isComplex = NO;\n\n    Literal.prototype.assigns = function(name) {\n      return name === this.value;\n    };\n\n    Literal.prototype.jumps = function(o) {\n      if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) {\n        return this;\n      }\n      if (this.value === 'continue' && !(o != null ? o.loop : void 0)) return this;\n    };\n\n    Literal.prototype.compileNode = function(o) {\n      var code, _ref2;\n      code = this.isUndefined ? o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0' : this.value === 'this' ? ((_ref2 = o.scope.method) != null ? _ref2.bound : void 0) ? o.scope.method.context : this.value : this.value.reserved ? \"\\\"\" + this.value + \"\\\"\" : this.value;\n      if (this.isStatement()) {\n        return \"\" + this.tab + code + \";\";\n      } else {\n        return code;\n      }\n    };\n\n    Literal.prototype.toString = function() {\n      return ' \"' + this.value + '\"';\n    };\n\n    return Literal;\n\n  })(Base);\n\n  exports.Return = Return = (function(_super) {\n\n    __extends(Return, _super);\n\n    Return.name = 'Return';\n\n    function Return(expr) {\n      if (expr && !expr.unwrap().isUndefined) this.expression = expr;\n    }\n\n    Return.prototype.children = ['expression'];\n\n    Return.prototype.isStatement = YES;\n\n    Return.prototype.makeReturn = THIS;\n\n    Return.prototype.jumps = THIS;\n\n    Return.prototype.compile = function(o, level) {\n      var expr, _ref2;\n      expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0;\n      if (expr && !(expr instanceof Return)) {\n        return expr.compile(o, level);\n      } else {\n        return Return.__super__.compile.call(this, o, level);\n      }\n    };\n\n    Return.prototype.compileNode = function(o) {\n      return this.tab + (\"return\" + [this.expression ? \" \" + (this.expression.compile(o, LEVEL_PAREN)) : void 0] + \";\");\n    };\n\n    return Return;\n\n  })(Base);\n\n  exports.Value = Value = (function(_super) {\n\n    __extends(Value, _super);\n\n    Value.name = 'Value';\n\n    function Value(base, props, tag) {\n      if (!props && base instanceof Value) return base;\n      this.base = base;\n      this.properties = props || [];\n      if (tag) this[tag] = true;\n      return this;\n    }\n\n    Value.prototype.children = ['base', 'properties'];\n\n    Value.prototype.add = function(props) {\n      this.properties = this.properties.concat(props);\n      return this;\n    };\n\n    Value.prototype.hasProperties = function() {\n      return !!this.properties.length;\n    };\n\n    Value.prototype.isArray = function() {\n      return !this.properties.length && this.base instanceof Arr;\n    };\n\n    Value.prototype.isComplex = function() {\n      return this.hasProperties() || this.base.isComplex();\n    };\n\n    Value.prototype.isAssignable = function() {\n      return this.hasProperties() || this.base.isAssignable();\n    };\n\n    Value.prototype.isSimpleNumber = function() {\n      return this.base instanceof Literal && SIMPLENUM.test(this.base.value);\n    };\n\n    Value.prototype.isString = function() {\n      return this.base instanceof Literal && IS_STRING.test(this.base.value);\n    };\n\n    Value.prototype.isAtomic = function() {\n      var node, _i, _len, _ref2;\n      _ref2 = this.properties.concat(this.base);\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        node = _ref2[_i];\n        if (node.soak || node instanceof Call) return false;\n      }\n      return true;\n    };\n\n    Value.prototype.isStatement = function(o) {\n      return !this.properties.length && this.base.isStatement(o);\n    };\n\n    Value.prototype.assigns = function(name) {\n      return !this.properties.length && this.base.assigns(name);\n    };\n\n    Value.prototype.jumps = function(o) {\n      return !this.properties.length && this.base.jumps(o);\n    };\n\n    Value.prototype.isObject = function(onlyGenerated) {\n      if (this.properties.length) return false;\n      return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated);\n    };\n\n    Value.prototype.isSplice = function() {\n      return last(this.properties) instanceof Slice;\n    };\n\n    Value.prototype.unwrap = function() {\n      if (this.properties.length) {\n        return this;\n      } else {\n        return this.base;\n      }\n    };\n\n    Value.prototype.cacheReference = function(o) {\n      var base, bref, name, nref;\n      name = last(this.properties);\n      if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) {\n        return [this, this];\n      }\n      base = new Value(this.base, this.properties.slice(0, -1));\n      if (base.isComplex()) {\n        bref = new Literal(o.scope.freeVariable('base'));\n        base = new Value(new Parens(new Assign(bref, base)));\n      }\n      if (!name) return [base, bref];\n      if (name.isComplex()) {\n        nref = new Literal(o.scope.freeVariable('name'));\n        name = new Index(new Assign(nref, name.index));\n        nref = new Index(nref);\n      }\n      return [base.add(name), new Value(bref || base.base, [nref || name])];\n    };\n\n    Value.prototype.compileNode = function(o) {\n      var code, prop, props, _i, _len;\n      this.base.front = this.front;\n      props = this.properties;\n      code = this.base.compile(o, props.length ? LEVEL_ACCESS : null);\n      if ((this.base instanceof Parens || props.length) && SIMPLENUM.test(code)) {\n        code = \"\" + code + \".\";\n      }\n      for (_i = 0, _len = props.length; _i < _len; _i++) {\n        prop = props[_i];\n        code += prop.compile(o);\n      }\n      return code;\n    };\n\n    Value.prototype.unfoldSoak = function(o) {\n      var result,\n        _this = this;\n      if (this.unfoldedSoak != null) return this.unfoldedSoak;\n      result = (function() {\n        var fst, i, ifn, prop, ref, snd, _i, _len, _ref2;\n        if (ifn = _this.base.unfoldSoak(o)) {\n          Array.prototype.push.apply(ifn.body.properties, _this.properties);\n          return ifn;\n        }\n        _ref2 = _this.properties;\n        for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {\n          prop = _ref2[i];\n          if (!prop.soak) continue;\n          prop.soak = false;\n          fst = new Value(_this.base, _this.properties.slice(0, i));\n          snd = new Value(_this.base, _this.properties.slice(i));\n          if (fst.isComplex()) {\n            ref = new Literal(o.scope.freeVariable('ref'));\n            fst = new Parens(new Assign(ref, fst));\n            snd.base = ref;\n          }\n          return new If(new Existence(fst), snd, {\n            soak: true\n          });\n        }\n        return null;\n      })();\n      return this.unfoldedSoak = result || false;\n    };\n\n    return Value;\n\n  })(Base);\n\n  exports.Comment = Comment = (function(_super) {\n\n    __extends(Comment, _super);\n\n    Comment.name = 'Comment';\n\n    function Comment(comment) {\n      this.comment = comment;\n    }\n\n    Comment.prototype.isStatement = YES;\n\n    Comment.prototype.makeReturn = THIS;\n\n    Comment.prototype.compileNode = function(o, level) {\n      var code;\n      code = '/*' + multident(this.comment, this.tab) + (\"\\n\" + this.tab + \"*/\\n\");\n      if ((level || o.level) === LEVEL_TOP) code = o.indent + code;\n      return code;\n    };\n\n    return Comment;\n\n  })(Base);\n\n  exports.Call = Call = (function(_super) {\n\n    __extends(Call, _super);\n\n    Call.name = 'Call';\n\n    function Call(variable, args, soak) {\n      this.args = args != null ? args : [];\n      this.soak = soak;\n      this.isNew = false;\n      this.isSuper = variable === 'super';\n      this.variable = this.isSuper ? null : variable;\n    }\n\n    Call.prototype.children = ['variable', 'args'];\n\n    Call.prototype.newInstance = function() {\n      var base, _ref2;\n      base = ((_ref2 = this.variable) != null ? _ref2.base : void 0) || this.variable;\n      if (base instanceof Call && !base.isNew) {\n        base.newInstance();\n      } else {\n        this.isNew = true;\n      }\n      return this;\n    };\n\n    Call.prototype.superReference = function(o) {\n      var accesses, method, name;\n      method = o.scope.method;\n      if (!method) throw SyntaxError('cannot call super outside of a function.');\n      name = method.name;\n      if (name == null) {\n        throw SyntaxError('cannot call super on an anonymous function.');\n      }\n      if (method.klass) {\n        accesses = [new Access(new Literal('__super__'))];\n        if (method[\"static\"]) {\n          accesses.push(new Access(new Literal('constructor')));\n        }\n        accesses.push(new Access(new Literal(name)));\n        return (new Value(new Literal(method.klass), accesses)).compile(o);\n      } else {\n        return \"\" + name + \".__super__.constructor\";\n      }\n    };\n\n    Call.prototype.unfoldSoak = function(o) {\n      var call, ifn, left, list, rite, _i, _len, _ref2, _ref3;\n      if (this.soak) {\n        if (this.variable) {\n          if (ifn = unfoldSoak(o, this, 'variable')) return ifn;\n          _ref2 = new Value(this.variable).cacheReference(o), left = _ref2[0], rite = _ref2[1];\n        } else {\n          left = new Literal(this.superReference(o));\n          rite = new Value(left);\n        }\n        rite = new Call(rite, this.args);\n        rite.isNew = this.isNew;\n        left = new Literal(\"typeof \" + (left.compile(o)) + \" === \\\"function\\\"\");\n        return new If(left, new Value(rite), {\n          soak: true\n        });\n      }\n      call = this;\n      list = [];\n      while (true) {\n        if (call.variable instanceof Call) {\n          list.push(call);\n          call = call.variable;\n          continue;\n        }\n        if (!(call.variable instanceof Value)) break;\n        list.push(call);\n        if (!((call = call.variable.base) instanceof Call)) break;\n      }\n      _ref3 = list.reverse();\n      for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n        call = _ref3[_i];\n        if (ifn) {\n          if (call.variable instanceof Call) {\n            call.variable = ifn;\n          } else {\n            call.variable.base = ifn;\n          }\n        }\n        ifn = unfoldSoak(o, call, 'variable');\n      }\n      return ifn;\n    };\n\n    Call.prototype.filterImplicitObjects = function(list) {\n      var node, nodes, obj, prop, properties, _i, _j, _len, _len1, _ref2;\n      nodes = [];\n      for (_i = 0, _len = list.length; _i < _len; _i++) {\n        node = list[_i];\n        if (!((typeof node.isObject === \"function\" ? node.isObject() : void 0) && node.base.generated)) {\n          nodes.push(node);\n          continue;\n        }\n        obj = null;\n        _ref2 = node.base.properties;\n        for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {\n          prop = _ref2[_j];\n          if (prop instanceof Assign || prop instanceof Comment) {\n            if (!obj) nodes.push(obj = new Obj(properties = [], true));\n            properties.push(prop);\n          } else {\n            nodes.push(prop);\n            obj = null;\n          }\n        }\n      }\n      return nodes;\n    };\n\n    Call.prototype.compileNode = function(o) {\n      var arg, args, code, _ref2;\n      if ((_ref2 = this.variable) != null) _ref2.front = this.front;\n      if (code = Splat.compileSplattedArray(o, this.args, true)) {\n        return this.compileSplat(o, code);\n      }\n      args = this.filterImplicitObjects(this.args);\n      args = ((function() {\n        var _i, _len, _results;\n        _results = [];\n        for (_i = 0, _len = args.length; _i < _len; _i++) {\n          arg = args[_i];\n          _results.push(arg.compile(o, LEVEL_LIST));\n        }\n        return _results;\n      })()).join(', ');\n      if (this.isSuper) {\n        return this.superReference(o) + (\".call(this\" + (args && ', ' + args) + \")\");\n      } else {\n        return (this.isNew ? 'new ' : '') + this.variable.compile(o, LEVEL_ACCESS) + (\"(\" + args + \")\");\n      }\n    };\n\n    Call.prototype.compileSuper = function(args, o) {\n      return \"\" + (this.superReference(o)) + \".call(this\" + (args.length ? ', ' : '') + args + \")\";\n    };\n\n    Call.prototype.compileSplat = function(o, splatArgs) {\n      var base, fun, idt, name, ref;\n      if (this.isSuper) {\n        return \"\" + (this.superReference(o)) + \".apply(this, \" + splatArgs + \")\";\n      }\n      if (this.isNew) {\n        idt = this.tab + TAB;\n        return \"(function(func, args, ctor) {\\n\" + idt + \"ctor.prototype = func.prototype;\\n\" + idt + \"var child = new ctor, result = func.apply(child, args), t = typeof result;\\n\" + idt + \"return t == \\\"object\\\" || t == \\\"function\\\" ? result || child : child;\\n\" + this.tab + \"})(\" + (this.variable.compile(o, LEVEL_LIST)) + \", \" + splatArgs + \", function(){})\";\n      }\n      base = new Value(this.variable);\n      if ((name = base.properties.pop()) && base.isComplex()) {\n        ref = o.scope.freeVariable('ref');\n        fun = \"(\" + ref + \" = \" + (base.compile(o, LEVEL_LIST)) + \")\" + (name.compile(o));\n      } else {\n        fun = base.compile(o, LEVEL_ACCESS);\n        if (SIMPLENUM.test(fun)) fun = \"(\" + fun + \")\";\n        if (name) {\n          ref = fun;\n          fun += name.compile(o);\n        } else {\n          ref = 'null';\n        }\n      }\n      return \"\" + fun + \".apply(\" + ref + \", \" + splatArgs + \")\";\n    };\n\n    return Call;\n\n  })(Base);\n\n  exports.Extends = Extends = (function(_super) {\n\n    __extends(Extends, _super);\n\n    Extends.name = 'Extends';\n\n    function Extends(child, parent) {\n      this.child = child;\n      this.parent = parent;\n    }\n\n    Extends.prototype.children = ['child', 'parent'];\n\n    Extends.prototype.compile = function(o) {\n      return new Call(new Value(new Literal(utility('extends'))), [this.child, this.parent]).compile(o);\n    };\n\n    return Extends;\n\n  })(Base);\n\n  exports.Access = Access = (function(_super) {\n\n    __extends(Access, _super);\n\n    Access.name = 'Access';\n\n    function Access(name, tag) {\n      this.name = name;\n      this.name.asKey = true;\n      this.soak = tag === 'soak';\n    }\n\n    Access.prototype.children = ['name'];\n\n    Access.prototype.compile = function(o) {\n      var name;\n      name = this.name.compile(o);\n      if (IDENTIFIER.test(name)) {\n        return \".\" + name;\n      } else {\n        return \"[\" + name + \"]\";\n      }\n    };\n\n    Access.prototype.isComplex = NO;\n\n    return Access;\n\n  })(Base);\n\n  exports.Index = Index = (function(_super) {\n\n    __extends(Index, _super);\n\n    Index.name = 'Index';\n\n    function Index(index) {\n      this.index = index;\n    }\n\n    Index.prototype.children = ['index'];\n\n    Index.prototype.compile = function(o) {\n      return \"[\" + (this.index.compile(o, LEVEL_PAREN)) + \"]\";\n    };\n\n    Index.prototype.isComplex = function() {\n      return this.index.isComplex();\n    };\n\n    return Index;\n\n  })(Base);\n\n  exports.Range = Range = (function(_super) {\n\n    __extends(Range, _super);\n\n    Range.name = 'Range';\n\n    Range.prototype.children = ['from', 'to'];\n\n    function Range(from, to, tag) {\n      this.from = from;\n      this.to = to;\n      this.exclusive = tag === 'exclusive';\n      this.equals = this.exclusive ? '' : '=';\n    }\n\n    Range.prototype.compileVariables = function(o) {\n      var step, _ref2, _ref3, _ref4, _ref5;\n      o = merge(o, {\n        top: true\n      });\n      _ref2 = this.from.cache(o, LEVEL_LIST), this.fromC = _ref2[0], this.fromVar = _ref2[1];\n      _ref3 = this.to.cache(o, LEVEL_LIST), this.toC = _ref3[0], this.toVar = _ref3[1];\n      if (step = del(o, 'step')) {\n        _ref4 = step.cache(o, LEVEL_LIST), this.step = _ref4[0], this.stepVar = _ref4[1];\n      }\n      _ref5 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref5[0], this.toNum = _ref5[1];\n      if (this.stepVar) return this.stepNum = this.stepVar.match(SIMPLENUM);\n    };\n\n    Range.prototype.compileNode = function(o) {\n      var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, stepPart, to, varPart, _ref2, _ref3;\n      if (!this.fromVar) this.compileVariables(o);\n      if (!o.index) return this.compileArray(o);\n      known = this.fromNum && this.toNum;\n      idx = del(o, 'index');\n      idxName = del(o, 'name');\n      namedIndex = idxName && idxName !== idx;\n      varPart = \"\" + idx + \" = \" + this.fromC;\n      if (this.toC !== this.toVar) varPart += \", \" + this.toC;\n      if (this.step !== this.stepVar) varPart += \", \" + this.step;\n      _ref2 = [\"\" + idx + \" <\" + this.equals, \"\" + idx + \" >\" + this.equals], lt = _ref2[0], gt = _ref2[1];\n      condPart = this.stepNum ? +this.stepNum > 0 ? \"\" + lt + \" \" + this.toVar : \"\" + gt + \" \" + this.toVar : known ? ((_ref3 = [+this.fromNum, +this.toNum], from = _ref3[0], to = _ref3[1], _ref3), from <= to ? \"\" + lt + \" \" + to : \"\" + gt + \" \" + to) : (cond = \"\" + this.fromVar + \" <= \" + this.toVar, \"\" + cond + \" ? \" + lt + \" \" + this.toVar + \" : \" + gt + \" \" + this.toVar);\n      stepPart = this.stepVar ? \"\" + idx + \" += \" + this.stepVar : known ? namedIndex ? from <= to ? \"++\" + idx : \"--\" + idx : from <= to ? \"\" + idx + \"++\" : \"\" + idx + \"--\" : namedIndex ? \"\" + cond + \" ? ++\" + idx + \" : --\" + idx : \"\" + cond + \" ? \" + idx + \"++ : \" + idx + \"--\";\n      if (namedIndex) varPart = \"\" + idxName + \" = \" + varPart;\n      if (namedIndex) stepPart = \"\" + idxName + \" = \" + stepPart;\n      return \"\" + varPart + \"; \" + condPart + \"; \" + stepPart;\n    };\n\n    Range.prototype.compileArray = function(o) {\n      var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref2, _ref3, _results;\n      if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) {\n        range = (function() {\n          _results = [];\n          for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i++ : _i--){ _results.push(_i); }\n          return _results;\n        }).apply(this);\n        if (this.exclusive) range.pop();\n        return \"[\" + (range.join(', ')) + \"]\";\n      }\n      idt = this.tab + TAB;\n      i = o.scope.freeVariable('i');\n      result = o.scope.freeVariable('results');\n      pre = \"\\n\" + idt + result + \" = [];\";\n      if (this.fromNum && this.toNum) {\n        o.index = i;\n        body = this.compileNode(o);\n      } else {\n        vars = (\"\" + i + \" = \" + this.fromC) + (this.toC !== this.toVar ? \", \" + this.toC : '');\n        cond = \"\" + this.fromVar + \" <= \" + this.toVar;\n        body = \"var \" + vars + \"; \" + cond + \" ? \" + i + \" <\" + this.equals + \" \" + this.toVar + \" : \" + i + \" >\" + this.equals + \" \" + this.toVar + \"; \" + cond + \" ? \" + i + \"++ : \" + i + \"--\";\n      }\n      post = \"{ \" + result + \".push(\" + i + \"); }\\n\" + idt + \"return \" + result + \";\\n\" + o.indent;\n      hasArgs = function(node) {\n        return node != null ? node.contains(function(n) {\n          return n instanceof Literal && n.value === 'arguments' && !n.asKey;\n        }) : void 0;\n      };\n      if (hasArgs(this.from) || hasArgs(this.to)) args = ', arguments';\n      return \"(function() {\" + pre + \"\\n\" + idt + \"for (\" + body + \")\" + post + \"}).apply(this\" + (args != null ? args : '') + \")\";\n    };\n\n    return Range;\n\n  })(Base);\n\n  exports.Slice = Slice = (function(_super) {\n\n    __extends(Slice, _super);\n\n    Slice.name = 'Slice';\n\n    Slice.prototype.children = ['range'];\n\n    function Slice(range) {\n      this.range = range;\n      Slice.__super__.constructor.call(this);\n    }\n\n    Slice.prototype.compileNode = function(o) {\n      var compiled, from, fromStr, to, toStr, _ref2;\n      _ref2 = this.range, to = _ref2.to, from = _ref2.from;\n      fromStr = from && from.compile(o, LEVEL_PAREN) || '0';\n      compiled = to && to.compile(o, LEVEL_PAREN);\n      if (to && !(!this.range.exclusive && +compiled === -1)) {\n        toStr = ', ' + (this.range.exclusive ? compiled : SIMPLENUM.test(compiled) ? \"\" + (+compiled + 1) : (compiled = to.compile(o, LEVEL_ACCESS), \"\" + compiled + \" + 1 || 9e9\"));\n      }\n      return \".slice(\" + fromStr + (toStr || '') + \")\";\n    };\n\n    return Slice;\n\n  })(Base);\n\n  exports.Obj = Obj = (function(_super) {\n\n    __extends(Obj, _super);\n\n    Obj.name = 'Obj';\n\n    function Obj(props, generated) {\n      this.generated = generated != null ? generated : false;\n      this.objects = this.properties = props || [];\n    }\n\n    Obj.prototype.children = ['properties'];\n\n    Obj.prototype.compileNode = function(o) {\n      var i, idt, indent, join, lastNoncom, node, obj, prop, propName, propNames, props, _i, _j, _len, _len1, _ref2;\n      props = this.properties;\n      propNames = [];\n      _ref2 = this.properties;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        prop = _ref2[_i];\n        if (prop.isComplex()) prop = prop.variable;\n        if (prop != null) {\n          propName = prop.unwrapAll().value.toString();\n          if (__indexOf.call(propNames, propName) >= 0) {\n            throw SyntaxError(\"multiple object literal properties named \\\"\" + propName + \"\\\"\");\n          }\n          propNames.push(propName);\n        }\n      }\n      if (!props.length) return (this.front ? '({})' : '{}');\n      if (this.generated) {\n        for (_j = 0, _len1 = props.length; _j < _len1; _j++) {\n          node = props[_j];\n          if (node instanceof Value) {\n            throw new Error('cannot have an implicit value in an implicit object');\n          }\n        }\n      }\n      idt = o.indent += TAB;\n      lastNoncom = this.lastNonComment(this.properties);\n      props = (function() {\n        var _k, _len2, _results;\n        _results = [];\n        for (i = _k = 0, _len2 = props.length; _k < _len2; i = ++_k) {\n          prop = props[i];\n          join = i === props.length - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\\n' : ',\\n';\n          indent = prop instanceof Comment ? '' : idt;\n          if (prop instanceof Value && prop[\"this\"]) {\n            prop = new Assign(prop.properties[0].name, prop, 'object');\n          }\n          if (!(prop instanceof Comment)) {\n            if (!(prop instanceof Assign)) prop = new Assign(prop, prop, 'object');\n            (prop.variable.base || prop.variable).asKey = true;\n          }\n          _results.push(indent + prop.compile(o, LEVEL_TOP) + join);\n        }\n        return _results;\n      })();\n      props = props.join('');\n      obj = \"{\" + (props && '\\n' + props + '\\n' + this.tab) + \"}\";\n      if (this.front) {\n        return \"(\" + obj + \")\";\n      } else {\n        return obj;\n      }\n    };\n\n    Obj.prototype.assigns = function(name) {\n      var prop, _i, _len, _ref2;\n      _ref2 = this.properties;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        prop = _ref2[_i];\n        if (prop.assigns(name)) return true;\n      }\n      return false;\n    };\n\n    return Obj;\n\n  })(Base);\n\n  exports.Arr = Arr = (function(_super) {\n\n    __extends(Arr, _super);\n\n    Arr.name = 'Arr';\n\n    function Arr(objs) {\n      this.objects = objs || [];\n    }\n\n    Arr.prototype.children = ['objects'];\n\n    Arr.prototype.filterImplicitObjects = Call.prototype.filterImplicitObjects;\n\n    Arr.prototype.compileNode = function(o) {\n      var code, obj, objs;\n      if (!this.objects.length) return '[]';\n      o.indent += TAB;\n      objs = this.filterImplicitObjects(this.objects);\n      if (code = Splat.compileSplattedArray(o, objs)) return code;\n      code = ((function() {\n        var _i, _len, _results;\n        _results = [];\n        for (_i = 0, _len = objs.length; _i < _len; _i++) {\n          obj = objs[_i];\n          _results.push(obj.compile(o, LEVEL_LIST));\n        }\n        return _results;\n      })()).join(', ');\n      if (code.indexOf('\\n') >= 0) {\n        return \"[\\n\" + o.indent + code + \"\\n\" + this.tab + \"]\";\n      } else {\n        return \"[\" + code + \"]\";\n      }\n    };\n\n    Arr.prototype.assigns = function(name) {\n      var obj, _i, _len, _ref2;\n      _ref2 = this.objects;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        obj = _ref2[_i];\n        if (obj.assigns(name)) return true;\n      }\n      return false;\n    };\n\n    return Arr;\n\n  })(Base);\n\n  exports.Class = Class = (function(_super) {\n\n    __extends(Class, _super);\n\n    Class.name = 'Class';\n\n    function Class(variable, parent, body) {\n      this.variable = variable;\n      this.parent = parent;\n      this.body = body != null ? body : new Block;\n      this.boundFuncs = [];\n      this.body.classBody = true;\n    }\n\n    Class.prototype.children = ['variable', 'parent', 'body'];\n\n    Class.prototype.determineName = function() {\n      var decl, tail;\n      if (!this.variable) return null;\n      decl = (tail = last(this.variable.properties)) ? tail instanceof Access && tail.name.value : this.variable.base.value;\n      if (__indexOf.call(STRICT_PROSCRIBED, decl) >= 0) {\n        throw SyntaxError(\"variable name may not be \" + decl);\n      }\n      return decl && (decl = IDENTIFIER.test(decl) && decl);\n    };\n\n    Class.prototype.setContext = function(name) {\n      return this.body.traverseChildren(false, function(node) {\n        if (node.classBody) return false;\n        if (node instanceof Literal && node.value === 'this') {\n          return node.value = name;\n        } else if (node instanceof Code) {\n          node.klass = name;\n          if (node.bound) return node.context = name;\n        }\n      });\n    };\n\n    Class.prototype.addBoundFunctions = function(o) {\n      var bvar, lhs, _i, _len, _ref2, _results;\n      if (this.boundFuncs.length) {\n        _ref2 = this.boundFuncs;\n        _results = [];\n        for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n          bvar = _ref2[_i];\n          lhs = (new Value(new Literal(\"this\"), [new Access(bvar)])).compile(o);\n          _results.push(this.ctor.body.unshift(new Literal(\"\" + lhs + \" = \" + (utility('bind')) + \"(\" + lhs + \", this)\")));\n        }\n        return _results;\n      }\n    };\n\n    Class.prototype.addProperties = function(node, name, o) {\n      var assign, base, exprs, func, props;\n      props = node.base.properties.slice(0);\n      exprs = (function() {\n        var _results;\n        _results = [];\n        while (assign = props.shift()) {\n          if (assign instanceof Assign) {\n            base = assign.variable.base;\n            delete assign.context;\n            func = assign.value;\n            if (base.value === 'constructor') {\n              if (this.ctor) {\n                throw new Error('cannot define more than one constructor in a class');\n              }\n              if (func.bound) {\n                throw new Error('cannot define a constructor as a bound function');\n              }\n              if (func instanceof Code) {\n                assign = this.ctor = func;\n              } else {\n                this.externalCtor = o.scope.freeVariable('class');\n                assign = new Assign(new Literal(this.externalCtor), func);\n              }\n            } else {\n              if (assign.variable[\"this\"]) {\n                func[\"static\"] = true;\n                if (func.bound) func.context = name;\n              } else {\n                assign.variable = new Value(new Literal(name), [new Access(new Literal('prototype')), new Access(base)]);\n                if (func instanceof Code && func.bound) {\n                  this.boundFuncs.push(base);\n                  func.bound = false;\n                }\n              }\n            }\n          }\n          _results.push(assign);\n        }\n        return _results;\n      }).call(this);\n      return compact(exprs);\n    };\n\n    Class.prototype.walkBody = function(name, o) {\n      var _this = this;\n      return this.traverseChildren(false, function(child) {\n        var exps, i, node, _i, _len, _ref2;\n        if (child instanceof Class) return false;\n        if (child instanceof Block) {\n          _ref2 = exps = child.expressions;\n          for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {\n            node = _ref2[i];\n            if (node instanceof Value && node.isObject(true)) {\n              exps[i] = _this.addProperties(node, name, o);\n            }\n          }\n          return child.expressions = exps = flatten(exps);\n        }\n      });\n    };\n\n    Class.prototype.hoistDirectivePrologue = function() {\n      var expressions, index, node;\n      index = 0;\n      expressions = this.body.expressions;\n      while ((node = expressions[index]) && node instanceof Comment || node instanceof Value && node.isString()) {\n        ++index;\n      }\n      return this.directives = expressions.splice(0, index);\n    };\n\n    Class.prototype.ensureConstructor = function(name) {\n      if (!this.ctor) {\n        this.ctor = new Code;\n        if (this.parent) {\n          this.ctor.body.push(new Literal(\"\" + name + \".__super__.constructor.apply(this, arguments)\"));\n        }\n        if (this.externalCtor) {\n          this.ctor.body.push(new Literal(\"\" + this.externalCtor + \".apply(this, arguments)\"));\n        }\n        this.ctor.body.makeReturn();\n        this.body.expressions.unshift(this.ctor);\n      }\n      this.ctor.ctor = this.ctor.name = name;\n      this.ctor.klass = null;\n      return this.ctor.noReturn = true;\n    };\n\n    Class.prototype.compileNode = function(o) {\n      var call, decl, klass, lname, name, params, _ref2;\n      decl = this.determineName();\n      name = decl || '_Class';\n      if (name.reserved) name = \"_\" + name;\n      lname = new Literal(name);\n      this.hoistDirectivePrologue();\n      this.setContext(name);\n      this.walkBody(name, o);\n      this.ensureConstructor(name);\n      this.body.spaced = true;\n      if (!(this.ctor instanceof Code)) this.body.expressions.unshift(this.ctor);\n      if (decl) {\n        this.body.expressions.unshift(new Assign(new Value(new Literal(name), [new Access(new Literal('name'))]), new Literal(\"'\" + name + \"'\")));\n      }\n      this.body.expressions.push(lname);\n      (_ref2 = this.body.expressions).unshift.apply(_ref2, this.directives);\n      this.addBoundFunctions(o);\n      call = Closure.wrap(this.body);\n      if (this.parent) {\n        this.superClass = new Literal(o.scope.freeVariable('super', false));\n        this.body.expressions.unshift(new Extends(lname, this.superClass));\n        call.args.push(this.parent);\n        params = call.variable.params || call.variable.base.params;\n        params.push(new Param(this.superClass));\n      }\n      klass = new Parens(call, true);\n      if (this.variable) klass = new Assign(this.variable, klass);\n      return klass.compile(o);\n    };\n\n    return Class;\n\n  })(Base);\n\n  exports.Assign = Assign = (function(_super) {\n\n    __extends(Assign, _super);\n\n    Assign.name = 'Assign';\n\n    function Assign(variable, value, context, options) {\n      var forbidden, name, _ref2;\n      this.variable = variable;\n      this.value = value;\n      this.context = context;\n      this.param = options && options.param;\n      this.subpattern = options && options.subpattern;\n      forbidden = (_ref2 = (name = this.variable.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0);\n      if (forbidden && this.context !== 'object') {\n        throw SyntaxError(\"variable name may not be \\\"\" + name + \"\\\"\");\n      }\n    }\n\n    Assign.prototype.children = ['variable', 'value'];\n\n    Assign.prototype.isStatement = function(o) {\n      return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && __indexOf.call(this.context, \"?\") >= 0;\n    };\n\n    Assign.prototype.assigns = function(name) {\n      return this[this.context === 'object' ? 'value' : 'variable'].assigns(name);\n    };\n\n    Assign.prototype.unfoldSoak = function(o) {\n      return unfoldSoak(o, this, 'variable');\n    };\n\n    Assign.prototype.compileNode = function(o) {\n      var isValue, match, name, val, varBase, _ref2, _ref3, _ref4, _ref5;\n      if (isValue = this.variable instanceof Value) {\n        if (this.variable.isArray() || this.variable.isObject()) {\n          return this.compilePatternMatch(o);\n        }\n        if (this.variable.isSplice()) return this.compileSplice(o);\n        if ((_ref2 = this.context) === '||=' || _ref2 === '&&=' || _ref2 === '?=') {\n          return this.compileConditional(o);\n        }\n      }\n      name = this.variable.compile(o, LEVEL_LIST);\n      if (!this.context) {\n        if (!(varBase = this.variable.unwrapAll()).isAssignable()) {\n          throw SyntaxError(\"\\\"\" + (this.variable.compile(o)) + \"\\\" cannot be assigned.\");\n        }\n        if (!(typeof varBase.hasProperties === \"function\" ? varBase.hasProperties() : void 0)) {\n          if (this.param) {\n            o.scope.add(name, 'var');\n          } else {\n            o.scope.find(name);\n          }\n        }\n      }\n      if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) {\n        if (match[1]) this.value.klass = match[1];\n        this.value.name = (_ref3 = (_ref4 = (_ref5 = match[2]) != null ? _ref5 : match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5];\n      }\n      val = this.value.compile(o, LEVEL_LIST);\n      if (this.context === 'object') return \"\" + name + \": \" + val;\n      val = name + (\" \" + (this.context || '=') + \" \") + val;\n      if (o.level <= LEVEL_LIST) {\n        return val;\n      } else {\n        return \"(\" + val + \")\";\n      }\n    };\n\n    Assign.prototype.compilePatternMatch = function(o) {\n      var acc, assigns, code, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8;\n      top = o.level === LEVEL_TOP;\n      value = this.value;\n      objects = this.variable.base.objects;\n      if (!(olen = objects.length)) {\n        code = value.compile(o);\n        if (o.level >= LEVEL_OP) {\n          return \"(\" + code + \")\";\n        } else {\n          return code;\n        }\n      }\n      isObject = this.variable.isObject();\n      if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) {\n        if (obj instanceof Assign) {\n          _ref2 = obj, (_ref3 = _ref2.variable, idx = _ref3.base), obj = _ref2.value;\n        } else {\n          if (obj.base instanceof Parens) {\n            _ref4 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref4[0], idx = _ref4[1];\n          } else {\n            idx = isObject ? obj[\"this\"] ? obj.properties[0].name : obj : new Literal(0);\n          }\n        }\n        acc = IDENTIFIER.test(idx.unwrap().value || 0);\n        value = new Value(value);\n        value.properties.push(new (acc ? Access : Index)(idx));\n        if (_ref5 = obj.unwrap().value, __indexOf.call(RESERVED, _ref5) >= 0) {\n          throw new SyntaxError(\"assignment to a reserved word: \" + (obj.compile(o)) + \" = \" + (value.compile(o)));\n        }\n        return new Assign(obj, value, null, {\n          param: this.param\n        }).compile(o, LEVEL_TOP);\n      }\n      vvar = value.compile(o, LEVEL_LIST);\n      assigns = [];\n      splat = false;\n      if (!IDENTIFIER.test(vvar) || this.variable.assigns(vvar)) {\n        assigns.push(\"\" + (ref = o.scope.freeVariable('ref')) + \" = \" + vvar);\n        vvar = ref;\n      }\n      for (i = _i = 0, _len = objects.length; _i < _len; i = ++_i) {\n        obj = objects[i];\n        idx = i;\n        if (isObject) {\n          if (obj instanceof Assign) {\n            _ref6 = obj, (_ref7 = _ref6.variable, idx = _ref7.base), obj = _ref6.value;\n          } else {\n            if (obj.base instanceof Parens) {\n              _ref8 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref8[0], idx = _ref8[1];\n            } else {\n              idx = obj[\"this\"] ? obj.properties[0].name : obj;\n            }\n          }\n        }\n        if (!splat && obj instanceof Splat) {\n          name = obj.name.unwrap().value;\n          obj = obj.unwrap();\n          val = \"\" + olen + \" <= \" + vvar + \".length ? \" + (utility('slice')) + \".call(\" + vvar + \", \" + i;\n          if (rest = olen - i - 1) {\n            ivar = o.scope.freeVariable('i');\n            val += \", \" + ivar + \" = \" + vvar + \".length - \" + rest + \") : (\" + ivar + \" = \" + i + \", [])\";\n          } else {\n            val += \") : []\";\n          }\n          val = new Literal(val);\n          splat = \"\" + ivar + \"++\";\n        } else {\n          name = obj.unwrap().value;\n          if (obj instanceof Splat) {\n            obj = obj.name.compile(o);\n            throw new SyntaxError(\"multiple splats are disallowed in an assignment: \" + obj + \"...\");\n          }\n          if (typeof idx === 'number') {\n            idx = new Literal(splat || idx);\n            acc = false;\n          } else {\n            acc = isObject && IDENTIFIER.test(idx.unwrap().value || 0);\n          }\n          val = new Value(new Literal(vvar), [new (acc ? Access : Index)(idx)]);\n        }\n        if ((name != null) && __indexOf.call(RESERVED, name) >= 0) {\n          throw new SyntaxError(\"assignment to a reserved word: \" + (obj.compile(o)) + \" = \" + (val.compile(o)));\n        }\n        assigns.push(new Assign(obj, val, null, {\n          param: this.param,\n          subpattern: true\n        }).compile(o, LEVEL_LIST));\n      }\n      if (!(top || this.subpattern)) assigns.push(vvar);\n      code = assigns.join(', ');\n      if (o.level < LEVEL_LIST) {\n        return code;\n      } else {\n        return \"(\" + code + \")\";\n      }\n    };\n\n    Assign.prototype.compileConditional = function(o) {\n      var left, right, _ref2;\n      _ref2 = this.variable.cacheReference(o), left = _ref2[0], right = _ref2[1];\n      if (left.base instanceof Literal && left.base.value !== \"this\" && !o.scope.check(left.base.value)) {\n        throw new Error(\"the variable \\\"\" + left.base.value + \"\\\" can't be assigned with \" + this.context + \" because it has not been defined.\");\n      }\n      if (__indexOf.call(this.context, \"?\") >= 0) o.isExistentialEquals = true;\n      return new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compile(o);\n    };\n\n    Assign.prototype.compileSplice = function(o) {\n      var code, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref2, _ref3, _ref4;\n      _ref2 = this.variable.properties.pop().range, from = _ref2.from, to = _ref2.to, exclusive = _ref2.exclusive;\n      name = this.variable.compile(o);\n      _ref3 = (from != null ? from.cache(o, LEVEL_OP) : void 0) || ['0', '0'], fromDecl = _ref3[0], fromRef = _ref3[1];\n      if (to) {\n        if ((from != null ? from.isSimpleNumber() : void 0) && to.isSimpleNumber()) {\n          to = +to.compile(o) - +fromRef;\n          if (!exclusive) to += 1;\n        } else {\n          to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef;\n          if (!exclusive) to += ' + 1';\n        }\n      } else {\n        to = \"9e9\";\n      }\n      _ref4 = this.value.cache(o, LEVEL_LIST), valDef = _ref4[0], valRef = _ref4[1];\n      code = \"[].splice.apply(\" + name + \", [\" + fromDecl + \", \" + to + \"].concat(\" + valDef + \")), \" + valRef;\n      if (o.level > LEVEL_TOP) {\n        return \"(\" + code + \")\";\n      } else {\n        return code;\n      }\n    };\n\n    return Assign;\n\n  })(Base);\n\n  exports.Code = Code = (function(_super) {\n\n    __extends(Code, _super);\n\n    Code.name = 'Code';\n\n    function Code(params, body, tag) {\n      this.params = params || [];\n      this.body = body || new Block;\n      this.bound = tag === 'boundfunc';\n      if (this.bound) this.context = '_this';\n    }\n\n    Code.prototype.children = ['params', 'body'];\n\n    Code.prototype.isStatement = function() {\n      return !!this.ctor;\n    };\n\n    Code.prototype.jumps = NO;\n\n    Code.prototype.compileNode = function(o) {\n      var code, exprs, i, idt, lit, name, p, param, params, ref, splats, uniqs, val, wasEmpty, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8;\n      o.scope = new Scope(o.scope, this.body, this);\n      o.scope.shared = del(o, 'sharedScope');\n      o.indent += TAB;\n      delete o.bare;\n      delete o.isExistentialEquals;\n      params = [];\n      exprs = [];\n      _ref2 = this.paramNames();\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        name = _ref2[_i];\n        if (!o.scope.check(name)) o.scope.parameter(name);\n      }\n      _ref3 = this.params;\n      for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n        param = _ref3[_j];\n        if (!param.splat) continue;\n        _ref4 = this.params;\n        for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) {\n          p = _ref4[_k];\n          if (p.name.value) o.scope.add(p.name.value, 'var', true);\n        }\n        splats = new Assign(new Value(new Arr((function() {\n          var _l, _len3, _ref5, _results;\n          _ref5 = this.params;\n          _results = [];\n          for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) {\n            p = _ref5[_l];\n            _results.push(p.asReference(o));\n          }\n          return _results;\n        }).call(this))), new Value(new Literal('arguments')));\n        break;\n      }\n      _ref5 = this.params;\n      for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) {\n        param = _ref5[_l];\n        if (param.isComplex()) {\n          val = ref = param.asReference(o);\n          if (param.value) val = new Op('?', ref, param.value);\n          exprs.push(new Assign(new Value(param.name), val, '=', {\n            param: true\n          }));\n        } else {\n          ref = param;\n          if (param.value) {\n            lit = new Literal(ref.name.value + ' == null');\n            val = new Assign(new Value(param.name), param.value, '=');\n            exprs.push(new If(lit, val));\n          }\n        }\n        if (!splats) params.push(ref);\n      }\n      wasEmpty = this.body.isEmpty();\n      if (splats) exprs.unshift(splats);\n      if (exprs.length) {\n        (_ref6 = this.body.expressions).unshift.apply(_ref6, exprs);\n      }\n      for (i = _m = 0, _len4 = params.length; _m < _len4; i = ++_m) {\n        p = params[i];\n        o.scope.parameter(params[i] = p.compile(o));\n      }\n      uniqs = [];\n      _ref7 = this.paramNames();\n      for (_n = 0, _len5 = _ref7.length; _n < _len5; _n++) {\n        name = _ref7[_n];\n        if (__indexOf.call(uniqs, name) >= 0) {\n          throw SyntaxError(\"multiple parameters named '\" + name + \"'\");\n        }\n        uniqs.push(name);\n      }\n      if (!(wasEmpty || this.noReturn)) this.body.makeReturn();\n      if (this.bound) {\n        if ((_ref8 = o.scope.parent.method) != null ? _ref8.bound : void 0) {\n          this.bound = this.context = o.scope.parent.method.context;\n        } else if (!this[\"static\"]) {\n          o.scope.parent.assign('_this', 'this');\n        }\n      }\n      idt = o.indent;\n      code = 'function';\n      if (this.ctor) code += ' ' + this.name;\n      code += '(' + params.join(', ') + ') {';\n      if (!this.body.isEmpty()) {\n        code += \"\\n\" + (this.body.compileWithDeclarations(o)) + \"\\n\" + this.tab;\n      }\n      code += '}';\n      if (this.ctor) return this.tab + code;\n      if (this.front || (o.level >= LEVEL_ACCESS)) {\n        return \"(\" + code + \")\";\n      } else {\n        return code;\n      }\n    };\n\n    Code.prototype.paramNames = function() {\n      var names, param, _i, _len, _ref2;\n      names = [];\n      _ref2 = this.params;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        param = _ref2[_i];\n        names.push.apply(names, param.names());\n      }\n      return names;\n    };\n\n    Code.prototype.traverseChildren = function(crossScope, func) {\n      if (crossScope) {\n        return Code.__super__.traverseChildren.call(this, crossScope, func);\n      }\n    };\n\n    return Code;\n\n  })(Base);\n\n  exports.Param = Param = (function(_super) {\n\n    __extends(Param, _super);\n\n    Param.name = 'Param';\n\n    function Param(name, value, splat) {\n      var _ref2;\n      this.name = name;\n      this.value = value;\n      this.splat = splat;\n      if (_ref2 = (name = this.name.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) {\n        throw SyntaxError(\"parameter name \\\"\" + name + \"\\\" is not allowed\");\n      }\n    }\n\n    Param.prototype.children = ['name', 'value'];\n\n    Param.prototype.compile = function(o) {\n      return this.name.compile(o, LEVEL_LIST);\n    };\n\n    Param.prototype.asReference = function(o) {\n      var node;\n      if (this.reference) return this.reference;\n      node = this.name;\n      if (node[\"this\"]) {\n        node = node.properties[0].name;\n        if (node.value.reserved) {\n          node = new Literal(o.scope.freeVariable(node.value));\n        }\n      } else if (node.isComplex()) {\n        node = new Literal(o.scope.freeVariable('arg'));\n      }\n      node = new Value(node);\n      if (this.splat) node = new Splat(node);\n      return this.reference = node;\n    };\n\n    Param.prototype.isComplex = function() {\n      return this.name.isComplex();\n    };\n\n    Param.prototype.names = function(name) {\n      var atParam, names, obj, _i, _len, _ref2;\n      if (name == null) name = this.name;\n      atParam = function(obj) {\n        var value;\n        value = obj.properties[0].name.value;\n        if (value.reserved) {\n          return [];\n        } else {\n          return [value];\n        }\n      };\n      if (name instanceof Literal) return [name.value];\n      if (name instanceof Value) return atParam(name);\n      names = [];\n      _ref2 = name.objects;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        obj = _ref2[_i];\n        if (obj instanceof Assign) {\n          names.push(obj.variable.base.value);\n        } else if (obj.isArray() || obj.isObject()) {\n          names.push.apply(names, this.names(obj.base));\n        } else if (obj[\"this\"]) {\n          names.push.apply(names, atParam(obj));\n        } else {\n          names.push(obj.base.value);\n        }\n      }\n      return names;\n    };\n\n    return Param;\n\n  })(Base);\n\n  exports.Splat = Splat = (function(_super) {\n\n    __extends(Splat, _super);\n\n    Splat.name = 'Splat';\n\n    Splat.prototype.children = ['name'];\n\n    Splat.prototype.isAssignable = YES;\n\n    function Splat(name) {\n      this.name = name.compile ? name : new Literal(name);\n    }\n\n    Splat.prototype.assigns = function(name) {\n      return this.name.assigns(name);\n    };\n\n    Splat.prototype.compile = function(o) {\n      if (this.index != null) {\n        return this.compileParam(o);\n      } else {\n        return this.name.compile(o);\n      }\n    };\n\n    Splat.prototype.unwrap = function() {\n      return this.name;\n    };\n\n    Splat.compileSplattedArray = function(o, list, apply) {\n      var args, base, code, i, index, node, _i, _len;\n      index = -1;\n      while ((node = list[++index]) && !(node instanceof Splat)) {\n        continue;\n      }\n      if (index >= list.length) return '';\n      if (list.length === 1) {\n        code = list[0].compile(o, LEVEL_LIST);\n        if (apply) return code;\n        return \"\" + (utility('slice')) + \".call(\" + code + \")\";\n      }\n      args = list.slice(index);\n      for (i = _i = 0, _len = args.length; _i < _len; i = ++_i) {\n        node = args[i];\n        code = node.compile(o, LEVEL_LIST);\n        args[i] = node instanceof Splat ? \"\" + (utility('slice')) + \".call(\" + code + \")\" : \"[\" + code + \"]\";\n      }\n      if (index === 0) {\n        return args[0] + (\".concat(\" + (args.slice(1).join(', ')) + \")\");\n      }\n      base = (function() {\n        var _j, _len1, _ref2, _results;\n        _ref2 = list.slice(0, index);\n        _results = [];\n        for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {\n          node = _ref2[_j];\n          _results.push(node.compile(o, LEVEL_LIST));\n        }\n        return _results;\n      })();\n      return \"[\" + (base.join(', ')) + \"].concat(\" + (args.join(', ')) + \")\";\n    };\n\n    return Splat;\n\n  })(Base);\n\n  exports.While = While = (function(_super) {\n\n    __extends(While, _super);\n\n    While.name = 'While';\n\n    function While(condition, options) {\n      this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition;\n      this.guard = options != null ? options.guard : void 0;\n    }\n\n    While.prototype.children = ['condition', 'guard', 'body'];\n\n    While.prototype.isStatement = YES;\n\n    While.prototype.makeReturn = function(res) {\n      if (res) {\n        return While.__super__.makeReturn.apply(this, arguments);\n      } else {\n        this.returns = !this.jumps({\n          loop: true\n        });\n        return this;\n      }\n    };\n\n    While.prototype.addBody = function(body) {\n      this.body = body;\n      return this;\n    };\n\n    While.prototype.jumps = function() {\n      var expressions, node, _i, _len;\n      expressions = this.body.expressions;\n      if (!expressions.length) return false;\n      for (_i = 0, _len = expressions.length; _i < _len; _i++) {\n        node = expressions[_i];\n        if (node.jumps({\n          loop: true\n        })) return node;\n      }\n      return false;\n    };\n\n    While.prototype.compileNode = function(o) {\n      var body, code, rvar, set;\n      o.indent += TAB;\n      set = '';\n      body = this.body;\n      if (body.isEmpty()) {\n        body = '';\n      } else {\n        if (this.returns) {\n          body.makeReturn(rvar = o.scope.freeVariable('results'));\n          set = \"\" + this.tab + rvar + \" = [];\\n\";\n        }\n        if (this.guard) {\n          if (body.expressions.length > 1) {\n            body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal(\"continue\")));\n          } else {\n            if (this.guard) body = Block.wrap([new If(this.guard, body)]);\n          }\n        }\n        body = \"\\n\" + (body.compile(o, LEVEL_TOP)) + \"\\n\" + this.tab;\n      }\n      code = set + this.tab + (\"while (\" + (this.condition.compile(o, LEVEL_PAREN)) + \") {\" + body + \"}\");\n      if (this.returns) code += \"\\n\" + this.tab + \"return \" + rvar + \";\";\n      return code;\n    };\n\n    return While;\n\n  })(Base);\n\n  exports.Op = Op = (function(_super) {\n    var CONVERSIONS, INVERSIONS;\n\n    __extends(Op, _super);\n\n    Op.name = 'Op';\n\n    function Op(op, first, second, flip) {\n      if (op === 'in') return new In(first, second);\n      if (op === 'do') return this.generateDo(first);\n      if (op === 'new') {\n        if (first instanceof Call && !first[\"do\"] && !first.isNew) {\n          return first.newInstance();\n        }\n        if (first instanceof Code && first.bound || first[\"do\"]) {\n          first = new Parens(first);\n        }\n      }\n      this.operator = CONVERSIONS[op] || op;\n      this.first = first;\n      this.second = second;\n      this.flip = !!flip;\n      return this;\n    }\n\n    CONVERSIONS = {\n      '==': '===',\n      '!=': '!==',\n      'of': 'in'\n    };\n\n    INVERSIONS = {\n      '!==': '===',\n      '===': '!=='\n    };\n\n    Op.prototype.children = ['first', 'second'];\n\n    Op.prototype.isSimpleNumber = NO;\n\n    Op.prototype.isUnary = function() {\n      return !this.second;\n    };\n\n    Op.prototype.isComplex = function() {\n      var _ref2;\n      return !(this.isUnary() && ((_ref2 = this.operator) === '+' || _ref2 === '-')) || this.first.isComplex();\n    };\n\n    Op.prototype.isChainable = function() {\n      var _ref2;\n      return (_ref2 = this.operator) === '<' || _ref2 === '>' || _ref2 === '>=' || _ref2 === '<=' || _ref2 === '===' || _ref2 === '!==';\n    };\n\n    Op.prototype.invert = function() {\n      var allInvertable, curr, fst, op, _ref2;\n      if (this.isChainable() && this.first.isChainable()) {\n        allInvertable = true;\n        curr = this;\n        while (curr && curr.operator) {\n          allInvertable && (allInvertable = curr.operator in INVERSIONS);\n          curr = curr.first;\n        }\n        if (!allInvertable) return new Parens(this).invert();\n        curr = this;\n        while (curr && curr.operator) {\n          curr.invert = !curr.invert;\n          curr.operator = INVERSIONS[curr.operator];\n          curr = curr.first;\n        }\n        return this;\n      } else if (op = INVERSIONS[this.operator]) {\n        this.operator = op;\n        if (this.first.unwrap() instanceof Op) this.first.invert();\n        return this;\n      } else if (this.second) {\n        return new Parens(this).invert();\n      } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref2 = fst.operator) === '!' || _ref2 === 'in' || _ref2 === 'instanceof')) {\n        return fst;\n      } else {\n        return new Op('!', this);\n      }\n    };\n\n    Op.prototype.unfoldSoak = function(o) {\n      var _ref2;\n      return ((_ref2 = this.operator) === '++' || _ref2 === '--' || _ref2 === 'delete') && unfoldSoak(o, this, 'first');\n    };\n\n    Op.prototype.generateDo = function(exp) {\n      var call, func, param, passedParams, ref, _i, _len, _ref2;\n      passedParams = [];\n      func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp;\n      _ref2 = func.params || [];\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        param = _ref2[_i];\n        if (param.value) {\n          passedParams.push(param.value);\n          delete param.value;\n        } else {\n          passedParams.push(param);\n        }\n      }\n      call = new Call(exp, passedParams);\n      call[\"do\"] = true;\n      return call;\n    };\n\n    Op.prototype.compileNode = function(o) {\n      var code, isChain, _ref2, _ref3;\n      isChain = this.isChainable() && this.first.isChainable();\n      if (!isChain) this.first.front = this.front;\n      if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) {\n        throw SyntaxError('delete operand may not be argument or var');\n      }\n      if (((_ref2 = this.operator) === '--' || _ref2 === '++') && (_ref3 = this.first.unwrapAll().value, __indexOf.call(STRICT_PROSCRIBED, _ref3) >= 0)) {\n        throw SyntaxError('prefix increment/decrement may not have eval or arguments operand');\n      }\n      if (this.isUnary()) return this.compileUnary(o);\n      if (isChain) return this.compileChain(o);\n      if (this.operator === '?') return this.compileExistence(o);\n      code = this.first.compile(o, LEVEL_OP) + ' ' + this.operator + ' ' + this.second.compile(o, LEVEL_OP);\n      if (o.level <= LEVEL_OP) {\n        return code;\n      } else {\n        return \"(\" + code + \")\";\n      }\n    };\n\n    Op.prototype.compileChain = function(o) {\n      var code, fst, shared, _ref2;\n      _ref2 = this.first.second.cache(o), this.first.second = _ref2[0], shared = _ref2[1];\n      fst = this.first.compile(o, LEVEL_OP);\n      code = \"\" + fst + \" \" + (this.invert ? '&&' : '||') + \" \" + (shared.compile(o)) + \" \" + this.operator + \" \" + (this.second.compile(o, LEVEL_OP));\n      return \"(\" + code + \")\";\n    };\n\n    Op.prototype.compileExistence = function(o) {\n      var fst, ref;\n      if (this.first.isComplex() && o.level > LEVEL_TOP) {\n        ref = new Literal(o.scope.freeVariable('ref'));\n        fst = new Parens(new Assign(ref, this.first));\n      } else {\n        fst = this.first;\n        ref = fst;\n      }\n      return new If(new Existence(fst), ref, {\n        type: 'if'\n      }).addElse(this.second).compile(o);\n    };\n\n    Op.prototype.compileUnary = function(o) {\n      var op, parts, plusMinus;\n      if (o.level >= LEVEL_ACCESS) return (new Parens(this)).compile(o);\n      parts = [op = this.operator];\n      plusMinus = op === '+' || op === '-';\n      if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) {\n        parts.push(' ');\n      }\n      if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) {\n        this.first = new Parens(this.first);\n      }\n      parts.push(this.first.compile(o, LEVEL_OP));\n      if (this.flip) parts.reverse();\n      return parts.join('');\n    };\n\n    Op.prototype.toString = function(idt) {\n      return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator);\n    };\n\n    return Op;\n\n  })(Base);\n\n  exports.In = In = (function(_super) {\n\n    __extends(In, _super);\n\n    In.name = 'In';\n\n    function In(object, array) {\n      this.object = object;\n      this.array = array;\n    }\n\n    In.prototype.children = ['object', 'array'];\n\n    In.prototype.invert = NEGATE;\n\n    In.prototype.compileNode = function(o) {\n      var hasSplat, obj, _i, _len, _ref2;\n      if (this.array instanceof Value && this.array.isArray()) {\n        _ref2 = this.array.base.objects;\n        for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n          obj = _ref2[_i];\n          if (!(obj instanceof Splat)) continue;\n          hasSplat = true;\n          break;\n        }\n        if (!hasSplat) return this.compileOrTest(o);\n      }\n      return this.compileLoopTest(o);\n    };\n\n    In.prototype.compileOrTest = function(o) {\n      var cmp, cnj, i, item, ref, sub, tests, _ref2, _ref3;\n      if (this.array.base.objects.length === 0) return \"\" + (!!this.negated);\n      _ref2 = this.object.cache(o, LEVEL_OP), sub = _ref2[0], ref = _ref2[1];\n      _ref3 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref3[0], cnj = _ref3[1];\n      tests = (function() {\n        var _i, _len, _ref4, _results;\n        _ref4 = this.array.base.objects;\n        _results = [];\n        for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) {\n          item = _ref4[i];\n          _results.push((i ? ref : sub) + cmp + item.compile(o, LEVEL_ACCESS));\n        }\n        return _results;\n      }).call(this);\n      tests = tests.join(cnj);\n      if (o.level < LEVEL_OP) {\n        return tests;\n      } else {\n        return \"(\" + tests + \")\";\n      }\n    };\n\n    In.prototype.compileLoopTest = function(o) {\n      var code, ref, sub, _ref2;\n      _ref2 = this.object.cache(o, LEVEL_LIST), sub = _ref2[0], ref = _ref2[1];\n      code = utility('indexOf') + (\".call(\" + (this.array.compile(o, LEVEL_LIST)) + \", \" + ref + \") \") + (this.negated ? '< 0' : '>= 0');\n      if (sub === ref) return code;\n      code = sub + ', ' + code;\n      if (o.level < LEVEL_LIST) {\n        return code;\n      } else {\n        return \"(\" + code + \")\";\n      }\n    };\n\n    In.prototype.toString = function(idt) {\n      return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : ''));\n    };\n\n    return In;\n\n  })(Base);\n\n  exports.Try = Try = (function(_super) {\n\n    __extends(Try, _super);\n\n    Try.name = 'Try';\n\n    function Try(attempt, error, recovery, ensure) {\n      this.attempt = attempt;\n      this.error = error;\n      this.recovery = recovery;\n      this.ensure = ensure;\n    }\n\n    Try.prototype.children = ['attempt', 'recovery', 'ensure'];\n\n    Try.prototype.isStatement = YES;\n\n    Try.prototype.jumps = function(o) {\n      var _ref2;\n      return this.attempt.jumps(o) || ((_ref2 = this.recovery) != null ? _ref2.jumps(o) : void 0);\n    };\n\n    Try.prototype.makeReturn = function(res) {\n      if (this.attempt) this.attempt = this.attempt.makeReturn(res);\n      if (this.recovery) this.recovery = this.recovery.makeReturn(res);\n      return this;\n    };\n\n    Try.prototype.compileNode = function(o) {\n      var catchPart, ensurePart, errorPart, tryPart;\n      o.indent += TAB;\n      errorPart = this.error ? \" (\" + (this.error.compile(o)) + \") \" : ' ';\n      tryPart = this.attempt.compile(o, LEVEL_TOP);\n      catchPart = (function() {\n        var _ref2;\n        if (this.recovery) {\n          if (_ref2 = this.error.value, __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) {\n            throw SyntaxError(\"catch variable may not be \\\"\" + this.error.value + \"\\\"\");\n          }\n          if (!o.scope.check(this.error.value)) {\n            o.scope.add(this.error.value, 'param');\n          }\n          return \" catch\" + errorPart + \"{\\n\" + (this.recovery.compile(o, LEVEL_TOP)) + \"\\n\" + this.tab + \"}\";\n        } else if (!(this.ensure || this.recovery)) {\n          return ' catch (_error) {}';\n        }\n      }).call(this);\n      ensurePart = this.ensure ? \" finally {\\n\" + (this.ensure.compile(o, LEVEL_TOP)) + \"\\n\" + this.tab + \"}\" : '';\n      return \"\" + this.tab + \"try {\\n\" + tryPart + \"\\n\" + this.tab + \"}\" + (catchPart || '') + ensurePart;\n    };\n\n    return Try;\n\n  })(Base);\n\n  exports.Throw = Throw = (function(_super) {\n\n    __extends(Throw, _super);\n\n    Throw.name = 'Throw';\n\n    function Throw(expression) {\n      this.expression = expression;\n    }\n\n    Throw.prototype.children = ['expression'];\n\n    Throw.prototype.isStatement = YES;\n\n    Throw.prototype.jumps = NO;\n\n    Throw.prototype.makeReturn = THIS;\n\n    Throw.prototype.compileNode = function(o) {\n      return this.tab + (\"throw \" + (this.expression.compile(o)) + \";\");\n    };\n\n    return Throw;\n\n  })(Base);\n\n  exports.Existence = Existence = (function(_super) {\n\n    __extends(Existence, _super);\n\n    Existence.name = 'Existence';\n\n    function Existence(expression) {\n      this.expression = expression;\n    }\n\n    Existence.prototype.children = ['expression'];\n\n    Existence.prototype.invert = NEGATE;\n\n    Existence.prototype.compileNode = function(o) {\n      var cmp, cnj, code, _ref2;\n      this.expression.front = this.front;\n      code = this.expression.compile(o, LEVEL_OP);\n      if (IDENTIFIER.test(code) && !o.scope.check(code)) {\n        _ref2 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref2[0], cnj = _ref2[1];\n        code = \"typeof \" + code + \" \" + cmp + \" \\\"undefined\\\" \" + cnj + \" \" + code + \" \" + cmp + \" null\";\n      } else {\n        code = \"\" + code + \" \" + (this.negated ? '==' : '!=') + \" null\";\n      }\n      if (o.level <= LEVEL_COND) {\n        return code;\n      } else {\n        return \"(\" + code + \")\";\n      }\n    };\n\n    return Existence;\n\n  })(Base);\n\n  exports.Parens = Parens = (function(_super) {\n\n    __extends(Parens, _super);\n\n    Parens.name = 'Parens';\n\n    function Parens(body) {\n      this.body = body;\n    }\n\n    Parens.prototype.children = ['body'];\n\n    Parens.prototype.unwrap = function() {\n      return this.body;\n    };\n\n    Parens.prototype.isComplex = function() {\n      return this.body.isComplex();\n    };\n\n    Parens.prototype.compileNode = function(o) {\n      var bare, code, expr;\n      expr = this.body.unwrap();\n      if (expr instanceof Value && expr.isAtomic()) {\n        expr.front = this.front;\n        return expr.compile(o);\n      }\n      code = expr.compile(o, LEVEL_PAREN);\n      bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns));\n      if (bare) {\n        return code;\n      } else {\n        return \"(\" + code + \")\";\n      }\n    };\n\n    return Parens;\n\n  })(Base);\n\n  exports.For = For = (function(_super) {\n\n    __extends(For, _super);\n\n    For.name = 'For';\n\n    function For(body, source) {\n      var _ref2;\n      this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index;\n      this.body = Block.wrap([body]);\n      this.own = !!source.own;\n      this.object = !!source.object;\n      if (this.object) {\n        _ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1];\n      }\n      if (this.index instanceof Value) {\n        throw SyntaxError('index cannot be a pattern matching expression');\n      }\n      this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length;\n      this.pattern = this.name instanceof Value;\n      if (this.range && this.index) {\n        throw SyntaxError('indexes do not apply to range loops');\n      }\n      if (this.range && this.pattern) {\n        throw SyntaxError('cannot pattern match over range loops');\n      }\n      this.returns = false;\n    }\n\n    For.prototype.children = ['body', 'source', 'guard', 'step'];\n\n    For.prototype.compileNode = function(o) {\n      var body, defPart, forPart, forVarPart, guardPart, idt1, index, ivar, kvar, kvarAssign, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, stepPart, stepvar, svar, varPart, _ref2;\n      body = Block.wrap([this.body]);\n      lastJumps = (_ref2 = last(body.expressions)) != null ? _ref2.jumps() : void 0;\n      if (lastJumps && lastJumps instanceof Return) this.returns = false;\n      source = this.range ? this.source.base : this.source;\n      scope = o.scope;\n      name = this.name && this.name.compile(o, LEVEL_LIST);\n      index = this.index && this.index.compile(o, LEVEL_LIST);\n      if (name && !this.pattern) {\n        scope.find(name, {\n          immediate: true\n        });\n      }\n      if (index) {\n        scope.find(index, {\n          immediate: true\n        });\n      }\n      if (this.returns) rvar = scope.freeVariable('results');\n      ivar = (this.object && index) || scope.freeVariable('i');\n      kvar = (this.range && name) || index || ivar;\n      kvarAssign = kvar !== ivar ? \"\" + kvar + \" = \" : \"\";\n      if (this.step && !this.range) stepvar = scope.freeVariable(\"step\");\n      if (this.pattern) name = ivar;\n      varPart = '';\n      guardPart = '';\n      defPart = '';\n      idt1 = this.tab + TAB;\n      if (this.range) {\n        forPart = source.compile(merge(o, {\n          index: ivar,\n          name: name,\n          step: this.step\n        }));\n      } else {\n        svar = this.source.compile(o, LEVEL_LIST);\n        if ((name || this.own) && !IDENTIFIER.test(svar)) {\n          defPart = \"\" + this.tab + (ref = scope.freeVariable('ref')) + \" = \" + svar + \";\\n\";\n          svar = ref;\n        }\n        if (name && !this.pattern) {\n          namePart = \"\" + name + \" = \" + svar + \"[\" + kvar + \"]\";\n        }\n        if (!this.object) {\n          lvar = scope.freeVariable('len');\n          forVarPart = \"\" + kvarAssign + ivar + \" = 0, \" + lvar + \" = \" + svar + \".length\";\n          if (this.step) {\n            forVarPart += \", \" + stepvar + \" = \" + (this.step.compile(o, LEVEL_OP));\n          }\n          stepPart = \"\" + kvarAssign + (this.step ? \"\" + ivar + \" += \" + stepvar : (kvar !== ivar ? \"++\" + ivar : \"\" + ivar + \"++\"));\n          forPart = \"\" + forVarPart + \"; \" + ivar + \" < \" + lvar + \"; \" + stepPart;\n        }\n      }\n      if (this.returns) {\n        resultPart = \"\" + this.tab + rvar + \" = [];\\n\";\n        returnResult = \"\\n\" + this.tab + \"return \" + rvar + \";\";\n        body.makeReturn(rvar);\n      }\n      if (this.guard) {\n        if (body.expressions.length > 1) {\n          body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal(\"continue\")));\n        } else {\n          if (this.guard) body = Block.wrap([new If(this.guard, body)]);\n        }\n      }\n      if (this.pattern) {\n        body.expressions.unshift(new Assign(this.name, new Literal(\"\" + svar + \"[\" + kvar + \"]\")));\n      }\n      defPart += this.pluckDirectCall(o, body);\n      if (namePart) varPart = \"\\n\" + idt1 + namePart + \";\";\n      if (this.object) {\n        forPart = \"\" + kvar + \" in \" + svar;\n        if (this.own) {\n          guardPart = \"\\n\" + idt1 + \"if (!\" + (utility('hasProp')) + \".call(\" + svar + \", \" + kvar + \")) continue;\";\n        }\n      }\n      body = body.compile(merge(o, {\n        indent: idt1\n      }), LEVEL_TOP);\n      if (body) body = '\\n' + body + '\\n';\n      return \"\" + defPart + (resultPart || '') + this.tab + \"for (\" + forPart + \") {\" + guardPart + varPart + body + this.tab + \"}\" + (returnResult || '');\n    };\n\n    For.prototype.pluckDirectCall = function(o, body) {\n      var base, defs, expr, fn, idx, ref, val, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;\n      defs = '';\n      _ref2 = body.expressions;\n      for (idx = _i = 0, _len = _ref2.length; _i < _len; idx = ++_i) {\n        expr = _ref2[idx];\n        expr = expr.unwrapAll();\n        if (!(expr instanceof Call)) continue;\n        val = expr.variable.unwrapAll();\n        if (!((val instanceof Code) || (val instanceof Value && ((_ref3 = val.base) != null ? _ref3.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref4 = (_ref5 = val.properties[0].name) != null ? _ref5.value : void 0) === 'call' || _ref4 === 'apply')))) {\n          continue;\n        }\n        fn = ((_ref6 = val.base) != null ? _ref6.unwrapAll() : void 0) || val;\n        ref = new Literal(o.scope.freeVariable('fn'));\n        base = new Value(ref);\n        if (val.base) _ref7 = [base, val], val.base = _ref7[0], base = _ref7[1];\n        body.expressions[idx] = new Call(base, expr.args);\n        defs += this.tab + new Assign(ref, fn).compile(o, LEVEL_TOP) + ';\\n';\n      }\n      return defs;\n    };\n\n    return For;\n\n  })(While);\n\n  exports.Switch = Switch = (function(_super) {\n\n    __extends(Switch, _super);\n\n    Switch.name = 'Switch';\n\n    function Switch(subject, cases, otherwise) {\n      this.subject = subject;\n      this.cases = cases;\n      this.otherwise = otherwise;\n    }\n\n    Switch.prototype.children = ['subject', 'cases', 'otherwise'];\n\n    Switch.prototype.isStatement = YES;\n\n    Switch.prototype.jumps = function(o) {\n      var block, conds, _i, _len, _ref2, _ref3, _ref4;\n      if (o == null) {\n        o = {\n          block: true\n        };\n      }\n      _ref2 = this.cases;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        _ref3 = _ref2[_i], conds = _ref3[0], block = _ref3[1];\n        if (block.jumps(o)) return block;\n      }\n      return (_ref4 = this.otherwise) != null ? _ref4.jumps(o) : void 0;\n    };\n\n    Switch.prototype.makeReturn = function(res) {\n      var pair, _i, _len, _ref2, _ref3;\n      _ref2 = this.cases;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        pair = _ref2[_i];\n        pair[1].makeReturn(res);\n      }\n      if (res) {\n        this.otherwise || (this.otherwise = new Block([new Literal('void 0')]));\n      }\n      if ((_ref3 = this.otherwise) != null) _ref3.makeReturn(res);\n      return this;\n    };\n\n    Switch.prototype.compileNode = function(o) {\n      var block, body, code, cond, conditions, expr, i, idt1, idt2, _i, _j, _len, _len1, _ref2, _ref3, _ref4, _ref5;\n      idt1 = o.indent + TAB;\n      idt2 = o.indent = idt1 + TAB;\n      code = this.tab + (\"switch (\" + (((_ref2 = this.subject) != null ? _ref2.compile(o, LEVEL_PAREN) : void 0) || false) + \") {\\n\");\n      _ref3 = this.cases;\n      for (i = _i = 0, _len = _ref3.length; _i < _len; i = ++_i) {\n        _ref4 = _ref3[i], conditions = _ref4[0], block = _ref4[1];\n        _ref5 = flatten([conditions]);\n        for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) {\n          cond = _ref5[_j];\n          if (!this.subject) cond = cond.invert();\n          code += idt1 + (\"case \" + (cond.compile(o, LEVEL_PAREN)) + \":\\n\");\n        }\n        if (body = block.compile(o, LEVEL_TOP)) code += body + '\\n';\n        if (i === this.cases.length - 1 && !this.otherwise) break;\n        expr = this.lastNonComment(block.expressions);\n        if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) {\n          continue;\n        }\n        code += idt2 + 'break;\\n';\n      }\n      if (this.otherwise && this.otherwise.expressions.length) {\n        code += idt1 + (\"default:\\n\" + (this.otherwise.compile(o, LEVEL_TOP)) + \"\\n\");\n      }\n      return code + this.tab + '}';\n    };\n\n    return Switch;\n\n  })(Base);\n\n  exports.If = If = (function(_super) {\n\n    __extends(If, _super);\n\n    If.name = 'If';\n\n    function If(condition, body, options) {\n      this.body = body;\n      if (options == null) options = {};\n      this.condition = options.type === 'unless' ? condition.invert() : condition;\n      this.elseBody = null;\n      this.isChain = false;\n      this.soak = options.soak;\n    }\n\n    If.prototype.children = ['condition', 'body', 'elseBody'];\n\n    If.prototype.bodyNode = function() {\n      var _ref2;\n      return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0;\n    };\n\n    If.prototype.elseBodyNode = function() {\n      var _ref2;\n      return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0;\n    };\n\n    If.prototype.addElse = function(elseBody) {\n      if (this.isChain) {\n        this.elseBodyNode().addElse(elseBody);\n      } else {\n        this.isChain = elseBody instanceof If;\n        this.elseBody = this.ensureBlock(elseBody);\n      }\n      return this;\n    };\n\n    If.prototype.isStatement = function(o) {\n      var _ref2;\n      return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0);\n    };\n\n    If.prototype.jumps = function(o) {\n      var _ref2;\n      return this.body.jumps(o) || ((_ref2 = this.elseBody) != null ? _ref2.jumps(o) : void 0);\n    };\n\n    If.prototype.compileNode = function(o) {\n      if (this.isStatement(o)) {\n        return this.compileStatement(o);\n      } else {\n        return this.compileExpression(o);\n      }\n    };\n\n    If.prototype.makeReturn = function(res) {\n      if (res) {\n        this.elseBody || (this.elseBody = new Block([new Literal('void 0')]));\n      }\n      this.body && (this.body = new Block([this.body.makeReturn(res)]));\n      this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)]));\n      return this;\n    };\n\n    If.prototype.ensureBlock = function(node) {\n      if (node instanceof Block) {\n        return node;\n      } else {\n        return new Block([node]);\n      }\n    };\n\n    If.prototype.compileStatement = function(o) {\n      var body, bodyc, child, cond, exeq, ifPart, _ref2;\n      child = del(o, 'chainChild');\n      exeq = del(o, 'isExistentialEquals');\n      if (exeq) {\n        return new If(this.condition.invert(), this.elseBodyNode(), {\n          type: 'if'\n        }).compile(o);\n      }\n      cond = this.condition.compile(o, LEVEL_PAREN);\n      o.indent += TAB;\n      body = this.ensureBlock(this.body);\n      bodyc = body.compile(o);\n      if (1 === ((_ref2 = body.expressions) != null ? _ref2.length : void 0) && !this.elseBody && !child && bodyc && cond && -1 === (bodyc.indexOf('\\n')) && 80 > cond.length + bodyc.length) {\n        return \"\" + this.tab + \"if (\" + cond + \") \" + (bodyc.replace(/^\\s+/, ''));\n      }\n      if (bodyc) bodyc = \"\\n\" + bodyc + \"\\n\" + this.tab;\n      ifPart = \"if (\" + cond + \") {\" + bodyc + \"}\";\n      if (!child) ifPart = this.tab + ifPart;\n      if (!this.elseBody) return ifPart;\n      return ifPart + ' else ' + (this.isChain ? (o.indent = this.tab, o.chainChild = true, this.elseBody.unwrap().compile(o, LEVEL_TOP)) : \"{\\n\" + (this.elseBody.compile(o, LEVEL_TOP)) + \"\\n\" + this.tab + \"}\");\n    };\n\n    If.prototype.compileExpression = function(o) {\n      var alt, body, code, cond;\n      cond = this.condition.compile(o, LEVEL_COND);\n      body = this.bodyNode().compile(o, LEVEL_LIST);\n      alt = this.elseBodyNode() ? this.elseBodyNode().compile(o, LEVEL_LIST) : 'void 0';\n      code = \"\" + cond + \" ? \" + body + \" : \" + alt;\n      if (o.level >= LEVEL_COND) {\n        return \"(\" + code + \")\";\n      } else {\n        return code;\n      }\n    };\n\n    If.prototype.unfoldSoak = function() {\n      return this.soak && this;\n    };\n\n    return If;\n\n  })(Base);\n\n  Closure = {\n    wrap: function(expressions, statement, noReturn) {\n      var args, call, func, mentionsArgs, meth;\n      if (expressions.jumps()) return expressions;\n      func = new Code([], Block.wrap([expressions]));\n      args = [];\n      if ((mentionsArgs = expressions.contains(this.literalArgs)) || expressions.contains(this.literalThis)) {\n        meth = new Literal(mentionsArgs ? 'apply' : 'call');\n        args = [new Literal('this')];\n        if (mentionsArgs) args.push(new Literal('arguments'));\n        func = new Value(func, [new Access(meth)]);\n      }\n      func.noReturn = noReturn;\n      call = new Call(func, args);\n      if (statement) {\n        return Block.wrap([call]);\n      } else {\n        return call;\n      }\n    },\n    literalArgs: function(node) {\n      return node instanceof Literal && node.value === 'arguments' && !node.asKey;\n    },\n    literalThis: function(node) {\n      return (node instanceof Literal && node.value === 'this' && !node.asKey) || (node instanceof Code && node.bound);\n    }\n  };\n\n  unfoldSoak = function(o, parent, name) {\n    var ifn;\n    if (!(ifn = parent[name].unfoldSoak(o))) return;\n    parent[name] = ifn.body;\n    ifn.body = new Value(parent);\n    return ifn;\n  };\n\n  UTILITIES = {\n    \"extends\": function() {\n      return \"function(child, parent) { for (var key in parent) { if (\" + (utility('hasProp')) + \".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }\";\n    },\n    bind: function() {\n      return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }';\n    },\n    indexOf: function() {\n      return \"[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }\";\n    },\n    hasProp: function() {\n      return '{}.hasOwnProperty';\n    },\n    slice: function() {\n      return '[].slice';\n    }\n  };\n\n  LEVEL_TOP = 1;\n\n  LEVEL_PAREN = 2;\n\n  LEVEL_LIST = 3;\n\n  LEVEL_COND = 4;\n\n  LEVEL_OP = 5;\n\n  LEVEL_ACCESS = 6;\n\n  TAB = '  ';\n\n  IDENTIFIER_STR = \"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\";\n\n  IDENTIFIER = RegExp(\"^\" + IDENTIFIER_STR + \"$\");\n\n  SIMPLENUM = /^[+-]?\\d+$/;\n\n  METHOD_DEF = RegExp(\"^(?:(\" + IDENTIFIER_STR + \")\\\\.prototype(?:\\\\.(\" + IDENTIFIER_STR + \")|\\\\[(\\\"(?:[^\\\\\\\\\\\"\\\\r\\\\n]|\\\\\\\\.)*\\\"|'(?:[^\\\\\\\\'\\\\r\\\\n]|\\\\\\\\.)*')\\\\]|\\\\[(0x[\\\\da-fA-F]+|\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\]))|(\" + IDENTIFIER_STR + \")$\");\n\n  IS_STRING = /^['\"]/;\n\n  utility = function(name) {\n    var ref;\n    ref = \"__\" + name;\n    Scope.root.assign(ref, UTILITIES[name]());\n    return ref;\n  };\n\n  multident = function(code, tab) {\n    code = code.replace(/\\n/g, '$&' + tab);\n    return code.replace(/\\s+$/, '');\n  };\n\n\n});\n\ndefine('ace/mode/coffee/scope', ['require', 'exports', 'module' , 'ace/mode/coffee/helpers'], function(require, exports, module) {\n// Generated by CoffeeScript 1.2.1-pre\n\n  var Scope, extend, last, _ref;\n\n  _ref = require('./helpers'), extend = _ref.extend, last = _ref.last;\n\n  exports.Scope = Scope = (function() {\n\n    Scope.name = 'Scope';\n\n    Scope.root = null;\n\n    function Scope(parent, expressions, method) {\n      this.parent = parent;\n      this.expressions = expressions;\n      this.method = method;\n      this.variables = [\n        {\n          name: 'arguments',\n          type: 'arguments'\n        }\n      ];\n      this.positions = {};\n      if (!this.parent) Scope.root = this;\n    }\n\n    Scope.prototype.add = function(name, type, immediate) {\n      if (this.shared && !immediate) return this.parent.add(name, type, immediate);\n      if (Object.prototype.hasOwnProperty.call(this.positions, name)) {\n        return this.variables[this.positions[name]].type = type;\n      } else {\n        return this.positions[name] = this.variables.push({\n          name: name,\n          type: type\n        }) - 1;\n      }\n    };\n\n    Scope.prototype.find = function(name, options) {\n      if (this.check(name, options)) return true;\n      this.add(name, 'var');\n      return false;\n    };\n\n    Scope.prototype.parameter = function(name) {\n      if (this.shared && this.parent.check(name, true)) return;\n      return this.add(name, 'param');\n    };\n\n    Scope.prototype.check = function(name, immediate) {\n      var found, _ref1;\n      found = !!this.type(name);\n      if (found || immediate) return found;\n      return !!((_ref1 = this.parent) != null ? _ref1.check(name) : void 0);\n    };\n\n    Scope.prototype.temporary = function(name, index) {\n      if (name.length > 1) {\n        return '_' + name + (index > 1 ? index - 1 : '');\n      } else {\n        return '_' + (index + parseInt(name, 36)).toString(36).replace(/\\d/g, 'a');\n      }\n    };\n\n    Scope.prototype.type = function(name) {\n      var v, _i, _len, _ref1;\n      _ref1 = this.variables;\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        v = _ref1[_i];\n        if (v.name === name) return v.type;\n      }\n      return null;\n    };\n\n    Scope.prototype.freeVariable = function(name, reserve) {\n      var index, temp;\n      if (reserve == null) reserve = true;\n      index = 0;\n      while (this.check((temp = this.temporary(name, index)))) {\n        index++;\n      }\n      if (reserve) this.add(temp, 'var', true);\n      return temp;\n    };\n\n    Scope.prototype.assign = function(name, value) {\n      this.add(name, {\n        value: value,\n        assigned: true\n      }, true);\n      return this.hasAssignments = true;\n    };\n\n    Scope.prototype.hasDeclarations = function() {\n      return !!this.declaredVariables().length;\n    };\n\n    Scope.prototype.declaredVariables = function() {\n      var realVars, tempVars, v, _i, _len, _ref1;\n      realVars = [];\n      tempVars = [];\n      _ref1 = this.variables;\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        v = _ref1[_i];\n        if (v.type === 'var') {\n          (v.name.charAt(0) === '_' ? tempVars : realVars).push(v.name);\n        }\n      }\n      return realVars.sort().concat(tempVars.sort());\n    };\n\n    Scope.prototype.assignedVariables = function() {\n      var v, _i, _len, _ref1, _results;\n      _ref1 = this.variables;\n      _results = [];\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        v = _ref1[_i];\n        if (v.type.assigned) _results.push(\"\" + v.name + \" = \" + v.type.value);\n      }\n      return _results;\n    };\n\n    return Scope;\n\n  })();\n\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/worker-css.js",
    "content": "\"no use strict\";\n\nvar console = {\n    log: function(msgs) {\n        postMessage({type: \"log\", data: arguments.join(\" \")});\n    }\n};\nvar window = {\n    console: console\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        var moduleName = base + \"/\" + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            var moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nvar require = function(parentId, id) {\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    var id = normalizeModule(parentId, id);\n    \n    var module = require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    require.id = id;\n    importScripts(path);\n    return require(parentId, id);    \n};\n\nrequire.modules = {};\nrequire.tlns = {};\n\nvar define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        id = require.id;\n    }\n\n    if (id.indexOf(\"text!\") === 0) \n        return;\n    \n    var req = function(deps, factory) {\n        return require(id, deps, factory);\n    };\n\n    require.modules[id] = {\n        factory: function() {\n            var module = {\n                exports: {}\n            };\n            var returnExports = factory(req, module.exports, module);\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\n\nfunction initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n}\n\nfunction initSender() {\n\n    var EventEmitter = require(null, \"ace/lib/event_emitter\").EventEmitter;\n    var oop = require(null, \"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n}\n\nvar main;\nvar sender;\n\nonmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        main[msg.command].apply(main, msg.args);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(null, \"ace/lib/fixoldbrowsers\");\n        sender = initSender();\n        var clazz = require(null, msg.module)[msg.classname];\n        main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._emit(msg.event, msg.data);\n    }\n};\n// vim:set ts=4 sts=4 sw=4 st:\n// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright(C) 2010 XXX No License Specified\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Irakli Gozalishvili Copyright (C) 2010 MIT License\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n \ndefine('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n\n    //---------------------------------\n    //  Overriden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n\n    // Don't override `test` if it won't change anything\n    if (!compliantLastIndexIncrement) {\n        // Fix browser bug in native method\n        RegExp.prototype.test = function (str) {\n            // Use the native `exec` to skip some processing overhead, even though the overriden\n            // `exec` would take care of the `lastIndex` fix\n            var match = real.exec.call(this, str);\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n// vim: ts=4 sts=4 sw=4 expandtab\n// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License\n// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License\n// -- kossnocorp Sasha Koss XXX TODO License or CLA\n// -- bryanforbes Bryan Forbes XXX TODO License or CLA\n// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence\n// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License\n// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License\n// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain)\n// -- iwyg XXX TODO License or CLA\n// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License\n// -- xavierm02 Montillet Xavier XXX TODO License or CLA\n// -- Raynos Raynos XXX TODO License or CLA\n// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License\n// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License\n// -- lexer Alexey Zakharov XXX TODO License or CLA\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n/*\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: http://es5.github.com/ (specific links below)\n * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n *\n * @module\n */\n\n/*whatsupdoc*/\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        // 1. Let Target be the this value.\n        var target = this;\n        // 2. If IsCallable(Target) is false, throw a TypeError exception.\n        if (typeof target != \"function\")\n            throw new TypeError(); // TODO message\n        // 3. Let A be a new (possibly empty) internal list of all of the\n        //   argument values provided after thisArg (arg1, arg2 etc), in order.\n        // XXX slicedArgs will stand in for \"A\" if used\n        var args = slice.call(arguments, 1); // for normal call\n        // 4. Let F be a new native ECMAScript object.\n        // 11. Set the [[Prototype]] internal property of F to the standard\n        //   built-in Function prototype object as specified in 15.3.3.1.\n        // 12. Set the [[Call]] internal property of F as described in\n        //   15.3.4.5.1.\n        // 13. Set the [[Construct]] internal property of F as described in\n        //   15.3.4.5.2.\n        // 14. Set the [[HasInstance]] internal property of F as described in\n        //   15.3.4.5.3.\n        var bound = function () {\n\n            if (this instanceof bound) {\n                // 15.3.4.5.2 [[Construct]]\n                // When the [[Construct]] internal method of a function object,\n                // F that was created using the bind function is called with a\n                // list of arguments ExtraArgs, the following steps are taken:\n                // 1. Let target be the value of F's [[TargetFunction]]\n                //   internal property.\n                // 2. If target has no [[Construct]] internal method, a\n                //   TypeError exception is thrown.\n                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Construct]] internal \n                //   method of target providing args as the arguments.\n\n                var F = function(){};\n                F.prototype = target.prototype;\n                var self = new F;\n\n                var result = target.apply(\n                    self,\n                    args.concat(slice.call(arguments))\n                );\n                if (result !== null && Object(result) === result)\n                    return result;\n                return self;\n\n            } else {\n                // 15.3.4.5.1 [[Call]]\n                // When the [[Call]] internal method of a function object, F,\n                // which was created using the bind function is called with a\n                // this value and a list of arguments ExtraArgs, the following\n                // steps are taken:\n                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                //   property.\n                // 3. Let target be the value of F's [[TargetFunction]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the \n                //   list boundArgs in the same order followed by the same \n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Call]] internal method \n                //   of target providing boundThis as the this value and \n                //   providing args as the arguments.\n\n                // equiv: target.call(this, ...boundArgs, ...args)\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        // XXX bound.length is never writable, so don't even try\n        //\n        // 15. If the [[Class]] internal property of Target is \"Function\", then\n        //     a. Let L be the length property of Target minus the length of A.\n        //     b. Set the length own property of F to either 0 or L, whichever is \n        //       larger.\n        // 16. Else set the length own property of F to 0.\n        // 17. Set the attributes of the length own property of F to the values\n        //   specified in 15.3.5.1.\n\n        // TODO\n        // 18. Set the [[Extensible]] internal property of F to true.\n        \n        // TODO\n        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n        // 20. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and \n        //   false.\n        // 21. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower, \n        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n        //   and false.\n\n        // TODO\n        // NOTE Function objects created using Function.prototype.bind do not \n        // have a prototype property or the [[Code]], [[FormalParameters]], and\n        // [[Scope]] internal properties.\n        // XXX can't delete prototype in pure-js.\n\n        // 22. Return F.\n        return bound;\n    };\n}\n\n// Shortcut to an often accessed properties, in order to avoid multiple\n// dereference that costs universally.\n// _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n// us it in defining shortcuts.\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\n\n// If JS engine supports accessors creating shortcuts.\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\n\n//\n// Array\n// =====\n//\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return toString(obj) == \"[object Array]\";\n    };\n}\n\n// The IsCallable() check in the Array functions\n// has been replaced with a strict check on the\n// internal class of the object to trap cases where\n// the provided function was actually a regular\n// expression literal, which in V8 and\n// JavaScriptCore is a typeof \"function\".  Only in\n// V8 are regular expression literals permitted as\n// reduce parameters, so it is desirable in the\n// general case for the shim to match the more\n// strict and common behavior of rejecting regular\n// expressions.\n\n// ES5 15.4.4.18\n// http://es5.github.com/#x15.4.4.18\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var self = toObject(this),\n            thisp = arguments[1],\n            i = 0,\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (i < length) {\n            if (i in self) {\n                // Invoke the callback function with call, passing arguments:\n                // context, property value, property key, thisArg object context\n                fun.call(thisp, self[i], i, self);\n            }\n            i++;\n        }\n    };\n}\n\n// ES5 15.4.4.19\n// http://es5.github.com/#x15.4.4.19\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, self);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.20\n// http://es5.github.com/#x15.4.4.20\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = [],\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                result.push(self[i]);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.16\n// http://es5.github.com/#x15.4.4.16\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, self))\n                return false;\n        }\n        return true;\n    };\n}\n\n// ES5 15.4.4.17\n// http://es5.github.com/#x15.4.4.17\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                return true;\n        }\n        return false;\n    };\n}\n\n// ES5 15.4.4.21\n// http://es5.github.com/#x15.4.4.21\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value and an empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (++i >= length)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self)\n                result = fun.call(void 0, result, self[i], i, self);\n        }\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.22\n// http://es5.github.com/#x15.4.4.22\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value, empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (--i < 0)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        do {\n            if (i in this)\n                result = fun.call(void 0, result, self[i], i, self);\n        } while (i--);\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n\n        var i = 0;\n        if (arguments.length > 1)\n            i = toInteger(arguments[1]);\n\n        // handle negative indices\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\n// ES5 15.4.4.15\n// http://es5.github.com/#x15.4.4.15\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\nif (!Array.prototype.lastIndexOf) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n        var i = length - 1;\n        if (arguments.length > 1)\n            i = Math.min(i, toInteger(arguments[1]));\n        // handle negative indices\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i])\n                return i;\n        }\n        return -1;\n    };\n}\n\n//\n// Object\n// ======\n//\n\n// ES5 15.2.3.2\n// http://es5.github.com/#x15.2.3.2\nif (!Object.getPrototypeOf) {\n    // https://github.com/kriskowal/es5-shim/issues#issue/2\n    // http://ejohn.org/blog/objectgetprototypeof/\n    // recommended by fschaefer on github\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\n\n// ES5 15.2.3.3\n// http://es5.github.com/#x15.2.3.3\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        // If object does not owns property return undefined immediately.\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n\n        // If object has a property then it's for sure both `enumerable` and\n        // `configurable`.\n        descriptor =  { enumerable: true, configurable: true };\n\n        // If JS engine supports accessor properties then property may be a\n        // getter or setter.\n        if (supportsAccessors) {\n            // Unfortunately `__lookupGetter__` will return a getter even\n            // if object has own non getter property along with a same named\n            // inherited getter. To avoid misbehavior we temporary remove\n            // `__proto__` so that `__lookupGetter__` will return getter only\n            // if it's owned by an object.\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n\n            // Once we have getter and setter we can put values back.\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n\n                // If it was accessor property we're done and return here\n                // in order to avoid adding `value` to the descriptor.\n                return descriptor;\n            }\n        }\n\n        // If we got this far we know that object has an own property that is\n        // not an accessor so we set it as a value and return descriptor.\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\n\n// ES5 15.2.3.4\n// http://es5.github.com/#x15.2.3.4\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\n\n// ES5 15.2.3.5\n// http://es5.github.com/#x15.2.3.5\nif (!Object.create) {\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = { \"__proto__\": null };\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            // IE has no built-in implementation of `Object.getPrototypeOf`\n            // neither `__proto__`, but this manually setting `__proto__` will\n            // guarantee that `Object.getPrototypeOf` will work as expected with\n            // objects created using `Object.create`\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\n// ES5 15.2.3.6\n// http://es5.github.com/#x15.2.3.6\n\n// Patch for WebKit and IE8 standard mode\n// Designed by hax <hax.github.com>\n// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5\n// IE8 Reference:\n//     http://msdn.microsoft.com/en-us/library/dd282900.aspx\n//     http://msdn.microsoft.com/en-us/library/dd229916.aspx\n// WebKit Bugs:\n//     https://bugs.webkit.org/show_bug.cgi?id=36423\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n        // returns falsy\n    }\n}\n\n// check whether defineProperty works if it's given. Otherwise,\n// shim partially.\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n\n        // make a valiant attempt to use the real defineProperty\n        // for I8's DOM elements.\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n                // try the shim if the real one doesn't work\n            }\n        }\n\n        // If it's a data property.\n        if (owns(descriptor, \"value\")) {\n            // fail silently if \"writable\", \"enumerable\", or \"configurable\"\n            // are requested but not supported\n            /*\n            // alternate approach:\n            if ( // can't implement these features; allow false but not true\n                !(owns(descriptor, \"writable\") ? descriptor.writable : true) ||\n                !(owns(descriptor, \"enumerable\") ? descriptor.enumerable : true) ||\n                !(owns(descriptor, \"configurable\") ? descriptor.configurable : true)\n            )\n                throw new RangeError(\n                    \"This implementation of Object.defineProperty does not \" +\n                    \"support configurable, enumerable, or writable.\"\n                );\n            */\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                // As accessors are supported only on engines implementing\n                // `__proto__` we can safely override `__proto__` while defining\n                // a property to make sure that we don't hit an inherited\n                // accessor.\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                // Deleting a property anyway since getter / setter may be\n                // defined on object itself.\n                delete object[property];\n                object[property] = descriptor.value;\n                // Setting original `__proto__` back now.\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            // If we got that far then getters and setters can be defined !!\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\n\n// ES5 15.2.3.7\n// http://es5.github.com/#x15.2.3.7\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\n\n// ES5 15.2.3.8\n// http://es5.github.com/#x15.2.3.8\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.9\n// http://es5.github.com/#x15.2.3.9\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// detect a Rhino bug and patch it\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\n\n// ES5 15.2.3.10\n// http://es5.github.com/#x15.2.3.10\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.11\n// http://es5.github.com/#x15.2.3.11\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.12\n// http://es5.github.com/#x15.2.3.12\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.13\n// http://es5.github.com/#x15.2.3.13\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        // 1. If Type(O) is not Object throw a TypeError exception.\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        // 2. Return the Boolean value of the [[Extensible]] internal property of O.\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\n\n// ES5 15.2.3.14\n// http://es5.github.com/#x15.2.3.14\nif (!Object.keys) {\n    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null})\n        hasDontEnumBug = false;\n\n    Object.keys = function keys(object) {\n\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(\"Object.keys called on a non-object\");\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n\n        return keys;\n    };\n\n}\n\n//\n// Date\n// ====\n//\n\n// ES5 15.9.5.43\n// http://es5.github.com/#x15.9.5.43\n// This function returns a String value represent the instance in time \n// represented by this Date object. The format of the String is the Date Time \n// string format defined in 15.9.1.15. All fields are present in the String. \n// The time zone is always UTC, denoted by the suffix Z. If the time value of \n// this object is not a finite Number a RangeError exception is thrown.\nif (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) {\n    Date.prototype.toISOString = function toISOString() {\n        var result, length, value, year;\n        if (!isFinite(this))\n            throw new RangeError;\n\n        // the date time string format is specified in 15.9.1.15.\n        result = [this.getUTCMonth() + 1, this.getUTCDate(),\n            this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];\n        year = this.getUTCFullYear();\n        year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6);\n\n        length = result.length;\n        while (length--) {\n            value = result[length];\n            // pad months, days, hours, minutes, and seconds to have two digits.\n            if (value < 10)\n                result[length] = \"0\" + value;\n        }\n        // pad milliseconds to have three digits.\n        return year + \"-\" + result.slice(0, 2).join(\"-\") + \"T\" + result.slice(2).join(\":\") + \".\" +\n            (\"000\" + this.getUTCMilliseconds()).slice(-3) + \"Z\";\n    }\n}\n\n// ES5 15.9.4.4\n// http://es5.github.com/#x15.9.4.4\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\n\n// ES5 15.9.5.44\n// http://es5.github.com/#x15.9.5.44\n// This function provides a String representation of a Date object for use by \n// JSON.stringify (15.12.3).\nif (!Date.prototype.toJSON) {\n    Date.prototype.toJSON = function toJSON(key) {\n        // When the toJSON method is called with argument key, the following \n        // steps are taken:\n\n        // 1.  Let O be the result of calling ToObject, giving it the this\n        // value as its argument.\n        // 2. Let tv be ToPrimitive(O, hint Number).\n        // 3. If tv is a Number and is not finite, return null.\n        // XXX\n        // 4. Let toISO be the result of calling the [[Get]] internal method of\n        // O with argument \"toISOString\".\n        // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n        if (typeof this.toISOString != \"function\")\n            throw new TypeError(); // TODO message\n        // 6. Return the result of calling the [[Call]] internal method of\n        //  toISO with O as the this value and an empty argument list.\n        return this.toISOString();\n\n        // NOTE 1 The argument is ignored.\n\n        // NOTE 2 The toJSON function is intentionally generic; it does not\n        // require that its this value be a Date object. Therefore, it can be\n        // transferred to other kinds of objects for use as a method. However,\n        // it does require that any such object have a toISOString method. An\n        // object is free to use the argument key to filter its\n        // stringification.\n    };\n}\n\n// ES5 15.9.4.2\n// http://es5.github.com/#x15.9.4.2\n// based on work shared by Daniel Friesen (dantman)\n// http://gist.github.com/303249\nif (Date.parse(\"+275760-09-13T00:00:00.000Z\") !== 8.64e15) {\n    // XXX global assignment won't work in embeddings that use\n    // an alternate object for the context.\n    Date = (function(NativeDate) {\n\n        // Date.length === 7\n        var Date = function Date(Y, M, D, h, m, s, ms) {\n            var length = arguments.length;\n            if (this instanceof NativeDate) {\n                var date = length == 1 && String(Y) === Y ? // isString(Y)\n                    // We explicitly pass it through parse:\n                    new NativeDate(Date.parse(Y)) :\n                    // We have to manually make calls depending on argument\n                    // length here\n                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\n                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\n                    length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                    length >= 4 ? new NativeDate(Y, M, D, h) :\n                    length >= 3 ? new NativeDate(Y, M, D) :\n                    length >= 2 ? new NativeDate(Y, M) :\n                    length >= 1 ? new NativeDate(Y) :\n                                  new NativeDate();\n                // Prevent mixups with unfixed Date object\n                date.constructor = Date;\n                return date;\n            }\n            return NativeDate.apply(this, arguments);\n        };\n\n        // 15.9.1.15 Date Time String Format.\n        var isoDateExpression = new RegExp(\"^\" +\n            \"(\\\\d{4}|[\\+\\-]\\\\d{6})\" + // four-digit year capture or sign + 6-digit extended year\n            \"(?:-(\\\\d{2})\" + // optional month capture\n            \"(?:-(\\\\d{2})\" + // optional day capture\n            \"(?:\" + // capture hours:minutes:seconds.milliseconds\n                \"T(\\\\d{2})\" + // hours capture\n                \":(\\\\d{2})\" + // minutes capture\n                \"(?:\" + // optional :seconds.milliseconds\n                    \":(\\\\d{2})\" + // seconds capture\n                    \"(?:\\\\.(\\\\d{3}))?\" + // milliseconds capture\n                \")?\" +\n            \"(?:\" + // capture UTC offset component\n                \"Z|\" + // UTC capture\n                \"(?:\" + // offset specifier +/-hours:minutes\n                    \"([-+])\" + // sign capture\n                    \"(\\\\d{2})\" + // hours offset capture\n                    \":(\\\\d{2})\" + // minutes offset capture\n                \")\" +\n            \")?)?)?)?\" +\n        \"$\");\n\n        // Copy any custom methods a 3rd party library may have added\n        for (var key in NativeDate)\n            Date[key] = NativeDate[key];\n\n        // Copy \"native\" methods explicitly; they may be non-enumerable\n        Date.now = NativeDate.now;\n        Date.UTC = NativeDate.UTC;\n        Date.prototype = NativeDate.prototype;\n        Date.prototype.constructor = Date;\n\n        // Upgrade Date.parse to handle simplified ISO 8601 strings\n        Date.parse = function parse(string) {\n            var match = isoDateExpression.exec(string);\n            if (match) {\n                match.shift(); // kill match[0], the full match\n                // parse months, days, hours, minutes, seconds, and milliseconds\n                for (var i = 1; i < 7; i++) {\n                    // provide default values if necessary\n                    match[i] = +(match[i] || (i < 3 ? 1 : 0));\n                    // match[1] is the month. Months are 0-11 in JavaScript\n                    // `Date` objects, but 1-12 in ISO notation, so we\n                    // decrement.\n                    if (i == 1)\n                        match[i]--;\n                }\n\n                // parse the UTC offset component\n                var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop();\n\n                // compute the explicit time zone offset if specified\n                var offset = 0;\n                if (sign) {\n                    // detect invalid offsets and return early\n                    if (hourOffset > 23 || minuteOffset > 59)\n                        return NaN;\n\n                    // express the provided time zone offset in minutes. The offset is\n                    // negative for time zones west of UTC; positive otherwise.\n                    offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == \"+\" ? -1 : 1);\n                }\n\n                // Date.UTC for years between 0 and 99 converts year to 1900 + year\n                // The Gregorian calendar has a 400-year cycle, so \n                // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...),\n                // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years\n                var year = +match[0];\n                if (0 <= year && year <= 99) {\n                    match[0] = year + 400;\n                    return NativeDate.UTC.apply(this, match) + offset - 12622780800000;\n                }\n\n                // compute a new UTC date value, accounting for the optional offset\n                return NativeDate.UTC.apply(this, match) + offset;\n            }\n            return NativeDate.parse.apply(this, arguments);\n        };\n\n        return Date;\n    })(Date);\n}\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.20\n// http://es5.github.com/#x15.5.4.20\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n    // http://perfectionkills.com/whitespace-deviations/\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\n//\n// Util\n// ======\n//\n\n// ES5 9.4\n// http://es5.github.com/#x9.4\n// http://jsperf.com/to-integer\nvar toInteger = function (n) {\n    n = +n;\n    if (n !== n) // isNaN\n        n = 0;\n    else if (n !== 0 && n !== (1/0) && n !== -(1/0))\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    return n;\n};\n\nvar prepareString = \"a\"[0] != \"a\",\n    // ES5 9.9\n    // http://es5.github.com/#x9.9\n    toObject = function (o) {\n        if (o == null) { // this matches both null and undefined\n            throw new TypeError(); // TODO message\n        }\n        // If the implementation doesn't support by-index access of\n        // string characters (ex. IE < 7), split the string\n        if (prepareString && typeof o == \"string\" && o) {\n            return o.split(\"\");\n        }\n        return Object(o);\n    };\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry = this._eventRegistry || {};\n    this._defaultHandlers = this._defaultHandlers || {};\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    \n    if (!e.stopPropagation) {\n        e.stopPropagation = function() {\n            this.propagationStopped = true;\n        };\n    }\n    \n    if (!e.preventDefault) {\n        e.preventDefault = function() {\n            this.defaultPrevented = true;\n        };\n    }\n\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e);\n};\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    this._defaultHandlers = this._defaultHandlers || {};\n    \n    if (this._defaultHandlers[eventName])\n        throw new Error(\"The default handler for '\" + eventName + \"' is already set\");\n        \n    this._defaultHandlers[eventName] = callback;\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners.push(callback);\n};\n\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var tempCtor = function() {};\n    return function(ctor, superCtor) {\n        tempCtor.prototype = superCtor.prototype;\n        ctor.super_ = superCtor.prototype;\n        ctor.prototype = new tempCtor();\n        ctor.prototype.constructor = ctor;\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n \ndefine('ace/mode/css_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/css/csslint'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar CSSLint = require(\"./css/csslint\").CSSLint;\n\nvar Worker = exports.Worker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(200);\n};\n\noop.inherits(Worker, Mirror);\n\n(function() {\n    \n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        \n        var result = CSSLint.verify(value);\n        this.sender.emit(\"csslint\", result.messages.map(function(msg) {\n            delete msg.rule;\n            return msg;\n        }));\n    };\n    \n}).call(Worker.prototype);\n\n});\ndefine('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas([e.data]);        \n        deferredUpdate.schedule(_self.$timeout);\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n        // abstract method\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\n /**\n * new Document([text])\n * - text (String | Array): The starting text\n *\n * Creates a new `Document`. If `text` is included, the `Document` contains those strings; otherwise, it's empty.\n *\n **/\n\nvar Document = function(text) {\n    this.$lines = [];\n\n    // There has to be one line at least in the document. If you pass an empty\n    // string to the insert function, nothing will happen. Workaround.\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this.insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n\n    // check for IE split bug\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getNewLineCharacter = function() {\n      switch (this.$newLineMode) {\n          case \"windows\":\n              return \"\\r\\n\";\n\n          case \"unix\":\n              return \"\\n\";\n\n          case \"auto\":\n              return this.$autoNewLine;\n      }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.$lines[range.start.row].substring(range.start.column,\n                                                         range.end.column);\n        }\n        else {\n            var lines = this.getLines(range.start.row+1, range.end.row-1);\n            lines.unshift((this.$lines[range.start.row] || \"\").substring(range.start.column));\n            lines.push((this.$lines[range.end.row] || \"\").substring(0, range.end.column));\n            return lines.join(this.getNewLineCharacter());\n        }\n    };\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        }\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n\n        // only detect new lines if the document has no line break yet\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this.insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    /**\n     * Document@change(e)\n     * - e (Object): Contains at least one property called `\"action\"`. `\"action\"` indicates the action that triggered the change. Each action also has a set of additional properties.\n     *\n     * Fires whenever the document changes.\n     *\n     * Several methods trigger different `\"change\"` events. Below is a list of each action type, followed by each property that's also available:\n     *\n     *  * `\"insertLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that are changing\n     *  * `\"insertText\"` (emitted by [[Document.insertNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being added\n     *  * `\"removeLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that were removed\n     *    * `nl`: the new line character (as defined by [[Document.getNewLineCharacter]])\n     *  * `\"removeText\"` (emitted by [[Document.removeInLine]] and [[Document.removeNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being removed\n     *\n     **/\n    this.insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n\n        // apply doesn't work for big arrays (smallest threshold is on safari 0xFFFF)\n        // to circumvent that we have to break huge inserts into smaller chunks here\n        if (lines.length > 0xFFFF) {\n            var end = this.insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        // clip to document\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this.removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n\n        // Shortcut: If the text we want to insert is the same as it is already\n        // in the document, we don't have to replace anything.\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Range\n *\n * This object is used in various places to indicate a region within the editor. To better visualize how this works, imagine a rectangle. Each quadrant of the rectangle is analogus to a range, as ranges contain a starting row and starting column, and an ending row, and ending column.\n *\n **/\n\n/**\n * new Range(startRow, startColumn, endRow, endColumn)\n * - startRow (Number): The starting row\n * - startColumn (Number): The starting column\n * - endRow (Number): The ending row\n * - endColumn (Number): The ending column\n *\n * Creates a new `Range` object with the given starting and ending row and column points.\n *\n **/\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    /**\n     * Range.isEqual(range) -> Boolean\n     * - range (Range): A range to check against\n     *\n     * Returns `true` if and only if the starting row and column, and ending tow and column, are equivalent to those given by `range`.\n     *\n     **/ \n    this.isEqual = function(range) {\n        return this.start.row == range.start.row &&\n            this.end.row == range.end.row &&\n            this.start.column == range.start.column &&\n            this.end.column == range.end.column\n    }; \n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    }; \n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    }; \n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.comparePoint(p) -> Number\n     * - p (Range): A point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1<br/>\n     *\n     * Checks the row and column points of `p` with the row and column points of the calling range.\n     *\n     * \n     *\n     **/ \n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    }\n\n    /** related to: Range.comparePoint\n     * Range.containsRange(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Checks the start and end points of `range` and compares them to the calling range. Returns `true` if the `range` is contained within the caller's range.\n     *\n     **/ \n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    }\n\n    /**\n     * Range.intersects(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Returns `true` if passed in `range` intersects with the one calling this method.\n     *\n     **/\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    }\n\n    /**\n     * Range.isEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's ending row point is the same as `row`, and if the caller's ending column is the same as `column`.\n     *\n     **/\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    }\n\n    /**\n     * Range.isStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's starting row point is the same as `row`, and if the caller's starting column is the same as `column`.\n     *\n     **/ \n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    }\n\n    /**\n     * Range.setStart(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    }\n\n    /**\n     * Range.setEnd(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.inside(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range.\n     *\n     **/ \n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's starting points.\n     *\n     **/ \n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's ending points.\n     *\n     **/ \n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** \n     * Range.compare(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal <br/>\n     * * `-1` if `p.row` is less then the calling range <br/>\n     * * `1` if `p.row` is greater than the calling range <br/>\n     *  <br/>\n     * If the starting row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     * <br/>\n     * If the ending row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0` <br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /**\n     * Range.compareEnd(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range, or if `isEnd` is `true.<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.compareInside(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `1` if the ending row of the calling range is equal to `row`, and the ending column of the calling range is equal to `column`<br/>\n     * * `-1` if the starting row of the calling range is equal to `row`, and the starting column of the calling range is equal to `column`<br/>\n     * <br/>\n     * Otherwise, it returns the value after calling [[Range.compare `compare()`]].\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     *\n     **/\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.clipRows(firstRow, lastRow) -> Range\n     * - firstRow (Number): The starting row\n     * - lastRow (Number): The ending row\n     *\n     * Returns the part of the current `Range` that occurs within the boundaries of `firstRow` and `lastRow` as a new `Range` object.\n     *\n    **/\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow) {\n            var end = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row > lastRow) {\n            var start = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row < firstRow) {\n            var start = {\n                row: firstRow,\n                column: 0\n            };\n        }\n\n        if (this.end.row < firstRow) {\n            var end = {\n                row: firstRow,\n                column: 0\n            };\n        }\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row == this.end.row && this.start.column == this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart =\n            session.documentToScreenPosition(this.start);\n        var screenPosEnd =\n            session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\n\nexports.Range = Range;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n/**\n * new Anchor(doc, row, column)\n * - doc (Document): The document to associate with the anchor\n * - row (Number): The starting row position\n * - column (Number): The starting column position\n *\n * Creates a new `Anchor` and associates it with a document.\n *\n **/\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.document = doc;\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n\n    this.$onChange = this.onChange.bind(this);\n    doc.on(\"change\", this.$onChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n        \n    this.getDocument = function() {\n        return this.document;\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n            \n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n            \n        if (range.start.row > this.row)\n            return;\n            \n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n    \n        var row = this.row;\n        var column = this.column;\n        \n        if (delta.action === \"insertText\") {\n            if (range.start.row === row && range.start.column <= column) {\n                if (range.start.row === range.end.row) {\n                    column += range.end.column - range.start.column;\n                }\n                else {\n                    column -= range.start.column;\n                    row += range.end.row - range.start.row;\n                }\n            }\n            else if (range.start.row !== range.end.row && range.start.row < row) {\n                row += range.end.row - range.start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (range.start.row <= row) {\n                row += range.end.row - range.start.row;\n            }\n        }\n        else if (delta.action == \"removeText\") {\n            if (range.start.row == row && range.start.column < column) {\n                if (range.end.column >= column)\n                    column = range.start.column;\n                else\n                    column = Math.max(0, column - (range.end.column - range.start.column));\n                \n            } else if (range.start.row !== range.end.row && range.start.row < row) {\n                if (range.end.row == row) {\n                    column = Math.max(0, column - range.end.column) + range.start.column;\n                }\n                row -= (range.end.row - range.start.row);\n            }\n            else if (range.end.row == row) {\n                row -= range.end.row - range.start.row;\n                column = Math.max(0, column - range.end.column) + range.start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (range.start.row <= row) {\n                if (range.end.row <= row)\n                    row -= range.end.row - range.start.row;\n                else {\n                    row = range.start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        }\n        else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n        \n        if (this.row == pos.row && this.column == pos.column)\n            return;\n            \n        var old = {\n            row: this.row,\n            column: this.column\n        };\n        \n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n    \n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n        \n        if (column < 0)\n            pos.column = 0;\n            \n        return pos;\n    };\n    \n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n     return new Array(count + 1).join(string);\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj != \"object\") {\n        return obj;\n    }\n    \n    var copy = obj.constructor();\n    for (var key in obj) {\n        if (typeof obj[key] == \"object\") {\n            copy[key] = this.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\n\n\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n\n    return deferred;\n};\n\n});\ndefine('ace/mode/css/csslint', ['require', 'exports', 'module' ], function(require, exports, module) {\n/*!\nCSSLint\nCopyright (c) 2011 Nicole Sullivan and Nicholas C. Zakas. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n/* Build time: 2-March-2012 02:47:11 */\n\n/*!\nParser-Lib\nCopyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n/* Version v0.1.6, Build time: 2-March-2012 02:44:32 */\nvar parserlib = {};\n(function(){\n\n\n/**\n * A generic base to inherit from for any object\n * that needs event handling.\n * @class EventTarget\n * @constructor\n */\nfunction EventTarget(){\n\n    /**\n     * The array of listeners for various events.\n     * @type Object\n     * @property _listeners\n     * @private\n     */\n    this._listeners = {};    \n}\n\nEventTarget.prototype = {\n\n    //restore constructor\n    constructor: EventTarget,\n\n    /**\n     * Adds a listener for a given event type.\n     * @param {String} type The type of event to add a listener for.\n     * @param {Function} listener The function to call when the event occurs.\n     * @return {void}\n     * @method addListener\n     */\n    addListener: function(type, listener){\n        if (!this._listeners[type]){\n            this._listeners[type] = [];\n        }\n\n        this._listeners[type].push(listener);\n    },\n    \n    /**\n     * Fires an event based on the passed-in object.\n     * @param {Object|String} event An object with at least a 'type' attribute\n     *      or a string indicating the event name.\n     * @return {void}\n     * @method fire\n     */    \n    fire: function(event){\n        if (typeof event == \"string\"){\n            event = { type: event };\n        }\n        if (typeof event.target != \"undefined\"){\n            event.target = this;\n        }\n        \n        if (typeof event.type == \"undefined\"){\n            throw new Error(\"Event object missing 'type' property.\");\n        }\n        \n        if (this._listeners[event.type]){\n        \n            //create a copy of the array and use that so listeners can't chane\n            var listeners = this._listeners[event.type].concat();\n            for (var i=0, len=listeners.length; i < len; i++){\n                listeners[i].call(this, event);\n            }\n        }            \n    },\n\n    /**\n     * Removes a listener for a given event type.\n     * @param {String} type The type of event to remove a listener from.\n     * @param {Function} listener The function to remove from the event.\n     * @return {void}\n     * @method removeListener\n     */\n    removeListener: function(type, listener){\n        if (this._listeners[type]){\n            var listeners = this._listeners[type];\n            for (var i=0, len=listeners.length; i < len; i++){\n                if (listeners[i] === listener){\n                    listeners.splice(i, 1);\n                    break;\n                }\n            }\n            \n            \n        }            \n    }\n};\nfunction StringReader(text){\n\n    /**\n     * The input text with line endings normalized.\n     * @property _input\n     * @type String\n     * @private\n     */\n    this._input = text.replace(/\\n\\r?/g, \"\\n\");\n    this._line = 1;\n    this._col = 1;\n    this._cursor = 0;\n}\n\nStringReader.prototype = {\n\n    //restore constructor\n    constructor: StringReader,\n\n    //-------------------------------------------------------------------------\n    // Position info\n    //-------------------------------------------------------------------------\n\n    /**\n     * Returns the column of the character to be read next.\n     * @return {int} The column of the character to be read next.\n     * @method getCol\n     */\n    getCol: function(){\n        return this._col;\n    },\n\n    /**\n     * Returns the row of the character to be read next.\n     * @return {int} The row of the character to be read next.\n     * @method getLine\n     */\n    getLine: function(){\n        return this._line ;\n    },\n\n    /**\n     * Determines if you're at the end of the input.\n     * @return {Boolean} True if there's no more input, false otherwise.\n     * @method eof\n     */\n    eof: function(){\n        return (this._cursor == this._input.length);\n    },\n\n    //-------------------------------------------------------------------------\n    // Basic reading\n    //-------------------------------------------------------------------------\n\n    /**\n     * Reads the next character without advancing the cursor.\n     * @param {int} count How many characters to look ahead (default is 1).\n     * @return {String} The next character or null if there is no next character.\n     * @method peek\n     */\n    peek: function(count){\n        var c = null;\n        count = (typeof count == \"undefined\" ? 1 : count);\n\n        //if we're not at the end of the input...\n        if (this._cursor < this._input.length){\n\n            //get character and increment cursor and column\n            c = this._input.charAt(this._cursor + count - 1);\n        }\n\n        return c;\n    },\n\n    /**\n     * Reads the next character from the input and adjusts the row and column\n     * accordingly.\n     * @return {String} The next character or null if there is no next character.\n     * @method read\n     */\n    read: function(){\n        var c = null;\n\n        //if we're not at the end of the input...\n        if (this._cursor < this._input.length){\n\n            //if the last character was a newline, increment row count\n            //and reset column count\n            if (this._input.charAt(this._cursor) == \"\\n\"){\n                this._line++;\n                this._col=1;\n            } else {\n                this._col++;\n            }\n\n            //get character and increment cursor and column\n            c = this._input.charAt(this._cursor++);\n        }\n\n        return c;\n    },\n\n    //-------------------------------------------------------------------------\n    // Misc\n    //-------------------------------------------------------------------------\n\n    /**\n     * Saves the current location so it can be returned to later.\n     * @method mark\n     * @return {void}\n     */\n    mark: function(){\n        this._bookmark = {\n            cursor: this._cursor,\n            line:   this._line,\n            col:    this._col\n        };\n    },\n\n    reset: function(){\n        if (this._bookmark){\n            this._cursor = this._bookmark.cursor;\n            this._line = this._bookmark.line;\n            this._col = this._bookmark.col;\n            delete this._bookmark;\n        }\n    },\n\n    //-------------------------------------------------------------------------\n    // Advanced reading\n    //-------------------------------------------------------------------------\n\n    /**\n     * Reads up to and including the given string. Throws an error if that\n     * string is not found.\n     * @param {String} pattern The string to read.\n     * @return {String} The string when it is found.\n     * @throws Error when the string pattern is not found.\n     * @method readTo\n     */\n    readTo: function(pattern){\n\n        var buffer = \"\",\n            c;\n        while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){\n            c = this.read();\n            if (c){\n                buffer += c;\n            } else {\n                throw new Error(\"Expected \\\"\" + pattern + \"\\\" at line \" + this._line  + \", col \" + this._col + \".\");\n            }\n        }\n\n        return buffer;\n\n    },\n\n    /**\n     * Reads characters while each character causes the given\n     * filter function to return true. The function is passed\n     * in each character and either returns true to continue\n     * reading or false to stop.\n     * @param {Function} filter The function to read on each character.\n     * @return {String} The string made up of all characters that passed the\n     *      filter check.\n     * @method readWhile\n     */\n    readWhile: function(filter){\n\n        var buffer = \"\",\n            c = this.read();\n\n        while(c !== null && filter(c)){\n            buffer += c;\n            c = this.read();\n        }\n\n        return buffer;\n\n    },\n\n    /**\n     * Reads characters that match either text or a regular expression and\n     * returns those characters. If a match is found, the row and column\n     * are adjusted; if no match is found, the reader's state is unchanged.\n     * reading or false to stop.\n     * @param {String|RegExp} matchter If a string, then the literal string\n     *      value is searched for. If a regular expression, then any string\n     *      matching the pattern is search for.\n     * @return {String} The string made up of all characters that matched or\n     *      null if there was no match.\n     * @method readMatch\n     */\n    readMatch: function(matcher){\n\n        var source = this._input.substring(this._cursor),\n            value = null;\n\n        //if it's a string, just do a straight match\n        if (typeof matcher == \"string\"){\n            if (source.indexOf(matcher) === 0){\n                value = this.readCount(matcher.length);\n            }\n        } else if (matcher instanceof RegExp){\n            if (matcher.test(source)){\n                value = this.readCount(RegExp.lastMatch.length);\n            }\n        }\n\n        return value;\n    },\n\n\n    /**\n     * Reads a given number of characters. If the end of the input is reached,\n     * it reads only the remaining characters and does not throw an error.\n     * @param {int} count The number of characters to read.\n     * @return {String} The string made up the read characters.\n     * @method readCount\n     */\n    readCount: function(count){\n        var buffer = \"\";\n\n        while(count--){\n            buffer += this.read();\n        }\n\n        return buffer;\n    }\n\n};\nfunction SyntaxError(message, line, col){\n\n    /**\n     * The column at which the error occurred.\n     * @type int\n     * @property col\n     */\n    this.col = col;\n    this.line = line;\n    this.message = message;\n\n}\n\n//inherit from Error\nSyntaxError.prototype = new Error();\nfunction SyntaxUnit(text, line, col, type){\n\n\n    /**\n     * The column of text on which the unit resides.\n     * @type int\n     * @property col\n     */\n    this.col = col;\n    this.line = line;\n    this.text = text;\n    this.type = type;\n}\n\n/**\n * Create a new syntax unit based solely on the given token.\n * Convenience method for creating a new syntax unit when\n * it represents a single token instead of multiple.\n * @param {Object} token The token object to represent.\n * @return {parserlib.util.SyntaxUnit} The object representing the token.\n * @static\n * @method fromToken\n */\nSyntaxUnit.fromToken = function(token){\n    return new SyntaxUnit(token.value, token.startLine, token.startCol);\n};\n\nSyntaxUnit.prototype = {\n\n    //restore constructor\n    constructor: SyntaxUnit,\n    \n    /**\n     * Returns the text representation of the unit.\n     * @return {String} The text representation of the unit.\n     * @method valueOf\n     */\n    valueOf: function(){\n        return this.toString();\n    },\n    \n    /**\n     * Returns the text representation of the unit.\n     * @return {String} The text representation of the unit.\n     * @method toString\n     */\n    toString: function(){\n        return this.text;\n    }\n\n};\n\n/**\n * Generic TokenStream providing base functionality.\n * @class TokenStreamBase\n * @namespace parserlib.util\n * @constructor\n * @param {String|StringReader} input The text to tokenize or a reader from \n *      which to read the input.\n */\nfunction TokenStreamBase(input, tokenData){\n\n    /**\n     * The string reader for easy access to the text.\n     * @type StringReader\n     * @property _reader\n     * @private\n     */\n    this._reader = input ? new StringReader(input.toString()) : null;\n    this._token = null;\n    this._tokenData = tokenData;\n    this._lt = [];\n    this._ltIndex = 0;\n    \n    this._ltIndexCache = [];\n}\n\n/**\n * Accepts an array of token information and outputs\n * an array of token data containing key-value mappings\n * and matching functions that the TokenStream needs.\n * @param {Array} tokens An array of token descriptors.\n * @return {Array} An array of processed token data.\n * @method createTokenData\n * @static\n */\nTokenStreamBase.createTokenData = function(tokens){\n\n    var nameMap     = [],\n        typeMap     = {},\n        tokenData     = tokens.concat([]),\n        i            = 0,\n        len            = tokenData.length+1;\n    \n    tokenData.UNKNOWN = -1;\n    tokenData.unshift({name:\"EOF\"});\n\n    for (; i < len; i++){\n        nameMap.push(tokenData[i].name);\n        tokenData[tokenData[i].name] = i;\n        if (tokenData[i].text){\n            typeMap[tokenData[i].text] = i;\n        }\n    }\n    \n    tokenData.name = function(tt){\n        return nameMap[tt];\n    };\n    \n    tokenData.type = function(c){\n        return typeMap[c];\n    };\n    \n    return tokenData;\n};\n\nTokenStreamBase.prototype = {\n\n    //restore constructor\n    constructor: TokenStreamBase,    \n    \n    //-------------------------------------------------------------------------\n    // Matching methods\n    //-------------------------------------------------------------------------\n    \n    /**\n     * Determines if the next token matches the given token type.\n     * If so, that token is consumed; if not, the token is placed\n     * back onto the token stream. You can pass in any number of\n     * token types and this will return true if any of the token\n     * types is found.\n     * @param {int|int[]} tokenTypes Either a single token type or an array of\n     *      token types that the next token might be. If an array is passed,\n     *      it's assumed that the token can be any of these.\n     * @param {variant} channel (Optional) The channel to read from. If not\n     *      provided, reads from the default (unnamed) channel.\n     * @return {Boolean} True if the token type matches, false if not.\n     * @method match\n     */\n    match: function(tokenTypes, channel){\n    \n        //always convert to an array, makes things easier\n        if (!(tokenTypes instanceof Array)){\n            tokenTypes = [tokenTypes];\n        }\n                \n        var tt  = this.get(channel),\n            i   = 0,\n            len = tokenTypes.length;\n            \n        while(i < len){\n            if (tt == tokenTypes[i++]){\n                return true;\n            }\n        }\n        \n        //no match found, put the token back\n        this.unget();\n        return false;\n    },    \n    \n    /**\n     * Determines if the next token matches the given token type.\n     * If so, that token is consumed; if not, an error is thrown.\n     * @param {int|int[]} tokenTypes Either a single token type or an array of\n     *      token types that the next token should be. If an array is passed,\n     *      it's assumed that the token must be one of these.\n     * @param {variant} channel (Optional) The channel to read from. If not\n     *      provided, reads from the default (unnamed) channel.\n     * @return {void}\n     * @method mustMatch\n     */    \n    mustMatch: function(tokenTypes, channel){\n\n        var token;\n\n        //always convert to an array, makes things easier\n        if (!(tokenTypes instanceof Array)){\n            tokenTypes = [tokenTypes];\n        }\n\n        if (!this.match.apply(this, arguments)){    \n            token = this.LT(1);\n            throw new SyntaxError(\"Expected \" + this._tokenData[tokenTypes[0]].name + \n                \" at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n        }\n    },\n    \n    //-------------------------------------------------------------------------\n    // Consuming methods\n    //-------------------------------------------------------------------------\n    \n    /**\n     * Keeps reading from the token stream until either one of the specified\n     * token types is found or until the end of the input is reached.\n     * @param {int|int[]} tokenTypes Either a single token type or an array of\n     *      token types that the next token should be. If an array is passed,\n     *      it's assumed that the token must be one of these.\n     * @param {variant} channel (Optional) The channel to read from. If not\n     *      provided, reads from the default (unnamed) channel.\n     * @return {void}\n     * @method advance\n     */\n    advance: function(tokenTypes, channel){\n        \n        while(this.LA(0) !== 0 && !this.match(tokenTypes, channel)){\n            this.get();\n        }\n\n        return this.LA(0);    \n    },\n    \n    /**\n     * Consumes the next token from the token stream. \n     * @return {int} The token type of the token that was just consumed.\n     * @method get\n     */      \n    get: function(channel){\n    \n        var tokenInfo   = this._tokenData,\n            reader      = this._reader,\n            value,\n            i           =0,\n            len         = tokenInfo.length,\n            found       = false,\n            token,\n            info;\n            \n        //check the lookahead buffer first\n        if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){  \n                           \n            i++;\n            this._token = this._lt[this._ltIndex++];\n            info = tokenInfo[this._token.type];\n            \n            //obey channels logic\n            while((info.channel !== undefined && channel !== info.channel) &&\n                    this._ltIndex < this._lt.length){\n                this._token = this._lt[this._ltIndex++];\n                info = tokenInfo[this._token.type];\n                i++;\n            }\n            \n            //here be dragons\n            if ((info.channel === undefined || channel === info.channel) &&\n                    this._ltIndex <= this._lt.length){\n                this._ltIndexCache.push(i);\n                return this._token.type;\n            }\n        }\n        \n        //call token retriever method\n        token = this._getToken();\n\n        //if it should be hidden, don't save a token\n        if (token.type > -1 && !tokenInfo[token.type].hide){\n                     \n            //apply token channel\n            token.channel = tokenInfo[token.type].channel;\n         \n            //save for later\n            this._token = token;\n            this._lt.push(token);\n\n            //save space that will be moved (must be done before array is truncated)\n            this._ltIndexCache.push(this._lt.length - this._ltIndex + i);  \n        \n            //keep the buffer under 5 items\n            if (this._lt.length > 5){\n                this._lt.shift();                \n            }\n            \n            //also keep the shift buffer under 5 items\n            if (this._ltIndexCache.length > 5){\n                this._ltIndexCache.shift();\n            }\n                \n            //update lookahead index\n            this._ltIndex = this._lt.length;\n        }\n            \n        /*\n         * Skip to the next token if:\n         * 1. The token type is marked as hidden.\n         * 2. The token type has a channel specified and it isn't the current channel.\n         */\n        info = tokenInfo[token.type];\n        if (info && \n                (info.hide || \n                (info.channel !== undefined && channel !== info.channel))){\n            return this.get(channel);\n        } else {\n            //return just the type\n            return token.type;\n        }\n    },\n    \n    /**\n     * Looks ahead a certain number of tokens and returns the token type at\n     * that position. This will throw an error if you lookahead past the\n     * end of input, past the size of the lookahead buffer, or back past\n     * the first token in the lookahead buffer.\n     * @param {int} The index of the token type to retrieve. 0 for the\n     *      current token, 1 for the next, -1 for the previous, etc.\n     * @return {int} The token type of the token in the given position.\n     * @method LA\n     */\n    LA: function(index){\n        var total = index,\n            tt;\n        if (index > 0){\n            //TODO: Store 5 somewhere\n            if (index > 5){\n                throw new Error(\"Too much lookahead.\");\n            }\n        \n            //get all those tokens\n            while(total){\n                tt = this.get();   \n                total--;                            \n            }\n            \n            //unget all those tokens\n            while(total < index){\n                this.unget();\n                total++;\n            }\n        } else if (index < 0){\n        \n            if(this._lt[this._ltIndex+index]){\n                tt = this._lt[this._ltIndex+index].type;\n            } else {\n                throw new Error(\"Too much lookbehind.\");\n            }\n        \n        } else {\n            tt = this._token.type;\n        }\n        \n        return tt;\n    \n    },\n    \n    /**\n     * Looks ahead a certain number of tokens and returns the token at\n     * that position. This will throw an error if you lookahead past the\n     * end of input, past the size of the lookahead buffer, or back past\n     * the first token in the lookahead buffer.\n     * @param {int} The index of the token type to retrieve. 0 for the\n     *      current token, 1 for the next, -1 for the previous, etc.\n     * @return {Object} The token of the token in the given position.\n     * @method LA\n     */    \n    LT: function(index){\n    \n        //lookahead first to prime the token buffer\n        this.LA(index);\n        \n        //now find the token, subtract one because _ltIndex is already at the next index\n        return this._lt[this._ltIndex+index-1];    \n    },\n    \n    /**\n     * Returns the token type for the next token in the stream without \n     * consuming it.\n     * @return {int} The token type of the next token in the stream.\n     * @method peek\n     */\n    peek: function(){\n        return this.LA(1);\n    },\n    \n    /**\n     * Returns the actual token object for the last consumed token.\n     * @return {Token} The token object for the last consumed token.\n     * @method token\n     */\n    token: function(){\n        return this._token;\n    },\n    \n    /**\n     * Returns the name of the token for the given token type.\n     * @param {int} tokenType The type of token to get the name of.\n     * @return {String} The name of the token or \"UNKNOWN_TOKEN\" for any\n     *      invalid token type.\n     * @method tokenName\n     */\n    tokenName: function(tokenType){\n        if (tokenType < 0 || tokenType > this._tokenData.length){\n            return \"UNKNOWN_TOKEN\";\n        } else {\n            return this._tokenData[tokenType].name;\n        }\n    },\n    \n    /**\n     * Returns the token type value for the given token name.\n     * @param {String} tokenName The name of the token whose value should be returned.\n     * @return {int} The token type value for the given token name or -1\n     *      for an unknown token.\n     * @method tokenName\n     */    \n    tokenType: function(tokenName){\n        return this._tokenData[tokenName] || -1;\n    },\n    \n    /**\n     * Returns the last consumed token to the token stream.\n     * @method unget\n     */      \n    unget: function(){\n        //if (this._ltIndex > -1){\n        if (this._ltIndexCache.length){\n            this._ltIndex -= this._ltIndexCache.pop();//--;\n            this._token = this._lt[this._ltIndex - 1];\n        } else {\n            throw new Error(\"Too much lookahead.\");\n        }\n    }\n\n};\n\n\n\n\nparserlib.util = {\nStringReader: StringReader,\nSyntaxError : SyntaxError,\nSyntaxUnit  : SyntaxUnit,\nEventTarget : EventTarget,\nTokenStreamBase : TokenStreamBase\n};\n})();\n/* Version v0.1.6, Build time: 2-March-2012 02:44:32 */\n(function(){\nvar EventTarget = parserlib.util.EventTarget,\nTokenStreamBase = parserlib.util.TokenStreamBase,\nStringReader = parserlib.util.StringReader,\nSyntaxError = parserlib.util.SyntaxError,\nSyntaxUnit  = parserlib.util.SyntaxUnit;\n\n\nvar Colors = {\n    aliceblue       :\"#f0f8ff\",\n    antiquewhite    :\"#faebd7\",\n    aqua            :\"#00ffff\",\n    aquamarine      :\"#7fffd4\",\n    azure           :\"#f0ffff\",\n    beige           :\"#f5f5dc\",\n    bisque          :\"#ffe4c4\",\n    black           :\"#000000\",\n    blanchedalmond  :\"#ffebcd\",\n    blue            :\"#0000ff\",\n    blueviolet      :\"#8a2be2\",\n    brown           :\"#a52a2a\",\n    burlywood       :\"#deb887\",\n    cadetblue       :\"#5f9ea0\",\n    chartreuse      :\"#7fff00\",\n    chocolate       :\"#d2691e\",\n    coral           :\"#ff7f50\",\n    cornflowerblue  :\"#6495ed\",\n    cornsilk        :\"#fff8dc\",\n    crimson         :\"#dc143c\",\n    cyan            :\"#00ffff\",\n    darkblue        :\"#00008b\",\n    darkcyan        :\"#008b8b\",\n    darkgoldenrod   :\"#b8860b\",\n    darkgray        :\"#a9a9a9\",\n    darkgreen       :\"#006400\",\n    darkkhaki       :\"#bdb76b\",\n    darkmagenta     :\"#8b008b\",\n    darkolivegreen  :\"#556b2f\",\n    darkorange      :\"#ff8c00\",\n    darkorchid      :\"#9932cc\",\n    darkred         :\"#8b0000\",\n    darksalmon      :\"#e9967a\",\n    darkseagreen    :\"#8fbc8f\",\n    darkslateblue   :\"#483d8b\",\n    darkslategray   :\"#2f4f4f\",\n    darkturquoise   :\"#00ced1\",\n    darkviolet      :\"#9400d3\",\n    deeppink        :\"#ff1493\",\n    deepskyblue     :\"#00bfff\",\n    dimgray         :\"#696969\",\n    dodgerblue      :\"#1e90ff\",\n    firebrick       :\"#b22222\",\n    floralwhite     :\"#fffaf0\",\n    forestgreen     :\"#228b22\",\n    fuchsia         :\"#ff00ff\",\n    gainsboro       :\"#dcdcdc\",\n    ghostwhite      :\"#f8f8ff\",\n    gold            :\"#ffd700\",\n    goldenrod       :\"#daa520\",\n    gray            :\"#808080\",\n    green           :\"#008000\",\n    greenyellow     :\"#adff2f\",\n    honeydew        :\"#f0fff0\",\n    hotpink         :\"#ff69b4\",\n    indianred       :\"#cd5c5c\",\n    indigo          :\"#4b0082\",\n    ivory           :\"#fffff0\",\n    khaki           :\"#f0e68c\",\n    lavender        :\"#e6e6fa\",\n    lavenderblush   :\"#fff0f5\",\n    lawngreen       :\"#7cfc00\",\n    lemonchiffon    :\"#fffacd\",\n    lightblue       :\"#add8e6\",\n    lightcoral      :\"#f08080\",\n    lightcyan       :\"#e0ffff\",\n    lightgoldenrodyellow  :\"#fafad2\",\n    lightgray       :\"#d3d3d3\",\n    lightgreen      :\"#90ee90\",\n    lightpink       :\"#ffb6c1\",\n    lightsalmon     :\"#ffa07a\",\n    lightseagreen   :\"#20b2aa\",\n    lightskyblue    :\"#87cefa\",\n    lightslategray  :\"#778899\",\n    lightsteelblue  :\"#b0c4de\",\n    lightyellow     :\"#ffffe0\",\n    lime            :\"#00ff00\",\n    limegreen       :\"#32cd32\",\n    linen           :\"#faf0e6\",\n    magenta         :\"#ff00ff\",\n    maroon          :\"#800000\",\n    mediumaquamarine:\"#66cdaa\",\n    mediumblue      :\"#0000cd\",\n    mediumorchid    :\"#ba55d3\",\n    mediumpurple    :\"#9370d8\",\n    mediumseagreen  :\"#3cb371\",\n    mediumslateblue :\"#7b68ee\",\n    mediumspringgreen   :\"#00fa9a\",\n    mediumturquoise :\"#48d1cc\",\n    mediumvioletred :\"#c71585\",\n    midnightblue    :\"#191970\",\n    mintcream       :\"#f5fffa\",\n    mistyrose       :\"#ffe4e1\",\n    moccasin        :\"#ffe4b5\",\n    navajowhite     :\"#ffdead\",\n    navy            :\"#000080\",\n    oldlace         :\"#fdf5e6\",\n    olive           :\"#808000\",\n    olivedrab       :\"#6b8e23\",\n    orange          :\"#ffa500\",\n    orangered       :\"#ff4500\",\n    orchid          :\"#da70d6\",\n    palegoldenrod   :\"#eee8aa\",\n    palegreen       :\"#98fb98\",\n    paleturquoise   :\"#afeeee\",\n    palevioletred   :\"#d87093\",\n    papayawhip      :\"#ffefd5\",\n    peachpuff       :\"#ffdab9\",\n    peru            :\"#cd853f\",\n    pink            :\"#ffc0cb\",\n    plum            :\"#dda0dd\",\n    powderblue      :\"#b0e0e6\",\n    purple          :\"#800080\",\n    red             :\"#ff0000\",\n    rosybrown       :\"#bc8f8f\",\n    royalblue       :\"#4169e1\",\n    saddlebrown     :\"#8b4513\",\n    salmon          :\"#fa8072\",\n    sandybrown      :\"#f4a460\",\n    seagreen        :\"#2e8b57\",\n    seashell        :\"#fff5ee\",\n    sienna          :\"#a0522d\",\n    silver          :\"#c0c0c0\",\n    skyblue         :\"#87ceeb\",\n    slateblue       :\"#6a5acd\",\n    slategray       :\"#708090\",\n    snow            :\"#fffafa\",\n    springgreen     :\"#00ff7f\",\n    steelblue       :\"#4682b4\",\n    tan             :\"#d2b48c\",\n    teal            :\"#008080\",\n    thistle         :\"#d8bfd8\",\n    tomato          :\"#ff6347\",\n    turquoise       :\"#40e0d0\",\n    violet          :\"#ee82ee\",\n    wheat           :\"#f5deb3\",\n    white           :\"#ffffff\",\n    whitesmoke      :\"#f5f5f5\",\n    yellow          :\"#ffff00\",\n    yellowgreen     :\"#9acd32\"\n};\n/**\n * Represents a selector combinator (whitespace, +, >).\n * @namespace parserlib.css\n * @class Combinator\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n * @param {String} text The text representation of the unit. \n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n */\nfunction Combinator(text, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE);\n    this.type = \"unknown\";\n    \n    //pretty simple\n    if (/^\\s+$/.test(text)){\n        this.type = \"descendant\";\n    } else if (text == \">\"){\n        this.type = \"child\";\n    } else if (text == \"+\"){\n        this.type = \"adjacent-sibling\";\n    } else if (text == \"~\"){\n        this.type = \"sibling\";\n    }\n\n}\n\nCombinator.prototype = new SyntaxUnit();\nCombinator.prototype.constructor = Combinator;\n/**\n * Represents a media feature, such as max-width:500.\n * @namespace parserlib.css\n * @class MediaFeature\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n * @param {SyntaxUnit} name The name of the feature.\n * @param {SyntaxUnit} value The value of the feature or null if none.\n */\nfunction MediaFeature(name, value){\n    \n    SyntaxUnit.call(this, \"(\" + name + (value !== null ? \":\" + value : \"\") + \")\", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE);\n    this.name = name;\n    this.value = value;\n}\n\nMediaFeature.prototype = new SyntaxUnit();\nMediaFeature.prototype.constructor = MediaFeature;\n/**\n * Represents an individual media query.\n * @namespace parserlib.css\n * @class MediaQuery\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n * @param {String} modifier The modifier \"not\" or \"only\" (or null).\n * @param {String} mediaType The type of media (i.e., \"print\").\n * @param {Array} parts Array of selectors parts making up this selector.\n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n */\nfunction MediaQuery(modifier, mediaType, features, line, col){\n    \n    SyntaxUnit.call(this, (modifier ? modifier + \" \": \"\") + (mediaType ? mediaType + \" \" : \"\") + features.join(\" and \"), line, col, Parser.MEDIA_QUERY_TYPE);\n    this.modifier = modifier;\n    this.mediaType = mediaType;\n    this.features = features;\n\n}\n\nMediaQuery.prototype = new SyntaxUnit();\nMediaQuery.prototype.constructor = MediaQuery;\n\n/**\n * A CSS3 parser.\n * @namespace parserlib.css\n * @class Parser\n * @constructor\n * @param {Object} options (Optional) Various options for the parser:\n *      starHack (true|false) to allow IE6 star hack as valid,\n *      underscoreHack (true|false) to interpret leading underscores\n *      as IE6-7 targeting for known properties, ieFilters (true|false)\n *      to indicate that IE < 8 filters should be accepted and not throw\n *      syntax errors.\n */\nfunction Parser(options){\n\n    //inherit event functionality\n    EventTarget.call(this);\n\n\n    this.options = options || {};\n\n    this._tokenStream = null;\n}\n\n//Static constants\nParser.DEFAULT_TYPE = 0;\nParser.COMBINATOR_TYPE = 1;\nParser.MEDIA_FEATURE_TYPE = 2;\nParser.MEDIA_QUERY_TYPE = 3;\nParser.PROPERTY_NAME_TYPE = 4;\nParser.PROPERTY_VALUE_TYPE = 5;\nParser.PROPERTY_VALUE_PART_TYPE = 6;\nParser.SELECTOR_TYPE = 7;\nParser.SELECTOR_PART_TYPE = 8;\nParser.SELECTOR_SUB_PART_TYPE = 9;\n\nParser.prototype = function(){\n\n    var proto = new EventTarget(),  //new prototype\n        prop,\n        additions =  {\n        \n            //restore constructor\n            constructor: Parser,\n                        \n            //instance constants - yuck\n            DEFAULT_TYPE : 0,\n            COMBINATOR_TYPE : 1,\n            MEDIA_FEATURE_TYPE : 2,\n            MEDIA_QUERY_TYPE : 3,\n            PROPERTY_NAME_TYPE : 4,\n            PROPERTY_VALUE_TYPE : 5,\n            PROPERTY_VALUE_PART_TYPE : 6,\n            SELECTOR_TYPE : 7,\n            SELECTOR_PART_TYPE : 8,\n            SELECTOR_SUB_PART_TYPE : 9,            \n        \n            //-----------------------------------------------------------------\n            // Grammar\n            //-----------------------------------------------------------------\n        \n            _stylesheet: function(){\n            \n                /*\n                 * stylesheet\n                 *  : [ CHARSET_SYM S* STRING S* ';' ]?\n                 *    [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*\n                 *    [ namespace [S|CDO|CDC]* ]*\n                 *    [ [ ruleset | media | page | font_face | keyframes ] [S|CDO|CDC]* ]*\n                 *  ;\n                 */ \n               \n                var tokenStream = this._tokenStream,\n                    charset     = null,\n                    count,\n                    token,\n                    tt;\n                    \n                this.fire(\"startstylesheet\");\n            \n                //try to read character set\n                this._charset();\n                \n                this._skipCruft();\n\n                //try to read imports - may be more than one\n                while (tokenStream.peek() == Tokens.IMPORT_SYM){\n                    this._import();\n                    this._skipCruft();\n                }\n                \n                //try to read namespaces - may be more than one\n                while (tokenStream.peek() == Tokens.NAMESPACE_SYM){\n                    this._namespace();\n                    this._skipCruft();\n                }\n                \n                //get the next token\n                tt = tokenStream.peek();\n                \n                //try to read the rest\n                while(tt > Tokens.EOF){\n                \n                    try {\n                \n                        switch(tt){\n                            case Tokens.MEDIA_SYM:\n                                this._media();\n                                this._skipCruft();\n                                break;\n                            case Tokens.PAGE_SYM:\n                                this._page(); \n                                this._skipCruft();\n                                break;                   \n                            case Tokens.FONT_FACE_SYM:\n                                this._font_face(); \n                                this._skipCruft();\n                                break;  \n                            case Tokens.KEYFRAMES_SYM:\n                                this._keyframes(); \n                                this._skipCruft();\n                                break;                                \n                            case Tokens.UNKNOWN_SYM:  //unknown @ rule\n                                tokenStream.get();\n                                if (!this.options.strict){\n                                \n                                    //fire error event\n                                    this.fire({\n                                        type:       \"error\",\n                                        error:      null,\n                                        message:    \"Unknown @ rule: \" + tokenStream.LT(0).value + \".\",\n                                        line:       tokenStream.LT(0).startLine,\n                                        col:        tokenStream.LT(0).startCol\n                                    });                          \n                                    \n                                    //skip braces\n                                    count=0;\n                                    while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){\n                                        count++;    //keep track of nesting depth\n                                    }\n                                    \n                                    while(count){\n                                        tokenStream.advance([Tokens.RBRACE]);\n                                        count--;\n                                    }\n                                    \n                                } else {\n                                    //not a syntax error, rethrow it\n                                    throw new SyntaxError(\"Unknown @ rule.\", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol);\n                                }                                \n                                break;\n                            case Tokens.S:\n                                this._readWhitespace();\n                                break;\n                            default:                            \n                                if(!this._ruleset()){\n                                \n                                    //error handling for known issues\n                                    switch(tt){\n                                        case Tokens.CHARSET_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._charset(false);\n                                            throw new SyntaxError(\"@charset not allowed here.\", token.startLine, token.startCol);\n                                        case Tokens.IMPORT_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._import(false);\n                                            throw new SyntaxError(\"@import not allowed here.\", token.startLine, token.startCol);\n                                        case Tokens.NAMESPACE_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._namespace(false);\n                                            throw new SyntaxError(\"@namespace not allowed here.\", token.startLine, token.startCol);\n                                        default:\n                                            tokenStream.get();  //get the last token\n                                            this._unexpectedToken(tokenStream.token());\n                                    }\n                                \n                                }\n                        }\n                    } catch(ex) {\n                        if (ex instanceof SyntaxError && !this.options.strict){\n                            this.fire({\n                                type:       \"error\",\n                                error:      ex,\n                                message:    ex.message,\n                                line:       ex.line,\n                                col:        ex.col\n                            });                     \n                        } else {\n                            throw ex;\n                        }\n                    }\n                    \n                    tt = tokenStream.peek();\n                }\n                \n                if (tt != Tokens.EOF){\n                    this._unexpectedToken(tokenStream.token());\n                }\n            \n                this.fire(\"endstylesheet\");\n            },\n            \n            _charset: function(emit){\n                var tokenStream = this._tokenStream,\n                    charset,\n                    token,\n                    line,\n                    col;\n                    \n                if (tokenStream.match(Tokens.CHARSET_SYM)){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                \n                    this._readWhitespace();\n                    tokenStream.mustMatch(Tokens.STRING);\n                    \n                    token = tokenStream.token();\n                    charset = token.value;\n                    \n                    this._readWhitespace();\n                    tokenStream.mustMatch(Tokens.SEMICOLON);\n                    \n                    if (emit !== false){\n                        this.fire({ \n                            type:   \"charset\",\n                            charset:charset,\n                            line:   line,\n                            col:    col\n                        });\n                    }\n                }            \n            },\n            \n            _import: function(emit){\n                /*\n                 * import\n                 *   : IMPORT_SYM S*\n                 *    [STRING|URI] S* media_query_list? ';' S*\n                 */    \n            \n                var tokenStream = this._tokenStream,\n                    tt,\n                    uri,\n                    importToken,\n                    mediaList   = [];\n                \n                //read import symbol\n                tokenStream.mustMatch(Tokens.IMPORT_SYM);\n                importToken = tokenStream.token();\n                this._readWhitespace();\n                \n                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n                \n                //grab the URI value\n                uri = tokenStream.token().value.replace(/(?:url\\()?[\"']([^\"']+)[\"']\\)?/, \"$1\");                \n\n                this._readWhitespace();\n                \n                mediaList = this._media_query_list();\n                \n                //must end with a semicolon\n                tokenStream.mustMatch(Tokens.SEMICOLON);\n                this._readWhitespace();\n                \n                if (emit !== false){\n                    this.fire({\n                        type:   \"import\",\n                        uri:    uri,\n                        media:  mediaList,\n                        line:   importToken.startLine,\n                        col:    importToken.startCol\n                    });\n                }\n        \n            },\n            \n            _namespace: function(emit){\n                /*\n                 * namespace\n                 *   : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S*\n                 */    \n            \n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    prefix,\n                    uri;\n                \n                //read import symbol\n                tokenStream.mustMatch(Tokens.NAMESPACE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                this._readWhitespace();\n                \n                //it's a namespace prefix - no _namespace_prefix() method because it's just an IDENT\n                if (tokenStream.match(Tokens.IDENT)){\n                    prefix = tokenStream.token().value;\n                    this._readWhitespace();\n                }\n                \n                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n                \n                //grab the URI value\n                uri = tokenStream.token().value.replace(/(?:url\\()?[\"']([^\"']+)[\"']\\)?/, \"$1\");                \n\n                this._readWhitespace();\n\n                //must end with a semicolon\n                tokenStream.mustMatch(Tokens.SEMICOLON);\n                this._readWhitespace();\n                \n                if (emit !== false){\n                    this.fire({\n                        type:   \"namespace\",\n                        prefix: prefix,\n                        uri:    uri,\n                        line:   line,\n                        col:    col\n                    });\n                }\n        \n            },            \n                       \n            _media: function(){\n                /*\n                 * media\n                 *   : MEDIA_SYM S* media_query_list S* '{' S* ruleset* '}' S*\n                 *   ;\n                 */\n                var tokenStream     = this._tokenStream,\n                    line,\n                    col,\n                    mediaList;//       = [];\n                \n                //look for @media\n                tokenStream.mustMatch(Tokens.MEDIA_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                \n                this._readWhitespace();               \n\n                mediaList = this._media_query_list();\n\n                tokenStream.mustMatch(Tokens.LBRACE);\n                this._readWhitespace();\n                \n                this.fire({\n                    type:   \"startmedia\",\n                    media:  mediaList,\n                    line:   line,\n                    col:    col\n                });\n                \n                while(true) {\n                    if (tokenStream.peek() == Tokens.PAGE_SYM){\n                        this._page();\n                    } else if (!this._ruleset()){\n                        break;\n                    }                \n                }\n                \n                tokenStream.mustMatch(Tokens.RBRACE);\n                this._readWhitespace();\n        \n                this.fire({\n                    type:   \"endmedia\",\n                    media:  mediaList,\n                    line:   line,\n                    col:    col\n                });\n            },                           \n        \n\n            //CSS3 Media Queries\n            _media_query_list: function(){\n                /*\n                 * media_query_list\n                 *   : S* [media_query [ ',' S* media_query ]* ]?\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream,\n                    mediaList   = [];\n                \n                \n                this._readWhitespace();\n                \n                if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){\n                    mediaList.push(this._media_query());\n                }\n                \n                while(tokenStream.match(Tokens.COMMA)){\n                    this._readWhitespace();\n                    mediaList.push(this._media_query());\n                }\n                \n                return mediaList;\n            },\n            \n            /*\n             * Note: \"expression\" in the grammar maps to the _media_expression\n             * method.\n             \n             */\n            _media_query: function(){\n                /*\n                 * media_query\n                 *   : [ONLY | NOT]? S* media_type S* [ AND S* expression ]*\n                 *   | expression [ AND S* expression ]*\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream,\n                    type        = null,\n                    ident       = null,\n                    token       = null,\n                    expressions = [];\n                    \n                if (tokenStream.match(Tokens.IDENT)){\n                    ident = tokenStream.token().value.toLowerCase();\n                    \n                    //since there's no custom tokens for these, need to manually check\n                    if (ident != \"only\" && ident != \"not\"){\n                        tokenStream.unget();\n                        ident = null;\n                    } else {\n                        token = tokenStream.token();\n                    }\n                }\n                                \n                this._readWhitespace();\n                \n                if (tokenStream.peek() == Tokens.IDENT){\n                    type = this._media_type();\n                    if (token === null){\n                        token = tokenStream.token();\n                    }\n                } else if (tokenStream.peek() == Tokens.LPAREN){\n                    if (token === null){\n                        token = tokenStream.LT(1);\n                    }\n                    expressions.push(this._media_expression());\n                }                               \n                \n                if (type === null && expressions.length === 0){\n                    return null;\n                } else {                \n                    this._readWhitespace();\n                    while (tokenStream.match(Tokens.IDENT)){\n                        if (tokenStream.token().value.toLowerCase() != \"and\"){\n                            this._unexpectedToken(tokenStream.token());\n                        }\n                        \n                        this._readWhitespace();\n                        expressions.push(this._media_expression());\n                    }\n                }\n\n                return new MediaQuery(ident, type, expressions, token.startLine, token.startCol);\n            },\n\n            //CSS3 Media Queries\n            _media_type: function(){\n                /*\n                 * media_type\n                 *   : IDENT\n                 *   ;\n                 */\n                return this._media_feature();           \n            },\n\n            /**\n             * Note: in CSS3 Media Queries, this is called \"expression\".\n             * Renamed here to avoid conflict with CSS3 Selectors\n             * definition of \"expression\". Also note that \"expr\" in the\n             * grammar now maps to \"expression\" from CSS3 selectors.\n             * @method _media_expression\n             * @private\n             */\n            _media_expression: function(){\n                /*\n                 * expression\n                 *  : '(' S* media_feature S* [ ':' S* expr ]? ')' S*\n                 *  ;\n                 */\n                var tokenStream = this._tokenStream,\n                    feature     = null,\n                    token,\n                    expression  = null;\n                \n                tokenStream.mustMatch(Tokens.LPAREN);\n                \n                feature = this._media_feature();\n                this._readWhitespace();\n                \n                if (tokenStream.match(Tokens.COLON)){\n                    this._readWhitespace();\n                    token = tokenStream.LT(1);\n                    expression = this._expression();\n                }\n                \n                tokenStream.mustMatch(Tokens.RPAREN);\n                this._readWhitespace();\n\n                return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null));            \n            },\n\n            //CSS3 Media Queries\n            _media_feature: function(){\n                /*\n                 * media_feature\n                 *   : IDENT\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream;\n                    \n                tokenStream.mustMatch(Tokens.IDENT);\n                \n                return SyntaxUnit.fromToken(tokenStream.token());            \n            },\n            \n            //CSS3 Paged Media\n            _page: function(){\n                /*\n                 * page:\n                 *    PAGE_SYM S* IDENT? pseudo_page? S* \n                 *    '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S*\n                 *    ;\n                 */            \n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    identifier  = null,\n                    pseudoPage  = null;\n                \n                //look for @page\n                tokenStream.mustMatch(Tokens.PAGE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                \n                this._readWhitespace();\n                \n                if (tokenStream.match(Tokens.IDENT)){\n                    identifier = tokenStream.token().value;\n\n                    //The value 'auto' may not be used as a page name and MUST be treated as a syntax error.\n                    if (identifier.toLowerCase() === \"auto\"){\n                        this._unexpectedToken(tokenStream.token());\n                    }\n                }                \n                \n                //see if there's a colon upcoming\n                if (tokenStream.peek() == Tokens.COLON){\n                    pseudoPage = this._pseudo_page();\n                }\n            \n                this._readWhitespace();\n                \n                this.fire({\n                    type:   \"startpage\",\n                    id:     identifier,\n                    pseudo: pseudoPage,\n                    line:   line,\n                    col:    col\n                });                   \n\n                this._readDeclarations(true, true);                \n                \n                this.fire({\n                    type:   \"endpage\",\n                    id:     identifier,\n                    pseudo: pseudoPage,\n                    line:   line,\n                    col:    col\n                });             \n            \n            },\n            \n            //CSS3 Paged Media\n            _margin: function(){\n                /*\n                 * margin :\n                 *    margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*\n                 *    ;\n                 */\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    marginSym   = this._margin_sym();\n\n                if (marginSym){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                \n                    this.fire({\n                        type: \"startpagemargin\",\n                        margin: marginSym,\n                        line:   line,\n                        col:    col\n                    });    \n                    \n                    this._readDeclarations(true);\n\n                    this.fire({\n                        type: \"endpagemargin\",\n                        margin: marginSym,\n                        line:   line,\n                        col:    col\n                    });    \n                    return true;\n                } else {\n                    return false;\n                }\n            },\n\n            //CSS3 Paged Media\n            _margin_sym: function(){\n            \n                /*\n                 * margin_sym :\n                 *    TOPLEFTCORNER_SYM | \n                 *    TOPLEFT_SYM | \n                 *    TOPCENTER_SYM | \n                 *    TOPRIGHT_SYM | \n                 *    TOPRIGHTCORNER_SYM |\n                 *    BOTTOMLEFTCORNER_SYM | \n                 *    BOTTOMLEFT_SYM | \n                 *    BOTTOMCENTER_SYM | \n                 *    BOTTOMRIGHT_SYM |\n                 *    BOTTOMRIGHTCORNER_SYM |\n                 *    LEFTTOP_SYM |\n                 *    LEFTMIDDLE_SYM |\n                 *    LEFTBOTTOM_SYM |\n                 *    RIGHTTOP_SYM |\n                 *    RIGHTMIDDLE_SYM |\n                 *    RIGHTBOTTOM_SYM \n                 *    ;\n                 */\n            \n                var tokenStream = this._tokenStream;\n            \n                if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM,\n                        Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM,\n                        Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, \n                        Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM,\n                        Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, \n                        Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM,\n                        Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM]))\n                {\n                    return SyntaxUnit.fromToken(tokenStream.token());                \n                } else {\n                    return null;\n                }\n            \n            },\n            \n            _pseudo_page: function(){\n                /*\n                 * pseudo_page\n                 *   : ':' IDENT\n                 *   ;    \n                 */\n        \n                var tokenStream = this._tokenStream;\n                \n                tokenStream.mustMatch(Tokens.COLON);\n                tokenStream.mustMatch(Tokens.IDENT);\n                \n                //TODO: CSS3 Paged Media says only \"left\", \"center\", and \"right\" are allowed\n                \n                return tokenStream.token().value;\n            },\n            \n            _font_face: function(){\n                /*\n                 * font_face\n                 *   : FONT_FACE_SYM S* \n                 *     '{' S* declaration [ ';' S* declaration ]* '}' S*\n                 *   ;\n                 */     \n                var tokenStream = this._tokenStream,\n                    line,\n                    col;\n                \n                //look for @page\n                tokenStream.mustMatch(Tokens.FONT_FACE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                \n                this._readWhitespace();\n\n                this.fire({\n                    type:   \"startfontface\",\n                    line:   line,\n                    col:    col\n                });                    \n                \n                this._readDeclarations(true);\n                \n                this.fire({\n                    type:   \"endfontface\",\n                    line:   line,\n                    col:    col\n                });              \n            },\n\n            _operator: function(){\n            \n                /*\n                 * operator\n                 *  : '/' S* | ',' S* | /( empty )/\n                 *  ;\n                 */    \n                 \n                var tokenStream = this._tokenStream,\n                    token       = null;\n                \n                if (tokenStream.match([Tokens.SLASH, Tokens.COMMA])){\n                    token =  tokenStream.token();\n                    this._readWhitespace();\n                } \n                return token ? PropertyValuePart.fromToken(token) : null;\n                \n            },\n            \n            _combinator: function(){\n            \n                /*\n                 * combinator\n                 *  : PLUS S* | GREATER S* | TILDE S* | S+\n                 *  ;\n                 */    \n                 \n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    token;\n                \n                if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){                \n                    token = tokenStream.token();\n                    value = new Combinator(token.value, token.startLine, token.startCol);\n                    this._readWhitespace();\n                }\n                \n                return value;\n            },\n            \n            _unary_operator: function(){\n            \n                /*\n                 * unary_operator\n                 *  : '-' | '+'\n                 *  ;\n                 */\n                 \n                var tokenStream = this._tokenStream;\n                \n                if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){\n                    return tokenStream.token().value;\n                } else {\n                    return null;\n                }         \n            },\n            \n            _property: function(){\n            \n                /*\n                 * property\n                 *   : IDENT S*\n                 *   ;        \n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    hack        = null,\n                    tokenValue,\n                    token,\n                    line,\n                    col;\n                    \n                //check for star hack - throws error if not allowed\n                if (tokenStream.peek() == Tokens.STAR && this.options.starHack){\n                    tokenStream.get();\n                    token = tokenStream.token();\n                    hack = token.value;\n                    line = token.startLine;\n                    col = token.startCol;\n                }\n                \n                if(tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();\n                    tokenValue = token.value;\n                    \n                    //check for underscore hack - no error if not allowed because it's valid CSS syntax\n                    if (tokenValue.charAt(0) == \"_\" && this.options.underscoreHack){\n                        hack = \"_\";\n                        tokenValue = tokenValue.substring(1);\n                    }\n                    \n                    value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol));\n                    this._readWhitespace();\n                }\n                \n                return value;\n            },\n        \n            //Augmented with CSS3 Selectors\n            _ruleset: function(){\n                /*\n                 * ruleset\n                 *   : selectors_group\n                 *     '{' S* declaration? [ ';' S* declaration? ]* '}' S*\n                 *   ;    \n                 */    \n                 \n                var tokenStream = this._tokenStream,\n                    tt,\n                    selectors;\n                try {\n                    selectors = this._selectors_group();\n                } catch (ex){\n                    if (ex instanceof SyntaxError && !this.options.strict){\n                    \n                        //fire error event\n                        this.fire({\n                            type:       \"error\",\n                            error:      ex,\n                            message:    ex.message,\n                            line:       ex.line,\n                            col:        ex.col\n                        });                          \n                        \n                        //skip over everything until closing brace\n                        tt = tokenStream.advance([Tokens.RBRACE]);\n                        if (tt == Tokens.RBRACE){\n                            //if there's a right brace, the rule is finished so don't do anything\n                        } else {\n                            //otherwise, rethrow the error because it wasn't handled properly\n                            throw ex;\n                        }                        \n                        \n                    } else {\n                        //not a syntax error, rethrow it\n                        throw ex;\n                    }                \n                \n                    //trigger parser to continue\n                    return true;\n                }\n                \n                //if it got here, all selectors parsed\n                if (selectors){ \n                                    \n                    this.fire({\n                        type:       \"startrule\",\n                        selectors:  selectors,\n                        line:       selectors[0].line,\n                        col:        selectors[0].col\n                    });                \n                    \n                    this._readDeclarations(true);                \n                    \n                    this.fire({\n                        type:       \"endrule\",\n                        selectors:  selectors,\n                        line:       selectors[0].line,\n                        col:        selectors[0].col\n                    });  \n                    \n                }\n                \n                return selectors;\n                \n            },\n\n            //CSS3 Selectors\n            _selectors_group: function(){\n            \n                /*            \n                 * selectors_group\n                 *   : selector [ COMMA S* selector ]*\n                 *   ;\n                 */           \n                var tokenStream = this._tokenStream,\n                    selectors   = [],\n                    selector;\n                    \n                selector = this._selector();\n                if (selector !== null){\n                \n                    selectors.push(selector);\n                    while(tokenStream.match(Tokens.COMMA)){\n                        this._readWhitespace();\n                        selector = this._selector();\n                        if (selector !== null){\n                            selectors.push(selector);\n                        } else {\n                            this._unexpectedToken(tokenStream.LT(1));\n                        }\n                    }\n                }\n\n                return selectors.length ? selectors : null;\n            },\n                \n            //CSS3 Selectors\n            _selector: function(){\n                /*\n                 * selector\n                 *   : simple_selector_sequence [ combinator simple_selector_sequence ]*\n                 *   ;    \n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    selector    = [],\n                    nextSelector = null,\n                    combinator  = null,\n                    ws          = null;\n                \n                //if there's no simple selector, then there's no selector\n                nextSelector = this._simple_selector_sequence();\n                if (nextSelector === null){\n                    return null;\n                }\n                \n                selector.push(nextSelector);\n                \n                do {\n                    \n                    //look for a combinator\n                    combinator = this._combinator();\n                    \n                    if (combinator !== null){\n                        selector.push(combinator);\n                        nextSelector = this._simple_selector_sequence();\n                        \n                        //there must be a next selector\n                        if (nextSelector === null){\n                            this._unexpectedToken(this.LT(1));\n                        } else {\n                        \n                            //nextSelector is an instance of SelectorPart\n                            selector.push(nextSelector);\n                        }\n                    } else {\n                        \n                        //if there's not whitespace, we're done\n                        if (this._readWhitespace()){           \n        \n                            //add whitespace separator\n                            ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol);\n                            \n                            //combinator is not required\n                            combinator = this._combinator();\n                            \n                            //selector is required if there's a combinator\n                            nextSelector = this._simple_selector_sequence();\n                            if (nextSelector === null){                        \n                                if (combinator !== null){\n                                    this._unexpectedToken(tokenStream.LT(1));\n                                }\n                            } else {\n                                \n                                if (combinator !== null){\n                                    selector.push(combinator);\n                                } else {\n                                    selector.push(ws);\n                                }\n                                \n                                selector.push(nextSelector);\n                            }     \n                        } else {\n                            break;\n                        }               \n                    \n                    }\n                } while(true);\n                \n                return new Selector(selector, selector[0].line, selector[0].col);\n            },\n            \n            //CSS3 Selectors\n            _simple_selector_sequence: function(){\n                /*\n                 * simple_selector_sequence\n                 *   : [ type_selector | universal ]\n                 *     [ HASH | class | attrib | pseudo | negation ]*\n                 *   | [ HASH | class | attrib | pseudo | negation ]+\n                 *   ;\n                 */\n                 \n                var tokenStream = this._tokenStream,\n                \n                    //parts of a simple selector\n                    elementName = null,\n                    modifiers   = [],\n                    \n                    //complete selector text\n                    selectorText= \"\",\n\n                    //the different parts after the element name to search for\n                    components  = [\n                        //HASH\n                        function(){\n                            return tokenStream.match(Tokens.HASH) ?\n                                    new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n                                    null;\n                        },\n                        this._class,\n                        this._attrib,\n                        this._pseudo,\n                        this._negation\n                    ],\n                    i           = 0,\n                    len         = components.length,\n                    component   = null,\n                    found       = false,\n                    line,\n                    col;\n                    \n                    \n                //get starting line and column for the selector\n                line = tokenStream.LT(1).startLine;\n                col = tokenStream.LT(1).startCol;\n                                        \n                elementName = this._type_selector();\n                if (!elementName){\n                    elementName = this._universal();\n                }\n                \n                if (elementName !== null){\n                    selectorText += elementName;\n                }                \n                \n                while(true){\n\n                    //whitespace means we're done\n                    if (tokenStream.peek() === Tokens.S){\n                        break;\n                    }\n                \n                    //check for each component\n                    while(i < len && component === null){\n                        component = components[i++].call(this);\n                    }\n        \n                    if (component === null){\n                    \n                        //we don't have a selector\n                        if (selectorText === \"\"){\n                            return null;\n                        } else {\n                            break;\n                        }\n                    } else {\n                        i = 0;\n                        modifiers.push(component);\n                        selectorText += component.toString(); \n                        component = null;\n                    }\n                }\n\n                 \n                return selectorText !== \"\" ?\n                        new SelectorPart(elementName, modifiers, selectorText, line, col) :\n                        null;\n            },            \n            \n            //CSS3 Selectors\n            _type_selector: function(){\n                /*\n                 * type_selector\n                 *   : [ namespace_prefix ]? element_name\n                 *   ;\n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    ns          = this._namespace_prefix(),\n                    elementName = this._element_name();\n                    \n                if (!elementName){                    \n                    /*\n                     * Need to back out the namespace that was read due to both\n                     * type_selector and universal reading namespace_prefix\n                     * first. Kind of hacky, but only way I can figure out\n                     * right now how to not change the grammar.\n                     */\n                    if (ns){\n                        tokenStream.unget();\n                        if (ns.length > 1){\n                            tokenStream.unget();\n                        }\n                    }\n                \n                    return null;\n                } else {     \n                    if (ns){\n                        elementName.text = ns + elementName.text;\n                        elementName.col -= ns.length;\n                    }\n                    return elementName;\n                }\n            },\n            \n            //CSS3 Selectors\n            _class: function(){\n                /*\n                 * class\n                 *   : '.' IDENT\n                 *   ;\n                 */    \n                 \n                var tokenStream = this._tokenStream,\n                    token;\n                \n                if (tokenStream.match(Tokens.DOT)){\n                    tokenStream.mustMatch(Tokens.IDENT);    \n                    token = tokenStream.token();\n                    return new SelectorSubPart(\".\" + token.value, \"class\", token.startLine, token.startCol - 1);        \n                } else {\n                    return null;\n                }\n        \n            },\n            \n            //CSS3 Selectors\n            _element_name: function(){\n                /*\n                 * element_name\n                 *   : IDENT\n                 *   ;\n                 */    \n                \n                var tokenStream = this._tokenStream,\n                    token;\n                \n                if (tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();\n                    return new SelectorSubPart(token.value, \"elementName\", token.startLine, token.startCol);        \n                \n                } else {\n                    return null;\n                }\n            },\n            \n            //CSS3 Selectors\n            _namespace_prefix: function(){\n                /*            \n                 * namespace_prefix\n                 *   : [ IDENT | '*' ]? '|'\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream,\n                    value       = \"\";\n                    \n                //verify that this is a namespace prefix\n                if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){\n                        \n                    if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){\n                        value += tokenStream.token().value;\n                    }\n                    \n                    tokenStream.mustMatch(Tokens.PIPE);\n                    value += \"|\";\n                    \n                }\n                \n                return value.length ? value : null;                \n            },\n            \n            //CSS3 Selectors\n            _universal: function(){\n                /*\n                 * universal\n                 *   : [ namespace_prefix ]? '*'\n                 *   ;            \n                 */\n                var tokenStream = this._tokenStream,\n                    value       = \"\",\n                    ns;\n                    \n                ns = this._namespace_prefix();\n                if(ns){\n                    value += ns;\n                }\n                \n                if(tokenStream.match(Tokens.STAR)){\n                    value += \"*\";\n                }\n                \n                return value.length ? value : null;\n                \n           },\n            \n            //CSS3 Selectors\n            _attrib: function(){\n                /*\n                 * attrib\n                 *   : '[' S* [ namespace_prefix ]? IDENT S*\n                 *         [ [ PREFIXMATCH |\n                 *             SUFFIXMATCH |\n                 *             SUBSTRINGMATCH |\n                 *             '=' |\n                 *             INCLUDES |\n                 *             DASHMATCH ] S* [ IDENT | STRING ] S*\n                 *         ]? ']'\n                 *   ;    \n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    ns,\n                    token;\n                \n                if (tokenStream.match(Tokens.LBRACKET)){\n                    token = tokenStream.token();\n                    value = token.value;\n                    value += this._readWhitespace();\n                    \n                    ns = this._namespace_prefix();\n                    \n                    if (ns){\n                        value += ns;\n                    }\n                                        \n                    tokenStream.mustMatch(Tokens.IDENT);\n                    value += tokenStream.token().value;                    \n                    value += this._readWhitespace();\n                    \n                    if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH,\n                            Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){\n                    \n                        value += tokenStream.token().value;                    \n                        value += this._readWhitespace();\n                        \n                        tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n                        value += tokenStream.token().value;                    \n                        value += this._readWhitespace();\n                    }\n                    \n                    tokenStream.mustMatch(Tokens.RBRACKET);\n                                        \n                    return new SelectorSubPart(value + \"]\", \"attribute\", token.startLine, token.startCol);\n                } else {\n                    return null;\n                }\n            },\n            \n            //CSS3 Selectors\n            _pseudo: function(){\n            \n                /*\n                 * pseudo\n                 *   : ':' ':'? [ IDENT | functional_pseudo ]\n                 *   ;    \n                 */   \n            \n                var tokenStream = this._tokenStream,\n                    pseudo      = null,\n                    colons      = \":\",\n                    line,\n                    col;\n                \n                if (tokenStream.match(Tokens.COLON)){\n                \n                    if (tokenStream.match(Tokens.COLON)){\n                        colons += \":\";\n                    }\n                \n                    if (tokenStream.match(Tokens.IDENT)){\n                        pseudo = tokenStream.token().value;\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol - colons.length;\n                    } else if (tokenStream.peek() == Tokens.FUNCTION){\n                        line = tokenStream.LT(1).startLine;\n                        col = tokenStream.LT(1).startCol - colons.length;\n                        pseudo = this._functional_pseudo();\n                    }\n                    \n                    if (pseudo){\n                        pseudo = new SelectorSubPart(colons + pseudo, \"pseudo\", line, col);\n                    }\n                }\n        \n                return pseudo;\n            },\n            \n            //CSS3 Selectors\n            _functional_pseudo: function(){\n                /*\n                 * functional_pseudo\n                 *   : FUNCTION S* expression ')'\n                 *   ;\n                */            \n                \n                var tokenStream = this._tokenStream,\n                    value = null;\n                \n                if(tokenStream.match(Tokens.FUNCTION)){\n                    value = tokenStream.token().value;\n                    value += this._readWhitespace();\n                    value += this._expression();\n                    tokenStream.mustMatch(Tokens.RPAREN);\n                    value += \")\";\n                }\n                \n                return value;\n            },\n            \n            //CSS3 Selectors\n            _expression: function(){\n                /*\n                 * expression\n                 *   : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+\n                 *   ;\n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    value       = \"\";\n                    \n                while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION,\n                        Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH,\n                        Tokens.FREQ, Tokens.ANGLE, Tokens.TIME,\n                        Tokens.RESOLUTION])){\n                    \n                    value += tokenStream.token().value;\n                    value += this._readWhitespace();                        \n                }\n                \n                return value.length ? value : null;\n                \n            },\n\n            //CSS3 Selectors\n            _negation: function(){\n                /*            \n                 * negation\n                 *   : NOT S* negation_arg S* ')'\n                 *   ;\n                 */\n\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    value       = \"\",\n                    arg,\n                    subpart     = null;\n                    \n                if (tokenStream.match(Tokens.NOT)){\n                    value = tokenStream.token().value;\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                    value += this._readWhitespace();\n                    arg = this._negation_arg();\n                    value += arg;\n                    value += this._readWhitespace();\n                    tokenStream.match(Tokens.RPAREN);\n                    value += tokenStream.token().value;\n                    \n                    subpart = new SelectorSubPart(value, \"not\", line, col);\n                    subpart.args.push(arg);\n                }\n                \n                return subpart;\n            },\n            \n            //CSS3 Selectors\n            _negation_arg: function(){            \n                /*\n                 * negation_arg\n                 *   : type_selector | universal | HASH | class | attrib | pseudo\n                 *   ;            \n                 */           \n                 \n                var tokenStream = this._tokenStream,\n                    args        = [\n                        this._type_selector,\n                        this._universal,\n                        function(){\n                            return tokenStream.match(Tokens.HASH) ?\n                                    new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n                                    null;                        \n                        },\n                        this._class,\n                        this._attrib,\n                        this._pseudo                    \n                    ],\n                    arg         = null,\n                    i           = 0,\n                    len         = args.length,\n                    elementName,\n                    line,\n                    col,\n                    part;\n                    \n                line = tokenStream.LT(1).startLine;\n                col = tokenStream.LT(1).startCol;\n                \n                while(i < len && arg === null){\n                    \n                    arg = args[i].call(this);\n                    i++;\n                }\n                \n                //must be a negation arg\n                if (arg === null){\n                    this._unexpectedToken(tokenStream.LT(1));\n                }\n \n                //it's an element name\n                if (arg.type == \"elementName\"){\n                    part = new SelectorPart(arg, [], arg.toString(), line, col);\n                } else {\n                    part = new SelectorPart(null, [arg], arg.toString(), line, col);\n                }\n                \n                return part;                \n            },\n            \n            _declaration: function(){\n            \n                /*\n                 * declaration\n                 *   : property ':' S* expr prio?\n                 *   | /( empty )/\n                 *   ;     \n                 */    \n            \n                var tokenStream = this._tokenStream,\n                    property    = null,\n                    expr        = null,\n                    prio        = null,\n                    error       = null,\n                    invalid     = null;\n                \n                property = this._property();\n                if (property !== null){\n\n                    tokenStream.mustMatch(Tokens.COLON);\n                    this._readWhitespace();\n                    \n                    expr = this._expr();\n                    \n                    //if there's no parts for the value, it's an error\n                    if (!expr || expr.length === 0){\n                        this._unexpectedToken(tokenStream.LT(1));\n                    }\n                    \n                    prio = this._prio();\n                    \n                    try {\n                        this._validateProperty(property, expr);\n                    } catch (ex) {\n                        invalid = ex;\n                    }\n                    \n                    this.fire({\n                        type:       \"property\",\n                        property:   property,\n                        value:      expr,\n                        important:  prio,\n                        line:       property.line,\n                        col:        property.col,\n                        invalid:    invalid\n                    });                      \n                    \n                    return true;\n                } else {\n                    return false;\n                }\n            },\n            \n            _prio: function(){\n                /*\n                 * prio\n                 *   : IMPORTANT_SYM S*\n                 *   ;    \n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    result      = tokenStream.match(Tokens.IMPORTANT_SYM);\n                    \n                this._readWhitespace();\n                return result;\n            },\n            \n            _expr: function(){\n                /*\n                 * expr\n                 *   : term [ operator term ]*\n                 *   ;\n                 */\n        \n                var tokenStream = this._tokenStream,\n                    values      = [],\n\t\t\t\t\t//valueParts\t= [],\n                    value       = null,\n                    operator    = null;\n                    \n                value = this._term();\n                if (value !== null){\n                \n                    values.push(value);\n                    \n                    do {\n                        operator = this._operator();\n        \n                        //if there's an operator, keep building up the value parts\n                        if (operator){\n                            values.push(operator);\n                        } /*else {\n                            //if there's not an operator, you have a full value\n\t\t\t\t\t\t\tvalues.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col));\n\t\t\t\t\t\t\tvalueParts = [];\n\t\t\t\t\t\t}*/\n                        \n                        value = this._term();\n                        \n                        if (value === null){\n                            break;\n                        } else {\n                            values.push(value);\n                        }\n                    } while(true);\n                }\n\t\t\t\t\n\t\t\t\t//cleanup\n                /*if (valueParts.length){\n                    values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col));\n                }*/\n        \n                return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null;\n            },\n            \n            _term: function(){                       \n            \n                /*\n                 * term\n                 *   : unary_operator?\n                 *     [ NUMBER S* | PERCENTAGE S* | LENGTH S* | ANGLE S* |\n                 *       TIME S* | FREQ S* | function | ie_function ]\n                 *   | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor\n                 *   ;\n                 */    \n        \n                var tokenStream = this._tokenStream,\n                    unary       = null,\n                    value       = null,\n                    token,\n                    line,\n                    col;\n                    \n                //returns the operator or null\n                unary = this._unary_operator();\n                if (unary !== null){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                }                \n               \n                //exception for IE filters\n                if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){\n                \n                    value = this._ie_function();\n                    if (unary === null){\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol;\n                    }\n                \n                //see if there's a simple match\n                } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH,\n                        Tokens.ANGLE, Tokens.TIME,\n                        Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){\n                 \n                    value = tokenStream.token().value;\n                    if (unary === null){\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol;\n                    }\n                    this._readWhitespace();\n                } else {\n                \n                    //see if it's a color\n                    token = this._hexcolor();\n                    if (token === null){\n                    \n                        //if there's no unary, get the start of the next token for line/col info\n                        if (unary === null){\n                            line = tokenStream.LT(1).startLine;\n                            col = tokenStream.LT(1).startCol;\n                        }                    \n                    \n                        //has to be a function\n                        if (value === null){\n                            \n                            /*\n                             * This checks for alpha(opacity=0) style of IE\n                             * functions. IE_FUNCTION only presents progid: style.\n                             */\n                            if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){\n                                value = this._ie_function();\n                            } else {\n                                value = this._function();\n                            }\n                        }\n\n                        /*if (value === null){\n                            return null;\n                            //throw new Error(\"Expected identifier at line \" + tokenStream.token().startLine + \", character \" +  tokenStream.token().startCol + \".\");\n                        }*/\n                    \n                    } else {\n                        value = token.value;\n                        if (unary === null){\n                            line = token.startLine;\n                            col = token.startCol;\n                        }                    \n                    }\n                \n                }                \n                \n                return value !== null ?\n                        new PropertyValuePart(unary !== null ? unary + value : value, line, col) :\n                        null;\n        \n            },\n            \n            _function: function(){\n            \n                /*\n                 * function\n                 *   : FUNCTION S* expr ')' S*\n                 *   ;\n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    functionText = null,\n                    expr        = null,\n                    lt;\n                    \n                if (tokenStream.match(Tokens.FUNCTION)){\n                    functionText = tokenStream.token().value;\n                    this._readWhitespace();\n                    expr = this._expr();\n                    functionText += expr;\n                    \n                    //START: Horrible hack in case it's an IE filter\n                    if (this.options.ieFilters && tokenStream.peek() == Tokens.EQUALS){\n                        do {\n                        \n                            if (this._readWhitespace()){\n                                functionText += tokenStream.token().value;\n                            }\n                            \n                            //might be second time in the loop\n                            if (tokenStream.LA(0) == Tokens.COMMA){\n                                functionText += tokenStream.token().value;\n                            }\n                        \n                            tokenStream.match(Tokens.IDENT);\n                            functionText += tokenStream.token().value;\n                            \n                            tokenStream.match(Tokens.EQUALS);\n                            functionText += tokenStream.token().value;\n                            \n                            //functionText += this._term();\n                            lt = tokenStream.peek();\n                            while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){\n                                tokenStream.get();\n                                functionText += tokenStream.token().value;\n                                lt = tokenStream.peek();\n                            }\n                        } while(tokenStream.match([Tokens.COMMA, Tokens.S]));\n                    }\n\n                    //END: Horrible Hack\n                    \n                    tokenStream.match(Tokens.RPAREN);    \n                    functionText += \")\";\n                    this._readWhitespace();\n                }                \n                \n                return functionText;\n            }, \n            \n            _ie_function: function(){\n            \n                /* (My own extension)\n                 * ie_function\n                 *   : IE_FUNCTION S* IDENT '=' term [S* ','? IDENT '=' term]+ ')' S*\n                 *   ;\n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    functionText = null,\n                    expr        = null,\n                    lt;\n                    \n                //IE function can begin like a regular function, too\n                if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){\n                    functionText = tokenStream.token().value;\n                    \n                    do {\n                    \n                        if (this._readWhitespace()){\n                            functionText += tokenStream.token().value;\n                        }\n                        \n                        //might be second time in the loop\n                        if (tokenStream.LA(0) == Tokens.COMMA){\n                            functionText += tokenStream.token().value;\n                        }\n                    \n                        tokenStream.match(Tokens.IDENT);\n                        functionText += tokenStream.token().value;\n                        \n                        tokenStream.match(Tokens.EQUALS);\n                        functionText += tokenStream.token().value;\n                        \n                        //functionText += this._term();\n                        lt = tokenStream.peek();\n                        while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){\n                            tokenStream.get();\n                            functionText += tokenStream.token().value;\n                            lt = tokenStream.peek();\n                        }\n                    } while(tokenStream.match([Tokens.COMMA, Tokens.S]));                    \n                    \n                    tokenStream.match(Tokens.RPAREN);    \n                    functionText += \")\";\n                    this._readWhitespace();\n                }                \n                \n                return functionText;\n            }, \n            \n            _hexcolor: function(){\n                /*\n                 * There is a constraint on the color that it must\n                 * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F])\n                 * after the \"#\"; e.g., \"#000\" is OK, but \"#abcd\" is not.\n                 *\n                 * hexcolor\n                 *   : HASH S*\n                 *   ;\n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    token = null,\n                    color;\n                    \n                if(tokenStream.match(Tokens.HASH)){\n                \n                    //need to do some validation here\n                    \n                    token = tokenStream.token();\n                    color = token.value;\n                    if (!/#[a-f0-9]{3,6}/i.test(color)){\n                        throw new SyntaxError(\"Expected a hex color but found '\" + color + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n                    }\n                    this._readWhitespace();\n                }\n                \n                return token;\n            },\n            \n            //-----------------------------------------------------------------\n            // Animations methods\n            //-----------------------------------------------------------------\n            \n            _keyframes: function(){\n            \n                /*\n                 * keyframes:\n                 *   : KEYFRAMES_SYM S* keyframe_name S* '{' S* keyframe_rule* '}' {\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream,\n                    token,\n                    tt,\n                    name;            \n                    \n                tokenStream.mustMatch(Tokens.KEYFRAMES_SYM);\n                this._readWhitespace();\n                name = this._keyframe_name();\n                \n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.LBRACE);\n                    \n                this.fire({\n                    type:   \"startkeyframes\",\n                    name:   name,\n                    line:   name.line,\n                    col:    name.col\n                });                \n                \n                this._readWhitespace();\n                tt = tokenStream.peek();\n                \n                //check for key\n                while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) {\n                    this._keyframe_rule();\n                    this._readWhitespace();\n                    tt = tokenStream.peek();\n                }           \n                \n                this.fire({\n                    type:   \"endkeyframes\",\n                    name:   name,\n                    line:   name.line,\n                    col:    name.col\n                });                      \n                    \n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.RBRACE);                    \n                \n            },\n            \n            _keyframe_name: function(){\n            \n                /*\n                 * keyframe_name:\n                 *   : IDENT\n                 *   | STRING\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream,\n                    token;\n\n                tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n                return SyntaxUnit.fromToken(tokenStream.token());            \n            },\n            \n            _keyframe_rule: function(){\n            \n                /*\n                 * keyframe_rule:\n                 *   : key_list S* \n                 *     '{' S* declaration [ ';' S* declaration ]* '}' S*\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream,\n                    token,\n                    keyList = this._key_list();\n                                    \n                this.fire({\n                    type:   \"startkeyframerule\",\n                    keys:   keyList,\n                    line:   keyList[0].line,\n                    col:    keyList[0].col\n                });                \n                \n                this._readDeclarations(true);                \n                \n                this.fire({\n                    type:   \"endkeyframerule\",\n                    keys:   keyList,\n                    line:   keyList[0].line,\n                    col:    keyList[0].col\n                });  \n                \n            },\n            \n            _key_list: function(){\n            \n                /*\n                 * key_list:\n                 *   : key [ S* ',' S* key]*\n                 *   ;\n                 */\n                var tokenStream = this._tokenStream,\n                    token,\n                    key,\n                    keyList = [];\n                    \n                //must be least one key\n                keyList.push(this._key());\n                    \n                this._readWhitespace();\n                    \n                while(tokenStream.match(Tokens.COMMA)){\n                    this._readWhitespace();\n                    keyList.push(this._key());\n                    this._readWhitespace();\n                }\n\n                return keyList;\n            },\n                        \n            _key: function(){\n                /*\n                 * There is a restriction that IDENT can be only \"from\" or \"to\".\n                 *\n                 * key\n                 *   : PERCENTAGE\n                 *   | IDENT\n                 *   ;\n                 */\n                 \n                var tokenStream = this._tokenStream,\n                    token;\n                    \n                if (tokenStream.match(Tokens.PERCENTAGE)){\n                    return SyntaxUnit.fromToken(tokenStream.token());\n                } else if (tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();                    \n                    \n                    if (/from|to/i.test(token.value)){\n                        return SyntaxUnit.fromToken(token);\n                    }\n                    \n                    tokenStream.unget();\n                }\n                \n                //if it gets here, there wasn't a valid token, so time to explode\n                this._unexpectedToken(tokenStream.LT(1));\n            },\n            \n            //-----------------------------------------------------------------\n            // Helper methods\n            //-----------------------------------------------------------------\n            \n            /**\n             * Not part of CSS grammar, but useful for skipping over\n             * combination of white space and HTML-style comments.\n             * @return {void}\n             * @method _skipCruft\n             * @private\n             */\n            _skipCruft: function(){\n                while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){\n                    //noop\n                }\n            },\n\n            /**\n             * Not part of CSS grammar, but this pattern occurs frequently\n             * in the official CSS grammar. Split out here to eliminate\n             * duplicate code.\n             * @param {Boolean} checkStart Indicates if the rule should check\n             *      for the left brace at the beginning.\n             * @param {Boolean} readMargins Indicates if the rule should check\n             *      for margin patterns.\n             * @return {void}\n             * @method _readDeclarations\n             * @private\n             */\n            _readDeclarations: function(checkStart, readMargins){\n                /*\n                 * Reads the pattern\n                 * S* '{' S* declaration [ ';' S* declaration ]* '}' S*\n                 * or\n                 * S* '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S*\n                 * Note that this is how it is described in CSS3 Paged Media, but is actually incorrect.\n                 * A semicolon is only necessary following a delcaration is there's another declaration\n                 * or margin afterwards. \n                 */\n                var tokenStream = this._tokenStream,\n                    tt;\n                       \n\n                this._readWhitespace();\n                \n                if (checkStart){\n                    tokenStream.mustMatch(Tokens.LBRACE);            \n                }\n                \n                this._readWhitespace();\n\n                try {\n                    \n                    while(true){\n                    \n                        if (tokenStream.match(Tokens.SEMICOLON) || (readMargins && this._margin())){\n                            //noop\n                        } else if (this._declaration()){\n                            if (!tokenStream.match(Tokens.SEMICOLON)){\n                                break;\n                            }\n                        } else {\n                            break;\n                        }\n                    \n                        //if ((!this._margin() && !this._declaration()) || !tokenStream.match(Tokens.SEMICOLON)){\n                        //    break;\n                        //}\n                        this._readWhitespace();\n                    }\n                    \n                    tokenStream.mustMatch(Tokens.RBRACE);\n                    this._readWhitespace();\n                    \n                } catch (ex) {\n                    if (ex instanceof SyntaxError && !this.options.strict){\n                    \n                        //fire error event\n                        this.fire({\n                            type:       \"error\",\n                            error:      ex,\n                            message:    ex.message,\n                            line:       ex.line,\n                            col:        ex.col\n                        });                          \n                        \n                        //see if there's another declaration\n                        tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]);\n                        if (tt == Tokens.SEMICOLON){\n                            //if there's a semicolon, then there might be another declaration\n                            this._readDeclarations(false, readMargins);                            \n                        } else if (tt != Tokens.RBRACE){\n                            //if there's a right brace, the rule is finished so don't do anything\n                            //otherwise, rethrow the error because it wasn't handled properly\n                            throw ex;\n                        }                        \n                        \n                    } else {\n                        //not a syntax error, rethrow it\n                        throw ex;\n                    }\n                }    \n            \n            },      \n            \n            /**\n             * In some cases, you can end up with two white space tokens in a\n             * row. Instead of making a change in every function that looks for\n             * white space, this function is used to match as much white space\n             * as necessary.\n             * @method _readWhitespace\n             * @return {String} The white space if found, empty string if not.\n             * @private\n             */\n            _readWhitespace: function(){\n            \n                var tokenStream = this._tokenStream,\n                    ws = \"\";\n                    \n                while(tokenStream.match(Tokens.S)){\n                    ws += tokenStream.token().value;\n                }\n                \n                return ws;\n            },\n          \n\n            /**\n             * Throws an error when an unexpected token is found.\n             * @param {Object} token The token that was found.\n             * @method _unexpectedToken\n             * @return {void}\n             * @private\n             */\n            _unexpectedToken: function(token){\n                throw new SyntaxError(\"Unexpected token '\" + token.value + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n            },\n            \n            /**\n             * Helper method used for parsing subparts of a style sheet.\n             * @return {void}\n             * @method _verifyEnd\n             * @private\n             */\n            _verifyEnd: function(){\n                if (this._tokenStream.LA(1) != Tokens.EOF){\n                    this._unexpectedToken(this._tokenStream.LT(1));\n                }            \n            },\n            \n            //-----------------------------------------------------------------\n            // Validation methods\n            //-----------------------------------------------------------------\n            _validateProperty: function(property, value){\n                Validation.validate(property, value);\n            },\n            \n            //-----------------------------------------------------------------\n            // Parsing methods\n            //-----------------------------------------------------------------\n            \n            parse: function(input){    \n                this._tokenStream = new TokenStream(input, Tokens);\n                this._stylesheet();\n            },\n            \n            parseStyleSheet: function(input){\n                //just passthrough\n                return this.parse(input);\n            },\n            \n            parseMediaQuery: function(input){\n                this._tokenStream = new TokenStream(input, Tokens);\n                var result = this._media_query();\n                \n                //if there's anything more, then it's an invalid selector\n                this._verifyEnd();\n                \n                //otherwise return result\n                return result;            \n            },\n            \n            /**\n             * Parses a property value (everything after the semicolon).\n             * @return {parserlib.css.PropertyValue} The property value.\n             * @throws parserlib.util.SyntaxError If an unexpected token is found.\n             * @method parserPropertyValue\n             */             \n            parsePropertyValue: function(input){\n            \n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readWhitespace();\n                \n                var result = this._expr();\n                \n                //okay to have a trailing white space\n                this._readWhitespace();\n                \n                //if there's anything more, then it's an invalid selector\n                this._verifyEnd();\n                \n                //otherwise return result\n                return result;\n            },\n            \n            /**\n             * Parses a complete CSS rule, including selectors and\n             * properties.\n             * @param {String} input The text to parser.\n             * @return {Boolean} True if the parse completed successfully, false if not.\n             * @method parseRule\n             */\n            parseRule: function(input){\n                this._tokenStream = new TokenStream(input, Tokens);\n                \n                //skip any leading white space\n                this._readWhitespace();\n                \n                var result = this._ruleset();\n                \n                //skip any trailing white space\n                this._readWhitespace();\n\n                //if there's anything more, then it's an invalid selector\n                this._verifyEnd();\n                \n                //otherwise return result\n                return result;            \n            },\n            \n            /**\n             * Parses a single CSS selector (no comma)\n             * @param {String} input The text to parse as a CSS selector.\n             * @return {Selector} An object representing the selector.\n             * @throws parserlib.util.SyntaxError If an unexpected token is found.\n             * @method parseSelector\n             */\n            parseSelector: function(input){\n            \n                this._tokenStream = new TokenStream(input, Tokens);\n                \n                //skip any leading white space\n                this._readWhitespace();\n                \n                var result = this._selector();\n                \n                //skip any trailing white space\n                this._readWhitespace();\n\n                //if there's anything more, then it's an invalid selector\n                this._verifyEnd();\n                \n                //otherwise return result\n                return result;\n            },\n\n            /**\n             * Parses an HTML style attribute: a set of CSS declarations \n             * separated by semicolons.\n             * @param {String} input The text to parse as a style attribute\n             * @return {void} \n             * @method parseStyleAttribute\n             */\n            parseStyleAttribute: function(input){\n                input += \"}\"; // for error recovery in _readDeclarations()\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readDeclarations();\n            }\n        };\n        \n    //copy over onto prototype\n    for (prop in additions){\n        if (additions.hasOwnProperty(prop)){\n            proto[prop] = additions[prop];\n        }\n    }   \n    \n    return proto;\n}();\n/*global Validation, ValidationTypes, ValidationError*/\nvar Properties = {\n\n    //A\n    \"alignment-adjust\"              : \"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | <percentage> | <length>\",\n    \"alignment-baseline\"            : \"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"animation\"                     : 1,\n    \"animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \"animation-timing-function\"     : 1,\n    \n    //vendor prefixed\n    \"-moz-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-moz-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-moz-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-moz-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-moz-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-moz-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \n    \"-ms-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-ms-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-ms-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-ms-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-ms-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-ms-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \n    \"-webkit-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-webkit-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-webkit-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-webkit-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-webkit-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-webkit-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \n    \"-o-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-o-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-o-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-o-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-o-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-o-animation-play-state\"          : { multi: \"running | paused\", comma: true },        \n    \n    \"appearance\"                    : \"icon | window | desktop | workspace | document | tooltip | dialog | button | push-button | hyperlink | radio-button | checkbox | menu-item | tab | menu | menubar | pull-down-menu | pop-up-menu | list-menu | radio-group | checkbox-group | outline-tree | range | field | combo-box | signature | password | normal | inherit\",\n    \"azimuth\"                       : function (expression) {\n        var simple      = \"<angle> | leftwards | rightwards | inherit\",\n            direction   = \"left-side | far-left | left | center-left | center | center-right | right | far-right | right-side\",\n            behind      = false,\n            valid       = false,\n            part;\n        \n        if (!ValidationTypes.isAny(expression, simple)) {\n            if (ValidationTypes.isAny(expression, \"behind\")) {\n                behind = true;\n                valid = true;\n            }\n            \n            if (ValidationTypes.isAny(expression, direction)) {\n                valid = true;\n                if (!behind) {\n                    ValidationTypes.isAny(expression, \"behind\");\n                }\n            }\n        }\n        \n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (<'azimuth'>) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }        \n    },\n    \n    //B\n    \"backface-visibility\"           : \"visible | hidden\",\n    \"background\"                    : 1,\n    \"background-attachment\"         : { multi: \"<attachment>\", comma: true },\n    \"background-clip\"               : { multi: \"<box>\", comma: true },\n    \"background-color\"              : \"<color> | inherit\",\n    \"background-image\"              : { multi: \"<bg-image>\", comma: true },\n    \"background-origin\"             : { multi: \"<box>\", comma: true },\n    \"background-position\"           : { multi: \"<bg-position>\", comma: true },\n    \"background-repeat\"             : { multi: \"<repeat-style>\" },\n    \"background-size\"               : { multi: \"<bg-size>\", comma: true },\n    \"baseline-shift\"                : \"baseline | sub | super | <percentage> | <length>\",\n    \"binding\"                       : 1,\n    \"bleed\"                         : \"<length>\",\n    \"bookmark-label\"                : \"<content> | <attr> | <string>\",\n    \"bookmark-level\"                : \"none | <integer>\",\n    \"bookmark-state\"                : \"open | closed\",\n    \"bookmark-target\"               : \"none | <uri> | <attr>\",\n    \"border\"                        : \"<border-width> || <border-style> || <color>\",\n    \"border-bottom\"                 : \"<border-width> || <border-style> || <color>\",\n    \"border-bottom-color\"           : \"<color>\",\n    \"border-bottom-left-radius\"     :  \"<x-one-radius>\",\n    \"border-bottom-right-radius\"    :  \"<x-one-radius>\",\n    \"border-bottom-style\"           : \"<border-style>\",\n    \"border-bottom-width\"           : \"<border-width>\",\n    \"border-collapse\"               : \"collapse | separate | inherit\",\n    \"border-color\"                  : { multi: \"<color> | inherit\", max: 4 },\n    \"border-image\"                  : 1,\n    \"border-image-outset\"           : { multi: \"<length> | <number>\", max: 4 },\n    \"border-image-repeat\"           : { multi: \"stretch | repeat | round\", max: 2 },\n    \"border-image-slice\"            : function(expression) {\n        \n        var valid   = false,\n            numeric = \"<number> | <percentage>\",\n            fill    = false,\n            count   = 0,\n            max     = 4,\n            part;\n        \n        if (ValidationTypes.isAny(expression, \"fill\")) {\n            fill = true;\n            valid = true;\n        }\n        \n        while (expression.hasNext() && count < max) {\n            valid = ValidationTypes.isAny(expression, numeric);\n            if (!valid) {\n                break;\n            }\n            count++;\n        }\n        \n        \n        if (!fill) {\n            ValidationTypes.isAny(expression, \"fill\");\n        } else {\n            valid = true;\n        }\n        \n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected ([<number> | <percentage>]{1,4} && fill?) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }         \n    },\n    \"border-image-source\"           : \"<image> | none\",\n    \"border-image-width\"            : { multi: \"<length> | <percentage> | <number> | auto\", max: 4 },\n    \"border-left\"                   : \"<border-width> || <border-style> || <color>\",\n    \"border-left-color\"             : \"<color> | inherit\",\n    \"border-left-style\"             : \"<border-style>\",\n    \"border-left-width\"             : \"<border-width>\",\n    \"border-radius\"                 : function(expression) {\n        \n        var valid   = false,\n            numeric = \"<length> | <percentage>\",\n            slash   = false,\n            fill    = false,\n            count   = 0,\n            max     = 8,\n            part;\n\n        while (expression.hasNext() && count < max) {\n            valid = ValidationTypes.isAny(expression, numeric);\n            if (!valid) {\n            \n                if (expression.peek() == \"/\" && count > 1 && !slash) {\n                    slash = true;\n                    max = count + 5;\n                    expression.next();\n                } else {\n                    break;\n                }\n            }\n            count++;\n        }\n        \n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (<'border-radius'>) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }         \n    },\n    \"border-right\"                  : \"<border-width> || <border-style> || <color>\",\n    \"border-right-color\"            : \"<color> | inherit\",\n    \"border-right-style\"            : \"<border-style>\",\n    \"border-right-width\"            : \"<border-width>\",\n    \"border-spacing\"                : { multi: \"<length> | inherit\", max: 2 },\n    \"border-style\"                  : { multi: \"<border-style>\", max: 4 },\n    \"border-top\"                    : \"<border-width> || <border-style> || <color>\",\n    \"border-top-color\"              : \"<color> | inherit\",\n    \"border-top-left-radius\"        : \"<x-one-radius>\",\n    \"border-top-right-radius\"       : \"<x-one-radius>\",\n    \"border-top-style\"              : \"<border-style>\",\n    \"border-top-width\"              : \"<border-width>\",\n    \"border-width\"                  : { multi: \"<border-width>\", max: 4 },\n    \"bottom\"                        : \"<margin-width> | inherit\", \n    \"box-align\"                     : \"start | end | center | baseline | stretch\",        //http://www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n    \"box-decoration-break\"          : \"slice |clone\",\n    \"box-direction\"                 : \"normal | reverse | inherit\",\n    \"box-flex\"                      : \"<number>\",\n    \"box-flex-group\"                : \"<integer>\",\n    \"box-lines\"                     : \"single | multiple\",\n    \"box-ordinal-group\"             : \"<integer>\",\n    \"box-orient\"                    : \"horizontal | vertical | inline-axis | block-axis | inherit\",\n    \"box-pack\"                      : \"start | end | center | justify\",\n    \"box-shadow\"                    : function (expression) {\n        var result      = false,\n            part;\n\n        if (!ValidationTypes.isAny(expression, \"none\")) {\n            Validation.multiProperty(\"<shadow>\", expression, true, Infinity);                       \n        } else {\n            if (expression.hasNext()) {\n                part = expression.next();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            }   \n        }\n    },\n    \"box-sizing\"                    : \"content-box | border-box | inherit\",\n    \"break-after\"                   : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n    \"break-before\"                  : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n    \"break-inside\"                  : \"auto | avoid | avoid-page | avoid-column\",\n    \n    //C\n    \"caption-side\"                  : \"top | bottom | inherit\",\n    \"clear\"                         : \"none | right | left | both | inherit\",\n    \"clip\"                          : 1,\n    \"color\"                         : \"<color> | inherit\",\n    \"color-profile\"                 : 1,\n    \"column-count\"                  : \"<integer> | auto\",                      //http://www.w3.org/TR/css3-multicol/\n    \"column-fill\"                   : \"auto | balance\",\n    \"column-gap\"                    : \"<length> | normal\",\n    \"column-rule\"                   : \"<border-width> || <border-style> || <color>\",\n    \"column-rule-color\"             : \"<color>\",\n    \"column-rule-style\"             : \"<border-style>\",\n    \"column-rule-width\"             : \"<border-width>\",\n    \"column-span\"                   : \"none | all\",\n    \"column-width\"                  : \"<length> | auto\",\n    \"columns\"                       : 1,\n    \"content\"                       : 1,\n    \"counter-increment\"             : 1,\n    \"counter-reset\"                 : 1,\n    \"crop\"                          : \"<shape> | auto\",\n    \"cue\"                           : \"cue-after | cue-before | inherit\",\n    \"cue-after\"                     : 1,\n    \"cue-before\"                    : 1,\n    \"cursor\"                        : 1,\n    \n    //D\n    \"direction\"                     : \"ltr | rtl | inherit\",\n    \"display\"                       : \"inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | box | inline-box | grid | inline-grid | none | inherit\",\n    \"dominant-baseline\"             : 1,\n    \"drop-initial-after-adjust\"     : \"central | middle | after-edge | text-after-edge | ideographic | alphabetic | mathematical | <percentage> | <length>\",\n    \"drop-initial-after-align\"      : \"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"drop-initial-before-adjust\"    : \"before-edge | text-before-edge | central | middle | hanging | mathematical | <percentage> | <length>\",\n    \"drop-initial-before-align\"     : \"caps-height | baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"drop-initial-size\"             : \"auto | line | <length> | <percentage>\",\n    \"drop-initial-value\"            : \"initial | <integer>\",\n    \n    //E\n    \"elevation\"                     : \"<angle> | below | level | above | higher | lower | inherit\",\n    \"empty-cells\"                   : \"show | hide | inherit\",\n    \n    //F\n    \"filter\"                        : 1,\n    \"fit\"                           : \"fill | hidden | meet | slice\",\n    \"fit-position\"                  : 1,\n    \"float\"                         : \"left | right | none | inherit\",    \n    \"float-offset\"                  : 1,\n    \"font\"                          : 1,\n    \"font-family\"                   : 1,\n    \"font-size\"                     : \"<absolute-size> | <relative-size> | <length> | <percentage> | inherit\",\n    \"font-size-adjust\"              : \"<number> | none | inherit\",\n    \"font-stretch\"                  : \"normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | inherit\",\n    \"font-style\"                    : \"normal | italic | oblique | inherit\",\n    \"font-variant\"                  : \"normal | small-caps | inherit\",\n    \"font-weight\"                   : \"normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit\",\n    \n    //G\n    \"grid-cell-stacking\"            : \"columns | rows | layer\",\n    \"grid-column\"                   : 1,\n    \"grid-columns\"                  : 1,\n    \"grid-column-align\"             : \"start | end | center | stretch\",\n    \"grid-column-sizing\"            : 1,\n    \"grid-column-span\"              : \"<integer>\",\n    \"grid-flow\"                     : \"none | rows | columns\",\n    \"grid-layer\"                    : \"<integer>\",\n    \"grid-row\"                      : 1,\n    \"grid-rows\"                     : 1,\n    \"grid-row-align\"                : \"start | end | center | stretch\",\n    \"grid-row-span\"                 : \"<integer>\",\n    \"grid-row-sizing\"               : 1,\n    \n    //H\n    \"hanging-punctuation\"           : 1,\n    \"height\"                        : \"<margin-width> | inherit\",\n    \"hyphenate-after\"               : \"<integer> | auto\",\n    \"hyphenate-before\"              : \"<integer> | auto\",\n    \"hyphenate-character\"           : \"<string> | auto\",\n    \"hyphenate-lines\"               : \"no-limit | <integer>\",\n    \"hyphenate-resource\"            : 1,\n    \"hyphens\"                       : \"none | manual | auto\",\n    \n    //I\n    \"icon\"                          : 1,\n    \"image-orientation\"             : \"angle | auto\",\n    \"image-rendering\"               : 1,\n    \"image-resolution\"              : 1,\n    \"inline-box-align\"              : \"initial | last | <integer>\",\n    \n    //L\n    \"left\"                          : \"<margin-width> | inherit\",\n    \"letter-spacing\"                : \"<length> | normal | inherit\",\n    \"line-height\"                   : \"<number> | <length> | <percentage> | normal | inherit\",\n    \"line-break\"                    : \"auto | loose | normal | strict\",\n    \"line-stacking\"                 : 1,\n    \"line-stacking-ruby\"            : \"exclude-ruby | include-ruby\",\n    \"line-stacking-shift\"           : \"consider-shifts | disregard-shifts\",\n    \"line-stacking-strategy\"        : \"inline-line-height | block-line-height | max-height | grid-height\",\n    \"list-style\"                    : 1,\n    \"list-style-image\"              : \"<uri> | none | inherit\",\n    \"list-style-position\"           : \"inside | outside | inherit\",\n    \"list-style-type\"               : \"disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit\",\n    \n    //M\n    \"margin\"                        : { multi: \"<margin-width> | inherit\", max: 4 },\n    \"margin-bottom\"                 : \"<margin-width> | inherit\",\n    \"margin-left\"                   : \"<margin-width> | inherit\",\n    \"margin-right\"                  : \"<margin-width> | inherit\",\n    \"margin-top\"                    : \"<margin-width> | inherit\",\n    \"mark\"                          : 1,\n    \"mark-after\"                    : 1,\n    \"mark-before\"                   : 1,\n    \"marks\"                         : 1,\n    \"marquee-direction\"             : 1,\n    \"marquee-play-count\"            : 1,\n    \"marquee-speed\"                 : 1,\n    \"marquee-style\"                 : 1,\n    \"max-height\"                    : \"<length> | <percentage> | none | inherit\",\n    \"max-width\"                     : \"<length> | <percentage> | none | inherit\",\n    \"min-height\"                    : \"<length> | <percentage> | inherit\",\n    \"min-width\"                     : \"<length> | <percentage> | inherit\",\n    \"move-to\"                       : 1,\n    \n    //N\n    \"nav-down\"                      : 1,\n    \"nav-index\"                     : 1,\n    \"nav-left\"                      : 1,\n    \"nav-right\"                     : 1,\n    \"nav-up\"                        : 1,\n    \n    //O\n    \"opacity\"                       : \"<number> | inherit\",\n    \"orphans\"                       : \"<integer> | inherit\",\n    \"outline\"                       : 1,\n    \"outline-color\"                 : \"<color> | invert | inherit\",\n    \"outline-offset\"                : 1,\n    \"outline-style\"                 : \"<border-style> | inherit\",\n    \"outline-width\"                 : \"<border-width> | inherit\",\n    \"overflow\"                      : \"visible | hidden | scroll | auto | inherit\",\n    \"overflow-style\"                : 1,\n    \"overflow-x\"                    : 1,\n    \"overflow-y\"                    : 1,\n    \n    //P\n    \"padding\"                       : { multi: \"<padding-width> | inherit\", max: 4 },\n    \"padding-bottom\"                : \"<padding-width> | inherit\",\n    \"padding-left\"                  : \"<padding-width> | inherit\",\n    \"padding-right\"                 : \"<padding-width> | inherit\",\n    \"padding-top\"                   : \"<padding-width> | inherit\",\n    \"page\"                          : 1,\n    \"page-break-after\"              : \"auto | always | avoid | left | right | inherit\",\n    \"page-break-before\"             : \"auto | always | avoid | left | right | inherit\",\n    \"page-break-inside\"             : \"auto | avoid | inherit\",\n    \"page-policy\"                   : 1,\n    \"pause\"                         : 1,\n    \"pause-after\"                   : 1,\n    \"pause-before\"                  : 1,\n    \"perspective\"                   : 1,\n    \"perspective-origin\"            : 1,\n    \"phonemes\"                      : 1,\n    \"pitch\"                         : 1,\n    \"pitch-range\"                   : 1,\n    \"play-during\"                   : 1,\n    \"position\"                      : \"static | relative | absolute | fixed | inherit\",\n    \"presentation-level\"            : 1,\n    \"punctuation-trim\"              : 1,\n    \n    //Q\n    \"quotes\"                        : 1,\n    \n    //R\n    \"rendering-intent\"              : 1,\n    \"resize\"                        : 1,\n    \"rest\"                          : 1,\n    \"rest-after\"                    : 1,\n    \"rest-before\"                   : 1,\n    \"richness\"                      : 1,\n    \"right\"                         : \"<margin-width> | inherit\",\n    \"rotation\"                      : 1,\n    \"rotation-point\"                : 1,\n    \"ruby-align\"                    : 1,\n    \"ruby-overhang\"                 : 1,\n    \"ruby-position\"                 : 1,\n    \"ruby-span\"                     : 1,\n    \n    //S\n    \"size\"                          : 1,\n    \"speak\"                         : \"normal | none | spell-out | inherit\",\n    \"speak-header\"                  : \"once | always | inherit\",\n    \"speak-numeral\"                 : \"digits | continuous | inherit\",\n    \"speak-punctuation\"             : \"code | none | inherit\",\n    \"speech-rate\"                   : 1,\n    \"src\"                           : 1,\n    \"stress\"                        : 1,\n    \"string-set\"                    : 1,\n    \n    \"table-layout\"                  : \"auto | fixed | inherit\",\n    \"tab-size\"                      : \"<integer> | <length>\",\n    \"target\"                        : 1,\n    \"target-name\"                   : 1,\n    \"target-new\"                    : 1,\n    \"target-position\"               : 1,\n    \"text-align\"                    : \"left | right | center | justify | inherit\" ,\n    \"text-align-last\"               : 1,\n    \"text-decoration\"               : 1,\n    \"text-emphasis\"                 : 1,\n    \"text-height\"                   : 1,\n    \"text-indent\"                   : \"<length> | <percentage> | inherit\",\n    \"text-justify\"                  : \"auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida\",\n    \"text-outline\"                  : 1,\n    \"text-overflow\"                 : 1,\n    \"text-shadow\"                   : 1,\n    \"text-transform\"                : \"capitalize | uppercase | lowercase | none | inherit\",\n    \"text-wrap\"                     : \"normal | none | avoid\",\n    \"top\"                           : \"<margin-width> | inherit\",\n    \"transform\"                     : 1,\n    \"transform-origin\"              : 1,\n    \"transform-style\"               : 1,\n    \"transition\"                    : 1,\n    \"transition-delay\"              : 1,\n    \"transition-duration\"           : 1,\n    \"transition-property\"           : 1,\n    \"transition-timing-function\"    : 1,\n    \n    //U\n    \"unicode-bidi\"                  : \"normal | embed | bidi-override | inherit\",\n    \"user-modify\"                   : \"read-only | read-write | write-only | inherit\",\n    \"user-select\"                   : \"none | text | toggle | element | elements | all | inherit\",\n    \n    //V\n    \"vertical-align\"                : \"<percentage> | <length> | baseline | sub | super | top | text-top | middle | bottom | text-bottom | inherit\",\n    \"visibility\"                    : \"visible | hidden | collapse | inherit\",\n    \"voice-balance\"                 : 1,\n    \"voice-duration\"                : 1,\n    \"voice-family\"                  : 1,\n    \"voice-pitch\"                   : 1,\n    \"voice-pitch-range\"             : 1,\n    \"voice-rate\"                    : 1,\n    \"voice-stress\"                  : 1,\n    \"voice-volume\"                  : 1,\n    \"volume\"                        : 1,\n    \n    //W\n    \"white-space\"                   : \"normal | pre | nowrap | pre-wrap | pre-line | inherit\",\n    \"white-space-collapse\"          : 1,\n    \"widows\"                        : \"<integer> | inherit\",\n    \"width\"                         : \"<length> | <percentage> | auto | inherit\" ,\n    \"word-break\"                    : \"normal | keep-all | break-all\",\n    \"word-spacing\"                  : \"<length> | normal | inherit\",\n    \"word-wrap\"                     : 1,\n    \n    //Z\n    \"z-index\"                       : \"<integer> | auto | inherit\",\n    \"zoom\"                          : \"<number> | <percentage> | normal\"\n};\n/**\n * Represents a selector combinator (whitespace, +, >).\n * @namespace parserlib.css\n * @class PropertyName\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n * @param {String} text The text representation of the unit. \n * @param {String} hack The type of IE hack applied (\"*\", \"_\", or null).\n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n */\nfunction PropertyName(text, hack, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_NAME_TYPE);\n    this.hack = hack;\n\n}\n\nPropertyName.prototype = new SyntaxUnit();\nPropertyName.prototype.constructor = PropertyName;\nPropertyName.prototype.toString = function(){\n    return (this.hack ? this.hack : \"\") + this.text;\n};\n/**\n * Represents a single part of a CSS property value, meaning that it represents\n * just everything single part between \":\" and \";\". If there are multiple values\n * separated by commas, this type represents just one of the values.\n * @param {String[]} parts An array of value parts making up this value.\n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n * @namespace parserlib.css\n * @class PropertyValue\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n */\nfunction PropertyValue(parts, line, col){\n\n    SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.PROPERTY_VALUE_TYPE);\n    this.parts = parts;\n    \n}\n\nPropertyValue.prototype = new SyntaxUnit();\nPropertyValue.prototype.constructor = PropertyValue;\n/**\n * A utility class that allows for easy iteration over the various parts of a\n * property value.\n * @param {parserlib.css.PropertyValue} value The property value to iterate over.\n * @namespace parserlib.css\n * @class PropertyValueIterator\n * @constructor\n */\nfunction PropertyValueIterator(value){\n\n    /** \n     * Iterator value\n     * @type int\n     * @property _i\n     * @private\n     */\n    this._i = 0;\n    this._parts = value.parts;\n    this._marks = [];\n    this.value = value;\n    \n}\n\n/**\n * Returns the total number of parts in the value.\n * @return {int} The total number of parts in the value.\n * @method count\n */\nPropertyValueIterator.prototype.count = function(){\n    return this._parts.length;\n};\nPropertyValueIterator.prototype.isFirst = function(){\n    return this._i === 0;\n};\nPropertyValueIterator.prototype.hasNext = function(){\n    return (this._i < this._parts.length);\n};\nPropertyValueIterator.prototype.mark = function(){\n    this._marks.push(this._i);\n};\nPropertyValueIterator.prototype.peek = function(count){\n    return this.hasNext() ? this._parts[this._i + (count || 0)] : null;\n};\nPropertyValueIterator.prototype.next = function(){\n    return this.hasNext() ? this._parts[this._i++] : null;\n};\nPropertyValueIterator.prototype.previous = function(){\n    return this._i > 0 ? this._parts[--this._i] : null;\n};\nPropertyValueIterator.prototype.restore = function(){\n    if (this._marks.length){\n        this._i = this._marks.pop();\n    }\n};\n/**\n * Represents a single part of a CSS property value, meaning that it represents\n * just one part of the data between \":\" and \";\".\n * @param {String} text The text representation of the unit.\n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n * @namespace parserlib.css\n * @class PropertyValuePart\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n */\nfunction PropertyValuePart(text, line, col){\n\n    SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE);\n    this.type = \"unknown\";\n\n    //figure out what type of data it is\n    \n    var temp;\n    \n    //it is a measurement?\n    if (/^([+\\-]?[\\d\\.]+)([a-z]+)$/i.test(text)){  //dimension\n        this.type = \"dimension\";\n        this.value = +RegExp.$1;\n        this.units = RegExp.$2;\n        \n        //try to narrow down\n        switch(this.units.toLowerCase()){\n        \n            case \"em\":\n            case \"rem\":\n            case \"ex\":\n            case \"px\":\n            case \"cm\":\n            case \"mm\":\n            case \"in\":\n            case \"pt\":\n            case \"pc\":\n            case \"ch\":\n                this.type = \"length\";\n                break;\n                \n            case \"deg\":\n            case \"rad\":\n            case \"grad\":\n                this.type = \"angle\";\n                break;\n            \n            case \"ms\":\n            case \"s\":\n                this.type = \"time\";\n                break;\n            \n            case \"hz\":\n            case \"khz\":\n                this.type = \"frequency\";\n                break;\n            \n            case \"dpi\":\n            case \"dpcm\":\n                this.type = \"resolution\";\n                break;\n                \n            //default\n                \n        }\n        \n    } else if (/^([+\\-]?[\\d\\.]+)%$/i.test(text)){  //percentage\n        this.type = \"percentage\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?[\\d\\.]+)%$/i.test(text)){  //percentage\n        this.type = \"percentage\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?\\d+)$/i.test(text)){  //integer\n        this.type = \"integer\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?[\\d\\.]+)$/i.test(text)){  //number\n        this.type = \"number\";\n        this.value = +RegExp.$1;\n    \n    } else if (/^#([a-f0-9]{3,6})/i.test(text)){  //hexcolor\n        this.type = \"color\";\n        temp = RegExp.$1;\n        if (temp.length == 3){\n            this.red    = parseInt(temp.charAt(0)+temp.charAt(0),16);\n            this.green  = parseInt(temp.charAt(1)+temp.charAt(1),16);\n            this.blue   = parseInt(temp.charAt(2)+temp.charAt(2),16);            \n        } else {\n            this.red    = parseInt(temp.substring(0,2),16);\n            this.green  = parseInt(temp.substring(2,4),16);\n            this.blue   = parseInt(temp.substring(4,6),16);            \n        }\n    } else if (/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i.test(text)){ //rgb() color with absolute numbers\n        this.type   = \"color\";\n        this.red    = +RegExp.$1;\n        this.green  = +RegExp.$2;\n        this.blue   = +RegExp.$3;\n    } else if (/^rgb\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)){ //rgb() color with percentages\n        this.type   = \"color\";\n        this.red    = +RegExp.$1 * 255 / 100;\n        this.green  = +RegExp.$2 * 255 / 100;\n        this.blue   = +RegExp.$3 * 255 / 100;\n    } else if (/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //rgba() color with absolute numbers\n        this.type   = \"color\";\n        this.red    = +RegExp.$1;\n        this.green  = +RegExp.$2;\n        this.blue   = +RegExp.$3;\n        this.alpha  = +RegExp.$4;\n    } else if (/^rgba\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //rgba() color with percentages\n        this.type   = \"color\";\n        this.red    = +RegExp.$1 * 255 / 100;\n        this.green  = +RegExp.$2 * 255 / 100;\n        this.blue   = +RegExp.$3 * 255 / 100;\n        this.alpha  = +RegExp.$4;        \n    } else if (/^hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)){ //hsl()\n        this.type   = \"color\";\n        this.hue    = +RegExp.$1;\n        this.saturation = +RegExp.$2 / 100;\n        this.lightness  = +RegExp.$3 / 100;        \n    } else if (/^hsla\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //hsla() color with percentages\n        this.type   = \"color\";\n        this.hue    = +RegExp.$1;\n        this.saturation = +RegExp.$2 / 100;\n        this.lightness  = +RegExp.$3 / 100;        \n        this.alpha  = +RegExp.$4;        \n    } else if (/^url\\([\"']?([^\\)\"']+)[\"']?\\)/i.test(text)){ //URI\n        this.type   = \"uri\";\n        this.uri    = RegExp.$1;\n    } else if (/^([^\\(]+)\\(/i.test(text)){\n        this.type   = \"function\";\n        this.name   = RegExp.$1;\n        this.value  = text;\n    } else if (/^[\"'][^\"']*[\"']/.test(text)){    //string\n        this.type   = \"string\";\n        this.value  = eval(text);\n    } else if (Colors[text.toLowerCase()]){  //named color\n        this.type   = \"color\";\n        temp        = Colors[text.toLowerCase()].substring(1);\n        this.red    = parseInt(temp.substring(0,2),16);\n        this.green  = parseInt(temp.substring(2,4),16);\n        this.blue   = parseInt(temp.substring(4,6),16);         \n    } else if (/^[\\,\\/]$/.test(text)){\n        this.type   = \"operator\";\n        this.value  = text;\n    } else if (/^[a-z\\-\\u0080-\\uFFFF][a-z0-9\\-\\u0080-\\uFFFF]*$/i.test(text)){\n        this.type   = \"identifier\";\n        this.value  = text;\n    }\n\n}\n\nPropertyValuePart.prototype = new SyntaxUnit();\nPropertyValuePart.prototype.constructor = PropertyValuePart;\nPropertyValuePart.fromToken = function(token){\n    return new PropertyValuePart(token.value, token.startLine, token.startCol);\n};\nvar Pseudos = {\n    \":first-letter\": 1,\n    \":first-line\":   1,\n    \":before\":       1,\n    \":after\":        1\n};\n\nPseudos.ELEMENT = 1;\nPseudos.CLASS = 2;\n\nPseudos.isElement = function(pseudo){\n    return pseudo.indexOf(\"::\") === 0 || Pseudos[pseudo.toLowerCase()] == Pseudos.ELEMENT;\n};\n/**\n * Represents an entire single selector, including all parts but not\n * including multiple selectors (those separated by commas).\n * @namespace parserlib.css\n * @class Selector\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n * @param {Array} parts Array of selectors parts making up this selector.\n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n */\nfunction Selector(parts, line, col){\n    \n    SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.SELECTOR_TYPE);\n    this.parts = parts;\n    this.specificity = Specificity.calculate(this);\n\n}\n\nSelector.prototype = new SyntaxUnit();\nSelector.prototype.constructor = Selector;\n/**\n * Represents a single part of a selector string, meaning a single set of\n * element name and modifiers. This does not include combinators such as\n * spaces, +, >, etc.\n * @namespace parserlib.css\n * @class SelectorPart\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n * @param {String} elementName The element name in the selector or null\n *      if there is no element name.\n * @param {Array} modifiers Array of individual modifiers for the element.\n *      May be empty if there are none.\n * @param {String} text The text representation of the unit. \n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n */\nfunction SelectorPart(elementName, modifiers, text, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_PART_TYPE);\n    this.elementName = elementName;\n    this.modifiers = modifiers;\n\n}\n\nSelectorPart.prototype = new SyntaxUnit();\nSelectorPart.prototype.constructor = SelectorPart;\n/**\n * Represents a selector modifier string, meaning a class name, element name,\n * element ID, pseudo rule, etc.\n * @namespace parserlib.css\n * @class SelectorSubPart\n * @extends parserlib.util.SyntaxUnit\n * @constructor\n * @param {String} text The text representation of the unit. \n * @param {String} type The type of selector modifier.\n * @param {int} line The line of text on which the unit resides.\n * @param {int} col The column of text on which the unit resides.\n */\nfunction SelectorSubPart(text, type, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_SUB_PART_TYPE);\n    this.type = type;\n    this.args = [];\n\n}\n\nSelectorSubPart.prototype = new SyntaxUnit();\nSelectorSubPart.prototype.constructor = SelectorSubPart;\n/**\n * Represents a selector's specificity.\n * @namespace parserlib.css\n * @class Specificity\n * @constructor\n * @param {int} a Should be 1 for inline styles, zero for stylesheet styles\n * @param {int} b Number of ID selectors\n * @param {int} c Number of classes and pseudo classes\n * @param {int} d Number of element names and pseudo elements\n */\nfunction Specificity(a, b, c, d){\n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.d = d;\n}\n\nSpecificity.prototype = {\n    constructor: Specificity,\n    \n    /**\n     * Compare this specificity to another.\n     * @param {Specificity} other The other specificity to compare to.\n     * @return {int} -1 if the other specificity is larger, 1 if smaller, 0 if equal.\n     * @method compare\n     */\n    compare: function(other){\n        var comps = [\"a\", \"b\", \"c\", \"d\"],\n            i, len;\n            \n        for (i=0, len=comps.length; i < len; i++){\n            if (this[comps[i]] < other[comps[i]]){\n                return -1;\n            } else if (this[comps[i]] > other[comps[i]]){\n                return 1;\n            }\n        }\n        \n        return 0;\n    },\n    \n    /**\n     * Creates a numeric value for the specificity.\n     * @return {int} The numeric value for the specificity.\n     * @method valueOf\n     */\n    valueOf: function(){\n        return (this.a * 1000) + (this.b * 100) + (this.c * 10) + this.d;\n    },\n    \n    /**\n     * Returns a string representation for specificity.\n     * @return {String} The string representation of specificity.\n     * @method toString\n     */\n    toString: function(){\n        return this.a + \",\" + this.b + \",\" + this.c + \",\" + this.d;\n    }\n\n};\nSpecificity.calculate = function(selector){\n\n    var i, len,\n        part,\n        b=0, c=0, d=0;\n        \n    function updateValues(part){\n    \n        var i, j, len, num,\n            elementName = part.elementName ? part.elementName.text : \"\",\n            modifier;\n    \n        if (elementName && elementName.charAt(elementName.length-1) != \"*\") {\n            d++;\n        }    \n    \n        for (i=0, len=part.modifiers.length; i < len; i++){\n            modifier = part.modifiers[i];\n            switch(modifier.type){\n                case \"class\":\n                case \"attribute\":\n                    c++;\n                    break;\n                    \n                case \"id\":\n                    b++;\n                    break;\n                    \n                case \"pseudo\":\n                    if (Pseudos.isElement(modifier.text)){\n                        d++;\n                    } else {\n                        c++;\n                    }                    \n                    break;\n                    \n                case \"not\":\n                    for (j=0, num=modifier.args.length; j < num; j++){\n                        updateValues(modifier.args[j]);\n                    }\n            }    \n         }\n    }\n    \n    for (i=0, len=selector.parts.length; i < len; i++){\n        part = selector.parts[i];\n        \n        if (part instanceof SelectorPart){\n            updateValues(part);                \n        }\n    }\n    \n    return new Specificity(0, b, c, d);\n};\n\nvar h = /^[0-9a-fA-F]$/,\n    nonascii = /^[\\u0080-\\uFFFF]$/,\n    nl = /\\n|\\r\\n|\\r|\\f/;\n\n//-----------------------------------------------------------------------------\n// Helper functions\n//-----------------------------------------------------------------------------\n\n\nfunction isHexDigit(c){\n    return c !== null && h.test(c);\n}\n\nfunction isDigit(c){\n    return c !== null && /\\d/.test(c);\n}\n\nfunction isWhitespace(c){\n    return c !== null && /\\s/.test(c);\n}\n\nfunction isNewLine(c){\n    return c !== null && nl.test(c);\n}\n\nfunction isNameStart(c){\n    return c !== null && (/[a-z_\\u0080-\\uFFFF\\\\]/i.test(c));\n}\n\nfunction isNameChar(c){\n    return c !== null && (isNameStart(c) || /[0-9\\-\\\\]/.test(c));\n}\n\nfunction isIdentStart(c){\n    return c !== null && (isNameStart(c) || /\\-\\\\/.test(c));\n}\n\nfunction mix(receiver, supplier){\n\tfor (var prop in supplier){\n\t\tif (supplier.hasOwnProperty(prop)){\n\t\t\treceiver[prop] = supplier[prop];\n\t\t}\n\t}\n\treturn receiver;\n}\n\n//-----------------------------------------------------------------------------\n// CSS Token Stream\n//-----------------------------------------------------------------------------\n\n\n/**\n * A token stream that produces CSS tokens.\n * @param {String|Reader} input The source of text to tokenize.\n * @constructor\n * @class TokenStream\n * @namespace parserlib.css\n */\nfunction TokenStream(input){\n\tTokenStreamBase.call(this, input, Tokens);\n}\n\nTokenStream.prototype = mix(new TokenStreamBase(), {\n\n    /**\n     * Overrides the TokenStreamBase method of the same name\n     * to produce CSS tokens.\n     * @param {variant} channel The name of the channel to use\n     *      for the next token.\n     * @return {Object} A token object representing the next token.\n     * @method _getToken\n     * @private\n     */\n    _getToken: function(channel){\n\n        var c,\n            reader = this._reader,\n            token   = null,\n            startLine   = reader.getLine(),\n            startCol    = reader.getCol();\n\n        c = reader.read();\n\n\n        while(c){\n            switch(c){\n\n                /*\n                 * Potential tokens:\n                 * - COMMENT\n                 * - SLASH\n                 * - CHAR\n                 */\n                case \"/\":\n\n                    if(reader.peek() == \"*\"){\n                        token = this.commentToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"|\":\n                case \"~\":\n                case \"^\":\n                case \"$\":\n                case \"*\":\n                    if(reader.peek() == \"=\"){\n                        token = this.comparisonToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"\\\"\":\n                case \"'\":\n                    token = this.stringToken(c, startLine, startCol);\n                    break;\n                case \"#\":\n                    if (isNameChar(reader.peek())){\n                        token = this.hashToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \".\":\n                    if (isDigit(reader.peek())){\n                        token = this.numberToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"-\":\n                    if (reader.peek() == \"-\"){  //could be closing HTML-style comment\n                        token = this.htmlCommentEndToken(c, startLine, startCol);\n                    } else if (isNameStart(reader.peek())){\n                        token = this.identOrFunctionToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"!\":\n                    token = this.importantToken(c, startLine, startCol);\n                    break;\n                case \"@\":\n                    token = this.atRuleToken(c, startLine, startCol);\n                    break;\n                case \":\":\n                    token = this.notToken(c, startLine, startCol);\n                    break;\n                case \"<\":\n                    token = this.htmlCommentStartToken(c, startLine, startCol);\n                    break;\n                case \"U\":\n                case \"u\":\n                    if (reader.peek() == \"+\"){\n                        token = this.unicodeRangeToken(c, startLine, startCol);\n                        break;\n                    }\n                    /* falls through */\n                default:\n\n                    /*\n                     * Potential tokens:\n                     * - NUMBER\n                     * - DIMENSION\n                     * - LENGTH\n                     * - FREQ\n                     * - TIME\n                     * - EMS\n                     * - EXS\n                     * - ANGLE\n                     */\n                    if (isDigit(c)){\n                        token = this.numberToken(c, startLine, startCol);\n                    } else\n\n                    /*\n                     * Potential tokens:\n                     * - S\n                     */\n                    if (isWhitespace(c)){\n                        token = this.whitespaceToken(c, startLine, startCol);\n                    } else\n\n                    /*\n                     * Potential tokens:\n                     * - IDENT\n                     */\n                    if (isIdentStart(c)){\n                        token = this.identOrFunctionToken(c, startLine, startCol);\n                    } else\n\n                    /*\n                     * Potential tokens:\n                     * - CHAR\n                     * - PLUS\n                     */\n                    {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n\n\n\n\n\n\n            }\n\n            //make sure this token is wanted\n            //TODO: check channel\n            break;\n        }\n\n        if (!token && c === null){\n            token = this.createToken(Tokens.EOF,null,startLine,startCol);\n        }\n\n        return token;\n    },\n\n    //-------------------------------------------------------------------------\n    // Methods to create tokens\n    //-------------------------------------------------------------------------\n\n    /**\n     * Produces a token based on available data and the current\n     * reader position information. This method is called by other\n     * private methods to create tokens and is never called directly.\n     * @param {int} tt The token type.\n     * @param {String} value The text value of the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @param {Object} options (Optional) Specifies a channel property\n     *      to indicate that a different channel should be scanned\n     *      and/or a hide property indicating that the token should\n     *      be hidden.\n     * @return {Object} A token object.\n     * @method createToken\n     */\n    createToken: function(tt, value, startLine, startCol, options){\n        var reader = this._reader;\n        options = options || {};\n\n        return {\n            value:      value,\n            type:       tt,\n            channel:    options.channel,\n            hide:       options.hide || false,\n            startLine:  startLine,\n            startCol:   startCol,\n            endLine:    reader.getLine(),\n            endCol:     reader.getCol()\n        };\n    },\n\n    //-------------------------------------------------------------------------\n    // Methods to create specific tokens\n    //-------------------------------------------------------------------------\n\n    /**\n     * Produces a token for any at-rule. If the at-rule is unknown, then\n     * the token is for a single \"@\" character.\n     * @param {String} first The first character for the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method atRuleToken\n     */\n    atRuleToken: function(first, startLine, startCol){\n        var rule    = first,\n            reader  = this._reader,\n            tt      = Tokens.CHAR,\n            valid   = false,\n            ident,\n            c;\n        reader.mark();\n\n        //try to find the at-keyword\n        ident = this.readName();\n        rule = first + ident;\n        tt = Tokens.type(rule.toLowerCase());\n\n        //if it's not valid, use the first character only and reset the reader\n        if (tt == Tokens.CHAR || tt == Tokens.UNKNOWN){\n            if (rule.length > 1){\n                tt = Tokens.UNKNOWN_SYM;                \n            } else {\n                tt = Tokens.CHAR;\n                rule = first;\n                reader.reset();\n            }\n        }\n\n        return this.createToken(tt, rule, startLine, startCol);\n    },\n\n    /**\n     * Produces a character token based on the given character\n     * and location in the stream. If there's a special (non-standard)\n     * token name, this is used; otherwise CHAR is used.\n     * @param {String} c The character for the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method charToken\n     */\n    charToken: function(c, startLine, startCol){\n        var tt = Tokens.type(c);\n\n        if (tt == -1){\n            tt = Tokens.CHAR;\n        }\n\n        return this.createToken(tt, c, startLine, startCol);\n    },\n\n    /**\n     * Produces a character token based on the given character\n     * and location in the stream. If there's a special (non-standard)\n     * token name, this is used; otherwise CHAR is used.\n     * @param {String} first The first character for the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method commentToken\n     */\n    commentToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            comment = this.readComment(first);\n\n        return this.createToken(Tokens.COMMENT, comment, startLine, startCol);\n    },\n\n    /**\n     * Produces a comparison token based on the given character\n     * and location in the stream. The next character must be\n     * read and is already known to be an equals sign.\n     * @param {String} c The character for the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method comparisonToken\n     */\n    comparisonToken: function(c, startLine, startCol){\n        var reader  = this._reader,\n            comparison  = c + reader.read(),\n            tt      = Tokens.type(comparison) || Tokens.CHAR;\n\n        return this.createToken(tt, comparison, startLine, startCol);\n    },\n\n    /**\n     * Produces a hash token based on the specified information. The\n     * first character provided is the pound sign (#) and then this\n     * method reads a name afterward.\n     * @param {String} first The first character (#) in the hash name.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method hashToken\n     */\n    hashToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            name    = this.readName(first);\n\n        return this.createToken(Tokens.HASH, name, startLine, startCol);\n    },\n\n    /**\n     * Produces a CDO or CHAR token based on the specified information. The\n     * first character is provided and the rest is read by the function to determine\n     * the correct token to create.\n     * @param {String} first The first character in the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method htmlCommentStartToken\n     */\n    htmlCommentStartToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(3);\n\n        if (text == \"<!--\"){\n            return this.createToken(Tokens.CDO, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n\n    /**\n     * Produces a CDC or CHAR token based on the specified information. The\n     * first character is provided and the rest is read by the function to determine\n     * the correct token to create.\n     * @param {String} first The first character in the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method htmlCommentEndToken\n     */\n    htmlCommentEndToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(2);\n\n        if (text == \"-->\"){\n            return this.createToken(Tokens.CDC, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n\n    /**\n     * Produces an IDENT or FUNCTION token based on the specified information. The\n     * first character is provided and the rest is read by the function to determine\n     * the correct token to create.\n     * @param {String} first The first character in the identifier.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method identOrFunctionToken\n     */\n    identOrFunctionToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            ident   = this.readName(first),\n            tt      = Tokens.IDENT;\n\n        //if there's a left paren immediately after, it's a URI or function\n        if (reader.peek() == \"(\"){\n            ident += reader.read();\n            if (ident.toLowerCase() == \"url(\"){\n                tt = Tokens.URI;\n                ident = this.readURI(ident);\n\n                //didn't find a valid URL or there's no closing paren\n                if (ident.toLowerCase() == \"url(\"){\n                    tt = Tokens.FUNCTION;\n                }\n            } else {\n                tt = Tokens.FUNCTION;\n            }\n        } else if (reader.peek() == \":\"){  //might be an IE function\n\n            //IE-specific functions always being with progid:\n            if (ident.toLowerCase() == \"progid\"){\n                ident += reader.readTo(\"(\");\n                tt = Tokens.IE_FUNCTION;\n            }\n        }\n\n        return this.createToken(tt, ident, startLine, startCol);\n    },\n\n    /**\n     * Produces an IMPORTANT_SYM or CHAR token based on the specified information. The\n     * first character is provided and the rest is read by the function to determine\n     * the correct token to create.\n     * @param {String} first The first character in the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method importantToken\n     */\n    importantToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            important   = first,\n            tt          = Tokens.CHAR,\n            temp,\n            c;\n\n        reader.mark();\n        c = reader.read();\n\n        while(c){\n\n            //there can be a comment in here\n            if (c == \"/\"){\n\n                //if the next character isn't a star, then this isn't a valid !important token\n                if (reader.peek() != \"*\"){\n                    break;\n                } else {\n                    temp = this.readComment(c);\n                    if (temp === \"\"){    //broken!\n                        break;\n                    }\n                }\n            } else if (isWhitespace(c)){\n                important += c + this.readWhitespace();\n            } else if (/i/i.test(c)){\n                temp = reader.readCount(8);\n                if (/mportant/i.test(temp)){\n                    important += c + temp;\n                    tt = Tokens.IMPORTANT_SYM;\n\n                }\n                break;  //we're done\n            } else {\n                break;\n            }\n\n            c = reader.read();\n        }\n\n        if (tt == Tokens.CHAR){\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        } else {\n            return this.createToken(tt, important, startLine, startCol);\n        }\n\n\n    },\n\n    /**\n     * Produces a NOT or CHAR token based on the specified information. The\n     * first character is provided and the rest is read by the function to determine\n     * the correct token to create.\n     * @param {String} first The first character in the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method notToken\n     */\n    notToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(4);\n\n        if (text.toLowerCase() == \":not(\"){\n            return this.createToken(Tokens.NOT, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n\n    /**\n     * Produces a number token based on the given character\n     * and location in the stream. This may return a token of\n     * NUMBER, EMS, EXS, LENGTH, ANGLE, TIME, FREQ, DIMENSION,\n     * or PERCENTAGE.\n     * @param {String} first The first character for the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method numberToken\n     */\n    numberToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = this.readNumber(first),\n            ident,\n            tt      = Tokens.NUMBER,\n            c       = reader.peek();\n\n        if (isIdentStart(c)){\n            ident = this.readName(reader.read());\n            value += ident;\n\n            if (/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vm$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(ident)){\n                tt = Tokens.LENGTH;\n            } else if (/^deg|^rad$|^grad$/i.test(ident)){\n                tt = Tokens.ANGLE;\n            } else if (/^ms$|^s$/i.test(ident)){\n                tt = Tokens.TIME;\n            } else if (/^hz$|^khz$/i.test(ident)){\n                tt = Tokens.FREQ;\n            } else if (/^dpi$|^dpcm$/i.test(ident)){\n                tt = Tokens.RESOLUTION;\n            } else {\n                tt = Tokens.DIMENSION;\n            }\n\n        } else if (c == \"%\"){\n            value += reader.read();\n            tt = Tokens.PERCENTAGE;\n        }\n\n        return this.createToken(tt, value, startLine, startCol);\n    },\n\n    /**\n     * Produces a string token based on the given character\n     * and location in the stream. Since strings may be indicated\n     * by single or double quotes, a failure to match starting\n     * and ending quotes results in an INVALID token being generated.\n     * The first character in the string is passed in and then\n     * the rest are read up to and including the final quotation mark.\n     * @param {String} first The first character in the string.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method stringToken\n     */\n    stringToken: function(first, startLine, startCol){\n        var delim   = first,\n            string  = first,\n            reader  = this._reader,\n            prev    = first,\n            tt      = Tokens.STRING,\n            c       = reader.read();\n\n        while(c){\n            string += c;\n\n            //if the delimiter is found with an escapement, we're done.\n            if (c == delim && prev != \"\\\\\"){\n                break;\n            }\n\n            //if there's a newline without an escapement, it's an invalid string\n            if (isNewLine(reader.peek()) && c != \"\\\\\"){\n                tt = Tokens.INVALID;\n                break;\n            }\n\n            //save previous and get next\n            prev = c;\n            c = reader.read();\n        }\n\n        //if c is null, that means we're out of input and the string was never closed\n        if (c === null){\n            tt = Tokens.INVALID;\n        }\n\n        return this.createToken(tt, string, startLine, startCol);\n    },\n\n    unicodeRangeToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = first,\n            temp,\n            tt      = Tokens.CHAR;\n\n        //then it should be a unicode range\n        if (reader.peek() == \"+\"){\n            reader.mark();\n            value += reader.read();\n            value += this.readUnicodeRangePart(true);\n\n            //ensure there's an actual unicode range here\n            if (value.length == 2){\n                reader.reset();\n            } else {\n\n                tt = Tokens.UNICODE_RANGE;\n\n                //if there's a ? in the first part, there can't be a second part\n                if (value.indexOf(\"?\") == -1){\n\n                    if (reader.peek() == \"-\"){\n                        reader.mark();\n                        temp = reader.read();\n                        temp += this.readUnicodeRangePart(false);\n\n                        //if there's not another value, back up and just take the first\n                        if (temp.length == 1){\n                            reader.reset();\n                        } else {\n                            value += temp;\n                        }\n                    }\n\n                }\n            }\n        }\n\n        return this.createToken(tt, value, startLine, startCol);\n    },\n\n    /**\n     * Produces a S token based on the specified information. Since whitespace\n     * may have multiple characters, this consumes all whitespace characters\n     * into a single token.\n     * @param {String} first The first character in the token.\n     * @param {int} startLine The beginning line for the character.\n     * @param {int} startCol The beginning column for the character.\n     * @return {Object} A token object.\n     * @method whitespaceToken\n     */\n    whitespaceToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = first + this.readWhitespace();\n        return this.createToken(Tokens.S, value, startLine, startCol);\n    },\n\n\n\n\n    //-------------------------------------------------------------------------\n    // Methods to read values from the string stream\n    //-------------------------------------------------------------------------\n\n    readUnicodeRangePart: function(allowQuestionMark){\n        var reader  = this._reader,\n            part = \"\",\n            c       = reader.peek();\n\n        //first read hex digits\n        while(isHexDigit(c) && part.length < 6){\n            reader.read();\n            part += c;\n            c = reader.peek();\n        }\n\n        //then read question marks if allowed\n        if (allowQuestionMark){\n            while(c == \"?\" && part.length < 6){\n                reader.read();\n                part += c;\n                c = reader.peek();\n            }\n        }\n\n        //there can't be any other characters after this point\n\n        return part;\n    },\n\n    readWhitespace: function(){\n        var reader  = this._reader,\n            whitespace = \"\",\n            c       = reader.peek();\n\n        while(isWhitespace(c)){\n            reader.read();\n            whitespace += c;\n            c = reader.peek();\n        }\n\n        return whitespace;\n    },\n    readNumber: function(first){\n        var reader  = this._reader,\n            number  = first,\n            hasDot  = (first == \".\"),\n            c       = reader.peek();\n\n\n        while(c){\n            if (isDigit(c)){\n                number += reader.read();\n            } else if (c == \".\"){\n                if (hasDot){\n                    break;\n                } else {\n                    hasDot = true;\n                    number += reader.read();\n                }\n            } else {\n                break;\n            }\n\n            c = reader.peek();\n        }\n\n        return number;\n    },\n    readString: function(){\n        var reader  = this._reader,\n            delim   = reader.read(),\n            string  = delim,\n            prev    = delim,\n            c       = reader.peek();\n\n        while(c){\n            c = reader.read();\n            string += c;\n\n            //if the delimiter is found with an escapement, we're done.\n            if (c == delim && prev != \"\\\\\"){\n                break;\n            }\n\n            //if there's a newline without an escapement, it's an invalid string\n            if (isNewLine(reader.peek()) && c != \"\\\\\"){\n                string = \"\";\n                break;\n            }\n\n            //save previous and get next\n            prev = c;\n            c = reader.peek();\n        }\n\n        //if c is null, that means we're out of input and the string was never closed\n        if (c === null){\n            string = \"\";\n        }\n\n        return string;\n    },\n    readURI: function(first){\n        var reader  = this._reader,\n            uri     = first,\n            inner   = \"\",\n            c       = reader.peek();\n\n        reader.mark();\n\n        //skip whitespace before\n        while(c && isWhitespace(c)){\n            reader.read();\n            c = reader.peek();\n        }\n\n        //it's a string\n        if (c == \"'\" || c == \"\\\"\"){\n            inner = this.readString();\n        } else {\n            inner = this.readURL();\n        }\n\n        c = reader.peek();\n\n        //skip whitespace after\n        while(c && isWhitespace(c)){\n            reader.read();\n            c = reader.peek();\n        }\n\n        //if there was no inner value or the next character isn't closing paren, it's not a URI\n        if (inner === \"\" || c != \")\"){\n            uri = first;\n            reader.reset();\n        } else {\n            uri += inner + reader.read();\n        }\n\n        return uri;\n    },\n    readURL: function(){\n        var reader  = this._reader,\n            url     = \"\",\n            c       = reader.peek();\n\n        //TODO: Check for escape and nonascii\n        while (/^[!#$%&\\\\*-~]$/.test(c)){\n            url += reader.read();\n            c = reader.peek();\n        }\n\n        return url;\n\n    },\n    readName: function(first){\n        var reader  = this._reader,\n            ident   = first || \"\",\n            c       = reader.peek();\n\n        while(true){\n            if (c == \"\\\\\"){\n                ident += this.readEscape(reader.read());\n                c = reader.peek();\n            } else if(c && isNameChar(c)){\n                ident += reader.read();\n                c = reader.peek();\n            } else {\n                break;\n            }\n        }\n\n        return ident;\n    },\n    \n    readEscape: function(first){\n        var reader  = this._reader,\n            cssEscape = first || \"\",\n            i       = 0,\n            c       = reader.peek();    \n    \n        if (isHexDigit(c)){\n            do {\n                cssEscape += reader.read();\n                c = reader.peek();\n            } while(c && isHexDigit(c) && ++i < 6);\n        }\n        \n        if (cssEscape.length == 3 && /\\s/.test(c) ||\n            cssEscape.length == 7 || cssEscape.length == 1){\n                reader.read();\n        } else {\n            c = \"\";\n        }\n        \n        return cssEscape + c;\n    },\n    \n    readComment: function(first){\n        var reader  = this._reader,\n            comment = first || \"\",\n            c       = reader.read();\n\n        if (c == \"*\"){\n            while(c){\n                comment += c;\n\n                //look for end of comment\n                if (comment.length > 2 && c == \"*\" && reader.peek() == \"/\"){\n                    comment += reader.read();\n                    break;\n                }\n\n                c = reader.read();\n            }\n\n            return comment;\n        } else {\n            return \"\";\n        }\n\n    }\n});\n\n\nvar Tokens  = [\n\n    /*\n     * The following token names are defined in CSS3 Grammar: http://www.w3.org/TR/css3-syntax/#lexical\n     */\n     \n    //HTML-style comments\n    { name: \"CDO\"},\n    { name: \"CDC\"},\n\n    //ignorables\n    { name: \"S\", whitespace: true/*, channel: \"ws\"*/},\n    { name: \"COMMENT\", comment: true, hide: true, channel: \"comment\" },\n        \n    //attribute equality\n    { name: \"INCLUDES\", text: \"~=\"},\n    { name: \"DASHMATCH\", text: \"|=\"},\n    { name: \"PREFIXMATCH\", text: \"^=\"},\n    { name: \"SUFFIXMATCH\", text: \"$=\"},\n    { name: \"SUBSTRINGMATCH\", text: \"*=\"},\n        \n    //identifier types\n    { name: \"STRING\"},     \n    { name: \"IDENT\"},\n    { name: \"HASH\"},\n\n    //at-keywords\n    { name: \"IMPORT_SYM\", text: \"@import\"},\n    { name: \"PAGE_SYM\", text: \"@page\"},\n    { name: \"MEDIA_SYM\", text: \"@media\"},\n    { name: \"FONT_FACE_SYM\", text: \"@font-face\"},\n    { name: \"CHARSET_SYM\", text: \"@charset\"},\n    { name: \"NAMESPACE_SYM\", text: \"@namespace\"},\n    { name: \"UNKNOWN_SYM\" },\n    //{ name: \"ATKEYWORD\"},\n    \n    //CSS3 animations\n    { name: \"KEYFRAMES_SYM\", text: [ \"@keyframes\", \"@-webkit-keyframes\", \"@-moz-keyframes\", \"@-ms-keyframes\" ] },\n\n    //important symbol\n    { name: \"IMPORTANT_SYM\"},\n\n    //measurements\n    { name: \"LENGTH\"},\n    { name: \"ANGLE\"},\n    { name: \"TIME\"},\n    { name: \"FREQ\"},\n    { name: \"DIMENSION\"},\n    { name: \"PERCENTAGE\"},\n    { name: \"NUMBER\"},\n    \n    //functions\n    { name: \"URI\"},\n    { name: \"FUNCTION\"},\n    \n    //Unicode ranges\n    { name: \"UNICODE_RANGE\"},\n    \n    /*\n     * The following token names are defined in CSS3 Selectors: http://www.w3.org/TR/css3-selectors/#selector-syntax\n     */    \n    \n    //invalid string\n    { name: \"INVALID\"},\n    \n    //combinators\n    { name: \"PLUS\", text: \"+\" },\n    { name: \"GREATER\", text: \">\"},\n    { name: \"COMMA\", text: \",\"},\n    { name: \"TILDE\", text: \"~\"},\n    \n    //modifier\n    { name: \"NOT\"},        \n    \n    /*\n     * Defined in CSS3 Paged Media\n     */\n    { name: \"TOPLEFTCORNER_SYM\", text: \"@top-left-corner\"},\n    { name: \"TOPLEFT_SYM\", text: \"@top-left\"},\n    { name: \"TOPCENTER_SYM\", text: \"@top-center\"},\n    { name: \"TOPRIGHT_SYM\", text: \"@top-right\"},\n    { name: \"TOPRIGHTCORNER_SYM\", text: \"@top-right-corner\"},\n    { name: \"BOTTOMLEFTCORNER_SYM\", text: \"@bottom-left-corner\"},\n    { name: \"BOTTOMLEFT_SYM\", text: \"@bottom-left\"},\n    { name: \"BOTTOMCENTER_SYM\", text: \"@bottom-center\"},\n    { name: \"BOTTOMRIGHT_SYM\", text: \"@bottom-right\"},\n    { name: \"BOTTOMRIGHTCORNER_SYM\", text: \"@bottom-right-corner\"},\n    { name: \"LEFTTOP_SYM\", text: \"@left-top\"},\n    { name: \"LEFTMIDDLE_SYM\", text: \"@left-middle\"},\n    { name: \"LEFTBOTTOM_SYM\", text: \"@left-bottom\"},\n    { name: \"RIGHTTOP_SYM\", text: \"@right-top\"},\n    { name: \"RIGHTMIDDLE_SYM\", text: \"@right-middle\"},\n    { name: \"RIGHTBOTTOM_SYM\", text: \"@right-bottom\"},\n\n    /*\n     * The following token names are defined in CSS3 Media Queries: http://www.w3.org/TR/css3-mediaqueries/#syntax\n     */\n    /*{ name: \"MEDIA_ONLY\", state: \"media\"},\n    { name: \"MEDIA_NOT\", state: \"media\"},\n    { name: \"MEDIA_AND\", state: \"media\"},*/\n    { name: \"RESOLUTION\", state: \"media\"},\n\n    /*\n     * The following token names are not defined in any CSS specification but are used by the lexer.\n     */\n    \n    //not a real token, but useful for stupid IE filters\n    { name: \"IE_FUNCTION\" },\n\n    //part of CSS3 grammar but not the Flex code\n    { name: \"CHAR\" },\n    \n    //TODO: Needed?\n    //Not defined as tokens, but might as well be\n    {\n        name: \"PIPE\",\n        text: \"|\"\n    },\n    {\n        name: \"SLASH\",\n        text: \"/\"\n    },\n    {\n        name: \"MINUS\",\n        text: \"-\"\n    },\n    {\n        name: \"STAR\",\n        text: \"*\"\n    },\n\n    {\n        name: \"LBRACE\",\n        text: \"{\"\n    },   \n    {\n        name: \"RBRACE\",\n        text: \"}\"\n    },      \n    {\n        name: \"LBRACKET\",\n        text: \"[\"\n    },   \n    {\n        name: \"RBRACKET\",\n        text: \"]\"\n    },    \n    {\n        name: \"EQUALS\",\n        text: \"=\"\n    },\n    {\n        name: \"COLON\",\n        text: \":\"\n    },    \n    {\n        name: \"SEMICOLON\",\n        text: \";\"\n    },    \n \n    {\n        name: \"LPAREN\",\n        text: \"(\"\n    },   \n    {\n        name: \"RPAREN\",\n        text: \")\"\n    },     \n    {\n        name: \"DOT\",\n        text: \".\"\n    }\n];\n\n(function(){\n\n    var nameMap = [],\n        typeMap = {};\n    \n    Tokens.UNKNOWN = -1;\n    Tokens.unshift({name:\"EOF\"});\n    for (var i=0, len = Tokens.length; i < len; i++){\n        nameMap.push(Tokens[i].name);\n        Tokens[Tokens[i].name] = i;\n        if (Tokens[i].text){\n            if (Tokens[i].text instanceof Array){\n                for (var j=0; j < Tokens[i].text.length; j++){\n                    typeMap[Tokens[i].text[j]] = i;\n                }\n            } else {\n                typeMap[Tokens[i].text] = i;\n            }\n        }\n    }\n    \n    Tokens.name = function(tt){\n        return nameMap[tt];\n    };\n    \n    Tokens.type = function(c){\n        return typeMap[c] || -1;\n    };\n\n})();\n\n\n\n\n//This file will likely change a lot! Very experimental!\n/*global Properties, ValidationTypes, ValidationError, PropertyValueIterator */\nvar Validation = {\n\n    validate: function(property, value){\n    \n        //normalize name\n        var name        = property.toString().toLowerCase(),\n            parts       = value.parts,\n            expression  = new PropertyValueIterator(value),\n            spec        = Properties[name],\n            part,\n            valid,            \n            j, count,\n            msg,\n            types,\n            last,\n            literals,\n            max, multi, group;\n            \n        if (!spec) {\n            if (name.indexOf(\"-\") !== 0){    //vendor prefixed are ok\n                throw new ValidationError(\"Unknown property '\" + property + \"'.\", property.line, property.col);\n            }\n        } else if (typeof spec != \"number\"){\n        \n            //initialization\n            if (typeof spec == \"string\"){\n                if (spec.indexOf(\"||\") > -1) {\n                    this.groupProperty(spec, expression);\n                } else {\n                    this.singleProperty(spec, expression, 1);\n                }\n\n            } else if (spec.multi) {\n                this.multiProperty(spec.multi, expression, spec.comma, spec.max || Infinity);\n            } else if (typeof spec == \"function\") {\n                spec(expression);\n            }\n\n        }\n\n    },\n    \n    singleProperty: function(types, expression, max, partial) {\n\n        var result      = false,\n            value       = expression.value,\n            count       = 0,\n            part;\n         \n        while (expression.hasNext() && count < max) {\n            result = ValidationTypes.isAny(expression, types);\n            if (!result) {\n                break;\n            }\n            count++;\n        }\n        \n        if (!result) {\n            if (expression.hasNext() && !expression.isFirst()) {\n                part = expression.peek();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                 throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n            }        \n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }          \n                 \n    },    \n    \n    multiProperty: function (types, expression, comma, max) {\n\n        var result      = false,\n            value       = expression.value,\n            count       = 0,\n            sep         = false,\n            part;\n            \n        while(expression.hasNext() && !result && count < max) {\n            if (ValidationTypes.isAny(expression, types)) {\n                count++;\n                if (!expression.hasNext()) {\n                    result = true;\n\n                } else if (comma) {\n                    if (expression.peek() == \",\") {\n                        part = expression.next();\n                    } else {\n                        break;\n                    }\n                }\n            } else {\n                break;\n\n            }\n        }\n        \n        if (!result) {\n            if (expression.hasNext() && !expression.isFirst()) {\n                part = expression.peek();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                part = expression.previous();\n                if (comma && part == \",\") {\n                    throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col); \n                } else {\n                    throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n                }\n            }\n        \n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }  \n\n    },\n    \n    groupProperty: function (types, expression, comma) {\n\n        var result      = false,\n            value       = expression.value,\n            typeCount   = types.split(\"||\").length,\n            groups      = { count: 0 },\n            partial     = false,\n            name,\n            part;\n            \n        while(expression.hasNext() && !result) {\n            name = ValidationTypes.isAnyOfGroup(expression, types);\n            if (name) {\n            \n                //no dupes\n                if (groups[name]) {\n                    break;\n                } else {\n                    groups[name] = 1;\n                    groups.count++;\n                    partial = true;\n                    \n                    if (groups.count == typeCount || !expression.hasNext()) {\n                        result = true;\n                    }\n                }\n            } else {\n                break;\n            }\n        }\n        \n        if (!result) {        \n            if (partial && expression.hasNext()) {\n                    part = expression.peek();\n                    throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n            }\n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }           \n    }\n\n    \n\n};\nfunction ValidationError(message, line, col){\n\n    /**\n     * The column at which the error occurred.\n     * @type int\n     * @property col\n     */\n    this.col = col;\n    this.line = line;\n    this.message = message;\n\n}\n\n//inherit from Error\nValidationError.prototype = new Error();\n//This file will likely change a lot! Very experimental!\n/*global Properties, Validation, ValidationError, PropertyValueIterator, console*/\nvar ValidationTypes = {\n\n    isLiteral: function (part, literals) {\n        var text = part.text.toString().toLowerCase(),\n            args = literals.split(\" | \"),\n            i, len, found = false;\n        \n        for (i=0,len=args.length; i < len && !found; i++){\n            if (text == args[i]){\n                found = true;\n            }\n        }\n        \n        return found;    \n    },\n    \n    isSimple: function(type) {\n        return !!this.simple[type];\n    },\n    \n    isComplex: function(type) {\n        return !!this.complex[type];\n    },\n    \n    /**\n     * Determines if the next part(s) of the given expression\n     * are any of the given types.\n     */\n    isAny: function (expression, types) {\n        var args = types.split(\" | \"),\n            i, len, found = false;\n        \n        for (i=0,len=args.length; i < len && !found && expression.hasNext(); i++){\n            found = this.isType(expression, args[i]);\n        }\n        \n        return found;    \n    },\n    \n    /**\n     * Determines if the next part(s) of the given expresion\n     * are one of a group.\n     */\n    isAnyOfGroup: function(expression, types) {\n        var args = types.split(\" || \"),\n            i, len, found = false;\n        \n        for (i=0,len=args.length; i < len && !found; i++){\n            found = this.isType(expression, args[i]);\n        }\n        \n        return found ? args[i-1] : false;\n    },\n    \n    /**\n     * Determines if the next part(s) of the given expression\n     * are of a given type.\n     */\n    isType: function (expression, type) {\n        var part = expression.peek(),\n            result = false;\n            \n        if (type.charAt(0) != \"<\") {\n            result = this.isLiteral(part, type);\n            if (result) {\n                expression.next();\n            }\n        } else if (this.simple[type]) {\n            result = this.simple[type](part);\n            if (result) {\n                expression.next();\n            }\n        } else {\n            result = this.complex[type](expression);\n        }\n        \n        return result;\n    },\n    \n    \n    \n    simple: {\n\n        \"<absolute-size>\": function(part){\n            return ValidationTypes.isLiteral(part, \"xx-small | x-small | small | medium | large | x-large | xx-large\");\n        },\n        \n        \"<attachment>\": function(part){\n            return ValidationTypes.isLiteral(part, \"scroll | fixed | local\");\n        },\n        \n        \"<attr>\": function(part){\n            return part.type == \"function\" && part.name == \"attr\";\n        },\n                \n        \"<bg-image>\": function(part){\n            return this[\"<image>\"](part) || this[\"<gradient>\"](part) ||  part == \"none\";\n        },        \n        \n        \"<gradient>\": function(part) {\n            return part.type == \"function\" && /^(?:\\-(?:ms|moz|o|webkit)\\-)?(?:repeating\\-)?(?:radial|linear)\\-gradient/i.test(part);\n        },\n        \n        \"<box>\": function(part){\n            return ValidationTypes.isLiteral(part, \"padding-box | border-box | content-box\");\n        },\n        \n        \"<content>\": function(part){\n            return part.type == \"function\" && part.name == \"content\";\n        },        \n        \n        \"<relative-size>\": function(part){\n            return ValidationTypes.isLiteral(part, \"smaller | larger\");\n        },\n        \n        //any identifier\n        \"<ident>\": function(part){\n            return part.type == \"identifier\";\n        },\n        \n        \"<length>\": function(part){\n            return part.type == \"length\" || part.type == \"number\" || part.type == \"integer\" || part == \"0\";\n        },\n        \n        \"<color>\": function(part){\n            return part.type == \"color\" || part == \"transparent\";\n        },\n        \n        \"<number>\": function(part){\n            return part.type == \"number\" || this[\"<integer>\"](part);\n        },\n        \n        \"<integer>\": function(part){\n            return part.type == \"integer\";\n        },\n        \n        \"<line>\": function(part){\n            return part.type == \"integer\";\n        },\n        \n        \"<angle>\": function(part){\n            return part.type == \"angle\";\n        },        \n        \n        \"<uri>\": function(part){\n            return part.type == \"uri\";\n        },\n        \n        \"<image>\": function(part){\n            return this[\"<uri>\"](part);\n        },\n        \n        \"<percentage>\": function(part){\n            return part.type == \"percentage\" || part == \"0\";\n        },\n\n        \"<border-width>\": function(part){\n            return this[\"<length>\"](part) || ValidationTypes.isLiteral(part, \"thin | medium | thick\");\n        },\n        \n        \"<border-style>\": function(part){\n            return ValidationTypes.isLiteral(part, \"none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset\");\n        },\n        \n        \"<margin-width>\": function(part){\n            return this[\"<length>\"](part) || this[\"<percentage>\"](part) || ValidationTypes.isLiteral(part, \"auto\");\n        },\n        \n        \"<padding-width>\": function(part){\n            return this[\"<length>\"](part) || this[\"<percentage>\"](part);\n        },\n        \n        \"<shape>\": function(part){\n            return part.type == \"function\" && (part.name == \"rect\" || part.name == \"inset-rect\");\n        },\n        \n        \"<time>\": function(part) {\n            return part.type == \"time\";\n        }\n    },\n    \n    complex: {\n\n        \"<bg-position>\": function(expression){\n            var types   = this,\n                result  = false,\n                numeric = \"<percentage> | <length>\",\n                xDir    = \"left | center | right\",\n                yDir    = \"top | center | bottom\",\n                part,\n                i, len;\n            \n                \n            if (ValidationTypes.isAny(expression, \"top | bottom\")) {\n                result = true;\n            } else {\n                \n                //must be two-part\n                if (ValidationTypes.isAny(expression, numeric)){\n                    if (expression.hasNext()){\n                        result = ValidationTypes.isAny(expression, numeric + \" | \" + yDir);\n                    }\n                } else if (ValidationTypes.isAny(expression, xDir)){\n                    if (expression.hasNext()){\n                        \n                        //two- or three-part\n                        if (ValidationTypes.isAny(expression, yDir)){\n                            result = true;\n                      \n                            ValidationTypes.isAny(expression, numeric);\n                            \n                        } else if (ValidationTypes.isAny(expression, numeric)){\n                        \n                            //could also be two-part, so check the next part\n                            if (ValidationTypes.isAny(expression, yDir)){                                    \n                                ValidationTypes.isAny(expression, numeric);                               \n                            }\n                            \n                            result = true;\n                        }\n                    }\n                }                                 \n            }            \n\n            \n            return result;\n        },\n\n        \"<bg-size>\": function(expression){\n            //<bg-size> = [ <length> | <percentage> | auto ]{1,2} | cover | contain\n            var types   = this,\n                result  = false,\n                numeric = \"<percentage> | <length> | auto\",\n                part,\n                i, len;      \n      \n            if (ValidationTypes.isAny(expression, \"cover | contain\")) {\n                result = true;\n            } else if (ValidationTypes.isAny(expression, numeric)) {\n                result = true;                \n                ValidationTypes.isAny(expression, numeric);\n            }\n            \n            return result;\n        },\n        \n        \"<repeat-style>\": function(expression){\n            //repeat-x | repeat-y | [repeat | space | round | no-repeat]{1,2}\n            var result  = false,\n                values  = \"repeat | space | round | no-repeat\",\n                part;\n            \n            if (expression.hasNext()){\n                part = expression.next();\n                \n                if (ValidationTypes.isLiteral(part, \"repeat-x | repeat-y\")) {\n                    result = true;                    \n                } else if (ValidationTypes.isLiteral(part, values)) {\n                    result = true;\n\n                    if (expression.hasNext() && ValidationTypes.isLiteral(expression.peek(), values)) {\n                        expression.next();\n                    }\n                }\n            }\n            \n            return result;\n            \n        },\n        \n        \"<shadow>\": function(expression) {\n            //inset? && [ <length>{2,4} && <color>? ]\n            var result  = false,\n                count   = 0,\n                inset   = false,\n                color   = false,\n                part;\n                \n            if (expression.hasNext()) {            \n                \n                if (ValidationTypes.isAny(expression, \"inset\")){\n                    inset = true;\n                }\n                \n                if (ValidationTypes.isAny(expression, \"<color>\")) {\n                    color = true;\n                }                \n                \n                while (ValidationTypes.isAny(expression, \"<length>\") && count < 4) {\n                    count++;\n                }\n                \n                \n                if (expression.hasNext()) {\n                    if (!color) {\n                        ValidationTypes.isAny(expression, \"<color>\");\n                    }\n                    \n                    if (!inset) {\n                        ValidationTypes.isAny(expression, \"inset\");\n                    }\n\n                }\n                \n                result = (count >= 2 && count <= 4);\n            \n            }\n            \n            return result;\n        },\n        \n        \"<x-one-radius>\": function(expression) {\n            //[ <length> | <percentage> ] [ <length> | <percentage> ]?\n            var result  = false,\n                count   = 0,\n                numeric = \"<length> | <percentage>\",\n                part;\n                \n            if (ValidationTypes.isAny(expression, numeric)){\n                result = true;\n                \n                ValidationTypes.isAny(expression, numeric);\n            }                \n            \n            return result;\n        }\n    }\n};\n\n\nparserlib.css = {\nColors              :Colors,    \nCombinator          :Combinator,                \nParser              :Parser,\nPropertyName        :PropertyName,\nPropertyValue       :PropertyValue,\nPropertyValuePart   :PropertyValuePart,\nMediaFeature        :MediaFeature,\nMediaQuery          :MediaQuery,\nSelector            :Selector,\nSelectorPart        :SelectorPart,\nSelectorSubPart     :SelectorSubPart,\nSpecificity         :Specificity,\nTokenStream         :TokenStream,\nTokens              :Tokens,\nValidationError     :ValidationError\n};\n})();\n/*global parserlib, Reporter*/\nvar CSSLint = (function(){\n\n    var rules      = [],\n        formatters = [],\n        api        = new parserlib.util.EventTarget();\n        \n    api.version = \"0.9.7\";\n\n    //-------------------------------------------------------------------------\n    // Rule Management\n    //-------------------------------------------------------------------------\n\n    /**\n     * Adds a new rule to the engine.\n     * @param {Object} rule The rule to add.\n     * @method addRule\n     */\n    api.addRule = function(rule){\n        rules.push(rule);\n        rules[rule.id] = rule;\n    };\n    api.clearRules = function(){\n        rules = [];\n    };\n    api.getRules = function(){\n        return [].concat(rules).sort(function(a,b){ \n            return a.id > b.id ? 1 : 0;\n        });\n    };\n\n    //-------------------------------------------------------------------------\n    // Formatters\n    //-------------------------------------------------------------------------\n\n    /**\n     * Adds a new formatter to the engine.\n     * @param {Object} formatter The formatter to add.\n     * @method addFormatter\n     */\n    api.addFormatter = function(formatter) {\n        // formatters.push(formatter);\n        formatters[formatter.id] = formatter;\n    };\n    api.getFormatter = function(formatId){\n        return formatters[formatId];\n    };\n    api.format = function(results, filename, formatId, options) {\n        var formatter = this.getFormatter(formatId),\n            result = null;\n            \n        if (formatter){\n            result = formatter.startFormat();\n            result += formatter.formatResults(results, filename, options || {});\n            result += formatter.endFormat();\n        }\n        \n        return result;\n    };\n    api.hasFormat = function(formatId){\n        return formatters.hasOwnProperty(formatId);\n    };\n\n    //-------------------------------------------------------------------------\n    // Verification\n    //-------------------------------------------------------------------------\n\n    /**\n     * Starts the verification process for the given CSS text.\n     * @param {String} text The CSS text to verify.\n     * @param {Object} ruleset (Optional) List of rules to apply. If null, then\n     *      all rules are used. If a rule has a value of 1 then it's a warning,\n     *      a value of 2 means it's an error.\n     * @return {Object} Results of the verification.\n     * @method verify\n     */\n    api.verify = function(text, ruleset){\n\n        var i       = 0,\n            len     = rules.length,\n            reporter,\n            lines,\n            report,\n            parser = new parserlib.css.Parser({ starHack: true, ieFilters: true,\n                                                underscoreHack: true, strict: false });\n\n        lines = text.replace(/\\n\\r?/g, \"$split$\").split('$split$');\n        \n        if (!ruleset){\n            ruleset = {};\n            while (i < len){\n                ruleset[rules[i++].id] = 1;    //by default, everything is a warning\n            }\n        }\n        \n        reporter = new Reporter(lines, ruleset);\n        \n        ruleset.errors = 2;       //always report parsing errors as errors\n        for (i in ruleset){\n            if(ruleset.hasOwnProperty(i)){\n                if (rules[i]){\n                    rules[i].init(parser, reporter);\n                }\n            }\n        }\n\n\n        //capture most horrible error type\n        try {\n            parser.parse(text);\n        } catch (ex) {\n            reporter.error(\"Fatal error, cannot continue: \" + ex.message, ex.line, ex.col, {});\n        }\n\n        report = {\n            messages    : reporter.messages,\n            stats       : reporter.stats\n        };\n        \n        //sort by line numbers, rollups at the bottom\n        report.messages.sort(function (a, b){\n            if (a.rollup && !b.rollup){\n                return 1;\n            } else if (!a.rollup && b.rollup){\n                return -1;\n            } else {\n                return a.line - b.line;\n            }\n        });        \n        \n        return report;\n    };\n\n    //-------------------------------------------------------------------------\n    // Publish the API\n    //-------------------------------------------------------------------------\n\n    return api;\n\n})();\n/**\n * An instance of Report is used to report results of the\n * verification back to the main API.\n * @class Reporter\n * @constructor\n * @param {String[]} lines The text lines of the source.\n * @param {Object} ruleset The set of rules to work with, including if\n *      they are errors or warnings.\n */\nfunction Reporter(lines, ruleset){\n\n    /**\n     * List of messages being reported.\n     * @property messages\n     * @type String[]\n     */\n    this.messages = [];\n    this.stats = [];\n    this.lines = lines;\n    this.ruleset = ruleset;\n}\n\nReporter.prototype = {\n\n    //restore constructor\n    constructor: Reporter,\n\n    /**\n     * Report an error.\n     * @param {String} message The message to store.\n     * @param {int} line The line number.\n     * @param {int} col The column number.\n     * @param {Object} rule The rule this message relates to.\n     * @method error\n     */\n    error: function(message, line, col, rule){\n        this.messages.push({\n            type    : \"error\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule || {}\n        });\n    },\n\n    /**\n     * Report an warning.\n     * @param {String} message The message to store.\n     * @param {int} line The line number.\n     * @param {int} col The column number.\n     * @param {Object} rule The rule this message relates to.\n     * @method warn\n     * @deprecated Use report instead.\n     */\n    warn: function(message, line, col, rule){\n        this.report(message, line, col, rule);\n    },\n\n    /**\n     * Report an issue.\n     * @param {String} message The message to store.\n     * @param {int} line The line number.\n     * @param {int} col The column number.\n     * @param {Object} rule The rule this message relates to.\n     * @method report\n     */\n    report: function(message, line, col, rule){\n        this.messages.push({\n            type    : this.ruleset[rule.id] == 2 ? \"error\" : \"warning\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule\n        });\n    },\n\n    /**\n     * Report some informational text.\n     * @param {String} message The message to store.\n     * @param {int} line The line number.\n     * @param {int} col The column number.\n     * @param {Object} rule The rule this message relates to.\n     * @method info\n     */\n    info: function(message, line, col, rule){\n        this.messages.push({\n            type    : \"info\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule\n        });\n    },\n\n    /**\n     * Report some rollup error information.\n     * @param {String} message The message to store.\n     * @param {Object} rule The rule this message relates to.\n     * @method rollupError\n     */\n    rollupError: function(message, rule){\n        this.messages.push({\n            type    : \"error\",\n            rollup  : true,\n            message : message,\n            rule    : rule\n        });\n    },\n\n    /**\n     * Report some rollup warning information.\n     * @param {String} message The message to store.\n     * @param {Object} rule The rule this message relates to.\n     * @method rollupWarn\n     */\n    rollupWarn: function(message, rule){\n        this.messages.push({\n            type    : \"warning\",\n            rollup  : true,\n            message : message,\n            rule    : rule\n        });\n    },\n\n    /**\n     * Report a statistic.\n     * @param {String} name The name of the stat to store.\n     * @param {Variant} value The value of the stat.\n     * @method stat\n     */\n    stat: function(name, value){\n        this.stats[name] = value;\n    }\n};\n\n//expose for testing purposes\nCSSLint._Reporter = Reporter;\n\n/*\n * Utility functions that make life easier.\n */\nCSSLint.Util = {\n    /*\n     * Adds all properties from supplier onto receiver,\n     * overwriting if the same name already exists on\n     * reciever.\n     * @param {Object} The object to receive the properties.\n     * @param {Object} The object to provide the properties.\n     * @return {Object} The receiver\n     */\n    mix: function(receiver, supplier){\n        var prop;\n\n        for (prop in supplier){\n            if (supplier.hasOwnProperty(prop)){\n                receiver[prop] = supplier[prop];\n            }\n        }\n\n        return prop;\n    },\n\n    /*\n     * Polyfill for array indexOf() method.\n     * @param {Array} values The array to search.\n     * @param {Variant} value The value to search for.\n     * @return {int} The index of the value if found, -1 if not.\n     */\n    indexOf: function(values, value){\n        if (values.indexOf){\n            return values.indexOf(value);\n        } else {\n            for (var i=0, len=values.length; i < len; i++){\n                if (values[i] === value){\n                    return i;\n                }\n            }\n            return -1;\n        }\n    },\n\n    /*\n     * Polyfill for array forEach() method.\n     * @param {Array} values The array to operate on.\n     * @param {Function} func The function to call on each item.\n     * @return {void}\n     */\n    forEach: function(values, func) {\n        if (values.forEach){\n            return values.forEach(func);\n        } else {\n            for (var i=0, len=values.length; i < len; i++){\n                func(values[i], i, values);\n            }\n        }\n    }\n};\n/*\n * Rule: Don't use adjoining classes (.foo.bar).\n */\nCSSLint.addRule({\n\n    //rule information\n    id: \"adjoining-classes\",\n    name: \"Disallow adjoining classes\",\n    desc: \"Don't use adjoining classes.\",\n    browsers: \"IE6\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                classCount,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        classCount = 0;\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type == \"class\"){\n                                classCount++;\n                            }\n                            if (classCount > 1){\n                                reporter.report(\"Don't use adjoining classes.\", part.line, part.col, rule);\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\n\n/*\n * Rule: Don't use width or height when using padding or border. \n */\nCSSLint.addRule({\n\n    //rule information\n    id: \"box-model\",\n    name: \"Beware of broken box size\",\n    desc: \"Don't use width or height when using padding or border.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            widthProperties = {\n                border: 1,\n                \"border-left\": 1,\n                \"border-right\": 1,\n                padding: 1,\n                \"padding-left\": 1,\n                \"padding-right\": 1\n            },\n            heightProperties = {\n                border: 1,\n                \"border-bottom\": 1,\n                \"border-top\": 1,\n                padding: 1,\n                \"padding-bottom\": 1,\n                \"padding-top\": 1\n            },\n            properties;\n\n        function startRule(){\n            properties = {};\n        }\n\n        function endRule(){\n            var prop;\n            if (properties.height){\n                for (prop in heightProperties){\n                    if (heightProperties.hasOwnProperty(prop) && properties[prop]){\n                    \n                        //special case for padding\n                        if (!(prop == \"padding\" && properties[prop].value.parts.length === 2 && properties[prop].value.parts[0].value === 0)){\n                            reporter.report(\"Using height with \" + prop + \" can sometimes make elements larger than you expect.\", properties[prop].line, properties[prop].col, rule);\n                        }\n                    }\n                }\n            }\n\n            if (properties.width){\n                for (prop in widthProperties){\n                    if (widthProperties.hasOwnProperty(prop) && properties[prop]){\n\n                        if (!(prop == \"padding\" && properties[prop].value.parts.length === 2 && properties[prop].value.parts[1].value === 0)){\n                            reporter.report(\"Using width with \" + prop + \" can sometimes make elements larger than you expect.\", properties[prop].line, properties[prop].col, rule);\n                        }\n                    }\n                }\n            }        \n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule); \n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n            \n            if (heightProperties[name] || widthProperties[name]){\n                if (!/^0\\S*$/.test(event.value) && !(name == \"border\" && event.value == \"none\")){\n                    properties[name] = { line: event.property.line, col: event.property.col, value: event.value };\n                }\n            } else {\n                if (name == \"width\" || name == \"height\"){\n                    properties[name] = 1;\n                }\n            }\n            \n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);         \n    }\n\n});\n\n/*\n * Rule: box-sizing doesn't work in IE6 and IE7.\n */\nCSSLint.addRule({\n\n    //rule information\n    id: \"box-sizing\",\n    name: \"Disallow use of box-sizing\",\n    desc: \"The box-sizing properties isn't supported in IE6 and IE7.\",\n    browsers: \"IE6, IE7\",\n    tags: [\"Compatibility\"],\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n   \n            if (name == \"box-sizing\"){\n                reporter.report(\"The box-sizing property isn't supported in IE6 and IE7.\", event.line, event.col, rule);\n            }\n        });       \n    }\n\n});\n/*global CSSLint*/ \nCSSLint.addRule({\n\n    //rule information\n    id: \"compatible-vendor-prefixes\",\n    name: \"Require compatible vendor prefixes\",\n    desc: \"Include all compatible vendor prefixes to reach a wider range of users.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function (parser, reporter) {\n        var rule = this,\n            compatiblePrefixes,\n            properties,\n            prop,\n            variations,\n            prefixed,\n            i,\n            len,\n            arrayPush = Array.prototype.push,\n            applyTo = [];\n\n        // See http://peter.sh/experiments/vendor-prefixed-css-property-overview/ for details\n        compatiblePrefixes = {\n            \"animation\"                  : \"webkit moz ms\",\n            \"animation-delay\"            : \"webkit moz ms\",\n            \"animation-direction\"        : \"webkit moz ms\",\n            \"animation-duration\"         : \"webkit moz ms\",\n            \"animation-fill-mode\"        : \"webkit moz ms\",\n            \"animation-iteration-count\"  : \"webkit moz ms\",\n            \"animation-name\"             : \"webkit moz ms\",\n            \"animation-play-state\"       : \"webkit moz ms\",\n            \"animation-timing-function\"  : \"webkit moz ms\",\n            \"appearance\"                 : \"webkit moz\",\n            \"border-end\"                 : \"webkit moz\",\n            \"border-end-color\"           : \"webkit moz\",\n            \"border-end-style\"           : \"webkit moz\",\n            \"border-end-width\"           : \"webkit moz\",\n            \"border-image\"               : \"webkit moz o\",\n            \"border-radius\"              : \"webkit moz\",\n            \"border-start\"               : \"webkit moz\",\n            \"border-start-color\"         : \"webkit moz\",\n            \"border-start-style\"         : \"webkit moz\",\n            \"border-start-width\"         : \"webkit moz\",\n            \"box-align\"                  : \"webkit moz ms\",\n            \"box-direction\"              : \"webkit moz ms\",\n            \"box-flex\"                   : \"webkit moz ms\",\n            \"box-lines\"                  : \"webkit ms\",\n            \"box-ordinal-group\"          : \"webkit moz ms\",\n            \"box-orient\"                 : \"webkit moz ms\",\n            \"box-pack\"                   : \"webkit moz ms\",\n            \"box-sizing\"                 : \"webkit moz\",\n            \"box-shadow\"                 : \"webkit moz\",\n            \"column-count\"               : \"webkit moz ms\",\n            \"column-gap\"                 : \"webkit moz ms\",\n            \"column-rule\"                : \"webkit moz ms\",\n            \"column-rule-color\"          : \"webkit moz ms\",\n            \"column-rule-style\"          : \"webkit moz ms\",\n            \"column-rule-width\"          : \"webkit moz ms\",\n            \"column-width\"               : \"webkit moz ms\",\n            \"hyphens\"                    : \"epub moz\",\n            \"line-break\"                 : \"webkit ms\",\n            \"margin-end\"                 : \"webkit moz\",\n            \"margin-start\"               : \"webkit moz\",\n            \"marquee-speed\"              : \"webkit wap\",\n            \"marquee-style\"              : \"webkit wap\",\n            \"padding-end\"                : \"webkit moz\",\n            \"padding-start\"              : \"webkit moz\",\n            \"tab-size\"                   : \"moz o\",\n            \"text-size-adjust\"           : \"webkit ms\",\n            \"transform\"                  : \"webkit moz ms o\",\n            \"transform-origin\"           : \"webkit moz ms o\",\n            \"transition\"                 : \"webkit moz o ms\",\n            \"transition-delay\"           : \"webkit moz o ms\",\n            \"transition-duration\"        : \"webkit moz o ms\",\n            \"transition-property\"        : \"webkit moz o ms\",\n            \"transition-timing-function\" : \"webkit moz o ms\",\n            \"user-modify\"                : \"webkit moz\",\n            \"user-select\"                : \"webkit moz ms\",\n            \"word-break\"                 : \"epub ms\",\n            \"writing-mode\"               : \"epub ms\"\n        };\n\n\n        for (prop in compatiblePrefixes) {\n            if (compatiblePrefixes.hasOwnProperty(prop)) {\n                variations = [];\n                prefixed = compatiblePrefixes[prop].split(' ');\n                for (i = 0, len = prefixed.length; i < len; i++) {\n                    variations.push('-' + prefixed[i] + '-' + prop);\n                }\n                compatiblePrefixes[prop] = variations;\n                arrayPush.apply(applyTo, variations);\n            }\n        }\n        parser.addListener(\"startrule\", function () {\n            properties = [];\n        });\n\n        parser.addListener(\"property\", function (event) {\n            var name = event.property;\n            if (CSSLint.Util.indexOf(applyTo, name.text) > -1) {\n                properties.push(name);\n            }\n        });\n\n        parser.addListener(\"endrule\", function (event) {\n            if (!properties.length) {\n                return;\n            }\n\n            var propertyGroups = {},\n                i,\n                len,\n                name,\n                prop,\n                variations,\n                value,\n                full,\n                actual,\n                item,\n                propertiesSpecified;\n\n            for (i = 0, len = properties.length; i < len; i++) {\n                name = properties[i];\n\n                for (prop in compatiblePrefixes) {\n                    if (compatiblePrefixes.hasOwnProperty(prop)) {\n                        variations = compatiblePrefixes[prop];\n                        if (CSSLint.Util.indexOf(variations, name.text) > -1) {\n                            if (!propertyGroups[prop]) {\n                                propertyGroups[prop] = {\n                                    full : variations.slice(0),\n                                    actual : [],\n                                    actualNodes: []\n                                };\n                            }\n                            if (CSSLint.Util.indexOf(propertyGroups[prop].actual, name.text) === -1) {\n                                propertyGroups[prop].actual.push(name.text);\n                                propertyGroups[prop].actualNodes.push(name);\n                            }\n                        }\n                    }\n                }\n            }\n\n            for (prop in propertyGroups) {\n                if (propertyGroups.hasOwnProperty(prop)) {\n                    value = propertyGroups[prop];\n                    full = value.full;\n                    actual = value.actual;\n\n                    if (full.length > actual.length) {\n                        for (i = 0, len = full.length; i < len; i++) {\n                            item = full[i];\n                            if (CSSLint.Util.indexOf(actual, item) === -1) {\n                                propertiesSpecified = (actual.length === 1) ? actual[0] : (actual.length == 2) ? actual.join(\" and \") : actual.join(\", \");\n                                reporter.report(\"The property \" + item + \" is compatible with \" + propertiesSpecified + \" and should be included as well.\", value.actualNodes[0].line, value.actualNodes[0].col, rule); \n                            }\n                        }\n\n                    }\n                }\n            }\n        });\n    }\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"display-property-grouping\",\n    name: \"Require properties appropriate for display\",\n    desc: \"Certain properties shouldn't be used with certain display property values.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        var propertiesToCheck = {\n                display: 1,\n                \"float\": \"none\",\n                height: 1,\n                width: 1,\n                margin: 1,\n                \"margin-left\": 1,\n                \"margin-right\": 1,\n                \"margin-bottom\": 1,\n                \"margin-top\": 1,\n                padding: 1,\n                \"padding-left\": 1,\n                \"padding-right\": 1,\n                \"padding-bottom\": 1,\n                \"padding-top\": 1,\n                \"vertical-align\": 1\n            },\n            properties;\n\n        function reportProperty(name, display, msg){\n            if (properties[name]){\n                if (typeof propertiesToCheck[name] != \"string\" || properties[name].value.toLowerCase() != propertiesToCheck[name]){\n                    reporter.report(msg || name + \" can't be used with display: \" + display + \".\", properties[name].line, properties[name].col, rule);\n                }\n            }\n        }\n        \n        function startRule(){\n            properties = {};\n        }\n\n        function endRule(){\n\n            var display = properties.display ? properties.display.value : null;\n            if (display){\n                switch(display){\n\n                    case \"inline\":\n                        //height, width, margin-top, margin-bottom, float should not be used with inline\n                        reportProperty(\"height\", display);\n                        reportProperty(\"width\", display);\n                        reportProperty(\"margin\", display);\n                        reportProperty(\"margin-top\", display);\n                        reportProperty(\"margin-bottom\", display);              \n                        reportProperty(\"float\", display, \"display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug).\");\n                        break;\n\n                    case \"block\":\n                        //vertical-align should not be used with block\n                        reportProperty(\"vertical-align\", display);\n                        break;\n\n                    case \"inline-block\":\n                        //float should not be used with inline-block\n                        reportProperty(\"float\", display);\n                        break;\n\n                    default:\n                        //margin, float should not be used with table\n                        if (display.indexOf(\"table-\") === 0){\n                            reportProperty(\"margin\", display);\n                            reportProperty(\"margin-left\", display);\n                            reportProperty(\"margin-right\", display);\n                            reportProperty(\"margin-top\", display);\n                            reportProperty(\"margin-bottom\", display);\n                            reportProperty(\"float\", display);\n                        }\n\n                        //otherwise do nothing\n                }\n            }\n          \n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startpage\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (propertiesToCheck[name]){\n                properties[name] = { value: event.value.text, line: event.property.line, col: event.property.col };                    \n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endpage\", endRule);\n\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"duplicate-background-images\",\n    name: \"Disallow duplicate background images\",\n    desc: \"Every background-image should be unique. Use a common class for e.g. sprites.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            stack = {};\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text,\n                value = event.value,\n                i, len;\n\n            if (name.match(/background/i)) {\n                for (i=0, len=value.parts.length; i < len; i++) {\n                    if (value.parts[i].type == 'uri') {\n                        if (typeof stack[value.parts[i].uri] === 'undefined') {\n                            stack[value.parts[i].uri] = event;\n                        }\n                        else {\n                            reporter.report(\"Background image '\" + value.parts[i].uri + \"' was used multiple times, first declared at line \" + stack[value.parts[i].uri].line + \", col \" + stack[value.parts[i].uri].col + \".\", event.line, event.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n    }\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"duplicate-properties\",\n    name: \"Disallow duplicate properties\",\n    desc: \"Duplicate properties must appear one after the other.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            properties,\n            lastProperty;            \n            \n        function startRule(event){\n            properties = {};        \n        }\n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);        \n        \n        parser.addListener(\"property\", function(event){\n            var property = event.property,\n                name = property.text.toLowerCase();\n            \n            if (properties[name] && (lastProperty != name || properties[name] == event.value.text)){\n                reporter.report(\"Duplicate property '\" + event.property + \"' found.\", event.line, event.col, rule);\n            }\n            \n            properties[name] = event.value.text;\n            lastProperty = name;\n                        \n        });\n            \n        \n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"empty-rules\",\n    name: \"Disallow empty rules\",\n    desc: \"Rules without any properties specified should be removed.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n        parser.addListener(\"startrule\", function(){\n            count=0;\n        });\n\n        parser.addListener(\"property\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endrule\", function(event){\n            var selectors = event.selectors;\n            if (count === 0){\n                reporter.report(\"Rule is empty.\", selectors[0].line, selectors[0].col, rule);\n            }\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"errors\",\n    name: \"Parsing Errors\",\n    desc: \"This rule looks for recoverable syntax errors.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"error\", function(event){\n            reporter.error(event.message, event.line, event.col, rule);\n        });\n\n    }\n\n});\nCSSLint.addRule({\n\n    //rule information\n    id: \"fallback-colors\",\n    name: \"Require fallback colors\",\n    desc: \"For older browsers that don't support RGBA, HSL, or HSLA, provide a fallback color.\",\n    browsers: \"IE6,IE7,IE8\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            lastProperty,\n            propertiesToCheck = {\n                color: 1,\n                background: 1,\n                \"background-color\": 1                \n            },\n            properties;\n        \n        function startRule(event){\n            properties = {};    \n            lastProperty = null;    \n        }\n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);        \n        \n        parser.addListener(\"property\", function(event){\n            var property = event.property,\n                name = property.text.toLowerCase(),\n                parts = event.value.parts,\n                i = 0, \n                colorType = \"\",\n                len = parts.length;                \n                        \n            if(propertiesToCheck[name]){\n                while(i < len){\n                    if (parts[i].type == \"color\"){\n                        if (\"alpha\" in parts[i] || \"hue\" in parts[i]){\n                            \n                            if (/([^\\)]+)\\(/.test(parts[i])){\n                                colorType = RegExp.$1.toUpperCase();\n                            }\n                            \n                            if (!lastProperty || (lastProperty.property.text.toLowerCase() != name || lastProperty.colorType != \"compat\")){\n                                reporter.report(\"Fallback \" + name + \" (hex or RGB) should precede \" + colorType + \" \" + name + \".\", event.line, event.col, rule);\n                            }\n                        } else {\n                            event.colorType = \"compat\";\n                        }\n                    }\n                    \n                    i++;\n                }\n            }\n\n            lastProperty = event;\n        });        \n         \n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"floats\",\n    name: \"Disallow too many floats\",\n    desc: \"This rule tests if the float property is used too many times\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n        var count = 0;\n\n        //count how many times \"float\" is used\n        parser.addListener(\"property\", function(event){\n            if (event.property.text.toLowerCase() == \"float\" &&\n                    event.value.text.toLowerCase() != \"none\"){\n                count++;\n            }\n        });\n\n        //report the results\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"floats\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many floats (\" + count + \"), you're probably using them for layout. Consider using a grid system instead.\", rule);\n            }\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"font-faces\",\n    name: \"Don't use too many web fonts\",\n    desc: \"Too many different web fonts in the same stylesheet.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n\n        parser.addListener(\"startfontface\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n            if (count > 5){\n                reporter.rollupWarn(\"Too many @font-face declarations (\" + count + \").\", rule);\n            }\n        });\n    }\n\n});\n\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"font-sizes\",\n    name: \"Disallow too many font sizes\",\n    desc: \"Checks the number of font-size declarations.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n        //check for use of \"font-size\"\n        parser.addListener(\"property\", function(event){\n            if (event.property == \"font-size\"){\n                count++;\n            }\n        });\n\n        //report the results\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"font-sizes\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many font-size declarations (\" + count + \"), abstraction needed.\", rule);\n            }\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"gradients\",\n    name: \"Require all gradient definitions\",\n    desc: \"When using a vendor-prefixed gradient, make sure to use them all.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            gradients;\n\n        parser.addListener(\"startrule\", function(){\n            gradients = {\n                moz: 0,\n                webkit: 0,\n                oldWebkit: 0,\n                ms: 0,\n                o: 0\n            };\n        });\n\n        parser.addListener(\"property\", function(event){\n\n            if (/\\-(moz|ms|o|webkit)(?:\\-(?:linear|radial))\\-gradient/i.test(event.value)){\n                gradients[RegExp.$1] = 1;\n            } else if (/\\-webkit\\-gradient/i.test(event.value)){\n                gradients.oldWebkit = 1;\n            }\n\n        });\n\n        parser.addListener(\"endrule\", function(event){\n            var missing = [];\n\n            if (!gradients.moz){\n                missing.push(\"Firefox 3.6+\");\n            }\n\n            if (!gradients.webkit){\n                missing.push(\"Webkit (Safari 5+, Chrome)\");\n            }\n            \n            if (!gradients.oldWebkit){\n                missing.push(\"Old Webkit (Safari 4+, Chrome)\");\n            }\n\n            if (!gradients.ms){\n                missing.push(\"Internet Explorer 10+\");\n            }\n\n            if (!gradients.o){\n                missing.push(\"Opera 11.1+\");\n            }\n\n            if (missing.length && missing.length < 5){            \n                reporter.report(\"Missing vendor-prefixed CSS gradients for \" + missing.join(\", \") + \".\", event.selectors[0].line, event.selectors[0].col, rule); \n            }\n\n        });\n\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"ids\",\n    name: \"Disallow IDs in selectors\",\n    desc: \"Selectors should not contain IDs.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                idCount,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                idCount = 0;\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type == \"id\"){\n                                idCount++;\n                            }\n                        }\n                    }\n                }\n\n                if (idCount == 1){\n                    reporter.report(\"Don't use IDs in selectors.\", selector.line, selector.col, rule);\n                } else if (idCount > 1){\n                    reporter.report(idCount + \" IDs in the selector, really?\", selector.line, selector.col, rule);\n                }\n            }\n\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"import\",\n    name: \"Disallow @import\",\n    desc: \"Don't use @import, use <link> instead.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n        \n        parser.addListener(\"import\", function(event){        \n            reporter.report(\"@import prevents parallel downloads, use <link> instead.\", event.line, event.col, rule);\n        });\n\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"important\",\n    name: \"Disallow !important\",\n    desc: \"Be careful when using !important declaration\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n        //warn that important is used and increment the declaration counter\n        parser.addListener(\"property\", function(event){\n            if (event.important === true){\n                count++;\n                reporter.report(\"Use of !important\", event.line, event.col, rule);\n            }\n        });\n\n        //if there are more than 10, show an error\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"important\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many !important declarations (\" + count + \"), try to use less than 10 to avoid specifity issues.\", rule);\n            }\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"known-properties\",\n    name: \"Require use of known properties\",\n    desc: \"Properties should be known (listed in CSS specification) or be a vendor-prefixed property.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            properties = {\n\n                \"alignment-adjust\": 1,\n                \"alignment-baseline\": 1,\n                \"animation\": 1,\n                \"animation-delay\": 1,\n                \"animation-direction\": 1,\n                \"animation-duration\": 1,\n                \"animation-fill-mode\": 1,\n                \"animation-iteration-count\": 1,\n                \"animation-name\": 1,\n                \"animation-play-state\": 1,\n                \"animation-timing-function\": 1,\n                \"appearance\": 1,\n                \"azimuth\": 1,\n                \"backface-visibility\": 1,\n                \"background\": 1,\n                \"background-attachment\": 1,\n                \"background-break\": 1,\n                \"background-clip\": 1,\n                \"background-color\": 1,\n                \"background-image\": 1,\n                \"background-origin\": 1,\n                \"background-position\": 1,\n                \"background-repeat\": 1,\n                \"background-size\": 1,\n                \"baseline-shift\": 1,\n                \"binding\": 1,\n                \"bleed\": 1,\n                \"bookmark-label\": 1,\n                \"bookmark-level\": 1,\n                \"bookmark-state\": 1,\n                \"bookmark-target\": 1,\n                \"border\": 1,\n                \"border-bottom\": 1,\n                \"border-bottom-color\": 1,\n                \"border-bottom-left-radius\": 1,\n                \"border-bottom-right-radius\": 1,\n                \"border-bottom-style\": 1,\n                \"border-bottom-width\": 1,\n                \"border-collapse\": 1,\n                \"border-color\": 1,\n                \"border-image\": 1,\n                \"border-image-outset\": 1,\n                \"border-image-repeat\": 1,\n                \"border-image-slice\": 1,\n                \"border-image-source\": 1,\n                \"border-image-width\": 1,\n                \"border-left\": 1,\n                \"border-left-color\": 1,\n                \"border-left-style\": 1,\n                \"border-left-width\": 1,\n                \"border-radius\": 1,\n                \"border-right\": 1,\n                \"border-right-color\": 1,\n                \"border-right-style\": 1,\n                \"border-right-width\": 1,\n                \"border-spacing\": 1,\n                \"border-style\": 1,\n                \"border-top\": 1,\n                \"border-top-color\": 1,\n                \"border-top-left-radius\": 1,\n                \"border-top-right-radius\": 1,\n                \"border-top-style\": 1,\n                \"border-top-width\": 1,\n                \"border-width\": 1,\n                \"bottom\": 1, \n                \"box-align\": 1,\n                \"box-decoration-break\": 1,\n                \"box-direction\": 1,\n                \"box-flex\": 1,\n                \"box-flex-group\": 1,\n                \"box-lines\": 1,\n                \"box-ordinal-group\": 1,\n                \"box-orient\": 1,\n                \"box-pack\": 1,\n                \"box-shadow\": 1,\n                \"box-sizing\": 1,\n                \"break-after\": 1,\n                \"break-before\": 1,\n                \"break-inside\": 1,\n                \"caption-side\": 1,\n                \"clear\": 1,\n                \"clip\": 1,\n                \"color\": 1,\n                \"color-profile\": 1,\n                \"column-count\": 1,\n                \"column-fill\": 1,\n                \"column-gap\": 1,\n                \"column-rule\": 1,\n                \"column-rule-color\": 1,\n                \"column-rule-style\": 1,\n                \"column-rule-width\": 1,\n                \"column-span\": 1,\n                \"column-width\": 1,\n                \"columns\": 1,\n                \"content\": 1,\n                \"counter-increment\": 1,\n                \"counter-reset\": 1,\n                \"crop\": 1,\n                \"cue\": 1,\n                \"cue-after\": 1,\n                \"cue-before\": 1,\n                \"cursor\": 1,\n                \"direction\": 1,\n                \"display\": 1,\n                \"dominant-baseline\": 1,\n                \"drop-initial-after-adjust\": 1,\n                \"drop-initial-after-align\": 1,\n                \"drop-initial-before-adjust\": 1,\n                \"drop-initial-before-align\": 1,\n                \"drop-initial-size\": 1,\n                \"drop-initial-value\": 1,\n                \"elevation\": 1,\n                \"empty-cells\": 1,\n                \"fit\": 1,\n                \"fit-position\": 1,\n                \"float\": 1,                \n                \"float-offset\": 1,\n                \"font\": 1,\n                \"font-family\": 1,\n                \"font-size\": 1,\n                \"font-size-adjust\": 1,\n                \"font-stretch\": 1,\n                \"font-style\": 1,\n                \"font-variant\": 1,\n                \"font-weight\": 1,\n                \"grid-columns\": 1,\n                \"grid-rows\": 1,\n                \"hanging-punctuation\": 1,\n                \"height\": 1,\n                \"hyphenate-after\": 1,\n                \"hyphenate-before\": 1,\n                \"hyphenate-character\": 1,\n                \"hyphenate-lines\": 1,\n                \"hyphenate-resource\": 1,\n                \"hyphens\": 1,\n                \"icon\": 1,\n                \"image-orientation\": 1,\n                \"image-rendering\": 1,\n                \"image-resolution\": 1,\n                \"inline-box-align\": 1,\n                \"left\": 1,\n                \"letter-spacing\": 1,\n                \"line-height\": 1,\n                \"line-stacking\": 1,\n                \"line-stacking-ruby\": 1,\n                \"line-stacking-shift\": 1,\n                \"line-stacking-strategy\": 1,\n                \"list-style\": 1,\n                \"list-style-image\": 1,\n                \"list-style-position\": 1,\n                \"list-style-type\": 1,\n                \"margin\": 1,\n                \"margin-bottom\": 1,\n                \"margin-left\": 1,\n                \"margin-right\": 1,\n                \"margin-top\": 1,\n                \"mark\": 1,\n                \"mark-after\": 1,\n                \"mark-before\": 1,\n                \"marks\": 1,\n                \"marquee-direction\": 1,\n                \"marquee-play-count\": 1,\n                \"marquee-speed\": 1,\n                \"marquee-style\": 1,\n                \"max-height\": 1,\n                \"max-width\": 1,\n                \"min-height\": 1,\n                \"min-width\": 1,\n                \"move-to\": 1,\n                \"nav-down\": 1,\n                \"nav-index\": 1,\n                \"nav-left\": 1,\n                \"nav-right\": 1,\n                \"nav-up\": 1,\n                \"opacity\": 1,\n                \"orphans\": 1,\n                \"outline\": 1,\n                \"outline-color\": 1,\n                \"outline-offset\": 1,\n                \"outline-style\": 1,\n                \"outline-width\": 1,\n                \"overflow\": 1,\n                \"overflow-style\": 1,\n                \"overflow-x\": 1,\n                \"overflow-y\": 1,\n                \"padding\": 1,\n                \"padding-bottom\": 1,\n                \"padding-left\": 1,\n                \"padding-right\": 1,\n                \"padding-top\": 1,\n                \"page\": 1,\n                \"page-break-after\": 1,\n                \"page-break-before\": 1,\n                \"page-break-inside\": 1,\n                \"page-policy\": 1,\n                \"pause\": 1,\n                \"pause-after\": 1,\n                \"pause-before\": 1,\n                \"perspective\": 1,\n                \"perspective-origin\": 1,\n                \"phonemes\": 1,\n                \"pitch\": 1,\n                \"pitch-range\": 1,\n                \"play-during\": 1,\n                \"position\": 1,\n                \"presentation-level\": 1,\n                \"punctuation-trim\": 1,\n                \"quotes\": 1,\n                \"rendering-intent\": 1,\n                \"resize\": 1,\n                \"rest\": 1,\n                \"rest-after\": 1,\n                \"rest-before\": 1,\n                \"richness\": 1,\n                \"right\": 1,\n                \"rotation\": 1,\n                \"rotation-point\": 1,\n                \"ruby-align\": 1,\n                \"ruby-overhang\": 1,\n                \"ruby-position\": 1,\n                \"ruby-span\": 1,\n                \"size\": 1,\n                \"speak\": 1,\n                \"speak-header\": 1,\n                \"speak-numeral\": 1,\n                \"speak-punctuation\": 1,\n                \"speech-rate\": 1,\n                \"stress\": 1,\n                \"string-set\": 1,\n                \"table-layout\": 1,\n                \"target\": 1,\n                \"target-name\": 1,\n                \"target-new\": 1,\n                \"target-position\": 1,\n                \"text-align\": 1,\n                \"text-align-last\": 1,\n                \"text-decoration\": 1,\n                \"text-emphasis\": 1,\n                \"text-height\": 1,\n                \"text-indent\": 1,\n                \"text-justify\": 1,\n                \"text-outline\": 1,\n                \"text-shadow\": 1,\n                \"text-transform\": 1,\n                \"text-wrap\": 1,\n                \"top\": 1,\n                \"transform\": 1,\n                \"transform-origin\": 1,\n                \"transform-style\": 1,\n                \"transition\": 1,\n                \"transition-delay\": 1,\n                \"transition-duration\": 1,\n                \"transition-property\": 1,\n                \"transition-timing-function\": 1,\n                \"unicode-bidi\": 1,\n                \"user-modify\": 1,\n                \"user-select\": 1,\n                \"vertical-align\": 1,\n                \"visibility\": 1,\n                \"voice-balance\": 1,\n                \"voice-duration\": 1,\n                \"voice-family\": 1,\n                \"voice-pitch\": 1,\n                \"voice-pitch-range\": 1,\n                \"voice-rate\": 1,\n                \"voice-stress\": 1,\n                \"voice-volume\": 1,\n                \"volume\": 1,\n                \"white-space\": 1,\n                \"white-space-collapse\": 1,\n                \"widows\": 1,\n                \"width\": 1,\n                \"word-break\": 1,\n                \"word-spacing\": 1,\n                \"word-wrap\": 1,\n                \"z-index\": 1,\n                \n                //IE\n                \"filter\": 1,\n                \"zoom\": 1,\n                \n                //@font-face\n                \"src\": 1\n            };\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (event.invalid) {\n                reporter.report(event.invalid.message, event.line, event.col, rule);\n            }\n            //if (!properties[name] && name.charAt(0) != \"-\"){\n            //    reporter.error(\"Unknown property '\" + event.property + \"'.\", event.line, event.col, rule);\n            //}\n\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"outline-none\",\n    name: \"Disallow outline: none\",\n    desc: \"Use of outline: none or outline: 0 should be limited to :focus rules.\",\n    browsers: \"All\",\n    tags: [\"Accessibility\"],\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            lastRule;\n\n        function startRule(event){\n            if (event.selectors){\n                lastRule = {\n                    line: event.line,\n                    col: event.col,\n                    selectors: event.selectors,\n                    propCount: 0,\n                    outline: false\n                };\n            } else {\n                lastRule = null;\n            }\n        }\n        \n        function endRule(event){\n            if (lastRule){\n                if (lastRule.outline){\n                    if (lastRule.selectors.toString().toLowerCase().indexOf(\":focus\") == -1){\n                        reporter.report(\"Outlines should only be modified using :focus.\", lastRule.line, lastRule.col, rule);\n                    } else if (lastRule.propCount == 1) {\n                        reporter.report(\"Outlines shouldn't be hidden unless other visual changes are made.\", lastRule.line, lastRule.col, rule);                        \n                    }\n                }\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule); \n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase(),\n                value = event.value;                \n                \n            if (lastRule){\n                lastRule.propCount++;\n                if (name == \"outline\" && (value == \"none\" || value == \"0\")){\n                    lastRule.outline = true;\n                }            \n            }\n            \n        });\n        \n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule); \n\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"overqualified-elements\",\n    name: \"Disallow overqualified elements\",\n    desc: \"Don't use classes or IDs with elements (a.foo or a#foo).\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            classes = {};\n            \n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (part.elementName && modifier.type == \"id\"){\n                                reporter.report(\"Element (\" + part + \") is overqualified, just use \" + modifier + \" without element name.\", part.line, part.col, rule);\n                            } else if (modifier.type == \"class\"){\n                                \n                                if (!classes[modifier]){\n                                    classes[modifier] = [];\n                                }\n                                classes[modifier].push({ modifier: modifier, part: part });\n                            }\n                        }\n                    }\n                }\n            }\n        });\n        \n        parser.addListener(\"endstylesheet\", function(){\n        \n            var prop;\n            for (prop in classes){\n                if (classes.hasOwnProperty(prop)){\n                \n                    //one use means that this is overqualified\n                    if (classes[prop].length == 1 && classes[prop][0].part.elementName){\n                        reporter.report(\"Element (\" + classes[prop][0].part + \") is overqualified, just use \" + classes[prop][0].modifier + \" without element name.\", classes[prop][0].part.line, classes[prop][0].part.col, rule);\n                    }\n                }\n            }        \n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"qualified-headings\",\n    name: \"Disallow qualified headings\",\n    desc: \"Headings should not be qualified (namespaced).\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                i, j;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        if (part.elementName && /h[1-6]/.test(part.elementName.toString()) && j > 0){\n                            reporter.report(\"Heading (\" + part.elementName + \") should not be qualified.\", part.line, part.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"regex-selectors\",\n    name: \"Disallow selectors that look like regexs\",\n    desc: \"Selectors that look like regular expressions are slow and should be avoided.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type == \"attribute\"){\n                                if (/([\\~\\|\\^\\$\\*]=)/.test(modifier)){\n                                    reporter.report(\"Attribute selectors with \" + RegExp.$1 + \" are slow!\", modifier.line, modifier.col, rule);\n                                }\n                            }\n\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"rules-count\",\n    name: \"Rules Count\",\n    desc: \"Track how many rules there are.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n        //count each rule\n        parser.addListener(\"startrule\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"rule-count\", count);\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"shorthand\",\n    name: \"Require shorthand properties\",\n    desc: \"Use shorthand properties where possible.\",\n    browsers: \"All\",\n    \n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            prop, i, len,\n            propertiesToCheck = {},\n            properties,\n            mapping = {\n                \"margin\": [\n                    \"margin-top\",\n                    \"margin-bottom\",\n                    \"margin-left\",\n                    \"margin-right\"\n                ],\n                \"padding\": [\n                    \"padding-top\",\n                    \"padding-bottom\",\n                    \"padding-left\",\n                    \"padding-right\"\n                ]              \n            };\n            \n        //initialize propertiesToCheck \n        for (prop in mapping){\n            if (mapping.hasOwnProperty(prop)){\n                for (i=0, len=mapping[prop].length; i < len; i++){\n                    propertiesToCheck[mapping[prop][i]] = prop;\n                }\n            }\n        }\n            \n        function startRule(event){\n            properties = {};\n        }\n        \n        //event handler for end of rules\n        function endRule(event){\n            \n            var prop, i, len, total;\n            \n            //check which properties this rule has\n            for (prop in mapping){\n                if (mapping.hasOwnProperty(prop)){\n                    total=0;\n                    \n                    for (i=0, len=mapping[prop].length; i < len; i++){\n                        total += properties[mapping[prop][i]] ? 1 : 0;\n                    }\n                    \n                    if (total == mapping[prop].length){\n                        reporter.report(\"The properties \" + mapping[prop].join(\", \") + \" can be replaced by \" + prop + \".\", event.line, event.col, rule);\n                    }\n                }\n            }\n        }        \n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n    \n        //check for use of \"font-size\"\n        parser.addListener(\"property\", function(event){\n            var name = event.property.toString().toLowerCase(),\n                value = event.value.parts[0].value;\n\n            if (propertiesToCheck[name]){\n                properties[name] = 1;\n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);     \n\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"text-indent\",\n    name: \"Disallow negative text-indent\",\n    desc: \"Checks for text indent less than -99px\",\n    browsers: \"All\",\n    \n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            textIndent = false;\n            \n            \n        function startRule(event){\n            textIndent = false;\n        }\n        \n        //event handler for end of rules\n        function endRule(event){\n            if (textIndent){\n                reporter.report(\"Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set direction for that item to ltr.\", textIndent.line, textIndent.col, rule);\n            }\n        }        \n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n    \n        //check for use of \"font-size\"\n        parser.addListener(\"property\", function(event){\n            var name = event.property.toString().toLowerCase(),\n                value = event.value;\n\n            if (name == \"text-indent\" && value.parts[0].value < -99){\n                textIndent = event.property;\n            } else if (name == \"direction\" && value == \"ltr\"){\n                textIndent = false;\n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);     \n\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"unique-headings\",\n    name: \"Headings should only be defined once\",\n    desc: \"Headings should be defined only once.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        var headings =  {\n                h1: 0,\n                h2: 0,\n                h3: 0,\n                h4: 0,\n                h5: 0,\n                h6: 0\n            };\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                pseudo,\n                i, j;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                part = selector.parts[selector.parts.length-1];\n\n                if (part.elementName && /(h[1-6])/i.test(part.elementName.toString())){\n                    \n                    for (j=0; j < part.modifiers.length; j++){\n                        if (part.modifiers[j].type == \"pseudo\"){\n                            pseudo = true;\n                            break;\n                        }\n                    }\n                \n                    if (!pseudo){\n                        headings[RegExp.$1]++;\n                        if (headings[RegExp.$1] > 1) {\n                            reporter.report(\"Heading (\" + part.elementName + \") has already been defined.\", part.line, part.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n        \n        parser.addListener(\"endstylesheet\", function(event){\n            var prop,\n                messages = [];\n                \n            for (prop in headings){\n                if (headings.hasOwnProperty(prop)){\n                    if (headings[prop] > 1){\n                        messages.push(headings[prop] + \" \" + prop + \"s\");\n                    }\n                }\n            }\n            \n            if (messages.length){\n                reporter.rollupWarn(\"You have \" + messages.join(\", \") + \" defined in this stylesheet.\", rule);\n            }\n        });        \n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"universal-selector\",\n    name: \"Disallow universal selector\",\n    desc: \"The universal selector (*) is known to be slow.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                \n                part = selector.parts[selector.parts.length-1];\n                if (part.elementName == \"*\"){\n                    reporter.report(rule.desc, part.line, part.col, rule);\n                }\n            }\n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"unqualified-attributes\",\n    name: \"Disallow unqualified attribute selectors\",\n    desc: \"Unqualified attribute selectors are known to be slow.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            \n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                \n                part = selector.parts[selector.parts.length-1];\n                if (part.type == parser.SELECTOR_PART_TYPE){\n                    for (k=0; k < part.modifiers.length; k++){\n                        modifier = part.modifiers[k];\n                        if (modifier.type == \"attribute\" && (!part.elementName || part.elementName == \"*\")){\n                            reporter.report(rule.desc, part.line, part.col, rule);                               \n                        }\n                    }\n                }\n                \n            }            \n        });\n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"vendor-prefix\",\n    name: \"Require standard property with vendor prefix\",\n    desc: \"When using a vendor-prefixed property, make sure to include the standard one.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this,\n            properties,\n            num,\n            propertiesToCheck = {\n                \"-webkit-border-radius\": \"border-radius\",\n                \"-webkit-border-top-left-radius\": \"border-top-left-radius\",\n                \"-webkit-border-top-right-radius\": \"border-top-right-radius\",\n                \"-webkit-border-bottom-left-radius\": \"border-bottom-left-radius\",\n                \"-webkit-border-bottom-right-radius\": \"border-bottom-right-radius\",\n                \n                \"-o-border-radius\": \"border-radius\",\n                \"-o-border-top-left-radius\": \"border-top-left-radius\",\n                \"-o-border-top-right-radius\": \"border-top-right-radius\",\n                \"-o-border-bottom-left-radius\": \"border-bottom-left-radius\",\n                \"-o-border-bottom-right-radius\": \"border-bottom-right-radius\",\n                \n                \"-moz-border-radius\": \"border-radius\",\n                \"-moz-border-radius-topleft\": \"border-top-left-radius\",\n                \"-moz-border-radius-topright\": \"border-top-right-radius\",\n                \"-moz-border-radius-bottomleft\": \"border-bottom-left-radius\",\n                \"-moz-border-radius-bottomright\": \"border-bottom-right-radius\",                \n                \n                \"-moz-column-count\": \"column-count\",\n                \"-webkit-column-count\": \"column-count\",\n                \n                \"-moz-column-gap\": \"column-gap\",\n                \"-webkit-column-gap\": \"column-gap\",\n                \n                \"-moz-column-rule\": \"column-rule\",\n                \"-webkit-column-rule\": \"column-rule\",\n                \n                \"-moz-column-rule-style\": \"column-rule-style\",\n                \"-webkit-column-rule-style\": \"column-rule-style\",\n                \n                \"-moz-column-rule-color\": \"column-rule-color\",\n                \"-webkit-column-rule-color\": \"column-rule-color\",\n                \n                \"-moz-column-rule-width\": \"column-rule-width\",\n                \"-webkit-column-rule-width\": \"column-rule-width\",\n                \n                \"-moz-column-width\": \"column-width\",\n                \"-webkit-column-width\": \"column-width\",\n                \n                \"-webkit-column-span\": \"column-span\",\n                \"-webkit-columns\": \"columns\",\n                \n                \"-moz-box-shadow\": \"box-shadow\",\n                \"-webkit-box-shadow\": \"box-shadow\",\n                \n                \"-moz-transform\" : \"transform\",\n                \"-webkit-transform\" : \"transform\",\n                \"-o-transform\" : \"transform\",\n                \"-ms-transform\" : \"transform\",\n                \n                \"-moz-transform-origin\" : \"transform-origin\",\n                \"-webkit-transform-origin\" : \"transform-origin\",\n                \"-o-transform-origin\" : \"transform-origin\",\n                \"-ms-transform-origin\" : \"transform-origin\",\n                \n                \"-moz-box-sizing\" : \"box-sizing\",\n                \"-webkit-box-sizing\" : \"box-sizing\",\n                \n                \"-moz-user-select\" : \"user-select\",\n                \"-khtml-user-select\" : \"user-select\",\n                \"-webkit-user-select\" : \"user-select\"                \n            };\n\n        //event handler for beginning of rules\n        function startRule(){\n            properties = {};\n            num=1;        \n        }\n        \n        //event handler for end of rules\n        function endRule(event){\n            var prop,\n                i, len,\n                standard,\n                needed,\n                actual,\n                needsStandard = [];\n\n            for (prop in properties){\n                if (propertiesToCheck[prop]){\n                    needsStandard.push({ actual: prop, needed: propertiesToCheck[prop]});\n                }\n            }\n\n            for (i=0, len=needsStandard.length; i < len; i++){\n                needed = needsStandard[i].needed;\n                actual = needsStandard[i].actual;\n\n                if (!properties[needed]){               \n                    reporter.report(\"Missing standard property '\" + needed + \"' to go along with '\" + actual + \"'.\", properties[actual][0].name.line, properties[actual][0].name.col, rule);\n                } else {\n                    //make sure standard property is last\n                    if (properties[needed][0].pos < properties[actual][0].pos){\n                        reporter.report(\"Standard property '\" + needed + \"' should come after vendor-prefixed property '\" + actual + \"'.\", properties[actual][0].name.line, properties[actual][0].name.col, rule);\n                    }\n                }\n            }\n\n        }        \n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);         \n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (!properties[name]){\n                properties[name] = [];\n            }\n\n            properties[name].push({ name: event.property, value : event.value, pos:num++ });\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);         \n    }\n\n});\n/*global CSSLint*/\nCSSLint.addRule({\n\n    //rule information\n    id: \"zero-units\",\n    name: \"Disallow units for 0 values\",\n    desc: \"You don't need to specify units when a value is 0.\",\n    browsers: \"All\",\n\n    //initialization\n    init: function(parser, reporter){\n        var rule = this;\n\n        //count how many times \"float\" is used\n        parser.addListener(\"property\", function(event){\n            var parts = event.value.parts,\n                i = 0, \n                len = parts.length;\n\n            while(i < len){\n                if ((parts[i].units || parts[i].type == \"percentage\") && parts[i].value === 0 && parts[i].type != \"time\"){\n                    reporter.report(\"Values of 0 shouldn't have units specified.\", parts[i].line, parts[i].col, rule);\n                }\n                i++;\n            }\n\n        });\n\n    }\n\n});\nCSSLint.addFormatter({\n    //format information\n    id: \"checkstyle-xml\",\n    name: \"Checkstyle XML format\",\n\n    /**\n     * Return opening root XML tag.\n     * @return {String} to prepend before all results\n     */\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><checkstyle>\";\n    },\n\n    /**\n     * Return closing root XML tag.\n     * @return {String} to append after all results\n     */\n    endFormat: function(){\n        return \"</checkstyle>\";\n    },\n\n    /**\n     * Given CSS Lint results for a file, return output for this format.\n     * @param results {Object} with error and warning messages\n     * @param filename {String} relative file path\n     * @param options {Object} (UNUSED for now) specifies special handling of output\n     * @return {String} output for results\n     */\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = [];\n        var generateSource = function(rule) {\n            if (!rule || !('name' in rule)) {\n                return \"\";\n            }\n            return 'net.csslint.' + rule.name.replace(/\\s/g,'');\n        };\n        var escapeSpecialCharacters = function(str) {\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n            return str.replace(/\\\"/g, \"'\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        };\n\n        if (messages.length > 0) {\n            output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n            CSSLint.Util.forEach(messages, function (message, i) {\n                //ignore rollups for now\n                if (!message.rollup) {\n                  output.push(\"<error line=\\\"\" + message.line + \"\\\" column=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                      \" message=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" source=\\\"\" + generateSource(message.rule) +\"\\\"/>\");\n                }\n            });\n            output.push(\"</file>\");\n        }\n\n        return output.join(\"\");\n    }\n});\nCSSLint.addFormatter({\n    //format information\n    id: \"compact\",\n    name: \"Compact, 'porcelain' format\",\n\n    /**\n     * Return content to be printed before all file results.\n     * @return {String} to prepend before all results\n     */\n    startFormat: function() {\n        return \"\";\n    },\n\n    /**\n     * Return content to be printed after all file results.\n     * @return {String} to append after all results\n     */\n    endFormat: function() {\n        return \"\";\n    },\n\n    /**\n     * Given CSS Lint results for a file, return output for this format.\n     * @param results {Object} with error and warning messages\n     * @param filename {String} relative file path\n     * @param options {Object} (Optional) specifies special handling of output\n     * @return {String} output for results\n     */\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = \"\";\n        options = options || {};\n        var capitalize = function(str) {\n            return str.charAt(0).toUpperCase() + str.slice(1);\n        };\n\n        if (messages.length === 0) {\n            return options.quiet ? \"\" : filename + \": Lint Free!\";\n        }\n\n        CSSLint.Util.forEach(messages, function(message, i) {\n            if (message.rollup) {\n                output += filename + \": \" + capitalize(message.type) + \" - \" + message.message + \"\\n\";\n            } else {\n                output += filename + \": \" + \"line \" + message.line + \n                    \", col \" + message.col + \", \" + capitalize(message.type) + \" - \" + message.message + \"\\n\";\n            }\n        });\n    \n        return output;\n    }\n});\nCSSLint.addFormatter({\n    //format information\n    id: \"csslint-xml\",\n    name: \"CSSLint XML format\",\n\n    /**\n     * Return opening root XML tag.\n     * @return {String} to prepend before all results\n     */\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><csslint>\";\n    },\n\n    /**\n     * Return closing root XML tag.\n     * @return {String} to append after all results\n     */\n    endFormat: function(){\n        return \"</csslint>\";\n    },\n\n    /**\n     * Given CSS Lint results for a file, return output for this format.\n     * @param results {Object} with error and warning messages\n     * @param filename {String} relative file path\n     * @param options {Object} (UNUSED for now) specifies special handling of output\n     * @return {String} output for results\n     */\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = [];\n        var escapeSpecialCharacters = function(str) {\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n            return str.replace(/\\\"/g, \"'\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        };\n\n        if (messages.length > 0) {\n            output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n            CSSLint.Util.forEach(messages, function (message, i) {\n                if (message.rollup) {\n                    output.push(\"<issue severity=\\\"\" + message.type + \"\\\" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                } else {\n                    output.push(\"<issue line=\\\"\" + message.line + \"\\\" char=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                        \" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                }\n            });\n            output.push(\"</file>\");\n        }\n\n        return output.join(\"\");\n    }\n});\nCSSLint.addFormatter({\n    //format information\n    id: \"lint-xml\",\n    name: \"Lint XML format\",\n\n    /**\n     * Return opening root XML tag.\n     * @return {String} to prepend before all results\n     */\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><lint>\";\n    },\n\n    /**\n     * Return closing root XML tag.\n     * @return {String} to append after all results\n     */\n    endFormat: function(){\n        return \"</lint>\";\n    },\n\n    /**\n     * Given CSS Lint results for a file, return output for this format.\n     * @param results {Object} with error and warning messages\n     * @param filename {String} relative file path\n     * @param options {Object} (UNUSED for now) specifies special handling of output\n     * @return {String} output for results\n     */\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = [];\n        var escapeSpecialCharacters = function(str) {\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n            return str.replace(/\\\"/g, \"'\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        };\n\n        if (messages.length > 0) {\n        \n            output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n            CSSLint.Util.forEach(messages, function (message, i) {\n                if (message.rollup) {\n                    output.push(\"<issue severity=\\\"\" + message.type + \"\\\" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                } else {\n                    output.push(\"<issue line=\\\"\" + message.line + \"\\\" char=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                        \" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                }\n            });\n            output.push(\"</file>\");\n        }\n\n        return output.join(\"\");\n    }\n});\nCSSLint.addFormatter({\n    //format information\n    id: \"text\",\n    name: \"Plain Text\",\n\n    /**\n     * Return content to be printed before all file results.\n     * @return {String} to prepend before all results\n     */\n    startFormat: function() {\n        return \"\";\n    },\n\n    /**\n     * Return content to be printed after all file results.\n     * @return {String} to append after all results\n     */\n    endFormat: function() {\n        return \"\";\n    },\n\n    /**\n     * Given CSS Lint results for a file, return output for this format.\n     * @param results {Object} with error and warning messages\n     * @param filename {String} relative file path\n     * @param options {Object} (Optional) specifies special handling of output\n     * @return {String} output for results\n     */\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = \"\";\n        options = options || {};\n\n        if (messages.length === 0) {\n            return options.quiet ? \"\" : \"\\n\\ncsslint: No errors in \" + filename + \".\";\n        }\n\n        output = \"\\n\\ncsslint: There are \" + messages.length  +  \" problems in \" + filename + \".\";\n        var pos = filename.lastIndexOf(\"/\"),\n            shortFilename = filename;\n\n        if (pos === -1){\n            pos = filename.lastIndexOf(\"\\\\\");       \n        }\n        if (pos > -1){\n            shortFilename = filename.substring(pos+1);\n        }\n\n        CSSLint.Util.forEach(messages, function (message, i) {\n            output = output + \"\\n\\n\" + shortFilename;\n            if (message.rollup) {\n                output += \"\\n\" + (i+1) + \": \" + message.type;\n                output += \"\\n\" + message.message;\n            } else {\n                output += \"\\n\" + (i+1) + \": \" + message.type + \" at line \" + message.line + \", col \" + message.col;\n                output += \"\\n\" + message.message;\n                output += \"\\n\" + message.evidence;\n            }\n        });\n    \n        return output;\n    }\n});\n\n\nexports.CSSLint = CSSLint;\n\n\n});"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/worker-javascript.js",
    "content": "\"no use strict\";\n\nvar console = {\n    log: function(msgs) {\n        postMessage({type: \"log\", data: arguments.join(\" \")});\n    }\n};\nvar window = {\n    console: console\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        var moduleName = base + \"/\" + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            var moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nvar require = function(parentId, id) {\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    var id = normalizeModule(parentId, id);\n    \n    var module = require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    require.id = id;\n    importScripts(path);\n    return require(parentId, id);    \n};\n\nrequire.modules = {};\nrequire.tlns = {};\n\nvar define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        id = require.id;\n    }\n\n    if (id.indexOf(\"text!\") === 0) \n        return;\n    \n    var req = function(deps, factory) {\n        return require(id, deps, factory);\n    };\n\n    require.modules[id] = {\n        factory: function() {\n            var module = {\n                exports: {}\n            };\n            var returnExports = factory(req, module.exports, module);\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\n\nfunction initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n}\n\nfunction initSender() {\n\n    var EventEmitter = require(null, \"ace/lib/event_emitter\").EventEmitter;\n    var oop = require(null, \"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n}\n\nvar main;\nvar sender;\n\nonmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        main[msg.command].apply(main, msg.args);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(null, \"ace/lib/fixoldbrowsers\");\n        sender = initSender();\n        var clazz = require(null, msg.module)[msg.classname];\n        main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._emit(msg.event, msg.data);\n    }\n};\n// vim:set ts=4 sts=4 sw=4 st:\n// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright(C) 2010 XXX No License Specified\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Irakli Gozalishvili Copyright (C) 2010 MIT License\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n \ndefine('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n\n    //---------------------------------\n    //  Overriden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n\n    // Don't override `test` if it won't change anything\n    if (!compliantLastIndexIncrement) {\n        // Fix browser bug in native method\n        RegExp.prototype.test = function (str) {\n            // Use the native `exec` to skip some processing overhead, even though the overriden\n            // `exec` would take care of the `lastIndex` fix\n            var match = real.exec.call(this, str);\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n// vim: ts=4 sts=4 sw=4 expandtab\n// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License\n// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License\n// -- kossnocorp Sasha Koss XXX TODO License or CLA\n// -- bryanforbes Bryan Forbes XXX TODO License or CLA\n// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence\n// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License\n// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License\n// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain)\n// -- iwyg XXX TODO License or CLA\n// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License\n// -- xavierm02 Montillet Xavier XXX TODO License or CLA\n// -- Raynos Raynos XXX TODO License or CLA\n// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License\n// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License\n// -- lexer Alexey Zakharov XXX TODO License or CLA\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n/*\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: http://es5.github.com/ (specific links below)\n * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n *\n * @module\n */\n\n/*whatsupdoc*/\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        // 1. Let Target be the this value.\n        var target = this;\n        // 2. If IsCallable(Target) is false, throw a TypeError exception.\n        if (typeof target != \"function\")\n            throw new TypeError(); // TODO message\n        // 3. Let A be a new (possibly empty) internal list of all of the\n        //   argument values provided after thisArg (arg1, arg2 etc), in order.\n        // XXX slicedArgs will stand in for \"A\" if used\n        var args = slice.call(arguments, 1); // for normal call\n        // 4. Let F be a new native ECMAScript object.\n        // 11. Set the [[Prototype]] internal property of F to the standard\n        //   built-in Function prototype object as specified in 15.3.3.1.\n        // 12. Set the [[Call]] internal property of F as described in\n        //   15.3.4.5.1.\n        // 13. Set the [[Construct]] internal property of F as described in\n        //   15.3.4.5.2.\n        // 14. Set the [[HasInstance]] internal property of F as described in\n        //   15.3.4.5.3.\n        var bound = function () {\n\n            if (this instanceof bound) {\n                // 15.3.4.5.2 [[Construct]]\n                // When the [[Construct]] internal method of a function object,\n                // F that was created using the bind function is called with a\n                // list of arguments ExtraArgs, the following steps are taken:\n                // 1. Let target be the value of F's [[TargetFunction]]\n                //   internal property.\n                // 2. If target has no [[Construct]] internal method, a\n                //   TypeError exception is thrown.\n                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Construct]] internal \n                //   method of target providing args as the arguments.\n\n                var F = function(){};\n                F.prototype = target.prototype;\n                var self = new F;\n\n                var result = target.apply(\n                    self,\n                    args.concat(slice.call(arguments))\n                );\n                if (result !== null && Object(result) === result)\n                    return result;\n                return self;\n\n            } else {\n                // 15.3.4.5.1 [[Call]]\n                // When the [[Call]] internal method of a function object, F,\n                // which was created using the bind function is called with a\n                // this value and a list of arguments ExtraArgs, the following\n                // steps are taken:\n                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                //   property.\n                // 3. Let target be the value of F's [[TargetFunction]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the \n                //   list boundArgs in the same order followed by the same \n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Call]] internal method \n                //   of target providing boundThis as the this value and \n                //   providing args as the arguments.\n\n                // equiv: target.call(this, ...boundArgs, ...args)\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        // XXX bound.length is never writable, so don't even try\n        //\n        // 15. If the [[Class]] internal property of Target is \"Function\", then\n        //     a. Let L be the length property of Target minus the length of A.\n        //     b. Set the length own property of F to either 0 or L, whichever is \n        //       larger.\n        // 16. Else set the length own property of F to 0.\n        // 17. Set the attributes of the length own property of F to the values\n        //   specified in 15.3.5.1.\n\n        // TODO\n        // 18. Set the [[Extensible]] internal property of F to true.\n        \n        // TODO\n        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n        // 20. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and \n        //   false.\n        // 21. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower, \n        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n        //   and false.\n\n        // TODO\n        // NOTE Function objects created using Function.prototype.bind do not \n        // have a prototype property or the [[Code]], [[FormalParameters]], and\n        // [[Scope]] internal properties.\n        // XXX can't delete prototype in pure-js.\n\n        // 22. Return F.\n        return bound;\n    };\n}\n\n// Shortcut to an often accessed properties, in order to avoid multiple\n// dereference that costs universally.\n// _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n// us it in defining shortcuts.\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\n\n// If JS engine supports accessors creating shortcuts.\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\n\n//\n// Array\n// =====\n//\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return toString(obj) == \"[object Array]\";\n    };\n}\n\n// The IsCallable() check in the Array functions\n// has been replaced with a strict check on the\n// internal class of the object to trap cases where\n// the provided function was actually a regular\n// expression literal, which in V8 and\n// JavaScriptCore is a typeof \"function\".  Only in\n// V8 are regular expression literals permitted as\n// reduce parameters, so it is desirable in the\n// general case for the shim to match the more\n// strict and common behavior of rejecting regular\n// expressions.\n\n// ES5 15.4.4.18\n// http://es5.github.com/#x15.4.4.18\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var self = toObject(this),\n            thisp = arguments[1],\n            i = 0,\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (i < length) {\n            if (i in self) {\n                // Invoke the callback function with call, passing arguments:\n                // context, property value, property key, thisArg object context\n                fun.call(thisp, self[i], i, self);\n            }\n            i++;\n        }\n    };\n}\n\n// ES5 15.4.4.19\n// http://es5.github.com/#x15.4.4.19\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, self);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.20\n// http://es5.github.com/#x15.4.4.20\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = [],\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                result.push(self[i]);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.16\n// http://es5.github.com/#x15.4.4.16\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, self))\n                return false;\n        }\n        return true;\n    };\n}\n\n// ES5 15.4.4.17\n// http://es5.github.com/#x15.4.4.17\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                return true;\n        }\n        return false;\n    };\n}\n\n// ES5 15.4.4.21\n// http://es5.github.com/#x15.4.4.21\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value and an empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (++i >= length)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self)\n                result = fun.call(void 0, result, self[i], i, self);\n        }\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.22\n// http://es5.github.com/#x15.4.4.22\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value, empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (--i < 0)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        do {\n            if (i in this)\n                result = fun.call(void 0, result, self[i], i, self);\n        } while (i--);\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n\n        var i = 0;\n        if (arguments.length > 1)\n            i = toInteger(arguments[1]);\n\n        // handle negative indices\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\n// ES5 15.4.4.15\n// http://es5.github.com/#x15.4.4.15\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\nif (!Array.prototype.lastIndexOf) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n        var i = length - 1;\n        if (arguments.length > 1)\n            i = Math.min(i, toInteger(arguments[1]));\n        // handle negative indices\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i])\n                return i;\n        }\n        return -1;\n    };\n}\n\n//\n// Object\n// ======\n//\n\n// ES5 15.2.3.2\n// http://es5.github.com/#x15.2.3.2\nif (!Object.getPrototypeOf) {\n    // https://github.com/kriskowal/es5-shim/issues#issue/2\n    // http://ejohn.org/blog/objectgetprototypeof/\n    // recommended by fschaefer on github\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\n\n// ES5 15.2.3.3\n// http://es5.github.com/#x15.2.3.3\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        // If object does not owns property return undefined immediately.\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n\n        // If object has a property then it's for sure both `enumerable` and\n        // `configurable`.\n        descriptor =  { enumerable: true, configurable: true };\n\n        // If JS engine supports accessor properties then property may be a\n        // getter or setter.\n        if (supportsAccessors) {\n            // Unfortunately `__lookupGetter__` will return a getter even\n            // if object has own non getter property along with a same named\n            // inherited getter. To avoid misbehavior we temporary remove\n            // `__proto__` so that `__lookupGetter__` will return getter only\n            // if it's owned by an object.\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n\n            // Once we have getter and setter we can put values back.\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n\n                // If it was accessor property we're done and return here\n                // in order to avoid adding `value` to the descriptor.\n                return descriptor;\n            }\n        }\n\n        // If we got this far we know that object has an own property that is\n        // not an accessor so we set it as a value and return descriptor.\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\n\n// ES5 15.2.3.4\n// http://es5.github.com/#x15.2.3.4\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\n\n// ES5 15.2.3.5\n// http://es5.github.com/#x15.2.3.5\nif (!Object.create) {\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = { \"__proto__\": null };\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            // IE has no built-in implementation of `Object.getPrototypeOf`\n            // neither `__proto__`, but this manually setting `__proto__` will\n            // guarantee that `Object.getPrototypeOf` will work as expected with\n            // objects created using `Object.create`\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\n// ES5 15.2.3.6\n// http://es5.github.com/#x15.2.3.6\n\n// Patch for WebKit and IE8 standard mode\n// Designed by hax <hax.github.com>\n// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5\n// IE8 Reference:\n//     http://msdn.microsoft.com/en-us/library/dd282900.aspx\n//     http://msdn.microsoft.com/en-us/library/dd229916.aspx\n// WebKit Bugs:\n//     https://bugs.webkit.org/show_bug.cgi?id=36423\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n        // returns falsy\n    }\n}\n\n// check whether defineProperty works if it's given. Otherwise,\n// shim partially.\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n\n        // make a valiant attempt to use the real defineProperty\n        // for I8's DOM elements.\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n                // try the shim if the real one doesn't work\n            }\n        }\n\n        // If it's a data property.\n        if (owns(descriptor, \"value\")) {\n            // fail silently if \"writable\", \"enumerable\", or \"configurable\"\n            // are requested but not supported\n            /*\n            // alternate approach:\n            if ( // can't implement these features; allow false but not true\n                !(owns(descriptor, \"writable\") ? descriptor.writable : true) ||\n                !(owns(descriptor, \"enumerable\") ? descriptor.enumerable : true) ||\n                !(owns(descriptor, \"configurable\") ? descriptor.configurable : true)\n            )\n                throw new RangeError(\n                    \"This implementation of Object.defineProperty does not \" +\n                    \"support configurable, enumerable, or writable.\"\n                );\n            */\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                // As accessors are supported only on engines implementing\n                // `__proto__` we can safely override `__proto__` while defining\n                // a property to make sure that we don't hit an inherited\n                // accessor.\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                // Deleting a property anyway since getter / setter may be\n                // defined on object itself.\n                delete object[property];\n                object[property] = descriptor.value;\n                // Setting original `__proto__` back now.\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            // If we got that far then getters and setters can be defined !!\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\n\n// ES5 15.2.3.7\n// http://es5.github.com/#x15.2.3.7\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\n\n// ES5 15.2.3.8\n// http://es5.github.com/#x15.2.3.8\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.9\n// http://es5.github.com/#x15.2.3.9\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// detect a Rhino bug and patch it\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\n\n// ES5 15.2.3.10\n// http://es5.github.com/#x15.2.3.10\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.11\n// http://es5.github.com/#x15.2.3.11\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.12\n// http://es5.github.com/#x15.2.3.12\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.13\n// http://es5.github.com/#x15.2.3.13\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        // 1. If Type(O) is not Object throw a TypeError exception.\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        // 2. Return the Boolean value of the [[Extensible]] internal property of O.\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\n\n// ES5 15.2.3.14\n// http://es5.github.com/#x15.2.3.14\nif (!Object.keys) {\n    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null})\n        hasDontEnumBug = false;\n\n    Object.keys = function keys(object) {\n\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(\"Object.keys called on a non-object\");\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n\n        return keys;\n    };\n\n}\n\n//\n// Date\n// ====\n//\n\n// ES5 15.9.5.43\n// http://es5.github.com/#x15.9.5.43\n// This function returns a String value represent the instance in time \n// represented by this Date object. The format of the String is the Date Time \n// string format defined in 15.9.1.15. All fields are present in the String. \n// The time zone is always UTC, denoted by the suffix Z. If the time value of \n// this object is not a finite Number a RangeError exception is thrown.\nif (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) {\n    Date.prototype.toISOString = function toISOString() {\n        var result, length, value, year;\n        if (!isFinite(this))\n            throw new RangeError;\n\n        // the date time string format is specified in 15.9.1.15.\n        result = [this.getUTCMonth() + 1, this.getUTCDate(),\n            this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];\n        year = this.getUTCFullYear();\n        year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6);\n\n        length = result.length;\n        while (length--) {\n            value = result[length];\n            // pad months, days, hours, minutes, and seconds to have two digits.\n            if (value < 10)\n                result[length] = \"0\" + value;\n        }\n        // pad milliseconds to have three digits.\n        return year + \"-\" + result.slice(0, 2).join(\"-\") + \"T\" + result.slice(2).join(\":\") + \".\" +\n            (\"000\" + this.getUTCMilliseconds()).slice(-3) + \"Z\";\n    }\n}\n\n// ES5 15.9.4.4\n// http://es5.github.com/#x15.9.4.4\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\n\n// ES5 15.9.5.44\n// http://es5.github.com/#x15.9.5.44\n// This function provides a String representation of a Date object for use by \n// JSON.stringify (15.12.3).\nif (!Date.prototype.toJSON) {\n    Date.prototype.toJSON = function toJSON(key) {\n        // When the toJSON method is called with argument key, the following \n        // steps are taken:\n\n        // 1.  Let O be the result of calling ToObject, giving it the this\n        // value as its argument.\n        // 2. Let tv be ToPrimitive(O, hint Number).\n        // 3. If tv is a Number and is not finite, return null.\n        // XXX\n        // 4. Let toISO be the result of calling the [[Get]] internal method of\n        // O with argument \"toISOString\".\n        // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n        if (typeof this.toISOString != \"function\")\n            throw new TypeError(); // TODO message\n        // 6. Return the result of calling the [[Call]] internal method of\n        //  toISO with O as the this value and an empty argument list.\n        return this.toISOString();\n\n        // NOTE 1 The argument is ignored.\n\n        // NOTE 2 The toJSON function is intentionally generic; it does not\n        // require that its this value be a Date object. Therefore, it can be\n        // transferred to other kinds of objects for use as a method. However,\n        // it does require that any such object have a toISOString method. An\n        // object is free to use the argument key to filter its\n        // stringification.\n    };\n}\n\n// ES5 15.9.4.2\n// http://es5.github.com/#x15.9.4.2\n// based on work shared by Daniel Friesen (dantman)\n// http://gist.github.com/303249\nif (Date.parse(\"+275760-09-13T00:00:00.000Z\") !== 8.64e15) {\n    // XXX global assignment won't work in embeddings that use\n    // an alternate object for the context.\n    Date = (function(NativeDate) {\n\n        // Date.length === 7\n        var Date = function Date(Y, M, D, h, m, s, ms) {\n            var length = arguments.length;\n            if (this instanceof NativeDate) {\n                var date = length == 1 && String(Y) === Y ? // isString(Y)\n                    // We explicitly pass it through parse:\n                    new NativeDate(Date.parse(Y)) :\n                    // We have to manually make calls depending on argument\n                    // length here\n                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\n                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\n                    length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                    length >= 4 ? new NativeDate(Y, M, D, h) :\n                    length >= 3 ? new NativeDate(Y, M, D) :\n                    length >= 2 ? new NativeDate(Y, M) :\n                    length >= 1 ? new NativeDate(Y) :\n                                  new NativeDate();\n                // Prevent mixups with unfixed Date object\n                date.constructor = Date;\n                return date;\n            }\n            return NativeDate.apply(this, arguments);\n        };\n\n        // 15.9.1.15 Date Time String Format.\n        var isoDateExpression = new RegExp(\"^\" +\n            \"(\\\\d{4}|[\\+\\-]\\\\d{6})\" + // four-digit year capture or sign + 6-digit extended year\n            \"(?:-(\\\\d{2})\" + // optional month capture\n            \"(?:-(\\\\d{2})\" + // optional day capture\n            \"(?:\" + // capture hours:minutes:seconds.milliseconds\n                \"T(\\\\d{2})\" + // hours capture\n                \":(\\\\d{2})\" + // minutes capture\n                \"(?:\" + // optional :seconds.milliseconds\n                    \":(\\\\d{2})\" + // seconds capture\n                    \"(?:\\\\.(\\\\d{3}))?\" + // milliseconds capture\n                \")?\" +\n            \"(?:\" + // capture UTC offset component\n                \"Z|\" + // UTC capture\n                \"(?:\" + // offset specifier +/-hours:minutes\n                    \"([-+])\" + // sign capture\n                    \"(\\\\d{2})\" + // hours offset capture\n                    \":(\\\\d{2})\" + // minutes offset capture\n                \")\" +\n            \")?)?)?)?\" +\n        \"$\");\n\n        // Copy any custom methods a 3rd party library may have added\n        for (var key in NativeDate)\n            Date[key] = NativeDate[key];\n\n        // Copy \"native\" methods explicitly; they may be non-enumerable\n        Date.now = NativeDate.now;\n        Date.UTC = NativeDate.UTC;\n        Date.prototype = NativeDate.prototype;\n        Date.prototype.constructor = Date;\n\n        // Upgrade Date.parse to handle simplified ISO 8601 strings\n        Date.parse = function parse(string) {\n            var match = isoDateExpression.exec(string);\n            if (match) {\n                match.shift(); // kill match[0], the full match\n                // parse months, days, hours, minutes, seconds, and milliseconds\n                for (var i = 1; i < 7; i++) {\n                    // provide default values if necessary\n                    match[i] = +(match[i] || (i < 3 ? 1 : 0));\n                    // match[1] is the month. Months are 0-11 in JavaScript\n                    // `Date` objects, but 1-12 in ISO notation, so we\n                    // decrement.\n                    if (i == 1)\n                        match[i]--;\n                }\n\n                // parse the UTC offset component\n                var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop();\n\n                // compute the explicit time zone offset if specified\n                var offset = 0;\n                if (sign) {\n                    // detect invalid offsets and return early\n                    if (hourOffset > 23 || minuteOffset > 59)\n                        return NaN;\n\n                    // express the provided time zone offset in minutes. The offset is\n                    // negative for time zones west of UTC; positive otherwise.\n                    offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == \"+\" ? -1 : 1);\n                }\n\n                // Date.UTC for years between 0 and 99 converts year to 1900 + year\n                // The Gregorian calendar has a 400-year cycle, so \n                // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...),\n                // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years\n                var year = +match[0];\n                if (0 <= year && year <= 99) {\n                    match[0] = year + 400;\n                    return NativeDate.UTC.apply(this, match) + offset - 12622780800000;\n                }\n\n                // compute a new UTC date value, accounting for the optional offset\n                return NativeDate.UTC.apply(this, match) + offset;\n            }\n            return NativeDate.parse.apply(this, arguments);\n        };\n\n        return Date;\n    })(Date);\n}\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.20\n// http://es5.github.com/#x15.5.4.20\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n    // http://perfectionkills.com/whitespace-deviations/\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\n//\n// Util\n// ======\n//\n\n// ES5 9.4\n// http://es5.github.com/#x9.4\n// http://jsperf.com/to-integer\nvar toInteger = function (n) {\n    n = +n;\n    if (n !== n) // isNaN\n        n = 0;\n    else if (n !== 0 && n !== (1/0) && n !== -(1/0))\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    return n;\n};\n\nvar prepareString = \"a\"[0] != \"a\",\n    // ES5 9.9\n    // http://es5.github.com/#x9.9\n    toObject = function (o) {\n        if (o == null) { // this matches both null and undefined\n            throw new TypeError(); // TODO message\n        }\n        // If the implementation doesn't support by-index access of\n        // string characters (ex. IE < 7), split the string\n        if (prepareString && typeof o == \"string\" && o) {\n            return o.split(\"\");\n        }\n        return Object(o);\n    };\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry = this._eventRegistry || {};\n    this._defaultHandlers = this._defaultHandlers || {};\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    \n    if (!e.stopPropagation) {\n        e.stopPropagation = function() {\n            this.propagationStopped = true;\n        };\n    }\n    \n    if (!e.preventDefault) {\n        e.preventDefault = function() {\n            this.defaultPrevented = true;\n        };\n    }\n\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e);\n};\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    this._defaultHandlers = this._defaultHandlers || {};\n    \n    if (this._defaultHandlers[eventName])\n        throw new Error(\"The default handler for '\" + eventName + \"' is already set\");\n        \n    this._defaultHandlers[eventName] = callback;\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners.push(callback);\n};\n\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var tempCtor = function() {};\n    return function(ctor, superCtor) {\n        tempCtor.prototype = superCtor.prototype;\n        ctor.super_ = superCtor.prototype;\n        ctor.prototype = new tempCtor();\n        ctor.prototype.constructor = ctor;\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n \ndefine('ace/mode/javascript_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/worker/jshint', 'ace/narcissus/parser'], function(require, exports, module) {\n\n    \nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar lint = require(\"../worker/jshint\").JSHINT;\nvar parser = require(\"../narcissus/parser\");\n    \nvar JavaScriptWorker = exports.JavaScriptWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(500);\n};\n\noop.inherits(JavaScriptWorker, Mirror);\n\n(function() {\n    \n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        value = value.replace(/^#!.*\\n/, \"\\n\");\n        \n//        var start = new Date();\n        try {\n            parser.parse(value);\n        } catch(e) {\n//            console.log(\"narcissus\")\n//            console.log(e);\n            var chunks = e.message.split(\":\")\n            var message = chunks.pop().trim();\n            var lineNumber = parseInt(chunks.pop().trim()) - 1;\n            this.sender.emit(\"narcissus\", {\n                row: lineNumber,\n                column: null, // TODO convert e.cursor\n                text: message,\n                type: \"error\"\n            });\n            return;\n        } finally {\n//            console.log(\"parse time: \" + (new Date() - start));\n        }\n        \n//        var start = new Date();\n//        console.log(\"jslint\")\n        lint(value, {undef: false, onevar: false, passfail: false});\n        this.sender.emit(\"jslint\", lint.errors);        \n//        console.log(\"lint time: \" + (new Date() - start));\n    }\n    \n}).call(JavaScriptWorker.prototype);\n\n});\ndefine('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas([e.data]);        \n        deferredUpdate.schedule(_self.$timeout);\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n        // abstract method\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\n /**\n * new Document([text])\n * - text (String | Array): The starting text\n *\n * Creates a new `Document`. If `text` is included, the `Document` contains those strings; otherwise, it's empty.\n *\n **/\n\nvar Document = function(text) {\n    this.$lines = [];\n\n    // There has to be one line at least in the document. If you pass an empty\n    // string to the insert function, nothing will happen. Workaround.\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this.insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n\n    // check for IE split bug\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getNewLineCharacter = function() {\n      switch (this.$newLineMode) {\n          case \"windows\":\n              return \"\\r\\n\";\n\n          case \"unix\":\n              return \"\\n\";\n\n          case \"auto\":\n              return this.$autoNewLine;\n      }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.$lines[range.start.row].substring(range.start.column,\n                                                         range.end.column);\n        }\n        else {\n            var lines = this.getLines(range.start.row+1, range.end.row-1);\n            lines.unshift((this.$lines[range.start.row] || \"\").substring(range.start.column));\n            lines.push((this.$lines[range.end.row] || \"\").substring(0, range.end.column));\n            return lines.join(this.getNewLineCharacter());\n        }\n    };\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        }\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n\n        // only detect new lines if the document has no line break yet\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this.insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    /**\n     * Document@change(e)\n     * - e (Object): Contains at least one property called `\"action\"`. `\"action\"` indicates the action that triggered the change. Each action also has a set of additional properties.\n     *\n     * Fires whenever the document changes.\n     *\n     * Several methods trigger different `\"change\"` events. Below is a list of each action type, followed by each property that's also available:\n     *\n     *  * `\"insertLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that are changing\n     *  * `\"insertText\"` (emitted by [[Document.insertNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being added\n     *  * `\"removeLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that were removed\n     *    * `nl`: the new line character (as defined by [[Document.getNewLineCharacter]])\n     *  * `\"removeText\"` (emitted by [[Document.removeInLine]] and [[Document.removeNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being removed\n     *\n     **/\n    this.insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n\n        // apply doesn't work for big arrays (smallest threshold is on safari 0xFFFF)\n        // to circumvent that we have to break huge inserts into smaller chunks here\n        if (lines.length > 0xFFFF) {\n            var end = this.insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        // clip to document\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this.removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n\n        // Shortcut: If the text we want to insert is the same as it is already\n        // in the document, we don't have to replace anything.\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Range\n *\n * This object is used in various places to indicate a region within the editor. To better visualize how this works, imagine a rectangle. Each quadrant of the rectangle is analogus to a range, as ranges contain a starting row and starting column, and an ending row, and ending column.\n *\n **/\n\n/**\n * new Range(startRow, startColumn, endRow, endColumn)\n * - startRow (Number): The starting row\n * - startColumn (Number): The starting column\n * - endRow (Number): The ending row\n * - endColumn (Number): The ending column\n *\n * Creates a new `Range` object with the given starting and ending row and column points.\n *\n **/\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    /**\n     * Range.isEqual(range) -> Boolean\n     * - range (Range): A range to check against\n     *\n     * Returns `true` if and only if the starting row and column, and ending tow and column, are equivalent to those given by `range`.\n     *\n     **/ \n    this.isEqual = function(range) {\n        return this.start.row == range.start.row &&\n            this.end.row == range.end.row &&\n            this.start.column == range.start.column &&\n            this.end.column == range.end.column\n    }; \n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    }; \n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    }; \n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.comparePoint(p) -> Number\n     * - p (Range): A point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1<br/>\n     *\n     * Checks the row and column points of `p` with the row and column points of the calling range.\n     *\n     * \n     *\n     **/ \n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    }\n\n    /** related to: Range.comparePoint\n     * Range.containsRange(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Checks the start and end points of `range` and compares them to the calling range. Returns `true` if the `range` is contained within the caller's range.\n     *\n     **/ \n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    }\n\n    /**\n     * Range.intersects(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Returns `true` if passed in `range` intersects with the one calling this method.\n     *\n     **/\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    }\n\n    /**\n     * Range.isEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's ending row point is the same as `row`, and if the caller's ending column is the same as `column`.\n     *\n     **/\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    }\n\n    /**\n     * Range.isStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's starting row point is the same as `row`, and if the caller's starting column is the same as `column`.\n     *\n     **/ \n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    }\n\n    /**\n     * Range.setStart(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    }\n\n    /**\n     * Range.setEnd(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.inside(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range.\n     *\n     **/ \n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's starting points.\n     *\n     **/ \n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's ending points.\n     *\n     **/ \n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** \n     * Range.compare(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal <br/>\n     * * `-1` if `p.row` is less then the calling range <br/>\n     * * `1` if `p.row` is greater than the calling range <br/>\n     *  <br/>\n     * If the starting row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     * <br/>\n     * If the ending row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0` <br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /**\n     * Range.compareEnd(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range, or if `isEnd` is `true.<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.compareInside(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `1` if the ending row of the calling range is equal to `row`, and the ending column of the calling range is equal to `column`<br/>\n     * * `-1` if the starting row of the calling range is equal to `row`, and the starting column of the calling range is equal to `column`<br/>\n     * <br/>\n     * Otherwise, it returns the value after calling [[Range.compare `compare()`]].\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     *\n     **/\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.clipRows(firstRow, lastRow) -> Range\n     * - firstRow (Number): The starting row\n     * - lastRow (Number): The ending row\n     *\n     * Returns the part of the current `Range` that occurs within the boundaries of `firstRow` and `lastRow` as a new `Range` object.\n     *\n    **/\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow) {\n            var end = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row > lastRow) {\n            var start = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row < firstRow) {\n            var start = {\n                row: firstRow,\n                column: 0\n            };\n        }\n\n        if (this.end.row < firstRow) {\n            var end = {\n                row: firstRow,\n                column: 0\n            };\n        }\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row == this.end.row && this.start.column == this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart =\n            session.documentToScreenPosition(this.start);\n        var screenPosEnd =\n            session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\n\nexports.Range = Range;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n/**\n * new Anchor(doc, row, column)\n * - doc (Document): The document to associate with the anchor\n * - row (Number): The starting row position\n * - column (Number): The starting column position\n *\n * Creates a new `Anchor` and associates it with a document.\n *\n **/\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.document = doc;\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n\n    this.$onChange = this.onChange.bind(this);\n    doc.on(\"change\", this.$onChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n        \n    this.getDocument = function() {\n        return this.document;\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n            \n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n            \n        if (range.start.row > this.row)\n            return;\n            \n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n    \n        var row = this.row;\n        var column = this.column;\n        \n        if (delta.action === \"insertText\") {\n            if (range.start.row === row && range.start.column <= column) {\n                if (range.start.row === range.end.row) {\n                    column += range.end.column - range.start.column;\n                }\n                else {\n                    column -= range.start.column;\n                    row += range.end.row - range.start.row;\n                }\n            }\n            else if (range.start.row !== range.end.row && range.start.row < row) {\n                row += range.end.row - range.start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (range.start.row <= row) {\n                row += range.end.row - range.start.row;\n            }\n        }\n        else if (delta.action == \"removeText\") {\n            if (range.start.row == row && range.start.column < column) {\n                if (range.end.column >= column)\n                    column = range.start.column;\n                else\n                    column = Math.max(0, column - (range.end.column - range.start.column));\n                \n            } else if (range.start.row !== range.end.row && range.start.row < row) {\n                if (range.end.row == row) {\n                    column = Math.max(0, column - range.end.column) + range.start.column;\n                }\n                row -= (range.end.row - range.start.row);\n            }\n            else if (range.end.row == row) {\n                row -= range.end.row - range.start.row;\n                column = Math.max(0, column - range.end.column) + range.start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (range.start.row <= row) {\n                if (range.end.row <= row)\n                    row -= range.end.row - range.start.row;\n                else {\n                    row = range.start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        }\n        else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n        \n        if (this.row == pos.row && this.column == pos.column)\n            return;\n            \n        var old = {\n            row: this.row,\n            column: this.column\n        };\n        \n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n    \n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n        \n        if (column < 0)\n            pos.column = 0;\n            \n        return pos;\n    };\n    \n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n     return new Array(count + 1).join(string);\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj != \"object\") {\n        return obj;\n    }\n    \n    var copy = obj.constructor();\n    for (var key in obj) {\n        if (typeof obj[key] == \"object\") {\n            copy[key] = this.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\n\n\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n\n    return deferred;\n};\n\n});\ndefine('ace/worker/jshint', ['require', 'exports', 'module' ], function(require, exports, module) {\n/*!\n * JSHint, by JSHint Community.\n *\n * Licensed under the same slightly modified MIT license that JSLint is.\n * It stops evil-doers everywhere.\n *\n * JSHint is a derivative work of JSLint:\n *\n *   Copyright (c) 2002 Douglas Crockford  (www.JSLint.com)\n *\n *   Permission is hereby granted, free of charge, to any person obtaining\n *   a copy of this software and associated documentation files (the \"Software\"),\n *   to deal in the Software without restriction, including without limitation\n *   the rights to use, copy, modify, merge, publish, distribute, sublicense,\n *   and/or sell copies of the Software, and to permit persons to whom\n *   the Software is furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included\n *   in all copies or substantial portions of the Software.\n *\n *   The Software shall be used for Good, not Evil.\n *\n *   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n *   DEALINGS IN THE SOFTWARE.\n *\n * JSHint was forked from 2010-12-16 edition of JSLint.\n *\n */\n\n/*\n JSHINT is a global function. It takes two parameters.\n\n     var myResult = JSHINT(source, option);\n\n The first parameter is either a string or an array of strings. If it is a\n string, it will be split on '\\n' or '\\r'. If it is an array of strings, it\n is assumed that each string represents one line. The source can be a\n JavaScript text or a JSON text.\n\n The second parameter is an optional object of options which control the\n operation of JSHINT. Most of the options are booleans: They are all\n optional and have a default value of false. One of the options, predef,\n can be an array of names, which will be used to declare global variables,\n or an object whose keys are used as global names, with a boolean value\n that determines if they are assignable.\n\n If it checks out, JSHINT returns true. Otherwise, it returns false.\n\n If false, you can inspect JSHINT.errors to find out the problems.\n JSHINT.errors is an array of objects containing these members:\n\n {\n     line      : The line (relative to 0) at which the lint was found\n     character : The character (relative to 0) at which the lint was found\n     reason    : The problem\n     evidence  : The text line in which the problem occurred\n     raw       : The raw message before the details were inserted\n     a         : The first detail\n     b         : The second detail\n     c         : The third detail\n     d         : The fourth detail\n }\n\n If a fatal error was found, a null will be the last element of the\n JSHINT.errors array.\n\n You can request a Function Report, which shows all of the functions\n and the parameters and vars that they use. This can be used to find\n implied global variables and other problems. The report is in HTML and\n can be inserted in an HTML <body>.\n\n     var myReport = JSHINT.report(limited);\n\n If limited is true, then the report will be limited to only errors.\n\n You can request a data structure which contains JSHint's results.\n\n     var myData = JSHINT.data();\n\n It returns a structure with this form:\n\n {\n     errors: [\n         {\n             line: NUMBER,\n             character: NUMBER,\n             reason: STRING,\n             evidence: STRING\n         }\n     ],\n     functions: [\n         name: STRING,\n         line: NUMBER,\n         last: NUMBER,\n         param: [\n             STRING\n         ],\n         closure: [\n             STRING\n         ],\n         var: [\n             STRING\n         ],\n         exception: [\n             STRING\n         ],\n         outer: [\n             STRING\n         ],\n         unused: [\n             STRING\n         ],\n         global: [\n             STRING\n         ],\n         label: [\n             STRING\n         ]\n     ],\n     globals: [\n         STRING\n     ],\n     member: {\n         STRING: NUMBER\n     },\n     unused: [\n         {\n             name: STRING,\n             line: NUMBER\n         }\n     ],\n     implieds: [\n         {\n             name: STRING,\n             line: NUMBER\n         }\n     ],\n     urls: [\n         STRING\n     ],\n     json: BOOLEAN\n }\n\n Empty arrays will not be included.\n\n*/\n\n/*jshint\n evil: true, nomen: false, onevar: false, regexp: false, strict: true, boss: true,\n undef: true, maxlen: 100, indent:4\n*/\n\n/*members \"\\b\", \"\\t\", \"\\n\", \"\\f\", \"\\r\", \"!=\", \"!==\", \"\\\"\", \"%\", \"(begin)\",\n \"(breakage)\", \"(context)\", \"(error)\", \"(global)\", \"(identifier)\", \"(last)\",\n \"(line)\", \"(loopage)\", \"(name)\", \"(onevar)\", \"(params)\", \"(scope)\",\n \"(statement)\", \"(verb)\", \"*\", \"+\", \"++\", \"-\", \"--\", \"\\/\", \"<\", \"<=\", \"==\",\n \"===\", \">\", \">=\", $, $$, $A, $F, $H, $R, $break, $continue, $w, Abstract, Ajax,\n __filename, __dirname, ActiveXObject, Array, ArrayBuffer, ArrayBufferView, Audio,\n Autocompleter, Assets, Boolean, Builder, Buffer, Browser, COM, CScript, Canvas,\n CustomAnimation, Class, Control, Chain, Color, Cookie, Core, DataView, Date,\n Debug, Draggable, Draggables, Droppables, Document, DomReady, DOMReady, DOMParser, Drag,\n E, Enumerator, Enumerable, Element, Elements, Error, Effect, EvalError, Event,\n Events, FadeAnimation, Field, Flash, Float32Array, Float64Array, Form,\n FormField, Frame, FormData, Function, Fx, GetObject, Group, Hash, HotKey,\n HTMLElement, HTMLAnchorElement, HTMLBaseElement, HTMLBlockquoteElement,\n HTMLBodyElement, HTMLBRElement, HTMLButtonElement, HTMLCanvasElement, HTMLDirectoryElement,\n HTMLDivElement, HTMLDListElement, HTMLFieldSetElement,\n HTMLFontElement, HTMLFormElement, HTMLFrameElement, HTMLFrameSetElement,\n HTMLHeadElement, HTMLHeadingElement, HTMLHRElement, HTMLHtmlElement,\n HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLIsIndexElement,\n HTMLLabelElement, HTMLLayerElement, HTMLLegendElement, HTMLLIElement,\n HTMLLinkElement, HTMLMapElement, HTMLMenuElement, HTMLMetaElement,\n HTMLModElement, HTMLObjectElement, HTMLOListElement, HTMLOptGroupElement,\n HTMLOptionElement, HTMLParagraphElement, HTMLParamElement, HTMLPreElement,\n HTMLQuoteElement, HTMLScriptElement, HTMLSelectElement, HTMLStyleElement,\n HtmlTable, HTMLTableCaptionElement, HTMLTableCellElement, HTMLTableColElement,\n HTMLTableElement, HTMLTableRowElement, HTMLTableSectionElement,\n HTMLTextAreaElement, HTMLTitleElement, HTMLUListElement, HTMLVideoElement,\n Iframe, IframeShim, Image, Int16Array, Int32Array, Int8Array,\n Insertion, InputValidator, JSON, Keyboard, Locale, LN10, LN2, LOG10E, LOG2E,\n MAX_VALUE, MIN_VALUE, Mask, Math, MenuItem, MessageChannel, MessageEvent, MessagePort,\n MoveAnimation, MooTools, Native, NEGATIVE_INFINITY, Number, Object, ObjectRange, Option,\n Options, OverText, PI, POSITIVE_INFINITY, PeriodicalExecuter, Point, Position, Prototype,\n RangeError, Rectangle, ReferenceError, RegExp, ResizeAnimation, Request, RotateAnimation,\n SQRT1_2, SQRT2, ScrollBar, ScriptEngine, ScriptEngineBuildVersion,\n ScriptEngineMajorVersion, ScriptEngineMinorVersion, Scriptaculous, Scroller,\n Slick, Slider, Selector, SharedWorker, String, Style, SyntaxError, Sortable, Sortables,\n SortableObserver, Sound, Spinner, System, Swiff, Text, TextArea, Template,\n Timer, Tips, Type, TypeError, Toggle, Try, \"use strict\", unescape, URI, URIError, URL,\n VBArray, WSH, WScript, XDomainRequest, Web, Window, XMLDOM, XMLHttpRequest, XMLSerializer,\n XPathEvaluator, XPathException, XPathExpression, XPathNamespace, XPathNSResolver, XPathResult,\n \"\\\\\", a, addEventListener, address, alert, apply, applicationCache, arguments, arity, asi, atob,\n b, basic, basicToken, bitwise, block, blur, boolOptions, boss, browser, btoa, c, call, callee,\n caller, cases, charAt, charCodeAt, character, clearInterval, clearTimeout,\n close, closed, closure, comment, condition, confirm, console, constructor,\n content, couch, create, css, curly, d, data, datalist, dd, debug, decodeURI,\n decodeURIComponent, defaultStatus, defineClass, deserialize, devel, document,\n dojo, dijit, dojox, define, else, emit, encodeURI, encodeURIComponent,\n entityify, eqeqeq, eqnull, errors, es5, escape, esnext, eval, event, evidence, evil,\n ex, exception, exec, exps, expr, exports, FileReader, first, floor, focus,\n forin, fragment, frames, from, fromCharCode, fud, funcscope, funct, function, functions,\n g, gc, getComputedStyle, getRow, getter, getterToken, GLOBAL, global, globals, globalstrict,\n hasOwnProperty, help, history, i, id, identifier, immed, implieds, importPackage, include,\n indent, indexOf, init, ins, instanceOf, isAlpha, isApplicationRunning, isArray,\n isDigit, isFinite, isNaN, iterator, java, join, jshint,\n JSHINT, json, jquery, jQuery, keys, label, labelled, last, lastsemic, laxbreak, laxcomma,\n latedef, lbp, led, left, length, line, load, loadClass, localStorage, location,\n log, loopfunc, m, match, maxerr, maxlen, member,message, meta, module, moveBy,\n moveTo, mootools, multistr, name, navigator, new, newcap, noarg, node, noempty, nomen,\n nonew, nonstandard, nud, onbeforeunload, onblur, onerror, onevar, onecase, onfocus,\n onload, onresize, onunload, open, openDatabase, openURL, opener, opera, options, outer, param,\n parent, parseFloat, parseInt, passfail, plusplus, predef, print, process, prompt,\n proto, prototype, prototypejs, provides, push, quit, range, raw, reach, reason, regexp,\n readFile, readUrl, regexdash, removeEventListener, replace, report, require,\n reserved, resizeBy, resizeTo, resolvePath, resumeUpdates, respond, rhino, right,\n runCommand, scroll, screen, scripturl, scrollBy, scrollTo, scrollbar, search, seal,\n send, serialize, sessionStorage, setInterval, setTimeout, setter, setterToken, shift, slice,\n smarttabs, sort, spawn, split, stack, status, start, strict, sub, substr, supernew, shadow,\n supplant, sum, sync, test, toLowerCase, toString, toUpperCase, toint32, token, top, trailing,\n type, typeOf, Uint16Array, Uint32Array, Uint8Array, undef, undefs, unused, urls, validthis,\n value, valueOf, var, version, WebSocket, withstmt, white, window, Worker, wsh*/\n\n/*global exports: false */\n\n// We build the application inside a function so that we produce only a single\n// global variable. That function will be invoked immediately, and its return\n// value is the JSHINT function itself.\n\nvar JSHINT = (function () {\n    \n\n    var anonname,       // The guessed name for anonymous functions.\n\n// These are operators that should not be used with the ! operator.\n\n        bang = {\n            '<'  : true,\n            '<=' : true,\n            '==' : true,\n            '===': true,\n            '!==': true,\n            '!=' : true,\n            '>'  : true,\n            '>=' : true,\n            '+'  : true,\n            '-'  : true,\n            '*'  : true,\n            '/'  : true,\n            '%'  : true\n        },\n\n        // These are the JSHint boolean options.\n        boolOptions = {\n            asi         : true, // if automatic semicolon insertion should be tolerated\n            bitwise     : true, // if bitwise operators should not be allowed\n            boss        : true, // if advanced usage of assignments should be allowed\n            browser     : true, // if the standard browser globals should be predefined\n            couch       : true, // if CouchDB globals should be predefined\n            curly       : true, // if curly braces around all blocks should be required\n            debug       : true, // if debugger statements should be allowed\n            devel       : true, // if logging globals should be predefined (console,\n                                // alert, etc.)\n            dojo        : true, // if Dojo Toolkit globals should be predefined\n            eqeqeq      : true, // if === should be required\n            eqnull      : true, // if == null comparisons should be tolerated\n            es5         : true, // if ES5 syntax should be allowed\n            esnext      : true, // if es.next specific syntax should be allowed\n            evil        : true, // if eval should be allowed\n            expr        : true, // if ExpressionStatement should be allowed as Programs\n            forin       : true, // if for in statements must filter\n            funcscope   : true, // if only function scope should be used for scope tests\n            globalstrict: true, // if global  should be allowed (also\n                                // enables 'strict')\n            immed       : true, // if immediate invocations must be wrapped in parens\n            iterator    : true, // if the `__iterator__` property should be allowed\n            jquery      : true, // if jQuery globals should be predefined\n            lastsemic   : true, // if semicolons may be ommitted for the trailing\n                                // statements inside of a one-line blocks.\n            latedef     : true, // if the use before definition should not be tolerated\n            laxbreak    : true, // if line breaks should not be checked\n            laxcomma    : true, // if line breaks should not be checked around commas\n            loopfunc    : true, // if functions should be allowed to be defined within\n                                // loops\n            mootools    : true, // if MooTools globals should be predefined\n            multistr    : true, // allow multiline strings\n            newcap      : true, // if constructor names must be capitalized\n            noarg       : true, // if arguments.caller and arguments.callee should be\n                                // disallowed\n            node        : true, // if the Node.js environment globals should be\n                                // predefined\n            noempty     : true, // if empty blocks should be disallowed\n            nonew       : true, // if using `new` for side-effects should be disallowed\n            nonstandard : true, // if non-standard (but widely adopted) globals should\n                                // be predefined\n            nomen       : true, // if names should be checked\n            onevar      : true, // if only one var statement per function should be\n                                // allowed\n            onecase     : true, // if one case switch statements should be allowed\n            passfail    : true, // if the scan should stop on first error\n            plusplus    : true, // if increment/decrement should not be allowed\n            proto       : true, // if the `__proto__` property should be allowed\n            prototypejs : true, // if Prototype and Scriptaculous globals should be\n                                // predefined\n            regexdash   : true, // if unescaped first/last dash (-) inside brackets\n                                // should be tolerated\n            regexp      : true, // if the . should not be allowed in regexp literals\n            rhino       : true, // if the Rhino environment globals should be predefined\n            undef       : true, // if variables should be declared before used\n            scripturl   : true, // if script-targeted URLs should be tolerated\n            shadow      : true, // if variable shadowing should be tolerated\n            smarttabs   : true, // if smarttabs should be tolerated\n                                // (http://www.emacswiki.org/emacs/SmartTabs)\n            strict      : true, // require the  pragma\n            sub         : true, // if all forms of subscript notation are tolerated\n            supernew    : true, // if `new function () { ... };` and `new Object;`\n                                // should be tolerated\n            trailing    : true, // if trailing whitespace rules apply\n            validthis   : true, // if 'this' inside a non-constructor function is valid.\n                                // This is a function scoped option only.\n            withstmt    : true, // if with statements should be allowed\n            white       : true, // if strict whitespace rules apply\n            wsh         : true  // if the Windows Scripting Host environment globals\n                                // should be predefined\n        },\n\n        // These are the JSHint options that can take any value\n        // (we use this object to detect invalid options)\n        valOptions = {\n            maxlen: false,\n            indent: false,\n            maxerr: false,\n            predef: false\n        },\n\n\n        // browser contains a set of global names which are commonly provided by a\n        // web browser environment.\n        browser = {\n            ArrayBuffer              :  false,\n            ArrayBufferView          :  false,\n            Audio                    :  false,\n            addEventListener         :  false,\n            applicationCache         :  false,\n            atob                     :  false,\n            blur                     :  false,\n            btoa                     :  false,\n            clearInterval            :  false,\n            clearTimeout             :  false,\n            close                    :  false,\n            closed                   :  false,\n            DataView                 :  false,\n            DOMParser                :  false,\n            defaultStatus            :  false,\n            document                 :  false,\n            event                    :  false,\n            FileReader               :  false,\n            Float32Array             :  false,\n            Float64Array             :  false,\n            FormData                 :  false,\n            focus                    :  false,\n            frames                   :  false,\n            getComputedStyle         :  false,\n            HTMLElement              :  false,\n            HTMLAnchorElement        :  false,\n            HTMLBaseElement          :  false,\n            HTMLBlockquoteElement    :  false,\n            HTMLBodyElement          :  false,\n            HTMLBRElement            :  false,\n            HTMLButtonElement        :  false,\n            HTMLCanvasElement        :  false,\n            HTMLDirectoryElement     :  false,\n            HTMLDivElement           :  false,\n            HTMLDListElement         :  false,\n            HTMLFieldSetElement      :  false,\n            HTMLFontElement          :  false,\n            HTMLFormElement          :  false,\n            HTMLFrameElement         :  false,\n            HTMLFrameSetElement      :  false,\n            HTMLHeadElement          :  false,\n            HTMLHeadingElement       :  false,\n            HTMLHRElement            :  false,\n            HTMLHtmlElement          :  false,\n            HTMLIFrameElement        :  false,\n            HTMLImageElement         :  false,\n            HTMLInputElement         :  false,\n            HTMLIsIndexElement       :  false,\n            HTMLLabelElement         :  false,\n            HTMLLayerElement         :  false,\n            HTMLLegendElement        :  false,\n            HTMLLIElement            :  false,\n            HTMLLinkElement          :  false,\n            HTMLMapElement           :  false,\n            HTMLMenuElement          :  false,\n            HTMLMetaElement          :  false,\n            HTMLModElement           :  false,\n            HTMLObjectElement        :  false,\n            HTMLOListElement         :  false,\n            HTMLOptGroupElement      :  false,\n            HTMLOptionElement        :  false,\n            HTMLParagraphElement     :  false,\n            HTMLParamElement         :  false,\n            HTMLPreElement           :  false,\n            HTMLQuoteElement         :  false,\n            HTMLScriptElement        :  false,\n            HTMLSelectElement        :  false,\n            HTMLStyleElement         :  false,\n            HTMLTableCaptionElement  :  false,\n            HTMLTableCellElement     :  false,\n            HTMLTableColElement      :  false,\n            HTMLTableElement         :  false,\n            HTMLTableRowElement      :  false,\n            HTMLTableSectionElement  :  false,\n            HTMLTextAreaElement      :  false,\n            HTMLTitleElement         :  false,\n            HTMLUListElement         :  false,\n            HTMLVideoElement         :  false,\n            history                  :  false,\n            Int16Array               :  false,\n            Int32Array               :  false,\n            Int8Array                :  false,\n            Image                    :  false,\n            length                   :  false,\n            localStorage             :  false,\n            location                 :  false,\n            MessageChannel           :  false,\n            MessageEvent             :  false,\n            MessagePort              :  false,\n            moveBy                   :  false,\n            moveTo                   :  false,\n            name                     :  false,\n            navigator                :  false,\n            onbeforeunload           :  true,\n            onblur                   :  true,\n            onerror                  :  true,\n            onfocus                  :  true,\n            onload                   :  true,\n            onresize                 :  true,\n            onunload                 :  true,\n            open                     :  false,\n            openDatabase             :  false,\n            opener                   :  false,\n            Option                   :  false,\n            parent                   :  false,\n            print                    :  false,\n            removeEventListener      :  false,\n            resizeBy                 :  false,\n            resizeTo                 :  false,\n            screen                   :  false,\n            scroll                   :  false,\n            scrollBy                 :  false,\n            scrollTo                 :  false,\n            sessionStorage           :  false,\n            setInterval              :  false,\n            setTimeout               :  false,\n            SharedWorker             :  false,\n            status                   :  false,\n            top                      :  false,\n            Uint16Array              :  false,\n            Uint32Array              :  false,\n            Uint8Array               :  false,\n            WebSocket                :  false,\n            window                   :  false,\n            Worker                   :  false,\n            XMLHttpRequest           :  false,\n            XMLSerializer            :  false,\n            XPathEvaluator           :  false,\n            XPathException           :  false,\n            XPathExpression          :  false,\n            XPathNamespace           :  false,\n            XPathNSResolver          :  false,\n            XPathResult              :  false\n        },\n\n        couch = {\n            \"require\" : false,\n            respond   : false,\n            getRow    : false,\n            emit      : false,\n            send      : false,\n            start     : false,\n            sum       : false,\n            log       : false,\n            exports   : false,\n            module    : false,\n            provides  : false\n        },\n\n        devel = {\n            alert   : false,\n            confirm : false,\n            console : false,\n            Debug   : false,\n            opera   : false,\n            prompt  : false\n        },\n\n        dojo = {\n            dojo      : false,\n            dijit     : false,\n            dojox     : false,\n            define    : false,\n            \"require\" : false\n        },\n\n        escapes = {\n            '\\b': '\\\\b',\n            '\\t': '\\\\t',\n            '\\n': '\\\\n',\n            '\\f': '\\\\f',\n            '\\r': '\\\\r',\n            '\"' : '\\\\\"',\n            '/' : '\\\\/',\n            '\\\\': '\\\\\\\\'\n        },\n\n        funct,          // The current function\n\n        functionicity = [\n            'closure', 'exception', 'global', 'label',\n            'outer', 'unused', 'var'\n        ],\n\n        functions,      // All of the functions\n\n        global,         // The global scope\n        implied,        // Implied globals\n        inblock,\n        indent,\n        jsonmode,\n\n        jquery = {\n            '$'    : false,\n            jQuery : false\n        },\n\n        lines,\n        lookahead,\n        member,\n        membersOnly,\n\n        mootools = {\n            '$'             : false,\n            '$$'            : false,\n            Assets          : false,\n            Browser         : false,\n            Chain           : false,\n            Class           : false,\n            Color           : false,\n            Cookie          : false,\n            Core            : false,\n            Document        : false,\n            DomReady        : false,\n            DOMReady        : false,\n            Drag            : false,\n            Element         : false,\n            Elements        : false,\n            Event           : false,\n            Events          : false,\n            Fx              : false,\n            Group           : false,\n            Hash            : false,\n            HtmlTable       : false,\n            Iframe          : false,\n            IframeShim      : false,\n            InputValidator  : false,\n            instanceOf      : false,\n            Keyboard        : false,\n            Locale          : false,\n            Mask            : false,\n            MooTools        : false,\n            Native          : false,\n            Options         : false,\n            OverText        : false,\n            Request         : false,\n            Scroller        : false,\n            Slick           : false,\n            Slider          : false,\n            Sortables       : false,\n            Spinner         : false,\n            Swiff           : false,\n            Tips            : false,\n            Type            : false,\n            typeOf          : false,\n            URI             : false,\n            Window          : false\n        },\n\n        nexttoken,\n\n        node = {\n            __filename    : false,\n            __dirname     : false,\n            Buffer        : false,\n            console       : false,\n            exports       : false,\n            GLOBAL        : false,\n            global        : false,\n            module        : false,\n            process       : false,\n            require       : false,\n            setTimeout    : false,\n            clearTimeout  : false,\n            setInterval   : false,\n            clearInterval : false\n        },\n\n        noreach,\n        option,\n        predefined,     // Global variables defined by option\n        prereg,\n        prevtoken,\n\n        prototypejs = {\n            '$'               : false,\n            '$$'              : false,\n            '$A'              : false,\n            '$F'              : false,\n            '$H'              : false,\n            '$R'              : false,\n            '$break'          : false,\n            '$continue'       : false,\n            '$w'              : false,\n            Abstract          : false,\n            Ajax              : false,\n            Class             : false,\n            Enumerable        : false,\n            Element           : false,\n            Event             : false,\n            Field             : false,\n            Form              : false,\n            Hash              : false,\n            Insertion         : false,\n            ObjectRange       : false,\n            PeriodicalExecuter: false,\n            Position          : false,\n            Prototype         : false,\n            Selector          : false,\n            Template          : false,\n            Toggle            : false,\n            Try               : false,\n            Autocompleter     : false,\n            Builder           : false,\n            Control           : false,\n            Draggable         : false,\n            Draggables        : false,\n            Droppables        : false,\n            Effect            : false,\n            Sortable          : false,\n            SortableObserver  : false,\n            Sound             : false,\n            Scriptaculous     : false\n        },\n\n        rhino = {\n            defineClass  : false,\n            deserialize  : false,\n            gc           : false,\n            help         : false,\n            importPackage: false,\n            \"java\"       : false,\n            load         : false,\n            loadClass    : false,\n            print        : false,\n            quit         : false,\n            readFile     : false,\n            readUrl      : false,\n            runCommand   : false,\n            seal         : false,\n            serialize    : false,\n            spawn        : false,\n            sync         : false,\n            toint32      : false,\n            version      : false\n        },\n\n        scope,      // The current scope\n        stack,\n\n        // standard contains the global names that are provided by the\n        // ECMAScript standard.\n        standard = {\n            Array               : false,\n            Boolean             : false,\n            Date                : false,\n            decodeURI           : false,\n            decodeURIComponent  : false,\n            encodeURI           : false,\n            encodeURIComponent  : false,\n            Error               : false,\n            'eval'              : false,\n            EvalError           : false,\n            Function            : false,\n            hasOwnProperty      : false,\n            isFinite            : false,\n            isNaN               : false,\n            JSON                : false,\n            Math                : false,\n            Number              : false,\n            Object              : false,\n            parseInt            : false,\n            parseFloat          : false,\n            RangeError          : false,\n            ReferenceError      : false,\n            RegExp              : false,\n            String              : false,\n            SyntaxError         : false,\n            TypeError           : false,\n            URIError            : false\n        },\n\n        // widely adopted global names that are not part of ECMAScript standard\n        nonstandard = {\n            escape              : false,\n            unescape            : false\n        },\n\n        standard_member = {\n            E                   : true,\n            LN2                 : true,\n            LN10                : true,\n            LOG2E               : true,\n            LOG10E              : true,\n            MAX_VALUE           : true,\n            MIN_VALUE           : true,\n            NEGATIVE_INFINITY   : true,\n            PI                  : true,\n            POSITIVE_INFINITY   : true,\n            SQRT1_2             : true,\n            SQRT2               : true\n        },\n\n        directive,\n        syntax = {},\n        tab,\n        token,\n        urls,\n        useESNextSyntax,\n        warnings,\n\n        wsh = {\n            ActiveXObject             : true,\n            Enumerator                : true,\n            GetObject                 : true,\n            ScriptEngine              : true,\n            ScriptEngineBuildVersion  : true,\n            ScriptEngineMajorVersion  : true,\n            ScriptEngineMinorVersion  : true,\n            VBArray                   : true,\n            WSH                       : true,\n            WScript                   : true,\n            XDomainRequest            : true\n        };\n\n    // Regular expressions. Some of these are stupidly long.\n    var ax, cx, tx, nx, nxg, lx, ix, jx, ft;\n    (function () {\n        /*jshint maxlen:300 */\n\n        // unsafe comment or string\n        ax = /@cc|<\\/?|script|\\]\\s*\\]|<\\s*!|&lt/i;\n\n        // unsafe characters that are silently deleted by one or more browsers\n        cx = /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\n\n        // token\n        tx = /^\\s*([(){}\\[.,:;'\"~\\?\\]#@]|==?=?|\\/(\\*(jshint|jslint|members?|global)?|=|\\/)?|\\*[\\/=]?|\\+(?:=|\\++)?|-(?:=|-+)?|%=?|&[&=]?|\\|[|=]?|>>?>?=?|<([\\/=!]|\\!(\\[|--)?|<=?)?|\\^=?|\\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\\.[0-9]*)?([eE][+\\-]?[0-9]+)?)/;\n\n        // characters in strings that need escapement\n        nx = /[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\n        nxg = /[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n        // star slash\n        lx = /\\*\\/|\\/\\*/;\n\n        // identifier\n        ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;\n\n        // javascript url\n        jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\\s*:/i;\n\n        // catches /* falls through */ comments\n        ft = /^\\s*\\/\\*\\s*falls\\sthrough\\s*\\*\\/\\s*$/;\n    }());\n\n    function F() {}     // Used by Object.create\n\n    function is_own(object, name) {\n\n// The object.hasOwnProperty method fails when the property under consideration\n// is named 'hasOwnProperty'. So we have to use this more convoluted form.\n\n        return Object.prototype.hasOwnProperty.call(object, name);\n    }\n\n    function checkOption(name, t) {\n        if (valOptions[name] === undefined && boolOptions[name] === undefined) {\n            warning(\"Bad option: '\" + name + \"'.\", t);\n        }\n    }\n\n// Provide critical ES5 functions to ES3.\n\n    if (typeof Array.isArray !== 'function') {\n        Array.isArray = function (o) {\n            return Object.prototype.toString.apply(o) === '[object Array]';\n        };\n    }\n\n    if (typeof Object.create !== 'function') {\n        Object.create = function (o) {\n            F.prototype = o;\n            return new F();\n        };\n    }\n\n    if (typeof Object.keys !== 'function') {\n        Object.keys = function (o) {\n            var a = [], k;\n            for (k in o) {\n                if (is_own(o, k)) {\n                    a.push(k);\n                }\n            }\n            return a;\n        };\n    }\n\n// Non standard methods\n\n    if (typeof String.prototype.entityify !== 'function') {\n        String.prototype.entityify = function () {\n            return this\n                .replace(/&/g, '&amp;')\n                .replace(/</g, '&lt;')\n                .replace(/>/g, '&gt;');\n        };\n    }\n\n    if (typeof String.prototype.isAlpha !== 'function') {\n        String.prototype.isAlpha = function () {\n            return (this >= 'a' && this <= 'z\\uffff') ||\n                (this >= 'A' && this <= 'Z\\uffff');\n        };\n    }\n\n    if (typeof String.prototype.isDigit !== 'function') {\n        String.prototype.isDigit = function () {\n            return (this >= '0' && this <= '9');\n        };\n    }\n\n    if (typeof String.prototype.supplant !== 'function') {\n        String.prototype.supplant = function (o) {\n            return this.replace(/\\{([^{}]*)\\}/g, function (a, b) {\n                var r = o[b];\n                return typeof r === 'string' || typeof r === 'number' ? r : a;\n            });\n        };\n    }\n\n    if (typeof String.prototype.name !== 'function') {\n        String.prototype.name = function () {\n\n// If the string looks like an identifier, then we can return it as is.\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can simply slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe\n// sequences.\n\n            if (ix.test(this)) {\n                return this;\n            }\n            if (nx.test(this)) {\n                return '\"' + this.replace(nxg, function (a) {\n                    var c = escapes[a];\n                    if (c) {\n                        return c;\n                    }\n                    return '\\\\u' + ('0000' + a.charCodeAt().toString(16)).slice(-4);\n                }) + '\"';\n            }\n            return '\"' + this + '\"';\n        };\n    }\n\n\n    function combine(t, o) {\n        var n;\n        for (n in o) {\n            if (is_own(o, n)) {\n                t[n] = o[n];\n            }\n        }\n    }\n\n    function assume() {\n        if (option.couch) {\n            combine(predefined, couch);\n        }\n\n        if (option.rhino) {\n            combine(predefined, rhino);\n        }\n\n        if (option.prototypejs) {\n            combine(predefined, prototypejs);\n        }\n\n        if (option.node) {\n            combine(predefined, node);\n            option.globalstrict = true;\n        }\n\n        if (option.devel) {\n            combine(predefined, devel);\n        }\n\n        if (option.dojo) {\n            combine(predefined, dojo);\n        }\n\n        if (option.browser) {\n            combine(predefined, browser);\n        }\n\n        if (option.nonstandard) {\n            combine(predefined, nonstandard);\n        }\n\n        if (option.jquery) {\n            combine(predefined, jquery);\n        }\n\n        if (option.mootools) {\n            combine(predefined, mootools);\n        }\n\n        if (option.wsh) {\n            combine(predefined, wsh);\n        }\n\n        if (option.esnext) {\n            useESNextSyntax();\n        }\n\n        if (option.globalstrict && option.strict !== false) {\n            option.strict = true;\n        }\n    }\n\n\n    // Produce an error warning.\n    function quit(message, line, chr) {\n        var percentage = Math.floor((line / lines.length) * 100);\n\n        throw {\n            name: 'JSHintError',\n            line: line,\n            character: chr,\n            message: message + \" (\" + percentage + \"% scanned).\",\n            raw: message\n        };\n    }\n\n    function isundef(scope, m, t, a) {\n        return JSHINT.undefs.push([scope, m, t, a]);\n    }\n\n    function warning(m, t, a, b, c, d) {\n        var ch, l, w;\n        t = t || nexttoken;\n        if (t.id === '(end)') {  // `~\n            t = token;\n        }\n        l = t.line || 0;\n        ch = t.from || 0;\n        w = {\n            id: '(error)',\n            raw: m,\n            evidence: lines[l - 1] || '',\n            line: l,\n            character: ch,\n            a: a,\n            b: b,\n            c: c,\n            d: d\n        };\n        w.reason = m.supplant(w);\n        JSHINT.errors.push(w);\n        if (option.passfail) {\n            quit('Stopping. ', l, ch);\n        }\n        warnings += 1;\n        if (warnings >= option.maxerr) {\n            quit(\"Too many errors.\", l, ch);\n        }\n        return w;\n    }\n\n    function warningAt(m, l, ch, a, b, c, d) {\n        return warning(m, {\n            line: l,\n            from: ch\n        }, a, b, c, d);\n    }\n\n    function error(m, t, a, b, c, d) {\n        var w = warning(m, t, a, b, c, d);\n    }\n\n    function errorAt(m, l, ch, a, b, c, d) {\n        return error(m, {\n            line: l,\n            from: ch\n        }, a, b, c, d);\n    }\n\n\n\n// lexical analysis and token construction\n\n    var lex = (function lex() {\n        var character, from, line, s;\n\n// Private lex methods\n\n        function nextLine() {\n            var at,\n                tw; // trailing whitespace check\n\n            if (line >= lines.length)\n                return false;\n\n            character = 1;\n            s = lines[line];\n            line += 1;\n\n            // If smarttabs option is used check for spaces followed by tabs only.\n            // Otherwise check for any occurence of mixed tabs and spaces.\n            if (option.smarttabs)\n                at = s.search(/ \\t/);\n            else\n                at = s.search(/ \\t|\\t /);\n\n            if (at >= 0)\n                warningAt(\"Mixed spaces and tabs.\", line, at + 1);\n\n            s = s.replace(/\\t/g, tab);\n            at = s.search(cx);\n\n            if (at >= 0)\n                warningAt(\"Unsafe character.\", line, at);\n\n            if (option.maxlen && option.maxlen < s.length)\n                warningAt(\"Line too long.\", line, s.length);\n\n            // Check for trailing whitespaces\n            tw = option.trailing && s.match(/^(.*?)\\s+$/);\n            if (tw && !/^\\s+$/.test(s)) {\n                warningAt(\"Trailing whitespace.\", line, tw[1].length + 1);\n            }\n            return true;\n        }\n\n// Produce a token object.  The token inherits from a syntax symbol.\n\n        function it(type, value) {\n            var i, t;\n            if (type === '(color)' || type === '(range)') {\n                t = {type: type};\n            } else if (type === '(punctuator)' ||\n                    (type === '(identifier)' && is_own(syntax, value))) {\n                t = syntax[value] || syntax['(error)'];\n            } else {\n                t = syntax[type];\n            }\n            t = Object.create(t);\n            if (type === '(string)' || type === '(range)') {\n                if (!option.scripturl && jx.test(value)) {\n                    warningAt(\"Script URL.\", line, from);\n                }\n            }\n            if (type === '(identifier)') {\n                t.identifier = true;\n                if (value === '__proto__' && !option.proto) {\n                    warningAt(\"The '{a}' property is deprecated.\",\n                        line, from, value);\n                } else if (value === '__iterator__' && !option.iterator) {\n                    warningAt(\"'{a}' is only available in JavaScript 1.7.\",\n                        line, from, value);\n                } else if (option.nomen && (value.charAt(0) === '_' ||\n                         value.charAt(value.length - 1) === '_')) {\n                    if (!option.node || token.id === '.' ||\n                            (value !== '__dirname' && value !== '__filename')) {\n                        warningAt(\"Unexpected {a} in '{b}'.\", line, from, \"dangling '_'\", value);\n                    }\n                }\n            }\n            t.value = value;\n            t.line = line;\n            t.character = character;\n            t.from = from;\n            i = t.id;\n            if (i !== '(endline)') {\n                prereg = i &&\n                    (('(,=:[!&|?{};'.indexOf(i.charAt(i.length - 1)) >= 0) ||\n                    i === 'return' ||\n                    i === 'case');\n            }\n            return t;\n        }\n\n        // Public lex methods\n        return {\n            init: function (source) {\n                if (typeof source === 'string') {\n                    lines = source\n                        .replace(/\\r\\n/g, '\\n')\n                        .replace(/\\r/g, '\\n')\n                        .split('\\n');\n                } else {\n                    lines = source;\n                }\n\n                // If the first line is a shebang (#!), make it a blank and move on.\n                // Shebangs are used by Node scripts.\n                if (lines[0] && lines[0].substr(0, 2) === '#!')\n                    lines[0] = '';\n\n                line = 0;\n                nextLine();\n                from = 1;\n            },\n\n            range: function (begin, end) {\n                var c, value = '';\n                from = character;\n                if (s.charAt(0) !== begin) {\n                    errorAt(\"Expected '{a}' and instead saw '{b}'.\",\n                            line, character, begin, s.charAt(0));\n                }\n                for (;;) {\n                    s = s.slice(1);\n                    character += 1;\n                    c = s.charAt(0);\n                    switch (c) {\n                    case '':\n                        errorAt(\"Missing '{a}'.\", line, character, c);\n                        break;\n                    case end:\n                        s = s.slice(1);\n                        character += 1;\n                        return it('(range)', value);\n                    case '\\\\':\n                        warningAt(\"Unexpected '{a}'.\", line, character, c);\n                    }\n                    value += c;\n                }\n\n            },\n\n\n            // token -- this is called by advance to get the next token\n            token: function () {\n                var b, c, captures, d, depth, high, i, l, low, q, t, isLiteral, isInRange, n;\n\n                function match(x) {\n                    var r = x.exec(s), r1;\n                    if (r) {\n                        l = r[0].length;\n                        r1 = r[1];\n                        c = r1.charAt(0);\n                        s = s.substr(l);\n                        from = character + l - r1.length;\n                        character += l;\n                        return r1;\n                    }\n                }\n\n                function string(x) {\n                    var c, j, r = '', allowNewLine = false;\n\n                    if (jsonmode && x !== '\"') {\n                        warningAt(\"Strings must use doublequote.\",\n                                line, character);\n                    }\n\n                    function esc(n) {\n                        var i = parseInt(s.substr(j + 1, n), 16);\n                        j += n;\n                        if (i >= 32 && i <= 126 &&\n                                i !== 34 && i !== 92 && i !== 39) {\n                            warningAt(\"Unnecessary escapement.\", line, character);\n                        }\n                        character += n;\n                        c = String.fromCharCode(i);\n                    }\n                    j = 0;\nunclosedString:     for (;;) {\n                        while (j >= s.length) {\n                            j = 0;\n\n                            var cl = line, cf = from;\n                            if (!nextLine()) {\n                                errorAt(\"Unclosed string.\", cl, cf);\n                                break unclosedString;\n                            }\n\n                            if (allowNewLine) {\n                                allowNewLine = false;\n                            } else {\n                                warningAt(\"Unclosed string.\", cl, cf);\n                            }\n                        }\n                        c = s.charAt(j);\n                        if (c === x) {\n                            character += 1;\n                            s = s.substr(j + 1);\n                            return it('(string)', r, x);\n                        }\n                        if (c < ' ') {\n                            if (c === '\\n' || c === '\\r') {\n                                break;\n                            }\n                            warningAt(\"Control character in string: {a}.\",\n                                    line, character + j, s.slice(0, j));\n                        } else if (c === '\\\\') {\n                            j += 1;\n                            character += 1;\n                            c = s.charAt(j);\n                            n = s.charAt(j + 1);\n                            switch (c) {\n                            case '\\\\':\n                            case '\"':\n                            case '/':\n                                break;\n                            case '\\'':\n                                if (jsonmode) {\n                                    warningAt(\"Avoid \\\\'.\", line, character);\n                                }\n                                break;\n                            case 'b':\n                                c = '\\b';\n                                break;\n                            case 'f':\n                                c = '\\f';\n                                break;\n                            case 'n':\n                                c = '\\n';\n                                break;\n                            case 'r':\n                                c = '\\r';\n                                break;\n                            case 't':\n                                c = '\\t';\n                                break;\n                            case '0':\n                                c = '\\0';\n                                // Octal literals fail in strict mode\n                                // check if the number is between 00 and 07\n                                // where 'n' is the token next to 'c'\n                                if (n >= 0 && n <= 7 && directive[\"use strict\"]) {\n                                    warningAt(\n                                    \"Octal literals are not allowed in strict mode.\",\n                                    line, character);\n                                }\n                                break;\n                            case 'u':\n                                esc(4);\n                                break;\n                            case 'v':\n                                if (jsonmode) {\n                                    warningAt(\"Avoid \\\\v.\", line, character);\n                                }\n                                c = '\\v';\n                                break;\n                            case 'x':\n                                if (jsonmode) {\n                                    warningAt(\"Avoid \\\\x-.\", line, character);\n                                }\n                                esc(2);\n                                break;\n                            case '':\n                                // last character is escape character\n                                // always allow new line if escaped, but show\n                                // warning if option is not set\n                                allowNewLine = true;\n                                if (option.multistr) {\n                                    if (jsonmode) {\n                                        warningAt(\"Avoid EOL escapement.\", line, character);\n                                    }\n                                    c = '';\n                                    character -= 1;\n                                    break;\n                                }\n                                warningAt(\"Bad escapement of EOL. Use option multistr if needed.\",\n                                    line, character);\n                                break;\n                            default:\n                                warningAt(\"Bad escapement.\", line, character);\n                            }\n                        }\n                        r += c;\n                        character += 1;\n                        j += 1;\n                    }\n                }\n\n                for (;;) {\n                    if (!s) {\n                        return it(nextLine() ? '(endline)' : '(end)', '');\n                    }\n                    t = match(tx);\n                    if (!t) {\n                        t = '';\n                        c = '';\n                        while (s && s < '!') {\n                            s = s.substr(1);\n                        }\n                        if (s) {\n                            errorAt(\"Unexpected '{a}'.\", line, character, s.substr(0, 1));\n                            s = '';\n                        }\n                    } else {\n\n    //      identifier\n\n                        if (c.isAlpha() || c === '_' || c === '$') {\n                            return it('(identifier)', t);\n                        }\n\n    //      number\n\n                        if (c.isDigit()) {\n                            if (!isFinite(Number(t))) {\n                                warningAt(\"Bad number '{a}'.\",\n                                    line, character, t);\n                            }\n                            if (s.substr(0, 1).isAlpha()) {\n                                warningAt(\"Missing space after '{a}'.\",\n                                        line, character, t);\n                            }\n                            if (c === '0') {\n                                d = t.substr(1, 1);\n                                if (d.isDigit()) {\n                                    if (token.id !== '.') {\n                                        warningAt(\"Don't use extra leading zeros '{a}'.\",\n                                            line, character, t);\n                                    }\n                                } else if (jsonmode && (d === 'x' || d === 'X')) {\n                                    warningAt(\"Avoid 0x-. '{a}'.\",\n                                            line, character, t);\n                                }\n                            }\n                            if (t.substr(t.length - 1) === '.') {\n                                warningAt(\n\"A trailing decimal point can be confused with a dot '{a}'.\", line, character, t);\n                            }\n                            return it('(number)', t);\n                        }\n                        switch (t) {\n\n    //      string\n\n                        case '\"':\n                        case \"'\":\n                            return string(t);\n\n    //      // comment\n\n                        case '//':\n                            s = '';\n                            token.comment = true;\n                            break;\n\n    //      /* comment\n\n                        case '/*':\n                            for (;;) {\n                                i = s.search(lx);\n                                if (i >= 0) {\n                                    break;\n                                }\n                                if (!nextLine()) {\n                                    errorAt(\"Unclosed comment.\", line, character);\n                                }\n                            }\n                            character += i + 2;\n                            if (s.substr(i, 1) === '/') {\n                                errorAt(\"Nested comment.\", line, character);\n                            }\n                            s = s.substr(i + 2);\n                            token.comment = true;\n                            break;\n\n    //      /*members /*jshint /*global\n\n                        case '/*members':\n                        case '/*member':\n                        case '/*jshint':\n                        case '/*jslint':\n                        case '/*global':\n                        case '*/':\n                            return {\n                                value: t,\n                                type: 'special',\n                                line: line,\n                                character: character,\n                                from: from\n                            };\n\n                        case '':\n                            break;\n    //      /\n                        case '/':\n                            if (token.id === '/=') {\n                                errorAt(\"A regular expression literal can be confused with '/='.\",\n                                    line, from);\n                            }\n                            if (prereg) {\n                                depth = 0;\n                                captures = 0;\n                                l = 0;\n                                for (;;) {\n                                    b = true;\n                                    c = s.charAt(l);\n                                    l += 1;\n                                    switch (c) {\n                                    case '':\n                                        errorAt(\"Unclosed regular expression.\", line, from);\n                                        return quit('Stopping.', line, from);\n                                    case '/':\n                                        if (depth > 0) {\n                                            warningAt(\"{a} unterminated regular expression \" +\n                                                \"group(s).\", line, from + l, depth);\n                                        }\n                                        c = s.substr(0, l - 1);\n                                        q = {\n                                            g: true,\n                                            i: true,\n                                            m: true\n                                        };\n                                        while (q[s.charAt(l)] === true) {\n                                            q[s.charAt(l)] = false;\n                                            l += 1;\n                                        }\n                                        character += l;\n                                        s = s.substr(l);\n                                        q = s.charAt(0);\n                                        if (q === '/' || q === '*') {\n                                            errorAt(\"Confusing regular expression.\",\n                                                    line, from);\n                                        }\n                                        return it('(regexp)', c);\n                                    case '\\\\':\n                                        c = s.charAt(l);\n                                        if (c < ' ') {\n                                            warningAt(\n\"Unexpected control character in regular expression.\", line, from + l);\n                                        } else if (c === '<') {\n                                            warningAt(\n\"Unexpected escaped character '{a}' in regular expression.\", line, from + l, c);\n                                        }\n                                        l += 1;\n                                        break;\n                                    case '(':\n                                        depth += 1;\n                                        b = false;\n                                        if (s.charAt(l) === '?') {\n                                            l += 1;\n                                            switch (s.charAt(l)) {\n                                            case ':':\n                                            case '=':\n                                            case '!':\n                                                l += 1;\n                                                break;\n                                            default:\n                                                warningAt(\n\"Expected '{a}' and instead saw '{b}'.\", line, from + l, ':', s.charAt(l));\n                                            }\n                                        } else {\n                                            captures += 1;\n                                        }\n                                        break;\n                                    case '|':\n                                        b = false;\n                                        break;\n                                    case ')':\n                                        if (depth === 0) {\n                                            warningAt(\"Unescaped '{a}'.\",\n                                                    line, from + l, ')');\n                                        } else {\n                                            depth -= 1;\n                                        }\n                                        break;\n                                    case ' ':\n                                        q = 1;\n                                        while (s.charAt(l) === ' ') {\n                                            l += 1;\n                                            q += 1;\n                                        }\n                                        if (q > 1) {\n                                            warningAt(\n\"Spaces are hard to count. Use {{a}}.\", line, from + l, q);\n                                        }\n                                        break;\n                                    case '[':\n                                        c = s.charAt(l);\n                                        if (c === '^') {\n                                            l += 1;\n                                            if (option.regexp) {\n                                                warningAt(\"Insecure '{a}'.\",\n                                                        line, from + l, c);\n                                            } else if (s.charAt(l) === ']') {\n                                                errorAt(\"Unescaped '{a}'.\",\n                                                    line, from + l, '^');\n                                            }\n                                        }\n                                        if (c === ']') {\n                                            warningAt(\"Empty class.\", line,\n                                                    from + l - 1);\n                                        }\n                                        isLiteral = false;\n                                        isInRange = false;\nklass:                                  do {\n                                            c = s.charAt(l);\n                                            l += 1;\n                                            switch (c) {\n                                            case '[':\n                                            case '^':\n                                                warningAt(\"Unescaped '{a}'.\",\n                                                        line, from + l, c);\n                                                if (isInRange) {\n                                                    isInRange = false;\n                                                } else {\n                                                    isLiteral = true;\n                                                }\n                                                break;\n                                            case '-':\n                                                if (isLiteral && !isInRange) {\n                                                    isLiteral = false;\n                                                    isInRange = true;\n                                                } else if (isInRange) {\n                                                    isInRange = false;\n                                                } else if (s.charAt(l) === ']') {\n                                                    isInRange = true;\n                                                } else {\n                                                    if (option.regexdash !== (l === 2 || (l === 3 &&\n                                                        s.charAt(1) === '^'))) {\n                                                        warningAt(\"Unescaped '{a}'.\",\n                                                            line, from + l - 1, '-');\n                                                    }\n                                                    isLiteral = true;\n                                                }\n                                                break;\n                                            case ']':\n                                                if (isInRange && !option.regexdash) {\n                                                    warningAt(\"Unescaped '{a}'.\",\n                                                            line, from + l - 1, '-');\n                                                }\n                                                break klass;\n                                            case '\\\\':\n                                                c = s.charAt(l);\n                                                if (c < ' ') {\n                                                    warningAt(\n\"Unexpected control character in regular expression.\", line, from + l);\n                                                } else if (c === '<') {\n                                                    warningAt(\n\"Unexpected escaped character '{a}' in regular expression.\", line, from + l, c);\n                                                }\n                                                l += 1;\n\n                                                // \\w, \\s and \\d are never part of a character range\n                                                if (/[wsd]/i.test(c)) {\n                                                    if (isInRange) {\n                                                        warningAt(\"Unescaped '{a}'.\",\n                                                            line, from + l, '-');\n                                                        isInRange = false;\n                                                    }\n                                                    isLiteral = false;\n                                                } else if (isInRange) {\n                                                    isInRange = false;\n                                                } else {\n                                                    isLiteral = true;\n                                                }\n                                                break;\n                                            case '/':\n                                                warningAt(\"Unescaped '{a}'.\",\n                                                        line, from + l - 1, '/');\n\n                                                if (isInRange) {\n                                                    isInRange = false;\n                                                } else {\n                                                    isLiteral = true;\n                                                }\n                                                break;\n                                            case '<':\n                                                if (isInRange) {\n                                                    isInRange = false;\n                                                } else {\n                                                    isLiteral = true;\n                                                }\n                                                break;\n                                            default:\n                                                if (isInRange) {\n                                                    isInRange = false;\n                                                } else {\n                                                    isLiteral = true;\n                                                }\n                                            }\n                                        } while (c);\n                                        break;\n                                    case '.':\n                                        if (option.regexp) {\n                                            warningAt(\"Insecure '{a}'.\", line,\n                                                    from + l, c);\n                                        }\n                                        break;\n                                    case ']':\n                                    case '?':\n                                    case '{':\n                                    case '}':\n                                    case '+':\n                                    case '*':\n                                        warningAt(\"Unescaped '{a}'.\", line,\n                                                from + l, c);\n                                    }\n                                    if (b) {\n                                        switch (s.charAt(l)) {\n                                        case '?':\n                                        case '+':\n                                        case '*':\n                                            l += 1;\n                                            if (s.charAt(l) === '?') {\n                                                l += 1;\n                                            }\n                                            break;\n                                        case '{':\n                                            l += 1;\n                                            c = s.charAt(l);\n                                            if (c < '0' || c > '9') {\n                                                warningAt(\n\"Expected a number and instead saw '{a}'.\", line, from + l, c);\n                                            }\n                                            l += 1;\n                                            low = +c;\n                                            for (;;) {\n                                                c = s.charAt(l);\n                                                if (c < '0' || c > '9') {\n                                                    break;\n                                                }\n                                                l += 1;\n                                                low = +c + (low * 10);\n                                            }\n                                            high = low;\n                                            if (c === ',') {\n                                                l += 1;\n                                                high = Infinity;\n                                                c = s.charAt(l);\n                                                if (c >= '0' && c <= '9') {\n                                                    l += 1;\n                                                    high = +c;\n                                                    for (;;) {\n                                                        c = s.charAt(l);\n                                                        if (c < '0' || c > '9') {\n                                                            break;\n                                                        }\n                                                        l += 1;\n                                                        high = +c + (high * 10);\n                                                    }\n                                                }\n                                            }\n                                            if (s.charAt(l) !== '}') {\n                                                warningAt(\n\"Expected '{a}' and instead saw '{b}'.\", line, from + l, '}', c);\n                                            } else {\n                                                l += 1;\n                                            }\n                                            if (s.charAt(l) === '?') {\n                                                l += 1;\n                                            }\n                                            if (low > high) {\n                                                warningAt(\n\"'{a}' should not be greater than '{b}'.\", line, from + l, low, high);\n                                            }\n                                        }\n                                    }\n                                }\n                                c = s.substr(0, l - 1);\n                                character += l;\n                                s = s.substr(l);\n                                return it('(regexp)', c);\n                            }\n                            return it('(punctuator)', t);\n\n    //      punctuator\n\n                        case '#':\n                            return it('(punctuator)', t);\n                        default:\n                            return it('(punctuator)', t);\n                        }\n                    }\n                }\n            }\n        };\n    }());\n\n\n    function addlabel(t, type) {\n\n        if (t === 'hasOwnProperty') {\n            warning(\"'hasOwnProperty' is a really bad name.\");\n        }\n\n// Define t in the current function in the current scope.\n        if (is_own(funct, t) && !funct['(global)']) {\n            if (funct[t] === true) {\n                if (option.latedef)\n                    warning(\"'{a}' was used before it was defined.\", nexttoken, t);\n            } else {\n                if (!option.shadow && type !== \"exception\")\n                    warning(\"'{a}' is already defined.\", nexttoken, t);\n            }\n        }\n\n        funct[t] = type;\n        if (funct['(global)']) {\n            global[t] = funct;\n            if (is_own(implied, t)) {\n                if (option.latedef)\n                    warning(\"'{a}' was used before it was defined.\", nexttoken, t);\n                delete implied[t];\n            }\n        } else {\n            scope[t] = funct;\n        }\n    }\n\n\n    function doOption() {\n        var b, obj, filter, o = nexttoken.value, t, v;\n\n        switch (o) {\n        case '*/':\n            error(\"Unbegun comment.\");\n            break;\n        case '/*members':\n        case '/*member':\n            o = '/*members';\n            if (!membersOnly) {\n                membersOnly = {};\n            }\n            obj = membersOnly;\n            break;\n        case '/*jshint':\n        case '/*jslint':\n            obj = option;\n            filter = boolOptions;\n            break;\n        case '/*global':\n            obj = predefined;\n            break;\n        default:\n            error(\"What?\");\n        }\n\n        t = lex.token();\nloop:   for (;;) {\n            for (;;) {\n                if (t.type === 'special' && t.value === '*/') {\n                    break loop;\n                }\n                if (t.id !== '(endline)' && t.id !== ',') {\n                    break;\n                }\n                t = lex.token();\n            }\n            if (t.type !== '(string)' && t.type !== '(identifier)' &&\n                    o !== '/*members') {\n                error(\"Bad option.\", t);\n            }\n\n            v = lex.token();\n            if (v.id === ':') {\n                v = lex.token();\n\n                if (obj === membersOnly) {\n                    error(\"Expected '{a}' and instead saw '{b}'.\",\n                            t, '*/', ':');\n                }\n\n                if (o === '/*jshint') {\n                    checkOption(t.value, t);\n                }\n\n                if (t.value === 'indent' && (o === '/*jshint' || o === '/*jslint')) {\n                    b = +v.value;\n                    if (typeof b !== 'number' || !isFinite(b) || b <= 0 ||\n                            Math.floor(b) !== b) {\n                        error(\"Expected a small integer and instead saw '{a}'.\",\n                                v, v.value);\n                    }\n                    obj.white = true;\n                    obj.indent = b;\n                } else if (t.value === 'maxerr' && (o === '/*jshint' || o === '/*jslint')) {\n                    b = +v.value;\n                    if (typeof b !== 'number' || !isFinite(b) || b <= 0 ||\n                            Math.floor(b) !== b) {\n                        error(\"Expected a small integer and instead saw '{a}'.\",\n                                v, v.value);\n                    }\n                    obj.maxerr = b;\n                } else if (t.value === 'maxlen' && (o === '/*jshint' || o === '/*jslint')) {\n                    b = +v.value;\n                    if (typeof b !== 'number' || !isFinite(b) || b <= 0 ||\n                            Math.floor(b) !== b) {\n                        error(\"Expected a small integer and instead saw '{a}'.\",\n                                v, v.value);\n                    }\n                    obj.maxlen = b;\n                } else if (t.value === 'validthis') {\n                    if (funct['(global)']) {\n                        error(\"Option 'validthis' can't be used in a global scope.\");\n                    } else {\n                        if (v.value === 'true' || v.value === 'false')\n                            obj[t.value] = v.value === 'true';\n                        else\n                            error(\"Bad option value.\", v);\n                    }\n                } else if (v.value === 'true') {\n                    obj[t.value] = true;\n                } else if (v.value === 'false') {\n                    obj[t.value] = false;\n                } else {\n                    error(\"Bad option value.\", v);\n                }\n                t = lex.token();\n            } else {\n                if (o === '/*jshint' || o === '/*jslint') {\n                    error(\"Missing option value.\", t);\n                }\n                obj[t.value] = false;\n                t = v;\n            }\n        }\n        if (filter) {\n            assume();\n        }\n    }\n\n\n// We need a peek function. If it has an argument, it peeks that much farther\n// ahead. It is used to distinguish\n//     for ( var i in ...\n// from\n//     for ( var i = ...\n\n    function peek(p) {\n        var i = p || 0, j = 0, t;\n\n        while (j <= i) {\n            t = lookahead[j];\n            if (!t) {\n                t = lookahead[j] = lex.token();\n            }\n            j += 1;\n        }\n        return t;\n    }\n\n\n\n// Produce the next token. It looks for programming errors.\n\n    function advance(id, t) {\n        switch (token.id) {\n        case '(number)':\n            if (nexttoken.id === '.') {\n                warning(\"A dot following a number can be confused with a decimal point.\", token);\n            }\n            break;\n        case '-':\n            if (nexttoken.id === '-' || nexttoken.id === '--') {\n                warning(\"Confusing minusses.\");\n            }\n            break;\n        case '+':\n            if (nexttoken.id === '+' || nexttoken.id === '++') {\n                warning(\"Confusing plusses.\");\n            }\n            break;\n        }\n\n        if (token.type === '(string)' || token.identifier) {\n            anonname = token.value;\n        }\n\n        if (id && nexttoken.id !== id) {\n            if (t) {\n                if (nexttoken.id === '(end)') {\n                    warning(\"Unmatched '{a}'.\", t, t.id);\n                } else {\n                    warning(\"Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.\",\n                            nexttoken, id, t.id, t.line, nexttoken.value);\n                }\n            } else if (nexttoken.type !== '(identifier)' ||\n                            nexttoken.value !== id) {\n                warning(\"Expected '{a}' and instead saw '{b}'.\",\n                        nexttoken, id, nexttoken.value);\n            }\n        }\n\n        prevtoken = token;\n        token = nexttoken;\n        for (;;) {\n            nexttoken = lookahead.shift() || lex.token();\n            if (nexttoken.id === '(end)' || nexttoken.id === '(error)') {\n                return;\n            }\n            if (nexttoken.type === 'special') {\n                doOption();\n            } else {\n                if (nexttoken.id !== '(endline)') {\n                    break;\n                }\n            }\n        }\n    }\n\n\n// This is the heart of JSHINT, the Pratt parser. In addition to parsing, it\n// is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is\n// like .nud except that it is only used on the first token of a statement.\n// Having .fud makes it much easier to define statement-oriented languages like\n// JavaScript. I retained Pratt's nomenclature.\n\n// .nud     Null denotation\n// .fud     First null denotation\n// .led     Left denotation\n//  lbp     Left binding power\n//  rbp     Right binding power\n\n// They are elements of the parsing method called Top Down Operator Precedence.\n\n    function expression(rbp, initial) {\n        var left, isArray = false, isObject = false;\n\n        if (nexttoken.id === '(end)')\n            error(\"Unexpected early end of program.\", token);\n\n        advance();\n        if (initial) {\n            anonname = 'anonymous';\n            funct['(verb)'] = token.value;\n        }\n        if (initial === true && token.fud) {\n            left = token.fud();\n        } else {\n            if (token.nud) {\n                left = token.nud();\n            } else {\n                if (nexttoken.type === '(number)' && token.id === '.') {\n                    warning(\"A leading decimal point can be confused with a dot: '.{a}'.\",\n                            token, nexttoken.value);\n                    advance();\n                    return token;\n                } else {\n                    error(\"Expected an identifier and instead saw '{a}'.\",\n                            token, token.id);\n                }\n            }\n            while (rbp < nexttoken.lbp) {\n                isArray = token.value === 'Array';\n                isObject = token.value === 'Object';\n                advance();\n                if (isArray && token.id === '(' && nexttoken.id === ')')\n                    warning(\"Use the array literal notation [].\", token);\n                if (isObject && token.id === '(' && nexttoken.id === ')')\n                    warning(\"Use the object literal notation {}.\", token);\n                if (token.led) {\n                    left = token.led(left);\n                } else {\n                    error(\"Expected an operator and instead saw '{a}'.\",\n                        token, token.id);\n                }\n            }\n        }\n        return left;\n    }\n\n\n// Functions for conformance of style.\n\n    function adjacent(left, right) {\n        left = left || token;\n        right = right || nexttoken;\n        if (option.white) {\n            if (left.character !== right.from && left.line === right.line) {\n                left.from += (left.character - left.from);\n                warning(\"Unexpected space after '{a}'.\", left, left.value);\n            }\n        }\n    }\n\n    function nobreak(left, right) {\n        left = left || token;\n        right = right || nexttoken;\n        if (option.white && (left.character !== right.from || left.line !== right.line)) {\n            warning(\"Unexpected space before '{a}'.\", right, right.value);\n        }\n    }\n\n    function nospace(left, right) {\n        left = left || token;\n        right = right || nexttoken;\n        if (option.white && !left.comment) {\n            if (left.line === right.line) {\n                adjacent(left, right);\n            }\n        }\n    }\n\n    function nonadjacent(left, right) {\n        if (option.white) {\n            left = left || token;\n            right = right || nexttoken;\n            if (left.line === right.line && left.character === right.from) {\n                left.from += (left.character - left.from);\n                warning(\"Missing space after '{a}'.\",\n                        left, left.value);\n            }\n        }\n    }\n\n    function nobreaknonadjacent(left, right) {\n        left = left || token;\n        right = right || nexttoken;\n        if (!option.laxbreak && left.line !== right.line) {\n            warning(\"Bad line breaking before '{a}'.\", right, right.id);\n        } else if (option.white) {\n            left = left || token;\n            right = right || nexttoken;\n            if (left.character === right.from) {\n                left.from += (left.character - left.from);\n                warning(\"Missing space after '{a}'.\",\n                        left, left.value);\n            }\n        }\n    }\n\n    function indentation(bias) {\n        var i;\n        if (option.white && nexttoken.id !== '(end)') {\n            i = indent + (bias || 0);\n            if (nexttoken.from !== i) {\n                warning(\n\"Expected '{a}' to have an indentation at {b} instead at {c}.\",\n                        nexttoken, nexttoken.value, i, nexttoken.from);\n            }\n        }\n    }\n\n    function nolinebreak(t) {\n        t = t || token;\n        if (t.line !== nexttoken.line) {\n            warning(\"Line breaking error '{a}'.\", t, t.value);\n        }\n    }\n\n\n    function comma() {\n        if (token.line !== nexttoken.line) {\n            if (!option.laxcomma) {\n                if (comma.first) {\n                    warning(\"Comma warnings can be turned off with 'laxcomma'\");\n                    comma.first = false;\n                }\n                warning(\"Bad line breaking before '{a}'.\", token, nexttoken.id);\n            }\n        } else if (!token.comment && token.character !== nexttoken.from && option.white) {\n            token.from += (token.character - token.from);\n            warning(\"Unexpected space after '{a}'.\", token, token.value);\n        }\n        advance(',');\n        nonadjacent(token, nexttoken);\n    }\n\n\n// Functional constructors for making the symbols that will be inherited by\n// tokens.\n\n    function symbol(s, p) {\n        var x = syntax[s];\n        if (!x || typeof x !== 'object') {\n            syntax[s] = x = {\n                id: s,\n                lbp: p,\n                value: s\n            };\n        }\n        return x;\n    }\n\n\n    function delim(s) {\n        return symbol(s, 0);\n    }\n\n\n    function stmt(s, f) {\n        var x = delim(s);\n        x.identifier = x.reserved = true;\n        x.fud = f;\n        return x;\n    }\n\n\n    function blockstmt(s, f) {\n        var x = stmt(s, f);\n        x.block = true;\n        return x;\n    }\n\n\n    function reserveName(x) {\n        var c = x.id.charAt(0);\n        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {\n            x.identifier = x.reserved = true;\n        }\n        return x;\n    }\n\n\n    function prefix(s, f) {\n        var x = symbol(s, 150);\n        reserveName(x);\n        x.nud = (typeof f === 'function') ? f : function () {\n            this.right = expression(150);\n            this.arity = 'unary';\n            if (this.id === '++' || this.id === '--') {\n                if (option.plusplus) {\n                    warning(\"Unexpected use of '{a}'.\", this, this.id);\n                } else if ((!this.right.identifier || this.right.reserved) &&\n                        this.right.id !== '.' && this.right.id !== '[') {\n                    warning(\"Bad operand.\", this);\n                }\n            }\n            return this;\n        };\n        return x;\n    }\n\n\n    function type(s, f) {\n        var x = delim(s);\n        x.type = s;\n        x.nud = f;\n        return x;\n    }\n\n\n    function reserve(s, f) {\n        var x = type(s, f);\n        x.identifier = x.reserved = true;\n        return x;\n    }\n\n\n    function reservevar(s, v) {\n        return reserve(s, function () {\n            if (typeof v === 'function') {\n                v(this);\n            }\n            return this;\n        });\n    }\n\n\n    function infix(s, f, p, w) {\n        var x = symbol(s, p);\n        reserveName(x);\n        x.led = function (left) {\n            if (!w) {\n                nobreaknonadjacent(prevtoken, token);\n                nonadjacent(token, nexttoken);\n            }\n            if (s === \"in\" && left.id === \"!\") {\n                warning(\"Confusing use of '{a}'.\", left, '!');\n            }\n            if (typeof f === 'function') {\n                return f(left, this);\n            } else {\n                this.left = left;\n                this.right = expression(p);\n                return this;\n            }\n        };\n        return x;\n    }\n\n\n    function relation(s, f) {\n        var x = symbol(s, 100);\n        x.led = function (left) {\n            nobreaknonadjacent(prevtoken, token);\n            nonadjacent(token, nexttoken);\n            var right = expression(100);\n            if ((left && left.id === 'NaN') || (right && right.id === 'NaN')) {\n                warning(\"Use the isNaN function to compare with NaN.\", this);\n            } else if (f) {\n                f.apply(this, [left, right]);\n            }\n            if (left.id === '!') {\n                warning(\"Confusing use of '{a}'.\", left, '!');\n            }\n            if (right.id === '!') {\n                warning(\"Confusing use of '{a}'.\", right, '!');\n            }\n            this.left = left;\n            this.right = right;\n            return this;\n        };\n        return x;\n    }\n\n\n    function isPoorRelation(node) {\n        return node &&\n              ((node.type === '(number)' && +node.value === 0) ||\n               (node.type === '(string)' && node.value === '') ||\n               (node.type === 'null' && !option.eqnull) ||\n                node.type === 'true' ||\n                node.type === 'false' ||\n                node.type === 'undefined');\n    }\n\n\n    function assignop(s, f) {\n        symbol(s, 20).exps = true;\n        return infix(s, function (left, that) {\n            var l;\n            that.left = left;\n            if (predefined[left.value] === false &&\n                    scope[left.value]['(global)'] === true) {\n                warning(\"Read only.\", left);\n            } else if (left['function']) {\n                warning(\"'{a}' is a function.\", left, left.value);\n            }\n            if (left) {\n                if (option.esnext && funct[left.value] === 'const') {\n                    warning(\"Attempting to override '{a}' which is a constant\", left, left.value);\n                }\n                if (left.id === '.' || left.id === '[') {\n                    if (!left.left || left.left.value === 'arguments') {\n                        warning('Bad assignment.', that);\n                    }\n                    that.right = expression(19);\n                    return that;\n                } else if (left.identifier && !left.reserved) {\n                    if (funct[left.value] === 'exception') {\n                        warning(\"Do not assign to the exception parameter.\", left);\n                    }\n                    that.right = expression(19);\n                    return that;\n                }\n                if (left === syntax['function']) {\n                    warning(\n\"Expected an identifier in an assignment and instead saw a function invocation.\",\n                                token);\n                }\n            }\n            error(\"Bad assignment.\", that);\n        }, 20);\n    }\n\n\n    function bitwise(s, f, p) {\n        var x = symbol(s, p);\n        reserveName(x);\n        x.led = (typeof f === 'function') ? f : function (left) {\n            if (option.bitwise) {\n                warning(\"Unexpected use of '{a}'.\", this, this.id);\n            }\n            this.left = left;\n            this.right = expression(p);\n            return this;\n        };\n        return x;\n    }\n\n\n    function bitwiseassignop(s) {\n        symbol(s, 20).exps = true;\n        return infix(s, function (left, that) {\n            if (option.bitwise) {\n                warning(\"Unexpected use of '{a}'.\", that, that.id);\n            }\n            nonadjacent(prevtoken, token);\n            nonadjacent(token, nexttoken);\n            if (left) {\n                if (left.id === '.' || left.id === '[' ||\n                        (left.identifier && !left.reserved)) {\n                    expression(19);\n                    return that;\n                }\n                if (left === syntax['function']) {\n                    warning(\n\"Expected an identifier in an assignment, and instead saw a function invocation.\",\n                                token);\n                }\n                return that;\n            }\n            error(\"Bad assignment.\", that);\n        }, 20);\n    }\n\n\n    function suffix(s, f) {\n        var x = symbol(s, 150);\n        x.led = function (left) {\n            if (option.plusplus) {\n                warning(\"Unexpected use of '{a}'.\", this, this.id);\n            } else if ((!left.identifier || left.reserved) &&\n                    left.id !== '.' && left.id !== '[') {\n                warning(\"Bad operand.\", this);\n            }\n            this.left = left;\n            return this;\n        };\n        return x;\n    }\n\n\n    // fnparam means that this identifier is being defined as a function\n    // argument (see identifier())\n    function optionalidentifier(fnparam) {\n        if (nexttoken.identifier) {\n            advance();\n            if (token.reserved && !option.es5) {\n                // `undefined` as a function param is a common pattern to protect\n                // against the case when somebody does `undefined = true` and\n                // help with minification. More info: https://gist.github.com/315916\n                if (!fnparam || token.value !== 'undefined') {\n                    warning(\"Expected an identifier and instead saw '{a}' (a reserved word).\",\n                            token, token.id);\n                }\n            }\n            return token.value;\n        }\n    }\n\n    // fnparam means that this identifier is being defined as a function\n    // argument\n    function identifier(fnparam) {\n        var i = optionalidentifier(fnparam);\n        if (i) {\n            return i;\n        }\n        if (token.id === 'function' && nexttoken.id === '(') {\n            warning(\"Missing name in function declaration.\");\n        } else {\n            error(\"Expected an identifier and instead saw '{a}'.\",\n                    nexttoken, nexttoken.value);\n        }\n    }\n\n\n    function reachable(s) {\n        var i = 0, t;\n        if (nexttoken.id !== ';' || noreach) {\n            return;\n        }\n        for (;;) {\n            t = peek(i);\n            if (t.reach) {\n                return;\n            }\n            if (t.id !== '(endline)') {\n                if (t.id === 'function') {\n                    if (!option.latedef) {\n                        break;\n                    }\n                    warning(\n\"Inner functions should be listed at the top of the outer function.\", t);\n                    break;\n                }\n                warning(\"Unreachable '{a}' after '{b}'.\", t, t.value, s);\n                break;\n            }\n            i += 1;\n        }\n    }\n\n\n    function statement(noindent) {\n        var i = indent, r, s = scope, t = nexttoken;\n\n        if (t.id === \";\") {\n            advance(\";\");\n            return;\n        }\n\n// Is this a labelled statement?\n\n        if (t.identifier && !t.reserved && peek().id === ':') {\n            advance();\n            advance(':');\n            scope = Object.create(s);\n            addlabel(t.value, 'label');\n            if (!nexttoken.labelled) {\n                warning(\"Label '{a}' on {b} statement.\",\n                        nexttoken, t.value, nexttoken.value);\n            }\n            if (jx.test(t.value + ':')) {\n                warning(\"Label '{a}' looks like a javascript url.\",\n                        t, t.value);\n            }\n            nexttoken.label = t.value;\n            t = nexttoken;\n        }\n\n// Parse the statement.\n\n        if (!noindent) {\n            indentation();\n        }\n        r = expression(0, true);\n\n        // Look for the final semicolon.\n        if (!t.block) {\n            if (!option.expr && (!r || !r.exps)) {\n                warning(\"Expected an assignment or function call and instead saw an expression.\",\n                    token);\n            } else if (option.nonew && r.id === '(' && r.left.id === 'new') {\n                warning(\"Do not use 'new' for side effects.\");\n            }\n\n            if (nexttoken.id === ',') {\n                return comma();\n            }\n\n            if (nexttoken.id !== ';') {\n                if (!option.asi) {\n                    // If this is the last statement in a block that ends on\n                    // the same line *and* option lastsemic is on, ignore the warning.\n                    // Otherwise, complain about missing semicolon.\n                    if (!option.lastsemic || nexttoken.id !== '}' ||\n                            nexttoken.line !== token.line) {\n                        warningAt(\"Missing semicolon.\", token.line, token.character);\n                    }\n                }\n            } else {\n                adjacent(token, nexttoken);\n                advance(';');\n                nonadjacent(token, nexttoken);\n            }\n        }\n\n// Restore the indentation.\n\n        indent = i;\n        scope = s;\n        return r;\n    }\n\n\n    function statements(startLine) {\n        var a = [], f, p;\n\n        while (!nexttoken.reach && nexttoken.id !== '(end)') {\n            if (nexttoken.id === ';') {\n                p = peek();\n                if (!p || p.id !== \"(\") {\n                    warning(\"Unnecessary semicolon.\");\n                }\n                advance(';');\n            } else {\n                a.push(statement(startLine === nexttoken.line));\n            }\n        }\n        return a;\n    }\n\n\n    /*\n     * read all directives\n     * recognizes a simple form of asi, but always\n     * warns, if it is used\n     */\n    function directives() {\n        var i, p, pn;\n\n        for (;;) {\n            if (nexttoken.id === \"(string)\") {\n                p = peek(0);\n                if (p.id === \"(endline)\") {\n                    i = 1;\n                    do {\n                        pn = peek(i);\n                        i = i + 1;\n                    } while (pn.id === \"(endline)\");\n\n                    if (pn.id !== \";\") {\n                        if (pn.id !== \"(string)\" && pn.id !== \"(number)\" &&\n                            pn.id !== \"(regexp)\" && pn.identifier !== true &&\n                            pn.id !== \"}\") {\n                            break;\n                        }\n                        warning(\"Missing semicolon.\", nexttoken);\n                    } else {\n                        p = pn;\n                    }\n                } else if (p.id === \"}\") {\n                    // directive with no other statements, warn about missing semicolon\n                    warning(\"Missing semicolon.\", p);\n                } else if (p.id !== \";\") {\n                    break;\n                }\n\n                indentation();\n                advance();\n                if (directive[token.value]) {\n                    warning(\"Unnecessary directive \\\"{a}\\\".\", token, token.value);\n                }\n\n                if (token.value === \"use strict\") {\n                    option.newcap = true;\n                    option.undef = true;\n                }\n\n                // there's no directive negation, so always set to true\n                directive[token.value] = true;\n\n                if (p.id === \";\") {\n                    advance(\";\");\n                }\n                continue;\n            }\n            break;\n        }\n    }\n\n\n    /*\n     * Parses a single block. A block is a sequence of statements wrapped in\n     * braces.\n     *\n     * ordinary - true for everything but function bodies and try blocks.\n     * stmt     - true if block can be a single statement (e.g. in if/for/while).\n     * isfunc   - true if block is a function body\n     */\n    function block(ordinary, stmt, isfunc) {\n        var a,\n            b = inblock,\n            old_indent = indent,\n            m,\n            s = scope,\n            t,\n            line,\n            d;\n\n        inblock = ordinary;\n        if (!ordinary || !option.funcscope) scope = Object.create(scope);\n        nonadjacent(token, nexttoken);\n        t = nexttoken;\n\n        if (nexttoken.id === '{') {\n            advance('{');\n            line = token.line;\n            if (nexttoken.id !== '}') {\n                indent += option.indent;\n                while (!ordinary && nexttoken.from > indent) {\n                    indent += option.indent;\n                }\n\n                if (isfunc) {\n                    m = {};\n                    for (d in directive) {\n                        if (is_own(directive, d)) {\n                            m[d] = directive[d];\n                        }\n                    }\n                    directives();\n\n                    if (option.strict && funct['(context)']['(global)']) {\n                        if (!m[\"use strict\"] && !directive[\"use strict\"]) {\n                            warning(\"Missing \\\"use strict\\\" statement.\");\n                        }\n                    }\n                }\n\n                a = statements(line);\n\n                if (isfunc) {\n                    directive = m;\n                }\n\n                indent -= option.indent;\n                if (line !== nexttoken.line) {\n                    indentation();\n                }\n            } else if (line !== nexttoken.line) {\n                indentation();\n            }\n            advance('}', t);\n            indent = old_indent;\n        } else if (!ordinary) {\n            error(\"Expected '{a}' and instead saw '{b}'.\",\n                  nexttoken, '{', nexttoken.value);\n        } else {\n            if (!stmt || option.curly)\n                warning(\"Expected '{a}' and instead saw '{b}'.\",\n                        nexttoken, '{', nexttoken.value);\n\n            noreach = true;\n            indent += option.indent;\n            // test indentation only if statement is in new line\n            a = [statement(nexttoken.line === token.line)];\n            indent -= option.indent;\n            noreach = false;\n        }\n        funct['(verb)'] = null;\n        if (!ordinary || !option.funcscope) scope = s;\n        inblock = b;\n        if (ordinary && option.noempty && (!a || a.length === 0)) {\n            warning(\"Empty block.\");\n        }\n        return a;\n    }\n\n\n    function countMember(m) {\n        if (membersOnly && typeof membersOnly[m] !== 'boolean') {\n            warning(\"Unexpected /*member '{a}'.\", token, m);\n        }\n        if (typeof member[m] === 'number') {\n            member[m] += 1;\n        } else {\n            member[m] = 1;\n        }\n    }\n\n\n    function note_implied(token) {\n        var name = token.value, line = token.line, a = implied[name];\n        if (typeof a === 'function') {\n            a = false;\n        }\n\n        if (!a) {\n            a = [line];\n            implied[name] = a;\n        } else if (a[a.length - 1] !== line) {\n            a.push(line);\n        }\n    }\n\n\n    // Build the syntax table by declaring the syntactic elements of the language.\n\n    type('(number)', function () {\n        return this;\n    });\n\n    type('(string)', function () {\n        return this;\n    });\n\n    syntax['(identifier)'] = {\n        type: '(identifier)',\n        lbp: 0,\n        identifier: true,\n        nud: function () {\n            var v = this.value,\n                s = scope[v],\n                f;\n\n            if (typeof s === 'function') {\n                // Protection against accidental inheritance.\n                s = undefined;\n            } else if (typeof s === 'boolean') {\n                f = funct;\n                funct = functions[0];\n                addlabel(v, 'var');\n                s = funct;\n                funct = f;\n            }\n\n            // The name is in scope and defined in the current function.\n            if (funct === s) {\n                // Change 'unused' to 'var', and reject labels.\n                switch (funct[v]) {\n                case 'unused':\n                    funct[v] = 'var';\n                    break;\n                case 'unction':\n                    funct[v] = 'function';\n                    this['function'] = true;\n                    break;\n                case 'function':\n                    this['function'] = true;\n                    break;\n                case 'label':\n                    warning(\"'{a}' is a statement label.\", token, v);\n                    break;\n                }\n            } else if (funct['(global)']) {\n                // The name is not defined in the function.  If we are in the global\n                // scope, then we have an undefined variable.\n                //\n                // Operators typeof and delete do not raise runtime errors even if\n                // the base object of a reference is null so no need to display warning\n                // if we're inside of typeof or delete.\n\n                if (option.undef && typeof predefined[v] !== 'boolean') {\n                    // Attempting to subscript a null reference will throw an\n                    // error, even within the typeof and delete operators\n                    if (!(anonname === 'typeof' || anonname === 'delete') ||\n                        (nexttoken && (nexttoken.value === '.' || nexttoken.value === '['))) {\n\n                        isundef(funct, \"'{a}' is not defined.\", token, v);\n                    }\n                }\n                note_implied(token);\n            } else {\n                // If the name is already defined in the current\n                // function, but not as outer, then there is a scope error.\n\n                switch (funct[v]) {\n                case 'closure':\n                case 'function':\n                case 'var':\n                case 'unused':\n                    warning(\"'{a}' used out of scope.\", token, v);\n                    break;\n                case 'label':\n                    warning(\"'{a}' is a statement label.\", token, v);\n                    break;\n                case 'outer':\n                case 'global':\n                    break;\n                default:\n                    // If the name is defined in an outer function, make an outer entry,\n                    // and if it was unused, make it var.\n                    if (s === true) {\n                        funct[v] = true;\n                    } else if (s === null) {\n                        warning(\"'{a}' is not allowed.\", token, v);\n                        note_implied(token);\n                    } else if (typeof s !== 'object') {\n                        // Operators typeof and delete do not raise runtime errors even\n                        // if the base object of a reference is null so no need to\n                        // display warning if we're inside of typeof or delete.\n                        if (option.undef) {\n                            // Attempting to subscript a null reference will throw an\n                            // error, even within the typeof and delete operators\n                            if (!(anonname === 'typeof' || anonname === 'delete') ||\n                                (nexttoken &&\n                                    (nexttoken.value === '.' || nexttoken.value === '['))) {\n\n                                isundef(funct, \"'{a}' is not defined.\", token, v);\n                            }\n                        }\n                        funct[v] = true;\n                        note_implied(token);\n                    } else {\n                        switch (s[v]) {\n                        case 'function':\n                        case 'unction':\n                            this['function'] = true;\n                            s[v] = 'closure';\n                            funct[v] = s['(global)'] ? 'global' : 'outer';\n                            break;\n                        case 'var':\n                        case 'unused':\n                            s[v] = 'closure';\n                            funct[v] = s['(global)'] ? 'global' : 'outer';\n                            break;\n                        case 'closure':\n                        case 'parameter':\n                            funct[v] = s['(global)'] ? 'global' : 'outer';\n                            break;\n                        case 'label':\n                            warning(\"'{a}' is a statement label.\", token, v);\n                        }\n                    }\n                }\n            }\n            return this;\n        },\n        led: function () {\n            error(\"Expected an operator and instead saw '{a}'.\",\n                nexttoken, nexttoken.value);\n        }\n    };\n\n    type('(regexp)', function () {\n        return this;\n    });\n\n\n// ECMAScript parser\n\n    delim('(endline)');\n    delim('(begin)');\n    delim('(end)').reach = true;\n    delim('</').reach = true;\n    delim('<!');\n    delim('<!--');\n    delim('-->');\n    delim('(error)').reach = true;\n    delim('}').reach = true;\n    delim(')');\n    delim(']');\n    delim('\"').reach = true;\n    delim(\"'\").reach = true;\n    delim(';');\n    delim(':').reach = true;\n    delim(',');\n    delim('#');\n    delim('@');\n    reserve('else');\n    reserve('case').reach = true;\n    reserve('catch');\n    reserve('default').reach = true;\n    reserve('finally');\n    reservevar('arguments', function (x) {\n        if (directive['use strict'] && funct['(global)']) {\n            warning(\"Strict violation.\", x);\n        }\n    });\n    reservevar('eval');\n    reservevar('false');\n    reservevar('Infinity');\n    reservevar('NaN');\n    reservevar('null');\n    reservevar('this', function (x) {\n        if (directive['use strict'] && !option.validthis && ((funct['(statement)'] &&\n                funct['(name)'].charAt(0) > 'Z') || funct['(global)'])) {\n            warning(\"Possible strict violation.\", x);\n        }\n    });\n    reservevar('true');\n    reservevar('undefined');\n    assignop('=', 'assign', 20);\n    assignop('+=', 'assignadd', 20);\n    assignop('-=', 'assignsub', 20);\n    assignop('*=', 'assignmult', 20);\n    assignop('/=', 'assigndiv', 20).nud = function () {\n        error(\"A regular expression literal can be confused with '/='.\");\n    };\n    assignop('%=', 'assignmod', 20);\n    bitwiseassignop('&=', 'assignbitand', 20);\n    bitwiseassignop('|=', 'assignbitor', 20);\n    bitwiseassignop('^=', 'assignbitxor', 20);\n    bitwiseassignop('<<=', 'assignshiftleft', 20);\n    bitwiseassignop('>>=', 'assignshiftright', 20);\n    bitwiseassignop('>>>=', 'assignshiftrightunsigned', 20);\n    infix('?', function (left, that) {\n        that.left = left;\n        that.right = expression(10);\n        advance(':');\n        that['else'] = expression(10);\n        return that;\n    }, 30);\n\n    infix('||', 'or', 40);\n    infix('&&', 'and', 50);\n    bitwise('|', 'bitor', 70);\n    bitwise('^', 'bitxor', 80);\n    bitwise('&', 'bitand', 90);\n    relation('==', function (left, right) {\n        var eqnull = option.eqnull && (left.value === 'null' || right.value === 'null');\n\n        if (!eqnull && option.eqeqeq)\n            warning(\"Expected '{a}' and instead saw '{b}'.\", this, '===', '==');\n        else if (isPoorRelation(left))\n            warning(\"Use '{a}' to compare with '{b}'.\", this, '===', left.value);\n        else if (isPoorRelation(right))\n            warning(\"Use '{a}' to compare with '{b}'.\", this, '===', right.value);\n\n        return this;\n    });\n    relation('===');\n    relation('!=', function (left, right) {\n        var eqnull = option.eqnull &&\n                (left.value === 'null' || right.value === 'null');\n\n        if (!eqnull && option.eqeqeq) {\n            warning(\"Expected '{a}' and instead saw '{b}'.\",\n                    this, '!==', '!=');\n        } else if (isPoorRelation(left)) {\n            warning(\"Use '{a}' to compare with '{b}'.\",\n                    this, '!==', left.value);\n        } else if (isPoorRelation(right)) {\n            warning(\"Use '{a}' to compare with '{b}'.\",\n                    this, '!==', right.value);\n        }\n        return this;\n    });\n    relation('!==');\n    relation('<');\n    relation('>');\n    relation('<=');\n    relation('>=');\n    bitwise('<<', 'shiftleft', 120);\n    bitwise('>>', 'shiftright', 120);\n    bitwise('>>>', 'shiftrightunsigned', 120);\n    infix('in', 'in', 120);\n    infix('instanceof', 'instanceof', 120);\n    infix('+', function (left, that) {\n        var right = expression(130);\n        if (left && right && left.id === '(string)' && right.id === '(string)') {\n            left.value += right.value;\n            left.character = right.character;\n            if (!option.scripturl && jx.test(left.value)) {\n                warning(\"JavaScript URL.\", left);\n            }\n            return left;\n        }\n        that.left = left;\n        that.right = right;\n        return that;\n    }, 130);\n    prefix('+', 'num');\n    prefix('+++', function () {\n        warning(\"Confusing pluses.\");\n        this.right = expression(150);\n        this.arity = 'unary';\n        return this;\n    });\n    infix('+++', function (left) {\n        warning(\"Confusing pluses.\");\n        this.left = left;\n        this.right = expression(130);\n        return this;\n    }, 130);\n    infix('-', 'sub', 130);\n    prefix('-', 'neg');\n    prefix('---', function () {\n        warning(\"Confusing minuses.\");\n        this.right = expression(150);\n        this.arity = 'unary';\n        return this;\n    });\n    infix('---', function (left) {\n        warning(\"Confusing minuses.\");\n        this.left = left;\n        this.right = expression(130);\n        return this;\n    }, 130);\n    infix('*', 'mult', 140);\n    infix('/', 'div', 140);\n    infix('%', 'mod', 140);\n\n    suffix('++', 'postinc');\n    prefix('++', 'preinc');\n    syntax['++'].exps = true;\n\n    suffix('--', 'postdec');\n    prefix('--', 'predec');\n    syntax['--'].exps = true;\n    prefix('delete', function () {\n        var p = expression(0);\n        if (!p || (p.id !== '.' && p.id !== '[')) {\n            warning(\"Variables should not be deleted.\");\n        }\n        this.first = p;\n        return this;\n    }).exps = true;\n\n    prefix('~', function () {\n        if (option.bitwise) {\n            warning(\"Unexpected '{a}'.\", this, '~');\n        }\n        expression(150);\n        return this;\n    });\n\n    prefix('!', function () {\n        this.right = expression(150);\n        this.arity = 'unary';\n        if (bang[this.right.id] === true) {\n            warning(\"Confusing use of '{a}'.\", this, '!');\n        }\n        return this;\n    });\n    prefix('typeof', 'typeof');\n    prefix('new', function () {\n        var c = expression(155), i;\n        if (c && c.id !== 'function') {\n            if (c.identifier) {\n                c['new'] = true;\n                switch (c.value) {\n                case 'Number':\n                case 'String':\n                case 'Boolean':\n                case 'Math':\n                case 'JSON':\n                    warning(\"Do not use {a} as a constructor.\", token, c.value);\n                    break;\n                case 'Function':\n                    if (!option.evil) {\n                        warning(\"The Function constructor is eval.\");\n                    }\n                    break;\n                case 'Date':\n                case 'RegExp':\n                    break;\n                default:\n                    if (c.id !== 'function') {\n                        i = c.value.substr(0, 1);\n                        if (option.newcap && (i < 'A' || i > 'Z')) {\n                            warning(\"A constructor name should start with an uppercase letter.\",\n                                token);\n                        }\n                    }\n                }\n            } else {\n                if (c.id !== '.' && c.id !== '[' && c.id !== '(') {\n                    warning(\"Bad constructor.\", token);\n                }\n            }\n        } else {\n            if (!option.supernew)\n                warning(\"Weird construction. Delete 'new'.\", this);\n        }\n        adjacent(token, nexttoken);\n        if (nexttoken.id !== '(' && !option.supernew) {\n            warning(\"Missing '()' invoking a constructor.\");\n        }\n        this.first = c;\n        return this;\n    });\n    syntax['new'].exps = true;\n\n    prefix('void').exps = true;\n\n    infix('.', function (left, that) {\n        adjacent(prevtoken, token);\n        nobreak();\n        var m = identifier();\n        if (typeof m === 'string') {\n            countMember(m);\n        }\n        that.left = left;\n        that.right = m;\n        if (left && left.value === 'arguments' && (m === 'callee' || m === 'caller')) {\n            if (option.noarg)\n                warning(\"Avoid arguments.{a}.\", left, m);\n            else if (directive['use strict'])\n                error('Strict violation.');\n        } else if (!option.evil && left && left.value === 'document' &&\n                (m === 'write' || m === 'writeln')) {\n            warning(\"document.write can be a form of eval.\", left);\n        }\n        if (!option.evil && (m === 'eval' || m === 'execScript')) {\n            warning('eval is evil.');\n        }\n        return that;\n    }, 160, true);\n\n    infix('(', function (left, that) {\n        if (prevtoken.id !== '}' && prevtoken.id !== ')') {\n            nobreak(prevtoken, token);\n        }\n        nospace();\n        if (option.immed && !left.immed && left.id === 'function') {\n            warning(\"Wrap an immediate function invocation in parentheses \" +\n                \"to assist the reader in understanding that the expression \" +\n                \"is the result of a function, and not the function itself.\");\n        }\n        var n = 0,\n            p = [];\n        if (left) {\n            if (left.type === '(identifier)') {\n                if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {\n                    if (left.value !== 'Number' && left.value !== 'String' &&\n                            left.value !== 'Boolean' &&\n                            left.value !== 'Date') {\n                        if (left.value === 'Math') {\n                            warning(\"Math is not a function.\", left);\n                        } else if (option.newcap) {\n                            warning(\n\"Missing 'new' prefix when invoking a constructor.\", left);\n                        }\n                    }\n                }\n            }\n        }\n        if (nexttoken.id !== ')') {\n            for (;;) {\n                p[p.length] = expression(10);\n                n += 1;\n                if (nexttoken.id !== ',') {\n                    break;\n                }\n                comma();\n            }\n        }\n        advance(')');\n        nospace(prevtoken, token);\n        if (typeof left === 'object') {\n            if (left.value === 'parseInt' && n === 1) {\n                warning(\"Missing radix parameter.\", left);\n            }\n            if (!option.evil) {\n                if (left.value === 'eval' || left.value === 'Function' ||\n                        left.value === 'execScript') {\n                    warning(\"eval is evil.\", left);\n                } else if (p[0] && p[0].id === '(string)' &&\n                       (left.value === 'setTimeout' ||\n                        left.value === 'setInterval')) {\n                    warning(\n    \"Implied eval is evil. Pass a function instead of a string.\", left);\n                }\n            }\n            if (!left.identifier && left.id !== '.' && left.id !== '[' &&\n                    left.id !== '(' && left.id !== '&&' && left.id !== '||' &&\n                    left.id !== '?') {\n                warning(\"Bad invocation.\", left);\n            }\n        }\n        that.left = left;\n        return that;\n    }, 155, true).exps = true;\n\n    prefix('(', function () {\n        nospace();\n        if (nexttoken.id === 'function') {\n            nexttoken.immed = true;\n        }\n        var v = expression(0);\n        advance(')', this);\n        nospace(prevtoken, token);\n        if (option.immed && v.id === 'function') {\n            if (nexttoken.id === '(' ||\n              (nexttoken.id === '.' && (peek().value === 'call' || peek().value === 'apply'))) {\n                warning(\n\"Move the invocation into the parens that contain the function.\", nexttoken);\n            } else {\n                warning(\n\"Do not wrap function literals in parens unless they are to be immediately invoked.\",\n                        this);\n            }\n        }\n        return v;\n    });\n\n    infix('[', function (left, that) {\n        nobreak(prevtoken, token);\n        nospace();\n        var e = expression(0), s;\n        if (e && e.type === '(string)') {\n            if (!option.evil && (e.value === 'eval' || e.value === 'execScript')) {\n                warning(\"eval is evil.\", that);\n            }\n            countMember(e.value);\n            if (!option.sub && ix.test(e.value)) {\n                s = syntax[e.value];\n                if (!s || !s.reserved) {\n                    warning(\"['{a}'] is better written in dot notation.\",\n                            e, e.value);\n                }\n            }\n        }\n        advance(']', that);\n        nospace(prevtoken, token);\n        that.left = left;\n        that.right = e;\n        return that;\n    }, 160, true);\n\n    prefix('[', function () {\n        var b = token.line !== nexttoken.line;\n        this.first = [];\n        if (b) {\n            indent += option.indent;\n            if (nexttoken.from === indent + option.indent) {\n                indent += option.indent;\n            }\n        }\n        while (nexttoken.id !== '(end)') {\n            while (nexttoken.id === ',') {\n                warning(\"Extra comma.\");\n                advance(',');\n            }\n            if (nexttoken.id === ']') {\n                break;\n            }\n            if (b && token.line !== nexttoken.line) {\n                indentation();\n            }\n            this.first.push(expression(10));\n            if (nexttoken.id === ',') {\n                comma();\n                if (nexttoken.id === ']' && !option.es5) {\n                    warning(\"Extra comma.\", token);\n                    break;\n                }\n            } else {\n                break;\n            }\n        }\n        if (b) {\n            indent -= option.indent;\n            indentation();\n        }\n        advance(']', this);\n        return this;\n    }, 160);\n\n\n    function property_name() {\n        var id = optionalidentifier(true);\n        if (!id) {\n            if (nexttoken.id === '(string)') {\n                id = nexttoken.value;\n                advance();\n            } else if (nexttoken.id === '(number)') {\n                id = nexttoken.value.toString();\n                advance();\n            }\n        }\n        return id;\n    }\n\n\n    function functionparams() {\n        var i, t = nexttoken, p = [];\n        advance('(');\n        nospace();\n        if (nexttoken.id === ')') {\n            advance(')');\n            return;\n        }\n        for (;;) {\n            i = identifier(true);\n            p.push(i);\n            addlabel(i, 'parameter');\n            if (nexttoken.id === ',') {\n                comma();\n            } else {\n                advance(')', t);\n                nospace(prevtoken, token);\n                return p;\n            }\n        }\n    }\n\n\n    function doFunction(i, statement) {\n        var f,\n            oldOption = option,\n            oldScope  = scope;\n\n        option = Object.create(option);\n        scope = Object.create(scope);\n\n        funct = {\n            '(name)'     : i || '\"' + anonname + '\"',\n            '(line)'     : nexttoken.line,\n            '(context)'  : funct,\n            '(breakage)' : 0,\n            '(loopage)'  : 0,\n            '(scope)'    : scope,\n            '(statement)': statement\n        };\n        f = funct;\n        token.funct = funct;\n        functions.push(funct);\n        if (i) {\n            addlabel(i, 'function');\n        }\n        funct['(params)'] = functionparams();\n\n        block(false, false, true);\n        scope = oldScope;\n        option = oldOption;\n        funct['(last)'] = token.line;\n        funct = funct['(context)'];\n        return f;\n    }\n\n\n    (function (x) {\n        x.nud = function () {\n            var b, f, i, j, p, t;\n            var props = {}; // All properties, including accessors\n\n            function saveProperty(name, token) {\n                if (props[name] && is_own(props, name))\n                    warning(\"Duplicate member '{a}'.\", nexttoken, i);\n                else\n                    props[name] = {};\n\n                props[name].basic = true;\n                props[name].basicToken = token;\n            }\n\n            function saveSetter(name, token) {\n                if (props[name] && is_own(props, name)) {\n                    if (props[name].basic || props[name].setter)\n                        warning(\"Duplicate member '{a}'.\", nexttoken, i);\n                } else {\n                    props[name] = {};\n                }\n\n                props[name].setter = true;\n                props[name].setterToken = token;\n            }\n\n            function saveGetter(name) {\n                if (props[name] && is_own(props, name)) {\n                    if (props[name].basic || props[name].getter)\n                        warning(\"Duplicate member '{a}'.\", nexttoken, i);\n                } else {\n                    props[name] = {};\n                }\n\n                props[name].getter = true;\n                props[name].getterToken = token;\n            }\n\n            b = token.line !== nexttoken.line;\n            if (b) {\n                indent += option.indent;\n                if (nexttoken.from === indent + option.indent) {\n                    indent += option.indent;\n                }\n            }\n            for (;;) {\n                if (nexttoken.id === '}') {\n                    break;\n                }\n                if (b) {\n                    indentation();\n                }\n                if (nexttoken.value === 'get' && peek().id !== ':') {\n                    advance('get');\n                    if (!option.es5) {\n                        error(\"get/set are ES5 features.\");\n                    }\n                    i = property_name();\n                    if (!i) {\n                        error(\"Missing property name.\");\n                    }\n                    saveGetter(i);\n                    t = nexttoken;\n                    adjacent(token, nexttoken);\n                    f = doFunction();\n                    p = f['(params)'];\n                    if (p) {\n                        warning(\"Unexpected parameter '{a}' in get {b} function.\", t, p[0], i);\n                    }\n                    adjacent(token, nexttoken);\n                } else if (nexttoken.value === 'set' && peek().id !== ':') {\n                    advance('set');\n                    if (!option.es5) {\n                        error(\"get/set are ES5 features.\");\n                    }\n                    i = property_name();\n                    if (!i) {\n                        error(\"Missing property name.\");\n                    }\n                    saveSetter(i, nexttoken);\n                    t = nexttoken;\n                    adjacent(token, nexttoken);\n                    f = doFunction();\n                    p = f['(params)'];\n                    if (!p || p.length !== 1) {\n                        warning(\"Expected a single parameter in set {a} function.\", t, i);\n                    }\n                } else {\n                    i = property_name();\n                    saveProperty(i, nexttoken);\n                    if (typeof i !== 'string') {\n                        break;\n                    }\n                    advance(':');\n                    nonadjacent(token, nexttoken);\n                    expression(10);\n                }\n\n                countMember(i);\n                if (nexttoken.id === ',') {\n                    comma();\n                    if (nexttoken.id === ',') {\n                        warning(\"Extra comma.\", token);\n                    } else if (nexttoken.id === '}' && !option.es5) {\n                        warning(\"Extra comma.\", token);\n                    }\n                } else {\n                    break;\n                }\n            }\n            if (b) {\n                indent -= option.indent;\n                indentation();\n            }\n            advance('}', this);\n\n            // Check for lonely setters if in the ES5 mode.\n            if (option.es5) {\n                for (var name in props) {\n                    if (is_own(props, name) && props[name].setter && !props[name].getter) {\n                        warning(\"Setter is defined without getter.\", props[name].setterToken);\n                    }\n                }\n            }\n            return this;\n        };\n        x.fud = function () {\n            error(\"Expected to see a statement and instead saw a block.\", token);\n        };\n    }(delim('{')));\n\n// This Function is called when esnext option is set to true\n// it adds the `const` statement to JSHINT\n\n    useESNextSyntax = function () {\n        var conststatement = stmt('const', function (prefix) {\n            var id, name, value;\n\n            this.first = [];\n            for (;;) {\n                nonadjacent(token, nexttoken);\n                id = identifier();\n                if (funct[id] === \"const\") {\n                    warning(\"const '\" + id + \"' has already been declared\");\n                }\n                if (funct['(global)'] && predefined[id] === false) {\n                    warning(\"Redefinition of '{a}'.\", token, id);\n                }\n                addlabel(id, 'const');\n                if (prefix) {\n                    break;\n                }\n                name = token;\n                this.first.push(token);\n\n                if (nexttoken.id !== \"=\") {\n                    warning(\"const \" +\n                      \"'{a}' is initialized to 'undefined'.\", token, id);\n                }\n\n                if (nexttoken.id === '=') {\n                    nonadjacent(token, nexttoken);\n                    advance('=');\n                    nonadjacent(token, nexttoken);\n                    if (nexttoken.id === 'undefined') {\n                        warning(\"It is not necessary to initialize \" +\n                          \"'{a}' to 'undefined'.\", token, id);\n                    }\n                    if (peek(0).id === '=' && nexttoken.identifier) {\n                        error(\"Constant {a} was not declared correctly.\",\n                                nexttoken, nexttoken.value);\n                    }\n                    value = expression(0);\n                    name.first = value;\n                }\n\n                if (nexttoken.id !== ',') {\n                    break;\n                }\n                comma();\n            }\n            return this;\n        });\n        conststatement.exps = true;\n    };\n\n    var varstatement = stmt('var', function (prefix) {\n        // JavaScript does not have block scope. It only has function scope. So,\n        // declaring a variable in a block can have unexpected consequences.\n        var id, name, value;\n\n        if (funct['(onevar)'] && option.onevar) {\n            warning(\"Too many var statements.\");\n        } else if (!funct['(global)']) {\n            funct['(onevar)'] = true;\n        }\n        this.first = [];\n        for (;;) {\n            nonadjacent(token, nexttoken);\n            id = identifier();\n            if (option.esnext && funct[id] === \"const\") {\n                warning(\"const '\" + id + \"' has already been declared\");\n            }\n            if (funct['(global)'] && predefined[id] === false) {\n                warning(\"Redefinition of '{a}'.\", token, id);\n            }\n            addlabel(id, 'unused');\n            if (prefix) {\n                break;\n            }\n            name = token;\n            this.first.push(token);\n            if (nexttoken.id === '=') {\n                nonadjacent(token, nexttoken);\n                advance('=');\n                nonadjacent(token, nexttoken);\n                if (nexttoken.id === 'undefined') {\n                    warning(\"It is not necessary to initialize '{a}' to 'undefined'.\", token, id);\n                }\n                if (peek(0).id === '=' && nexttoken.identifier) {\n                    error(\"Variable {a} was not declared correctly.\",\n                            nexttoken, nexttoken.value);\n                }\n                value = expression(0);\n                name.first = value;\n            }\n            if (nexttoken.id !== ',') {\n                break;\n            }\n            comma();\n        }\n        return this;\n    });\n    varstatement.exps = true;\n\n    blockstmt('function', function () {\n        if (inblock) {\n            warning(\"Function declarations should not be placed in blocks. \" +\n                \"Use a function expression or move the statement to the top of \" +\n                \"the outer function.\", token);\n\n        }\n        var i = identifier();\n        if (option.esnext && funct[i] === \"const\") {\n            warning(\"const '\" + i + \"' has already been declared\");\n        }\n        adjacent(token, nexttoken);\n        addlabel(i, 'unction');\n        doFunction(i, true);\n        if (nexttoken.id === '(' && nexttoken.line === token.line) {\n            error(\n\"Function declarations are not invocable. Wrap the whole function invocation in parens.\");\n        }\n        return this;\n    });\n\n    prefix('function', function () {\n        var i = optionalidentifier();\n        if (i) {\n            adjacent(token, nexttoken);\n        } else {\n            nonadjacent(token, nexttoken);\n        }\n        doFunction(i);\n        if (!option.loopfunc && funct['(loopage)']) {\n            warning(\"Don't make functions within a loop.\");\n        }\n        return this;\n    });\n\n    blockstmt('if', function () {\n        var t = nexttoken;\n        advance('(');\n        nonadjacent(this, t);\n        nospace();\n        expression(20);\n        if (nexttoken.id === '=') {\n            if (!option.boss)\n                warning(\"Expected a conditional expression and instead saw an assignment.\");\n            advance('=');\n            expression(20);\n        }\n        advance(')', t);\n        nospace(prevtoken, token);\n        block(true, true);\n        if (nexttoken.id === 'else') {\n            nonadjacent(token, nexttoken);\n            advance('else');\n            if (nexttoken.id === 'if' || nexttoken.id === 'switch') {\n                statement(true);\n            } else {\n                block(true, true);\n            }\n        }\n        return this;\n    });\n\n    blockstmt('try', function () {\n        var b, e, s;\n\n        block(false);\n        if (nexttoken.id === 'catch') {\n            advance('catch');\n            nonadjacent(token, nexttoken);\n            advance('(');\n            s = scope;\n            scope = Object.create(s);\n            e = nexttoken.value;\n            if (nexttoken.type !== '(identifier)') {\n                warning(\"Expected an identifier and instead saw '{a}'.\",\n                    nexttoken, e);\n            } else {\n                addlabel(e, 'exception');\n            }\n            advance();\n            advance(')');\n            block(false);\n            b = true;\n            scope = s;\n        }\n        if (nexttoken.id === 'finally') {\n            advance('finally');\n            block(false);\n            return;\n        } else if (!b) {\n            error(\"Expected '{a}' and instead saw '{b}'.\",\n                    nexttoken, 'catch', nexttoken.value);\n        }\n        return this;\n    });\n\n    blockstmt('while', function () {\n        var t = nexttoken;\n        funct['(breakage)'] += 1;\n        funct['(loopage)'] += 1;\n        advance('(');\n        nonadjacent(this, t);\n        nospace();\n        expression(20);\n        if (nexttoken.id === '=') {\n            if (!option.boss)\n                warning(\"Expected a conditional expression and instead saw an assignment.\");\n            advance('=');\n            expression(20);\n        }\n        advance(')', t);\n        nospace(prevtoken, token);\n        block(true, true);\n        funct['(breakage)'] -= 1;\n        funct['(loopage)'] -= 1;\n        return this;\n    }).labelled = true;\n\n    blockstmt('with', function () {\n        var t = nexttoken;\n        if (directive['use strict']) {\n            error(\"'with' is not allowed in strict mode.\", token);\n        } else if (!option.withstmt) {\n            warning(\"Don't use 'with'.\", token);\n        }\n\n        advance('(');\n        nonadjacent(this, t);\n        nospace();\n        expression(0);\n        advance(')', t);\n        nospace(prevtoken, token);\n        block(true, true);\n\n        return this;\n    });\n\n    blockstmt('switch', function () {\n        var t = nexttoken,\n            g = false;\n        funct['(breakage)'] += 1;\n        advance('(');\n        nonadjacent(this, t);\n        nospace();\n        this.condition = expression(20);\n        advance(')', t);\n        nospace(prevtoken, token);\n        nonadjacent(token, nexttoken);\n        t = nexttoken;\n        advance('{');\n        nonadjacent(token, nexttoken);\n        indent += option.indent;\n        this.cases = [];\n        for (;;) {\n            switch (nexttoken.id) {\n            case 'case':\n                switch (funct['(verb)']) {\n                case 'break':\n                case 'case':\n                case 'continue':\n                case 'return':\n                case 'switch':\n                case 'throw':\n                    break;\n                default:\n                    // You can tell JSHint that you don't use break intentionally by\n                    // adding a comment /* falls through */ on a line just before\n                    // the next `case`.\n                    if (!ft.test(lines[nexttoken.line - 2])) {\n                        warning(\n                            \"Expected a 'break' statement before 'case'.\",\n                            token);\n                    }\n                }\n                indentation(-option.indent);\n                advance('case');\n                this.cases.push(expression(20));\n                g = true;\n                advance(':');\n                funct['(verb)'] = 'case';\n                break;\n            case 'default':\n                switch (funct['(verb)']) {\n                case 'break':\n                case 'continue':\n                case 'return':\n                case 'throw':\n                    break;\n                default:\n                    if (!ft.test(lines[nexttoken.line - 2])) {\n                        warning(\n                            \"Expected a 'break' statement before 'default'.\",\n                            token);\n                    }\n                }\n                indentation(-option.indent);\n                advance('default');\n                g = true;\n                advance(':');\n                break;\n            case '}':\n                indent -= option.indent;\n                indentation();\n                advance('}', t);\n                if (this.cases.length === 1 || this.condition.id === 'true' ||\n                        this.condition.id === 'false') {\n                    if (!option.onecase)\n                        warning(\"This 'switch' should be an 'if'.\", this);\n                }\n                funct['(breakage)'] -= 1;\n                funct['(verb)'] = undefined;\n                return;\n            case '(end)':\n                error(\"Missing '{a}'.\", nexttoken, '}');\n                return;\n            default:\n                if (g) {\n                    switch (token.id) {\n                    case ',':\n                        error(\"Each value should have its own case label.\");\n                        return;\n                    case ':':\n                        g = false;\n                        statements();\n                        break;\n                    default:\n                        error(\"Missing ':' on a case clause.\", token);\n                        return;\n                    }\n                } else {\n                    if (token.id === ':') {\n                        advance(':');\n                        error(\"Unexpected '{a}'.\", token, ':');\n                        statements();\n                    } else {\n                        error(\"Expected '{a}' and instead saw '{b}'.\",\n                            nexttoken, 'case', nexttoken.value);\n                        return;\n                    }\n                }\n            }\n        }\n    }).labelled = true;\n\n    stmt('debugger', function () {\n        if (!option.debug) {\n            warning(\"All 'debugger' statements should be removed.\");\n        }\n        return this;\n    }).exps = true;\n\n    (function () {\n        var x = stmt('do', function () {\n            funct['(breakage)'] += 1;\n            funct['(loopage)'] += 1;\n            this.first = block(true);\n            advance('while');\n            var t = nexttoken;\n            nonadjacent(token, t);\n            advance('(');\n            nospace();\n            expression(20);\n            if (nexttoken.id === '=') {\n                if (!option.boss)\n                    warning(\"Expected a conditional expression and instead saw an assignment.\");\n                advance('=');\n                expression(20);\n            }\n            advance(')', t);\n            nospace(prevtoken, token);\n            funct['(breakage)'] -= 1;\n            funct['(loopage)'] -= 1;\n            return this;\n        });\n        x.labelled = true;\n        x.exps = true;\n    }());\n\n    blockstmt('for', function () {\n        var s, t = nexttoken;\n        funct['(breakage)'] += 1;\n        funct['(loopage)'] += 1;\n        advance('(');\n        nonadjacent(this, t);\n        nospace();\n        if (peek(nexttoken.id === 'var' ? 1 : 0).id === 'in') {\n            if (nexttoken.id === 'var') {\n                advance('var');\n                varstatement.fud.call(varstatement, true);\n            } else {\n                switch (funct[nexttoken.value]) {\n                case 'unused':\n                    funct[nexttoken.value] = 'var';\n                    break;\n                case 'var':\n                    break;\n                default:\n                    warning(\"Bad for in variable '{a}'.\",\n                            nexttoken, nexttoken.value);\n                }\n                advance();\n            }\n            advance('in');\n            expression(20);\n            advance(')', t);\n            s = block(true, true);\n            if (option.forin && s && (s.length > 1 || typeof s[0] !== 'object' ||\n                    s[0].value !== 'if')) {\n                warning(\"The body of a for in should be wrapped in an if statement to filter \" +\n                        \"unwanted properties from the prototype.\", this);\n            }\n            funct['(breakage)'] -= 1;\n            funct['(loopage)'] -= 1;\n            return this;\n        } else {\n            if (nexttoken.id !== ';') {\n                if (nexttoken.id === 'var') {\n                    advance('var');\n                    varstatement.fud.call(varstatement);\n                } else {\n                    for (;;) {\n                        expression(0, 'for');\n                        if (nexttoken.id !== ',') {\n                            break;\n                        }\n                        comma();\n                    }\n                }\n            }\n            nolinebreak(token);\n            advance(';');\n            if (nexttoken.id !== ';') {\n                expression(20);\n                if (nexttoken.id === '=') {\n                    if (!option.boss)\n                        warning(\"Expected a conditional expression and instead saw an assignment.\");\n                    advance('=');\n                    expression(20);\n                }\n            }\n            nolinebreak(token);\n            advance(';');\n            if (nexttoken.id === ';') {\n                error(\"Expected '{a}' and instead saw '{b}'.\",\n                        nexttoken, ')', ';');\n            }\n            if (nexttoken.id !== ')') {\n                for (;;) {\n                    expression(0, 'for');\n                    if (nexttoken.id !== ',') {\n                        break;\n                    }\n                    comma();\n                }\n            }\n            advance(')', t);\n            nospace(prevtoken, token);\n            block(true, true);\n            funct['(breakage)'] -= 1;\n            funct['(loopage)'] -= 1;\n            return this;\n        }\n    }).labelled = true;\n\n\n    stmt('break', function () {\n        var v = nexttoken.value;\n\n        if (funct['(breakage)'] === 0)\n            warning(\"Unexpected '{a}'.\", nexttoken, this.value);\n\n        if (!option.asi)\n            nolinebreak(this);\n\n        if (nexttoken.id !== ';') {\n            if (token.line === nexttoken.line) {\n                if (funct[v] !== 'label') {\n                    warning(\"'{a}' is not a statement label.\", nexttoken, v);\n                } else if (scope[v] !== funct) {\n                    warning(\"'{a}' is out of scope.\", nexttoken, v);\n                }\n                this.first = nexttoken;\n                advance();\n            }\n        }\n        reachable('break');\n        return this;\n    }).exps = true;\n\n\n    stmt('continue', function () {\n        var v = nexttoken.value;\n\n        if (funct['(breakage)'] === 0)\n            warning(\"Unexpected '{a}'.\", nexttoken, this.value);\n\n        if (!option.asi)\n            nolinebreak(this);\n\n        if (nexttoken.id !== ';') {\n            if (token.line === nexttoken.line) {\n                if (funct[v] !== 'label') {\n                    warning(\"'{a}' is not a statement label.\", nexttoken, v);\n                } else if (scope[v] !== funct) {\n                    warning(\"'{a}' is out of scope.\", nexttoken, v);\n                }\n                this.first = nexttoken;\n                advance();\n            }\n        } else if (!funct['(loopage)']) {\n            warning(\"Unexpected '{a}'.\", nexttoken, this.value);\n        }\n        reachable('continue');\n        return this;\n    }).exps = true;\n\n\n    stmt('return', function () {\n        if (this.line === nexttoken.line) {\n            if (nexttoken.id === '(regexp)')\n                warning(\"Wrap the /regexp/ literal in parens to disambiguate the slash operator.\");\n\n            if (nexttoken.id !== ';' && !nexttoken.reach) {\n                nonadjacent(token, nexttoken);\n                if (peek().value === \"=\" && !option.boss) {\n                    warningAt(\"Did you mean to return a conditional instead of an assignment?\",\n                              token.line, token.character + 1);\n                }\n                this.first = expression(0);\n            }\n        } else if (!option.asi) {\n            nolinebreak(this); // always warn (Line breaking error)\n        }\n        reachable('return');\n        return this;\n    }).exps = true;\n\n\n    stmt('throw', function () {\n        nolinebreak(this);\n        nonadjacent(token, nexttoken);\n        this.first = expression(20);\n        reachable('throw');\n        return this;\n    }).exps = true;\n\n//  Superfluous reserved words\n\n    reserve('class');\n    reserve('const');\n    reserve('enum');\n    reserve('export');\n    reserve('extends');\n    reserve('import');\n    reserve('super');\n\n    reserve('let');\n    reserve('yield');\n    reserve('implements');\n    reserve('interface');\n    reserve('package');\n    reserve('private');\n    reserve('protected');\n    reserve('public');\n    reserve('static');\n\n\n// Parse JSON\n\n    function jsonValue() {\n\n        function jsonObject() {\n            var o = {}, t = nexttoken;\n            advance('{');\n            if (nexttoken.id !== '}') {\n                for (;;) {\n                    if (nexttoken.id === '(end)') {\n                        error(\"Missing '}' to match '{' from line {a}.\",\n                                nexttoken, t.line);\n                    } else if (nexttoken.id === '}') {\n                        warning(\"Unexpected comma.\", token);\n                        break;\n                    } else if (nexttoken.id === ',') {\n                        error(\"Unexpected comma.\", nexttoken);\n                    } else if (nexttoken.id !== '(string)') {\n                        warning(\"Expected a string and instead saw {a}.\",\n                                nexttoken, nexttoken.value);\n                    }\n                    if (o[nexttoken.value] === true) {\n                        warning(\"Duplicate key '{a}'.\",\n                                nexttoken, nexttoken.value);\n                    } else if ((nexttoken.value === '__proto__' &&\n                        !option.proto) || (nexttoken.value === '__iterator__' &&\n                        !option.iterator)) {\n                        warning(\"The '{a}' key may produce unexpected results.\",\n                            nexttoken, nexttoken.value);\n                    } else {\n                        o[nexttoken.value] = true;\n                    }\n                    advance();\n                    advance(':');\n                    jsonValue();\n                    if (nexttoken.id !== ',') {\n                        break;\n                    }\n                    advance(',');\n                }\n            }\n            advance('}');\n        }\n\n        function jsonArray() {\n            var t = nexttoken;\n            advance('[');\n            if (nexttoken.id !== ']') {\n                for (;;) {\n                    if (nexttoken.id === '(end)') {\n                        error(\"Missing ']' to match '[' from line {a}.\",\n                                nexttoken, t.line);\n                    } else if (nexttoken.id === ']') {\n                        warning(\"Unexpected comma.\", token);\n                        break;\n                    } else if (nexttoken.id === ',') {\n                        error(\"Unexpected comma.\", nexttoken);\n                    }\n                    jsonValue();\n                    if (nexttoken.id !== ',') {\n                        break;\n                    }\n                    advance(',');\n                }\n            }\n            advance(']');\n        }\n\n        switch (nexttoken.id) {\n        case '{':\n            jsonObject();\n            break;\n        case '[':\n            jsonArray();\n            break;\n        case 'true':\n        case 'false':\n        case 'null':\n        case '(number)':\n        case '(string)':\n            advance();\n            break;\n        case '-':\n            advance('-');\n            if (token.character !== nexttoken.from) {\n                warning(\"Unexpected space after '-'.\", token);\n            }\n            adjacent(token, nexttoken);\n            advance('(number)');\n            break;\n        default:\n            error(\"Expected a JSON value.\", nexttoken);\n        }\n    }\n\n\n// The actual JSHINT function itself.\n\n    var itself = function (s, o, g) {\n        var a, i, k;\n        JSHINT.errors = [];\n        JSHINT.undefs = [];\n        predefined = Object.create(standard);\n        combine(predefined, g || {});\n        if (o) {\n            a = o.predef;\n            if (a) {\n                if (Array.isArray(a)) {\n                    for (i = 0; i < a.length; i += 1) {\n                        predefined[a[i]] = true;\n                    }\n                } else if (typeof a === 'object') {\n                    k = Object.keys(a);\n                    for (i = 0; i < k.length; i += 1) {\n                        predefined[k[i]] = !!a[k[i]];\n                    }\n                }\n            }\n            option = o;\n        } else {\n            option = {};\n        }\n        option.indent = option.indent || 4;\n        option.maxerr = option.maxerr || 50;\n\n        tab = '';\n        for (i = 0; i < option.indent; i += 1) {\n            tab += ' ';\n        }\n        indent = 1;\n        global = Object.create(predefined);\n        scope = global;\n        funct = {\n            '(global)': true,\n            '(name)': '(global)',\n            '(scope)': scope,\n            '(breakage)': 0,\n            '(loopage)': 0\n        };\n        functions = [funct];\n        urls = [];\n        stack = null;\n        member = {};\n        membersOnly = null;\n        implied = {};\n        inblock = false;\n        lookahead = [];\n        jsonmode = false;\n        warnings = 0;\n        lex.init(s);\n        prereg = true;\n        directive = {};\n\n        prevtoken = token = nexttoken = syntax['(begin)'];\n\n        // Check options\n        for (var name in o) {\n            if (is_own(o, name)) {\n                checkOption(name, token);\n            }\n        }\n\n        assume();\n\n        // combine the passed globals after we've assumed all our options\n        combine(predefined, g || {});\n\n        //reset values\n        comma.first = true;\n\n        try {\n            advance();\n            switch (nexttoken.id) {\n            case '{':\n            case '[':\n                option.laxbreak = true;\n                jsonmode = true;\n                jsonValue();\n                break;\n            default:\n                directives();\n                if (directive[\"use strict\"] && !option.globalstrict) {\n                    warning(\"Use the function form of \\\"use strict\\\".\", prevtoken);\n                }\n\n                statements();\n            }\n            advance('(end)');\n\n            var markDefined = function (name, context) {\n                do {\n                    if (typeof context[name] === 'string') {\n                        // JSHINT marks unused variables as 'unused' and\n                        // unused function declaration as 'unction'. This\n                        // code changes such instances back 'var' and\n                        // 'closure' so that the code in JSHINT.data()\n                        // doesn't think they're unused.\n\n                        if (context[name] === 'unused')\n                            context[name] = 'var';\n                        else if (context[name] === 'unction')\n                            context[name] = 'closure';\n\n                        return true;\n                    }\n\n                    context = context['(context)'];\n                } while (context);\n\n                return false;\n            };\n\n            var clearImplied = function (name, line) {\n                if (!implied[name])\n                    return;\n\n                var newImplied = [];\n                for (var i = 0; i < implied[name].length; i += 1) {\n                    if (implied[name][i] !== line)\n                        newImplied.push(implied[name][i]);\n                }\n\n                if (newImplied.length === 0)\n                    delete implied[name];\n                else\n                    implied[name] = newImplied;\n            };\n\n            // Check queued 'x is not defined' instances to see if they're still undefined.\n            for (i = 0; i < JSHINT.undefs.length; i += 1) {\n                k = JSHINT.undefs[i].slice(0);\n\n                if (markDefined(k[2].value, k[0])) {\n                    clearImplied(k[2].value, k[2].line);\n                } else {\n                    warning.apply(warning, k.slice(1));\n                }\n            }\n        } catch (e) {\n            if (e) {\n                var nt = nexttoken || {};\n                JSHINT.errors.push({\n                    raw       : e.raw,\n                    reason    : e.message,\n                    line      : e.line || nt.line,\n                    character : e.character || nt.from\n                }, null);\n            }\n        }\n\n        return JSHINT.errors.length === 0;\n    };\n\n    // Data summary.\n    itself.data = function () {\n\n        var data = { functions: [], options: option }, fu, globals, implieds = [], f, i, j,\n            members = [], n, unused = [], v;\n        if (itself.errors.length) {\n            data.errors = itself.errors;\n        }\n\n        if (jsonmode) {\n            data.json = true;\n        }\n\n        for (n in implied) {\n            if (is_own(implied, n)) {\n                implieds.push({\n                    name: n,\n                    line: implied[n]\n                });\n            }\n        }\n        if (implieds.length > 0) {\n            data.implieds = implieds;\n        }\n\n        if (urls.length > 0) {\n            data.urls = urls;\n        }\n\n        globals = Object.keys(scope);\n        if (globals.length > 0) {\n            data.globals = globals;\n        }\n        for (i = 1; i < functions.length; i += 1) {\n            f = functions[i];\n            fu = {};\n            for (j = 0; j < functionicity.length; j += 1) {\n                fu[functionicity[j]] = [];\n            }\n            for (n in f) {\n                if (is_own(f, n) && n.charAt(0) !== '(') {\n                    v = f[n];\n                    if (v === 'unction') {\n                        v = 'unused';\n                    }\n                    if (Array.isArray(fu[v])) {\n                        fu[v].push(n);\n                        if (v === 'unused') {\n                            unused.push({\n                                name: n,\n                                line: f['(line)'],\n                                'function': f['(name)']\n                            });\n                        }\n                    }\n                }\n            }\n            for (j = 0; j < functionicity.length; j += 1) {\n                if (fu[functionicity[j]].length === 0) {\n                    delete fu[functionicity[j]];\n                }\n            }\n            fu.name = f['(name)'];\n            fu.param = f['(params)'];\n            fu.line = f['(line)'];\n            fu.last = f['(last)'];\n            data.functions.push(fu);\n        }\n\n        if (unused.length > 0) {\n            data.unused = unused;\n        }\n\n        members = [];\n        for (n in member) {\n            if (typeof member[n] === 'number') {\n                data.member = member;\n                break;\n            }\n        }\n\n        return data;\n    };\n\n    itself.report = function (option) {\n        var data = itself.data();\n\n        var a = [], c, e, err, f, i, k, l, m = '', n, o = [], s;\n\n        function detail(h, array) {\n            var b, i, singularity;\n            if (array) {\n                o.push('<div><i>' + h + '</i> ');\n                array = array.sort();\n                for (i = 0; i < array.length; i += 1) {\n                    if (array[i] !== singularity) {\n                        singularity = array[i];\n                        o.push((b ? ', ' : '') + singularity);\n                        b = true;\n                    }\n                }\n                o.push('</div>');\n            }\n        }\n\n\n        if (data.errors || data.implieds || data.unused) {\n            err = true;\n            o.push('<div id=errors><i>Error:</i>');\n            if (data.errors) {\n                for (i = 0; i < data.errors.length; i += 1) {\n                    c = data.errors[i];\n                    if (c) {\n                        e = c.evidence || '';\n                        o.push('<p>Problem' + (isFinite(c.line) ? ' at line ' +\n                                c.line + ' character ' + c.character : '') +\n                                ': ' + c.reason.entityify() +\n                                '</p><p class=evidence>' +\n                                (e && (e.length > 80 ? e.slice(0, 77) + '...' :\n                                e).entityify()) + '</p>');\n                    }\n                }\n            }\n\n            if (data.implieds) {\n                s = [];\n                for (i = 0; i < data.implieds.length; i += 1) {\n                    s[i] = '<code>' + data.implieds[i].name + '</code>&nbsp;<i>' +\n                        data.implieds[i].line + '</i>';\n                }\n                o.push('<p><i>Implied global:</i> ' + s.join(', ') + '</p>');\n            }\n\n            if (data.unused) {\n                s = [];\n                for (i = 0; i < data.unused.length; i += 1) {\n                    s[i] = '<code><u>' + data.unused[i].name + '</u></code>&nbsp;<i>' +\n                        data.unused[i].line + '</i> <code>' +\n                        data.unused[i]['function'] + '</code>';\n                }\n                o.push('<p><i>Unused variable:</i> ' + s.join(', ') + '</p>');\n            }\n            if (data.json) {\n                o.push('<p>JSON: bad.</p>');\n            }\n            o.push('</div>');\n        }\n\n        if (!option) {\n\n            o.push('<br><div id=functions>');\n\n            if (data.urls) {\n                detail(\"URLs<br>\", data.urls, '<br>');\n            }\n\n            if (data.json && !err) {\n                o.push('<p>JSON: good.</p>');\n            } else if (data.globals) {\n                o.push('<div><i>Global</i> ' +\n                        data.globals.sort().join(', ') + '</div>');\n            } else {\n                o.push('<div><i>No new global variables introduced.</i></div>');\n            }\n\n            for (i = 0; i < data.functions.length; i += 1) {\n                f = data.functions[i];\n\n                o.push('<br><div class=function><i>' + f.line + '-' +\n                        f.last + '</i> ' + (f.name || '') + '(' +\n                        (f.param ? f.param.join(', ') : '') + ')</div>');\n                detail('<big><b>Unused</b></big>', f.unused);\n                detail('Closure', f.closure);\n                detail('Variable', f['var']);\n                detail('Exception', f.exception);\n                detail('Outer', f.outer);\n                detail('Global', f.global);\n                detail('Label', f.label);\n            }\n\n            if (data.member) {\n                a = Object.keys(data.member);\n                if (a.length) {\n                    a = a.sort();\n                    m = '<br><pre id=members>/*members ';\n                    l = 10;\n                    for (i = 0; i < a.length; i += 1) {\n                        k = a[i];\n                        n = k.name();\n                        if (l + n.length > 72) {\n                            o.push(m + '<br>');\n                            m = '    ';\n                            l = 1;\n                        }\n                        l += n.length + 2;\n                        if (data.member[k] === 1) {\n                            n = '<i>' + n + '</i>';\n                        }\n                        if (i < a.length - 1) {\n                            n += ', ';\n                        }\n                        m += n;\n                    }\n                    o.push(m + '<br>*/</pre>');\n                }\n                o.push('</div>');\n            }\n        }\n        return o.join('');\n    };\n\n    itself.jshint = itself;\n\n    return itself;\n}());\n\n// Make JSHINT a Node module, if possible.\nif (typeof exports === 'object' && exports)\n    exports.JSHINT = JSHINT;\n\n});\n\n/*\n * Narcissus - JS implemented in JS.\n *\n * Parser.\n */\n\ndefine('ace/narcissus/parser', ['require', 'exports', 'module' , 'ace/narcissus/lexer', 'ace/narcissus/definitions', 'ace/narcissus/options'], function(require, exports, module) {\n\nvar lexer = require('./lexer');\nvar definitions = require('./definitions');\nvar options = require('./options');\nvar Tokenizer = lexer.Tokenizer;\n\nvar Dict = definitions.Dict;\nvar Stack = definitions.Stack;\n\n// Set constants in the local scope.\neval(definitions.consts);\nfunction pushDestructuringVarDecls(n, s) {\n    for (var i in n) {\n        var sub = n[i];\n        if (sub.type === IDENTIFIER) {\n            s.varDecls.push(sub);\n        } else {\n            pushDestructuringVarDecls(sub, s);\n        }\n    }\n}\n\nfunction Parser(tokenizer) {\n    tokenizer.parser = this;\n    this.t = tokenizer;\n    this.x = null;\n    this.unexpectedEOF = false;\n    options.mozillaMode && (this.mozillaMode = true);\n    options.parenFreeMode && (this.parenFreeMode = true);\n}\n\nfunction StaticContext(parentScript, parentBlock, inModule, inFunction, strictMode) {\n    this.parentScript = parentScript;\n    this.parentBlock = parentBlock || parentScript;\n    this.inModule = inModule || false;\n    this.inFunction = inFunction || false;\n    this.inForLoopInit = false;\n    this.topLevel = true;\n    this.allLabels = new Stack();\n    this.currentLabels = new Stack();\n    this.labeledTargets = new Stack();\n    this.defaultLoopTarget = null;\n    this.defaultTarget = null;\n    this.strictMode = strictMode;\n}\n\nStaticContext.prototype = {\n    // non-destructive update via prototype extension\n    update: function(ext) {\n        var desc = {};\n        for (var key in ext) {\n            desc[key] = {\n                value: ext[key],\n                writable: true,\n                enumerable: true,\n                configurable: true\n            }\n        }\n        return Object.create(this, desc);\n    },\n    pushLabel: function(label) {\n        return this.update({ currentLabels: this.currentLabels.push(label),\n                             allLabels: this.allLabels.push(label) });\n    },\n    pushTarget: function(target) {\n        var isDefaultLoopTarget = target.isLoop;\n        var isDefaultTarget = isDefaultLoopTarget || target.type === SWITCH;\n\n        if (this.currentLabels.isEmpty()) {\n            if (isDefaultLoopTarget) this.update({ defaultLoopTarget: target });\n            if (isDefaultTarget) this.update({ defaultTarget: target });\n            return this;\n        }\n\n        target.labels = new Dict();\n        this.currentLabels.forEach(function(label) {\n            target.labels.set(label, true);\n        });\n        return this.update({ currentLabels: new Stack(),\n                             labeledTargets: this.labeledTargets.push(target),\n                             defaultLoopTarget: isDefaultLoopTarget\n                             ? target\n                             : this.defaultLoopTarget,\n                             defaultTarget: isDefaultTarget\n                             ? target\n                             : this.defaultTarget });\n    },\n    nest: function() {\n        return this.topLevel ? this.update({ topLevel: false }) : this;\n    },\n    canImport: function() {\n        return this.topLevel && !this.inFunction;\n    },\n    canExport: function() {\n        return this.inModule && this.topLevel && !this.inFunction;\n    },\n    banWith: function() {\n        return this.strictMode || this.inModule;\n    },\n    modulesAllowed: function() {\n        return this.topLevel && !this.inFunction;\n    }\n};\n\nvar Pp = Parser.prototype;\n\nPp.mozillaMode = false;\n\nPp.parenFreeMode = false;\n\nPp.withContext = function(x, f) {\n    var x0 = this.x;\n    this.x = x;\n    var result = f.call(this);\n    // NB: we don't bother with finally, since exceptions trash the parser\n    this.x = x0;\n    return result;\n};\n\nPp.newNode = function newNode(opts) {\n    return new Node(this.t, opts);\n};\n\nPp.fail = function fail(msg) {\n    throw this.t.newSyntaxError(msg);\n};\n\nPp.match = function match(tt, scanOperand, keywordIsName) {\n    return this.t.match(tt, scanOperand, keywordIsName);\n};\n\nPp.mustMatch = function mustMatch(tt, keywordIsName) {\n    return this.t.mustMatch(tt, keywordIsName);\n};\n\nPp.peek = function peek(scanOperand) {\n    return this.t.peek(scanOperand);\n};\n\nPp.peekOnSameLine = function peekOnSameLine(scanOperand) {\n    return this.t.peekOnSameLine(scanOperand);\n};\n\nPp.done = function done() {\n    return this.t.done;\n};\nPp.Script = function Script(inModule, inFunction, expectEnd) {\n    var node = this.newNode(scriptInit());\n    var x2 = new StaticContext(node, node, inModule, inFunction);\n    this.withContext(x2, function() {\n        this.Statements(node, true);\n    });\n    if (expectEnd && !this.done())\n        this.fail(\"expected end of input\");\n    return node;\n};\nfunction Pragma(n) {\n    if (n.type === SEMICOLON) {\n        var e = n.expression;\n        if (e.type === STRING && e.value === \"use strict\") {\n            n.pragma = \"strict\";\n            return true;\n        }\n    }\n    return false;\n}\n\n/*\n * Node :: (tokenizer, optional init object) -> node\n */\nfunction Node(t, init) {\n    var token = t.token;\n    if (token) {\n        // If init.type exists it will override token.type.\n        this.type = token.type;\n        this.value = token.value;\n        this.lineno = token.lineno;\n\n        // Start and end are file positions for error handling.\n        this.start = token.start;\n        this.end = token.end;\n    } else {\n        this.lineno = t.lineno;\n    }\n\n    this.filename = t.filename;\n    this.children = [];\n\n    for (var prop in init)\n        this[prop] = init[prop];\n}\n\n/*\n * SyntheticNode :: (optional init object) -> node\n */\nfunction SyntheticNode(init) {\n    this.children = [];\n    for (var prop in init)\n        this[prop] = init[prop];\n    this.synthetic = true;\n}\n\nvar Np = Node.prototype = SyntheticNode.prototype = {};\nNp.constructor = Node;\n\nvar TO_SOURCE_SKIP = {\n    type: true,\n    value: true,\n    lineno: true,\n    start: true,\n    end: true,\n    tokenizer: true,\n    assignOp: true\n};\nfunction unevalableConst(code) {\n    var token = definitions.tokens[code];\n    var constName = definitions.opTypeNames.hasOwnProperty(token)\n        ? definitions.opTypeNames[token]\n        : token in definitions.keywords\n        ? token.toUpperCase()\n        : token;\n    return { toSource: function() { return constName } };\n}\nNp.toSource = function toSource() {\n    var mock = {};\n    var self = this;\n    mock.type = unevalableConst(this.type);\n    // avoid infinite recursion in case of back-links\n    if (this.generatingSource)\n        return mock.toSource();\n    this.generatingSource = true;\n    if (\"value\" in this)\n        mock.value = this.value;\n    if (\"lineno\" in this)\n        mock.lineno = this.lineno;\n    if (\"start\" in this)\n        mock.start = this.start;\n    if (\"end\" in this)\n        mock.end = this.end;\n    if (this.assignOp)\n        mock.assignOp = unevalableConst(this.assignOp);\n    for (var key in this) {\n        if (this.hasOwnProperty(key) && !(key in TO_SOURCE_SKIP))\n            mock[key] = this[key];\n    }\n    try {\n        return mock.toSource();\n    } finally {\n        delete this.generatingSource;\n    }\n};\n\n// Always use push to add operands to an expression, to update start and end.\nNp.push = function (kid) {\n    // kid can be null e.g. [1, , 2].\n    if (kid !== null) {\n        if (kid.start < this.start)\n            this.start = kid.start;\n        if (this.end < kid.end)\n            this.end = kid.end;\n    }\n    return this.children.push(kid);\n}\n\nNode.indentLevel = 0;\n\nfunction tokenString(tt) {\n    var t = definitions.tokens[tt];\n    return /^\\W/.test(t) ? definitions.opTypeNames[t] : t.toUpperCase();\n}\n\nNp.toString = function () {\n    var a = [];\n    for (var i in this) {\n        if (this.hasOwnProperty(i) && i !== 'type' && i !== 'target')\n            a.push({id: i, value: this[i]});\n    }\n    a.sort(function (a,b) { return (a.id < b.id) ? -1 : 1; });\n    var INDENTATION = \"    \";\n    var n = ++Node.indentLevel;\n    var s = \"{\\n\" + INDENTATION.repeat(n) + \"type: \" + tokenString(this.type);\n    for (i = 0; i < a.length; i++)\n        s += \",\\n\" + INDENTATION.repeat(n) + a[i].id + \": \" + a[i].value;\n    n = --Node.indentLevel;\n    s += \"\\n\" + INDENTATION.repeat(n) + \"}\";\n    return s;\n}\n\nNp.synth = function(init) {\n    var node = new SyntheticNode(init);\n    node.filename = this.filename;\n    node.lineno = this.lineno;\n    node.start = this.start;\n    node.end = this.end;\n    return node;\n};\n\nvar LOOP_INIT = { isLoop: true };\n\nfunction blockInit() {\n    return { type: BLOCK, varDecls: [] };\n}\n\nfunction scriptInit() {\n    return { type: SCRIPT,\n             funDecls: [],\n             varDecls: [],\n             modDefns: new Dict(),\n             modAssns: new Dict(),\n             modDecls: new Dict(),\n             modLoads: new Dict(),\n             impDecls: [],\n             expDecls: [],\n             exports: new Dict(),\n             hasEmptyReturn: false,\n             hasReturnWithValue: false,\n             hasYield: false };\n}\n\ndefinitions.defineGetter(Np, \"length\",\n                         function() {\n                             throw new Error(\"Node.prototype.length is gone; \" +\n                                             \"use n.children.length instead\");\n                         });\n\ndefinitions.defineProperty(String.prototype, \"repeat\",\n                           function(n) {\n                               var s = \"\", t = this + s;\n                               while (--n >= 0)\n                                   s += t;\n                               return s;\n                           }, false, false, true);\n\nPp.MaybeLeftParen = function MaybeLeftParen() {\n    if (this.parenFreeMode)\n        return this.match(LEFT_PAREN) ? LEFT_PAREN : END;\n    return this.mustMatch(LEFT_PAREN).type;\n};\n\nPp.MaybeRightParen = function MaybeRightParen(p) {\n    if (p === LEFT_PAREN)\n        this.mustMatch(RIGHT_PAREN);\n}\n\n/*\n * Statements :: (node[, boolean]) -> void\n *\n * Parses a sequence of Statements.\n */\nPp.Statements = function Statements(n, topLevel) {\n    var prologue = !!topLevel;\n    try {\n        while (!this.done() && this.peek(true) !== RIGHT_CURLY) {\n            var n2 = this.Statement();\n            n.push(n2);\n            if (prologue && Pragma(n2)) {\n                this.x.strictMode = true;\n                n.strict = true;\n            } else {\n                prologue = false;\n            }\n        }\n    } catch (e) {\n        try {\n            if (this.done())\n                this.unexpectedEOF = true;\n        } catch(e) {}\n        throw e;\n    }\n}\n\nPp.Block = function Block() {\n    this.mustMatch(LEFT_CURLY);\n    var n = this.newNode(blockInit());\n    var x2 = this.x.update({ parentBlock: n }).pushTarget(n);\n    this.withContext(x2, function() {\n        this.Statements(n);\n    });\n    this.mustMatch(RIGHT_CURLY);\n    return n;\n}\n\nvar DECLARED_FORM = 0, EXPRESSED_FORM = 1, STATEMENT_FORM = 2;\nfunction Export(node, isDefinition) {\n    this.node = node;                 // the AST node declaring this individual export\n    this.isDefinition = isDefinition; // is the node an 'export'-annotated definition?\n    this.resolved = null;             // resolved pointer to the target of this export\n}\n\n/*\n * registerExport :: (Dict, EXPORT node) -> void\n */\nfunction registerExport(exports, decl) {\n    function register(name, exp) {\n        if (exports.has(name))\n            throw new SyntaxError(\"multiple exports of \" + name);\n        exports.set(name, exp);\n    }\n\n    switch (decl.type) {\n      case MODULE:\n      case FUNCTION:\n        register(decl.name, new Export(decl, true));\n        break;\n\n      case VAR:\n        for (var i = 0; i < decl.children.length; i++)\n            register(decl.children[i].name, new Export(decl.children[i], true));\n        break;\n\n      case LET:\n      case CONST:\n        throw new Error(\"NYI: \" + definitions.tokens[decl.type]);\n\n      case EXPORT:\n        for (var i = 0; i < decl.pathList.length; i++) {\n            var path = decl.pathList[i];\n            switch (path.type) {\n              case OBJECT_INIT:\n                for (var j = 0; j < path.children.length; j++) {\n                    // init :: IDENTIFIER | PROPERTY_INIT\n                    var init = path.children[j];\n                    if (init.type === IDENTIFIER)\n                        register(init.value, new Export(init, false));\n                    else\n                        register(init.children[0].value, new Export(init.children[1], false));\n                }\n                break;\n\n              case DOT:\n                register(path.children[1].value, new Export(path, false));\n                break;\n\n              case IDENTIFIER:\n                register(path.value, new Export(path, false));\n                break;\n\n              default:\n                throw new Error(\"unexpected export path: \" + definitions.tokens[path.type]);\n            }\n        }\n        break;\n\n      default:\n        throw new Error(\"unexpected export decl: \" + definitions.tokens[exp.type]);\n    }\n}\n\n/*\n * Module :: (node) -> Module\n *\n * Static semantic representation of a module.\n */\nfunction Module(node) {\n    var exports = node.body.exports;\n    var modDefns = node.body.modDefns;\n\n    var exportedModules = new Dict();\n\n    exports.forEach(function(name, exp) {\n        var node = exp.node;\n        if (node.type === MODULE) {\n            exportedModules.set(name, node);\n        } else if (!exp.isDefinition && node.type === IDENTIFIER && modDefns.has(node.value)) {\n            var mod = modDefns.get(node.value);\n            exportedModules.set(name, mod);\n        }\n    });\n\n    this.node = node;\n    this.exports = exports;\n    this.exportedModules = exportedModules;\n}\n\n/*\n * Statement :: () -> node\n *\n * Parses a Statement.\n */\nPp.Statement = function Statement() {\n    var i, label, n, n2, p, c, ss, tt = this.t.get(true), tt2, x0, x2, x3;\n\n    var comments = this.t.blockComments;\n\n    // Cases for statements ending in a right curly return early, avoiding the\n    // common semicolon insertion magic after this switch.\n    switch (tt) {\n      case IMPORT:\n        if (!this.x.canImport())\n            this.fail(\"illegal context for import statement\");\n        n = this.newNode();\n        n.pathList = this.ImportPathList();\n        this.x.parentScript.impDecls.push(n);\n        break;\n\n      case EXPORT:\n        if (!this.x.canExport())\n            this.fail(\"export statement not in module top level\");\n        switch (this.peek()) {\n          case MODULE:\n          case FUNCTION:\n          case LET:\n          case VAR:\n          case CONST:\n            n = this.Statement();\n            n.blockComments = comments;\n            n.exported = true;\n            this.x.parentScript.expDecls.push(n);\n            registerExport(this.x.parentScript.exports, n);\n            return n;\n        }\n        n = this.newNode();\n        n.pathList = this.ExportPathList();\n        this.x.parentScript.expDecls.push(n);\n        registerExport(this.x.parentScript.exports, n);\n        break;\n\n      case FUNCTION:\n        // DECLARED_FORM extends funDecls of x, STATEMENT_FORM doesn't.\n        return this.FunctionDefinition(true, this.x.topLevel ? DECLARED_FORM : STATEMENT_FORM, comments);\n\n      case LEFT_CURLY:\n        n = this.newNode(blockInit());\n        x2 = this.x.update({ parentBlock: n }).pushTarget(n).nest();\n        this.withContext(x2, function() {\n            this.Statements(n);\n        });\n        this.mustMatch(RIGHT_CURLY);\n        return n;\n\n      case IF:\n        n = this.newNode();\n        n.condition = this.HeadExpression();\n        x2 = this.x.pushTarget(n).nest();\n        this.withContext(x2, function() {\n            n.thenPart = this.Statement();\n            n.elsePart = this.match(ELSE, true) ? this.Statement() : null;\n        });\n        return n;\n\n      case SWITCH:\n        // This allows CASEs after a DEFAULT, which is in the standard.\n        n = this.newNode({ cases: [], defaultIndex: -1 });\n        n.discriminant = this.HeadExpression();\n        x2 = this.x.pushTarget(n).nest();\n        this.withContext(x2, function() {\n            this.mustMatch(LEFT_CURLY);\n            while ((tt = this.t.get()) !== RIGHT_CURLY) {\n                switch (tt) {\n                  case DEFAULT:\n                    if (n.defaultIndex >= 0)\n                        this.fail(\"More than one switch default\");\n                    // FALL THROUGH\n                  case CASE:\n                    n2 = this.newNode();\n                    if (tt === DEFAULT)\n                        n.defaultIndex = n.cases.length;\n                    else\n                        n2.caseLabel = this.Expression(COLON);\n                    break;\n\n                  default:\n                    this.fail(\"Invalid switch case\");\n                }\n                this.mustMatch(COLON);\n                n2.statements = this.newNode(blockInit());\n                while ((tt=this.peek(true)) !== CASE && tt !== DEFAULT &&\n                       tt !== RIGHT_CURLY)\n                    n2.statements.push(this.Statement());\n                n.cases.push(n2);\n            }\n        });\n        return n;\n\n      case FOR:\n        n = this.newNode(LOOP_INIT);\n        n.blockComments = comments;\n        if (this.match(IDENTIFIER)) {\n            if (this.t.token.value === \"each\")\n                n.isEach = true;\n            else\n                this.t.unget();\n        }\n        if (!this.parenFreeMode)\n            this.mustMatch(LEFT_PAREN);\n        x2 = this.x.pushTarget(n).nest();\n        x3 = this.x.update({ inForLoopInit: true });\n        n2 = null;\n        if ((tt = this.peek(true)) !== SEMICOLON) {\n            this.withContext(x3, function() {\n                if (tt === VAR || tt === CONST) {\n                    this.t.get();\n                    n2 = this.Variables();\n                } else if (tt === LET) {\n                    this.t.get();\n                    if (this.peek() === LEFT_PAREN) {\n                        n2 = this.LetBlock(false);\n                    } else {\n                        // Let in for head, we need to add an implicit block\n                        // around the rest of the for.\n                        this.x.parentBlock = n;\n                        n.varDecls = [];\n                        n2 = this.Variables();\n                    }\n                } else {\n                    n2 = this.Expression();\n                }\n            });\n        }\n        if (n2 && this.match(IN)) {\n            n.type = FOR_IN;\n            this.withContext(x3, function() {\n                n.object = this.Expression();\n                if (n2.type === VAR || n2.type === LET) {\n                    c = n2.children;\n\n                    // Destructuring turns one decl into multiples, so either\n                    // there must be only one destructuring or only one\n                    // decl.\n                    if (c.length !== 1 && n2.destructurings.length !== 1) {\n                        // FIXME: this.fail ?\n                        throw new SyntaxError(\"Invalid for..in left-hand side\",\n                                              this.filename, n2.lineno);\n                    }\n                    if (n2.destructurings.length > 0) {\n                        n.iterator = n2.destructurings[0];\n                    } else {\n                        n.iterator = c[0];\n                    }\n                    n.varDecl = n2;\n                } else {\n                    if (n2.type === ARRAY_INIT || n2.type === OBJECT_INIT) {\n                        n2.destructuredNames = this.checkDestructuring(n2);\n                    }\n                    n.iterator = n2;\n                }\n            });\n        } else {\n            x3.inForLoopInit = false;\n            n.setup = n2;\n            this.mustMatch(SEMICOLON);\n            if (n.isEach)\n                this.fail(\"Invalid for each..in loop\");\n            this.withContext(x3, function() {\n                n.condition = (this.peek(true) === SEMICOLON)\n                    ? null\n                    : this.Expression();\n                this.mustMatch(SEMICOLON);\n                tt2 = this.peek(true);\n                n.update = (this.parenFreeMode\n                            ? tt2 === LEFT_CURLY || definitions.isStatementStartCode[tt2]\n                            : tt2 === RIGHT_PAREN)\n                    ? null\n                    : this.Expression();\n            });\n        }\n        if (!this.parenFreeMode)\n            this.mustMatch(RIGHT_PAREN);\n        this.withContext(x2, function() {\n            n.body = this.Statement();\n        });\n        return n;\n\n      case WHILE:\n        n = this.newNode({ isLoop: true });\n        n.blockComments = comments;\n        n.condition = this.HeadExpression();\n        x2 = this.x.pushTarget(n).nest();\n        this.withContext(x2, function() {\n            n.body = this.Statement();\n        });\n        return n;\n\n      case DO:\n        n = this.newNode({ isLoop: true });\n        n.blockComments = comments;\n        x2 = this.x.pushTarget(n).next();\n        this.withContext(x2, function() {\n            n.body = this.Statement();\n        });\n        this.mustMatch(WHILE);\n        n.condition = this.HeadExpression();\n        // <script language=\"JavaScript\"> (without version hints) may need\n        // automatic semicolon insertion without a newline after do-while.\n        // See http://bugzilla.mozilla.org/show_bug.cgi?id=238945.\n        this.match(SEMICOLON);\n        return n;\n\n      case BREAK:\n      case CONTINUE:\n        n = this.newNode();\n        n.blockComments = comments;\n\n        // handle the |foo: break foo;| corner case\n        x2 = this.x.pushTarget(n);\n\n        if (this.peekOnSameLine() === IDENTIFIER) {\n            this.t.get();\n            n.label = this.t.token.value;\n        }\n\n        if (n.label) {\n            n.target = x2.labeledTargets.find(function(target) {\n                return target.labels.has(n.label)\n            });\n        } else if (tt === CONTINUE) {\n            n.target = x2.defaultLoopTarget;\n        } else {\n            n.target = x2.defaultTarget;\n        }\n\n        if (!n.target)\n            this.fail(\"Invalid \" + ((tt === BREAK) ? \"break\" : \"continue\"));\n        if (!n.target.isLoop && tt === CONTINUE)\n            this.fail(\"Invalid continue\");\n\n        break;\n\n      case TRY:\n        n = this.newNode({ catchClauses: [] });\n        n.blockComments = comments;\n        n.tryBlock = this.Block();\n        while (this.match(CATCH)) {\n            n2 = this.newNode();\n            p = this.MaybeLeftParen();\n            switch (this.t.get()) {\n              case LEFT_BRACKET:\n              case LEFT_CURLY:\n                // Destructured catch identifiers.\n                this.t.unget();\n                n2.varName = this.DestructuringExpression(true);\n                break;\n              case IDENTIFIER:\n                n2.varName = this.t.token.value;\n                break;\n              default:\n                this.fail(\"missing identifier in catch\");\n                break;\n            }\n            if (this.match(IF)) {\n                if (!this.mozillaMode)\n                    this.fail(\"Illegal catch guard\");\n                if (n.catchClauses.length && !n.catchClauses.top().guard)\n                    this.fail(\"Guarded catch after unguarded\");\n                n2.guard = this.Expression();\n            }\n            this.MaybeRightParen(p);\n            n2.block = this.Block();\n            n.catchClauses.push(n2);\n        }\n        if (this.match(FINALLY))\n            n.finallyBlock = this.Block();\n        if (!n.catchClauses.length && !n.finallyBlock)\n            this.fail(\"Invalid try statement\");\n        return n;\n\n      case CATCH:\n      case FINALLY:\n        this.fail(definitions.tokens[tt] + \" without preceding try\");\n\n      case THROW:\n        n = this.newNode();\n        n.exception = this.Expression();\n        break;\n\n      case RETURN:\n        n = this.ReturnOrYield();\n        break;\n\n      case WITH:\n        if (this.x.banWith())\n            this.fail(\"with statements not allowed in strict code or modules\");\n        n = this.newNode();\n        n.blockComments = comments;\n        n.object = this.HeadExpression();\n        x2 = this.x.pushTarget(n).next();\n        this.withContext(x2, function() {\n            n.body = this.Statement();\n        });\n        return n;\n\n      case VAR:\n      case CONST:\n        n = this.Variables();\n        break;\n\n      case LET:\n        if (this.peek() === LEFT_PAREN) {\n            n = this.LetBlock(true);\n            return n;\n        }\n        n = this.Variables();\n        break;\n\n      case DEBUGGER:\n        n = this.newNode();\n        break;\n\n      case NEWLINE:\n      case SEMICOLON:\n        n = this.newNode({ type: SEMICOLON });\n        n.blockComments = comments;\n        n.expression = null;\n        return n;\n\n      case IDENTIFIER:\n      case USE:\n      case MODULE:\n        switch (this.t.token.value) {\n          case \"use\":\n            if (!isPragmaToken(this.peekOnSameLine())) {\n                this.t.unget();\n                break;\n            }\n            return this.newNode({ type: USE, params: this.Pragmas() });\n\n          case \"module\":\n            if (!this.x.modulesAllowed())\n                this.fail(\"module declaration not at top level\");\n            this.x.parentScript.hasModules = true;\n            tt = this.peekOnSameLine();\n            if (tt !== IDENTIFIER && tt !== LEFT_CURLY) {\n                this.t.unget();\n                break;\n            }\n            n = this.newNode({ type: MODULE });\n            n.blockComments = comments;\n            this.mustMatch(IDENTIFIER);\n            label = this.t.token.value;\n\n            if (this.match(LEFT_CURLY)) {\n                n.name = label;\n                n.body = this.Script(true, false);\n                n.module = new Module(n);\n                this.mustMatch(RIGHT_CURLY);\n                this.x.parentScript.modDefns.set(n.name, n);\n                return n;\n            }\n\n            this.t.unget();\n            this.ModuleVariables(n);\n            return n;\n\n          default:\n            tt = this.peek();\n            // Labeled statement.\n            if (tt === COLON) {\n                label = this.t.token.value;\n                if (this.x.allLabels.has(label))\n                    this.fail(\"Duplicate label: \" + label);\n                this.t.get();\n                n = this.newNode({ type: LABEL, label: label });\n                n.blockComments = comments;\n                x2 = this.x.pushLabel(label).nest();\n                this.withContext(x2, function() {\n                    n.statement = this.Statement();\n                });\n                n.target = (n.statement.type === LABEL) ? n.statement.target : n.statement;\n                return n;\n            }\n            // FALL THROUGH\n        }\n        // FALL THROUGH\n\n      default:\n        // Expression statement.\n        // We unget the current token to parse the expression as a whole.\n        n = this.newNode({ type: SEMICOLON });\n        this.t.unget();\n        n.blockComments = comments;\n        n.expression = this.Expression();\n        n.end = n.expression.end;\n        break;\n    }\n\n    n.blockComments = comments;\n    this.MagicalSemicolon();\n    return n;\n}\n\n/*\n * isPragmaToken :: (number) -> boolean\n */\nfunction isPragmaToken(tt) {\n    switch (tt) {\n      case IDENTIFIER:\n      case STRING:\n      case NUMBER:\n      case NULL:\n      case TRUE:\n      case FALSE:\n        return true;\n    }\n    return false;\n}\n\n/*\n * Pragmas :: () -> Array[Array[token]]\n */\nPp.Pragmas = function Pragmas() {\n    var pragmas = [];\n    do {\n        pragmas.push(this.Pragma());\n    } while (this.match(COMMA));\n    this.MagicalSemicolon();\n    return pragmas;\n}\n\n/*\n * Pragmas :: () -> Array[token]\n */\nPp.Pragma = function Pragma() {\n    var items = [];\n    var tt;\n    do {\n        tt = this.t.get(true);\n        items.push(this.t.token);\n    } while (isPragmaToken(this.peek()));\n    return items;\n}\n\n/*\n * MagicalSemicolon :: () -> void\n */\nPp.MagicalSemicolon = function MagicalSemicolon() {\n    var tt;\n    if (this.t.lineno === this.t.token.lineno) {\n        tt = this.peekOnSameLine();\n        if (tt !== END && tt !== NEWLINE && tt !== SEMICOLON && tt !== RIGHT_CURLY)\n            this.fail(\"missing ; before statement\");\n    }\n    this.match(SEMICOLON);\n}\n\n/*\n * ReturnOrYield :: () -> (RETURN | YIELD) node\n */\nPp.ReturnOrYield = function ReturnOrYield() {\n    var n, b, tt = this.t.token.type, tt2;\n\n    var parentScript = this.x.parentScript;\n\n    if (tt === RETURN) {\n        if (!this.x.inFunction)\n            this.fail(\"Return not in function\");\n    } else /* if (tt === YIELD) */ {\n        if (!this.x.inFunction)\n            this.fail(\"Yield not in function\");\n        parentScript.hasYield = true;\n    }\n    n = this.newNode({ value: undefined });\n\n    tt2 = (tt === RETURN) ? this.peekOnSameLine(true) : this.peek(true);\n    if (tt2 !== END && tt2 !== NEWLINE &&\n        tt2 !== SEMICOLON && tt2 !== RIGHT_CURLY\n        && (tt !== YIELD ||\n            (tt2 !== tt && tt2 !== RIGHT_BRACKET && tt2 !== RIGHT_PAREN &&\n             tt2 !== COLON && tt2 !== COMMA))) {\n        if (tt === RETURN) {\n            n.value = this.Expression();\n            parentScript.hasReturnWithValue = true;\n        } else {\n            n.value = this.AssignExpression();\n        }\n    } else if (tt === RETURN) {\n        parentScript.hasEmptyReturn = true;\n    }\n\n    return n;\n}\n\n/*\n * ModuleExpression :: () -> (STRING | IDENTIFIER | DOT) node\n */\nPp.ModuleExpression = function ModuleExpression() {\n    return this.match(STRING) ? this.newNode() : this.QualifiedPath();\n}\n\n/*\n * ImportPathList :: () -> Array[DOT node]\n */\nPp.ImportPathList = function ImportPathList() {\n    var a = [];\n    do {\n        a.push(this.ImportPath());\n    } while (this.match(COMMA));\n    return a;\n}\n\n/*\n * ImportPath :: () -> DOT node\n */\nPp.ImportPath = function ImportPath() {\n    var n = this.QualifiedPath();\n    if (!this.match(DOT)) {\n        if (n.type === IDENTIFIER)\n            this.fail(\"cannot import local variable\");\n        return n;\n    }\n\n    var n2 = this.newNode();\n    n2.push(n);\n    n2.push(this.ImportSpecifierSet());\n    return n2;\n}\n\n/*\n * ExplicitSpecifierSet :: (() -> node) -> OBJECT_INIT node\n */\nPp.ExplicitSpecifierSet = function ExplicitSpecifierSet(SpecifierRHS) {\n    var n, n2, id, tt;\n\n    n = this.newNode({ type: OBJECT_INIT });\n    this.mustMatch(LEFT_CURLY);\n\n    if (!this.match(RIGHT_CURLY)) {\n        do {\n            id = this.Identifier();\n            if (this.match(COLON)) {\n                n2 = this.newNode({ type: PROPERTY_INIT });\n                n2.push(id);\n                n2.push(SpecifierRHS());\n                n.push(n2);\n            } else {\n                n.push(id);\n            }\n        } while (!this.match(RIGHT_CURLY) && this.mustMatch(COMMA));\n    }\n\n    return n;\n}\n\n/*\n * ImportSpecifierSet :: () -> (IDENTIFIER | OBJECT_INIT) node\n */\nPp.ImportSpecifierSet = function ImportSpecifierSet() {\n    var self = this;\n    return this.match(MUL)\n        ? this.newNode({ type: IDENTIFIER, name: \"*\" })\n    : ExplicitSpecifierSet(function() { return self.Identifier() });\n}\n\n/*\n * Identifier :: () -> IDENTIFIER node\n */\nPp.Identifier = function Identifier() {\n    this.mustMatch(IDENTIFIER);\n    return this.newNode({ type: IDENTIFIER });\n}\n\n/*\n * IdentifierName :: () -> IDENTIFIER node\n */\nPp.IdentifierName = function IdentifierName() {\n    this.mustMatch(IDENTIFIER, true);\n    return this.newNode({ type: IDENTIFIER });\n}\n\n/*\n * QualifiedPath :: () -> (IDENTIFIER | DOT) node\n */\nPp.QualifiedPath = function QualifiedPath() {\n    var n, n2;\n\n    n = this.Identifier();\n\n    while (this.match(DOT)) {\n        if (this.peek() !== IDENTIFIER) {\n            // Unget the '.' token, which isn't part of the QualifiedPath.\n            this.t.unget();\n            break;\n        }\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.Identifier());\n        n = n2;\n    }\n\n    return n;\n}\n\n/*\n * ExportPath :: () -> (IDENTIFIER | DOT | OBJECT_INIT) node\n */\nPp.ExportPath = function ExportPath() {\n    var self = this;\n    if (this.peek() === LEFT_CURLY)\n        return this.ExplicitSpecifierSet(function() { return self.QualifiedPath() });\n    return this.QualifiedPath();\n}\n\n/*\n * ExportPathList :: () -> Array[(IDENTIFIER | DOT | OBJECT_INIT) node]\n */\nPp.ExportPathList = function ExportPathList() {\n    var a = [];\n    do {\n        a.push(this.ExportPath());\n    } while (this.match(COMMA));\n    return a;\n}\n\n/*\n * FunctionDefinition :: (boolean,\n *                        DECLARED_FORM or EXPRESSED_FORM or STATEMENT_FORM,\n *                        [string] or null or undefined)\n *                    -> node\n */\nPp.FunctionDefinition = function FunctionDefinition(requireName, functionForm, comments) {\n    var tt;\n    var f = this.newNode({ params: [], paramComments: [] });\n    if (typeof comments === \"undefined\")\n        comments = null;\n    f.blockComments = comments;\n    if (f.type !== FUNCTION)\n        f.type = (f.value === \"get\") ? GETTER : SETTER;\n    if (this.match(MUL))\n        f.isExplicitGenerator = true;\n    if (this.match(IDENTIFIER, false, true))\n        f.name = this.t.token.value;\n    else if (requireName)\n        this.fail(\"missing function identifier\");\n\n    var inModule = this.x.inModule;\n    x2 = new StaticContext(null, null, inModule, true, this.x.strictMode);\n    this.withContext(x2, function() {\n        this.mustMatch(LEFT_PAREN);\n        if (!this.match(RIGHT_PAREN)) {\n            do {\n                tt = this.t.get();\n                f.paramComments.push(this.t.lastBlockComment());\n                switch (tt) {\n                  case LEFT_BRACKET:\n                  case LEFT_CURLY:\n                    // Destructured formal parameters.\n                    this.t.unget();\n                    f.params.push(this.DestructuringExpression());\n                    break;\n                  case IDENTIFIER:\n                    f.params.push(this.t.token.value);\n                    break;\n                  default:\n                    this.fail(\"missing formal parameter\");\n                }\n            } while (this.match(COMMA));\n            this.mustMatch(RIGHT_PAREN);\n        }\n\n        // Do we have an expression closure or a normal body?\n        tt = this.t.get(true);\n        if (tt !== LEFT_CURLY)\n            this.t.unget();\n\n        if (tt !== LEFT_CURLY) {\n            f.body = this.AssignExpression();\n        } else {\n            f.body = this.Script(inModule, true);\n        }\n    });\n\n    if (tt === LEFT_CURLY)\n        this.mustMatch(RIGHT_CURLY);\n\n    f.end = this.t.token.end;\n    f.functionForm = functionForm;\n    if (functionForm === DECLARED_FORM)\n        this.x.parentScript.funDecls.push(f);\n\n    if (this.x.inModule && !f.isExplicitGenerator && f.body.hasYield)\n        this.fail(\"yield in non-generator function\");\n\n    if (f.isExplicitGenerator || f.body.hasYield)\n        f.body = this.newNode({ type: GENERATOR, body: f.body });\n\n    return f;\n}\n\n/*\n * ModuleVariables :: (MODULE node) -> void\n *\n * Parses a comma-separated list of module declarations (and maybe\n * initializations).\n */\nPp.ModuleVariables = function ModuleVariables(n) {\n    var n1, n2;\n    do {\n        n1 = this.Identifier();\n        if (this.match(ASSIGN)) {\n            n2 = this.ModuleExpression();\n            n1.initializer = n2;\n            if (n2.type === STRING)\n                this.x.parentScript.modLoads.set(n1.value, n2.value);\n            else\n                this.x.parentScript.modAssns.set(n1.value, n1);\n        }\n        n.push(n1);\n    } while (this.match(COMMA));\n}\n\n/*\n * Variables :: () -> node\n *\n * Parses a comma-separated list of var declarations (and maybe\n * initializations).\n */\nPp.Variables = function Variables(letBlock) {\n    var n, n2, ss, i, s, tt;\n\n    tt = this.t.token.type;\n    switch (tt) {\n      case VAR:\n      case CONST:\n        s = this.x.parentScript;\n        break;\n      case LET:\n        s = this.x.parentBlock;\n        break;\n      case LEFT_PAREN:\n        tt = LET;\n        s = letBlock;\n        break;\n    }\n\n    n = this.newNode({ type: tt, destructurings: [] });\n\n    do {\n        tt = this.t.get();\n        if (tt === LEFT_BRACKET || tt === LEFT_CURLY) {\n            // Need to unget to parse the full destructured expression.\n            this.t.unget();\n\n            var dexp = this.DestructuringExpression(true);\n\n            n2 = this.newNode({ type: IDENTIFIER,\n                                name: dexp,\n                                readOnly: n.type === CONST });\n            n.push(n2);\n            pushDestructuringVarDecls(n2.name.destructuredNames, s);\n            n.destructurings.push({ exp: dexp, decl: n2 });\n\n            if (this.x.inForLoopInit && this.peek() === IN) {\n                continue;\n            }\n\n            this.mustMatch(ASSIGN);\n            if (this.t.token.assignOp)\n                this.fail(\"Invalid variable initialization\");\n\n            n2.blockComment = this.t.lastBlockComment();\n            n2.initializer = this.AssignExpression();\n\n            continue;\n        }\n\n        if (tt !== IDENTIFIER)\n            this.fail(\"missing variable name\");\n\n        n2 = this.newNode({ type: IDENTIFIER,\n                            name: this.t.token.value,\n                            readOnly: n.type === CONST });\n        n.push(n2);\n        s.varDecls.push(n2);\n\n        if (this.match(ASSIGN)) {\n            var comment = this.t.lastBlockComment();\n            if (this.t.token.assignOp)\n                this.fail(\"Invalid variable initialization\");\n\n            n2.initializer = this.AssignExpression();\n        } else {\n            var comment = this.t.lastBlockComment();\n        }\n        n2.blockComment = comment;\n    } while (this.match(COMMA));\n\n    return n;\n}\n\n/*\n * LetBlock :: (boolean) -> node\n *\n * Does not handle let inside of for loop init.\n */\nPp.LetBlock = function LetBlock(isStatement) {\n    var n, n2;\n\n    // t.token.type must be LET\n    n = this.newNode({ type: LET_BLOCK, varDecls: [] });\n    this.mustMatch(LEFT_PAREN);\n    n.variables = this.Variables(n);\n    this.mustMatch(RIGHT_PAREN);\n\n    if (isStatement && this.peek() !== LEFT_CURLY) {\n        /*\n         * If this is really an expression in let statement guise, then we\n         * need to wrap the LET_BLOCK node in a SEMICOLON node so that we pop\n         * the return value of the expression.\n         */\n        n2 = this.newNode({ type: SEMICOLON, expression: n });\n        isStatement = false;\n    }\n\n    if (isStatement)\n        n.block = this.Block();\n    else\n        n.expression = this.AssignExpression();\n\n    return n;\n}\n\nPp.checkDestructuring = function checkDestructuring(n, simpleNamesOnly) {\n    if (n.type === ARRAY_COMP)\n        this.fail(\"Invalid array comprehension left-hand side\");\n    if (n.type !== ARRAY_INIT && n.type !== OBJECT_INIT)\n        return;\n\n    var lhss = {};\n    var nn, n2, idx, sub, cc, c = n.children;\n    for (var i = 0, j = c.length; i < j; i++) {\n        if (!(nn = c[i]))\n            continue;\n        if (nn.type === PROPERTY_INIT) {\n            cc = nn.children;\n            sub = cc[1];\n            idx = cc[0].value;\n        } else if (n.type === OBJECT_INIT) {\n            // Do we have destructuring shorthand {foo, bar}?\n            sub = nn;\n            idx = nn.value;\n        } else {\n            sub = nn;\n            idx = i;\n        }\n\n        if (sub.type === ARRAY_INIT || sub.type === OBJECT_INIT) {\n            lhss[idx] = this.checkDestructuring(sub, simpleNamesOnly);\n        } else {\n            if (simpleNamesOnly && sub.type !== IDENTIFIER) {\n                // In declarations, lhs must be simple names\n                this.fail(\"missing name in pattern\");\n            }\n\n            lhss[idx] = sub;\n        }\n    }\n\n    return lhss;\n}\n\nPp.DestructuringExpression = function DestructuringExpression(simpleNamesOnly) {\n    var n = this.PrimaryExpression();\n    // Keep the list of lefthand sides for varDecls\n    n.destructuredNames = this.checkDestructuring(n, simpleNamesOnly);\n    return n;\n}\n\nPp.GeneratorExpression = function GeneratorExpression(e) {\n    return this.newNode({ type: GENERATOR,\n                          expression: e,\n                          tail: this.ComprehensionTail() });\n}\n\nPp.ComprehensionTail = function ComprehensionTail() {\n    var body, n, n2, n3, p;\n\n    // t.token.type must be FOR\n    body = this.newNode({ type: COMP_TAIL });\n\n    do {\n        // Comprehension tails are always for..in loops.\n        n = this.newNode({ type: FOR_IN, isLoop: true });\n        if (this.match(IDENTIFIER)) {\n            // But sometimes they're for each..in.\n            if (this.mozillaMode && this.t.token.value === \"each\")\n                n.isEach = true;\n            else\n                this.t.unget();\n        }\n        p = this.MaybeLeftParen();\n        switch(this.t.get()) {\n          case LEFT_BRACKET:\n          case LEFT_CURLY:\n            this.t.unget();\n            // Destructured left side of for in comprehension tails.\n            n.iterator = this.DestructuringExpression();\n            break;\n\n          case IDENTIFIER:\n            n.iterator = n3 = this.newNode({ type: IDENTIFIER });\n            n3.name = n3.value;\n            n.varDecl = n2 = this.newNode({ type: VAR });\n            n2.push(n3);\n            this.x.parentScript.varDecls.push(n3);\n            // Don't add to varDecls since the semantics of comprehensions is\n            // such that the variables are in their own function when\n            // desugared.\n            break;\n\n          default:\n            this.fail(\"missing identifier\");\n        }\n        this.mustMatch(IN);\n        n.object = this.Expression();\n        this.MaybeRightParen(p);\n        body.push(n);\n    } while (this.match(FOR));\n\n    // Optional guard.\n    if (this.match(IF))\n        body.guard = this.HeadExpression();\n\n    return body;\n}\n\nPp.HeadExpression = function HeadExpression() {\n    var p = this.MaybeLeftParen();\n    var n = this.ParenExpression();\n    this.MaybeRightParen(p);\n    if (p === END && !n.parenthesized) {\n        var tt = this.peek();\n        if (tt !== LEFT_CURLY && !definitions.isStatementStartCode[tt])\n            this.fail(\"Unparenthesized head followed by unbraced body\");\n    }\n    return n;\n}\n\nPp.ParenExpression = function ParenExpression() {\n    // Always accept the 'in' operator in a parenthesized expression,\n    // where it's unambiguous, even if we might be parsing the init of a\n    // for statement.\n    var x2 = this.x.update({\n        inForLoopInit: this.x.inForLoopInit && (this.t.token.type === LEFT_PAREN)\n    });\n    var n = this.withContext(x2, function() {\n        return this.Expression();\n    });\n    if (this.match(FOR)) {\n        if (n.type === YIELD && !n.parenthesized)\n            this.fail(\"Yield expression must be parenthesized\");\n        if (n.type === COMMA && !n.parenthesized)\n            this.fail(\"Generator expression must be parenthesized\");\n        n = this.GeneratorExpression(n);\n    }\n\n    return n;\n}\n\n/*\n * Expression :: () -> node\n *\n * Top-down expression parser matched against SpiderMonkey.\n */\nPp.Expression = function Expression() {\n    var n, n2;\n\n    n = this.AssignExpression();\n    if (this.match(COMMA)) {\n        n2 = this.newNode({ type: COMMA });\n        n2.push(n);\n        n = n2;\n        do {\n            n2 = n.children[n.children.length-1];\n            if (n2.type === YIELD && !n2.parenthesized)\n                this.fail(\"Yield expression must be parenthesized\");\n            n.push(this.AssignExpression());\n        } while (this.match(COMMA));\n    }\n\n    return n;\n}\n\nPp.AssignExpression = function AssignExpression() {\n    var n, lhs;\n\n    // Have to treat yield like an operand because it could be the leftmost\n    // operand of the expression.\n    if (this.match(YIELD, true))\n        return this.ReturnOrYield();\n\n    n = this.newNode({ type: ASSIGN });\n    lhs = this.ConditionalExpression();\n\n    if (!this.match(ASSIGN)) {\n        return lhs;\n    }\n\n    n.blockComment = this.t.lastBlockComment();\n\n    switch (lhs.type) {\n      case OBJECT_INIT:\n      case ARRAY_INIT:\n        lhs.destructuredNames = this.checkDestructuring(lhs);\n        // FALL THROUGH\n      case IDENTIFIER: case DOT: case INDEX: case CALL:\n        break;\n      default:\n        this.fail(\"Bad left-hand side of assignment\");\n        break;\n    }\n\n    n.assignOp = lhs.assignOp = this.t.token.assignOp;\n    n.push(lhs);\n    n.push(this.AssignExpression());\n\n    return n;\n}\n\nPp.ConditionalExpression = function ConditionalExpression() {\n    var n, n2;\n\n    n = this.OrExpression();\n    if (this.match(HOOK)) {\n        n2 = n;\n        n = this.newNode({ type: HOOK });\n        n.push(n2);\n        var x2 = this.x.update({ inForLoopInit: false });\n        this.withContext(x2, function() {\n            n.push(this.AssignExpression());\n        });\n        if (!this.match(COLON))\n            this.fail(\"missing : after ?\");\n        n.push(this.AssignExpression());\n    }\n\n    return n;\n}\n\nPp.OrExpression = function OrExpression() {\n    var n, n2;\n\n    n = this.AndExpression();\n    while (this.match(OR)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.AndExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.AndExpression = function AndExpression() {\n    var n, n2;\n\n    n = this.BitwiseOrExpression();\n    while (this.match(AND)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.BitwiseOrExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.BitwiseOrExpression = function BitwiseOrExpression() {\n    var n, n2;\n\n    n = this.BitwiseXorExpression();\n    while (this.match(BITWISE_OR)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.BitwiseXorExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.BitwiseXorExpression = function BitwiseXorExpression() {\n    var n, n2;\n\n    n = this.BitwiseAndExpression();\n    while (this.match(BITWISE_XOR)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.BitwiseAndExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.BitwiseAndExpression = function BitwiseAndExpression() {\n    var n, n2;\n\n    n = this.EqualityExpression();\n    while (this.match(BITWISE_AND)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.EqualityExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.EqualityExpression = function EqualityExpression() {\n    var n, n2;\n\n    n = this.RelationalExpression();\n    while (this.match(EQ) || this.match(NE) ||\n           this.match(STRICT_EQ) || this.match(STRICT_NE)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.RelationalExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.RelationalExpression = function RelationalExpression() {\n    var n, n2;\n    var x2 = this.x.update({ inForLoopInit: false });\n    this.withContext(x2, function() {\n        n = this.ShiftExpression();\n        while ((this.match(LT) || this.match(LE) || this.match(GE) || this.match(GT) ||\n                (!this.x.inForLoopInit && this.match(IN)) ||\n                this.match(INSTANCEOF))) {\n            n2 = this.newNode();\n            n2.push(n);\n            n2.push(this.ShiftExpression());\n            n = n2;\n        }\n    });\n\n    return n;\n}\n\nPp.ShiftExpression = function ShiftExpression() {\n    var n, n2;\n\n    n = this.AddExpression();\n    while (this.match(LSH) || this.match(RSH) || this.match(URSH)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.AddExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.AddExpression = function AddExpression() {\n    var n, n2;\n\n    n = this.MultiplyExpression();\n    while (this.match(PLUS) || this.match(MINUS)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.MultiplyExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.MultiplyExpression = function MultiplyExpression() {\n    var n, n2;\n\n    n = this.UnaryExpression();\n    while (this.match(MUL) || this.match(DIV) || this.match(MOD)) {\n        n2 = this.newNode();\n        n2.push(n);\n        n2.push(this.UnaryExpression());\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.UnaryExpression = function UnaryExpression() {\n    var n, n2, tt;\n\n    switch (tt = this.t.get(true)) {\n      case DELETE: case VOID: case TYPEOF:\n      case NOT: case BITWISE_NOT: case PLUS: case MINUS:\n        if (tt === PLUS)\n            n = this.newNode({ type: UNARY_PLUS });\n        else if (tt === MINUS)\n            n = this.newNode({ type: UNARY_MINUS });\n        else\n            n = this.newNode();\n        n.push(this.UnaryExpression());\n        break;\n\n      case INCREMENT:\n      case DECREMENT:\n        // Prefix increment/decrement.\n        n = this.newNode();\n        n.push(this.MemberExpression(true));\n        break;\n\n      default:\n        this.t.unget();\n        n = this.MemberExpression(true);\n\n        // Don't look across a newline boundary for a postfix {in,de}crement.\n        if (this.t.tokens[(this.t.tokenIndex + this.t.lookahead - 1) & 3].lineno ===\n            this.t.lineno) {\n            if (this.match(INCREMENT) || this.match(DECREMENT)) {\n                n2 = this.newNode({ postfix: true });\n                n2.push(n);\n                n = n2;\n            }\n        }\n        break;\n    }\n\n    return n;\n}\n\nPp.MemberExpression = function MemberExpression(allowCallSyntax) {\n    var n, n2, name, tt;\n\n    if (this.match(NEW)) {\n        n = this.newNode();\n        n.push(this.MemberExpression(false));\n        if (this.match(LEFT_PAREN)) {\n            n.type = NEW_WITH_ARGS;\n            n.push(this.ArgumentList());\n        }\n    } else {\n        n = this.PrimaryExpression();\n    }\n\n    while ((tt = this.t.get()) !== END) {\n        switch (tt) {\n          case DOT:\n            n2 = this.newNode();\n            n2.push(n);\n            n2.push(this.IdentifierName());\n            break;\n\n          case LEFT_BRACKET:\n            n2 = this.newNode({ type: INDEX });\n            n2.push(n);\n            n2.push(this.Expression());\n            this.mustMatch(RIGHT_BRACKET);\n            break;\n\n          case LEFT_PAREN:\n            if (allowCallSyntax) {\n                n2 = this.newNode({ type: CALL });\n                n2.push(n);\n                n2.push(this.ArgumentList());\n                break;\n            }\n\n            // FALL THROUGH\n          default:\n            this.t.unget();\n            return n;\n        }\n\n        n = n2;\n    }\n\n    return n;\n}\n\nPp.ArgumentList = function ArgumentList() {\n    var n, n2;\n\n    n = this.newNode({ type: LIST });\n    if (this.match(RIGHT_PAREN, true))\n        return n;\n    do {\n        n2 = this.AssignExpression();\n        if (n2.type === YIELD && !n2.parenthesized && this.peek() === COMMA)\n            this.fail(\"Yield expression must be parenthesized\");\n        if (this.match(FOR)) {\n            n2 = this.GeneratorExpression(n2);\n            if (n.children.length > 1 || this.peek(true) === COMMA)\n                this.fail(\"Generator expression must be parenthesized\");\n        }\n        n.push(n2);\n    } while (this.match(COMMA));\n    this.mustMatch(RIGHT_PAREN);\n\n    return n;\n}\n\nPp.PrimaryExpression = function PrimaryExpression() {\n    var n, n2, tt = this.t.get(true);\n\n    switch (tt) {\n      case FUNCTION:\n        n = this.FunctionDefinition(false, EXPRESSED_FORM);\n        break;\n\n      case LEFT_BRACKET:\n        n = this.newNode({ type: ARRAY_INIT });\n        while ((tt = this.peek(true)) !== RIGHT_BRACKET) {\n            if (tt === COMMA) {\n                this.t.get();\n                n.push(null);\n                continue;\n            }\n            n.push(this.AssignExpression());\n            if (tt !== COMMA && !this.match(COMMA))\n                break;\n        }\n\n        // If we matched exactly one element and got a FOR, we have an\n        // array comprehension.\n        if (n.children.length === 1 && this.match(FOR)) {\n            n2 = this.newNode({ type: ARRAY_COMP,\n                                expression: n.children[0],\n                                tail: this.ComprehensionTail() });\n            n = n2;\n        }\n        this.mustMatch(RIGHT_BRACKET);\n        break;\n\n      case LEFT_CURLY:\n        var id, fd;\n        n = this.newNode({ type: OBJECT_INIT });\n\n        object_init:\n        if (!this.match(RIGHT_CURLY)) {\n            do {\n                tt = this.t.get();\n                if ((this.t.token.value === \"get\" || this.t.token.value === \"set\") &&\n                    this.peek() === IDENTIFIER) {\n                    n.push(this.FunctionDefinition(true, EXPRESSED_FORM));\n                } else {\n                    var comments = this.t.blockComments;\n                    switch (tt) {\n                      case IDENTIFIER: case NUMBER: case STRING:\n                        id = this.newNode({ type: IDENTIFIER });\n                        break;\n                      case RIGHT_CURLY:\n                        break object_init;\n                      default:\n                        if (this.t.token.value in definitions.keywords) {\n                            id = this.newNode({ type: IDENTIFIER });\n                            break;\n                        }\n                        this.fail(\"Invalid property name\");\n                    }\n                    if (this.match(COLON)) {\n                        n2 = this.newNode({ type: PROPERTY_INIT });\n                        n2.push(id);\n                        n2.push(this.AssignExpression());\n                        n2.blockComments = comments;\n                        n.push(n2);\n                    } else {\n                        // Support, e.g., |var {x, y} = o| as destructuring shorthand\n                        // for |var {x: x, y: y} = o|, per proposed JS2/ES4 for JS1.8.\n                        if (this.peek() !== COMMA && this.peek() !== RIGHT_CURLY)\n                            this.fail(\"missing : after property\");\n                        n.push(id);\n                    }\n                }\n            } while (this.match(COMMA));\n            this.mustMatch(RIGHT_CURLY);\n        }\n        break;\n\n      case LEFT_PAREN:\n        n = this.ParenExpression();\n        this.mustMatch(RIGHT_PAREN);\n        n.parenthesized = true;\n        break;\n\n      case LET:\n        n = this.LetBlock(false);\n        break;\n\n      case NULL: case THIS: case TRUE: case FALSE:\n      case IDENTIFIER: case NUMBER: case STRING: case REGEXP:\n        n = this.newNode();\n        break;\n\n      default:\n        this.fail(\"missing operand; found \" + definitions.tokens[tt]);\n        break;\n    }\n\n    return n;\n}\n\n/*\n * parse :: (source, filename, line number) -> node\n */\nfunction parse(s, f, l) {\n    var t = new Tokenizer(s, f, l, options.allowHTMLComments);\n    var p = new Parser(t);\n    return p.Script(false, false, true);\n}\n\n/*\n * parseFunction :: (source, boolean,\n *                   DECLARED_FORM or EXPRESSED_FORM or STATEMENT_FORM,\n *                   filename, line number)\n *               -> node\n */\nfunction parseFunction(s, requireName, form, f, l) {\n    var t = new Tokenizer(s, f, l);\n    var p = new Parser(t);\n    p.x = new StaticContext(null, null, false, false, false);\n    return p.FunctionDefinition(requireName, form);\n}\n\n/*\n * parseStdin :: (source, {line number}, string, (string) -> boolean) -> program node\n */\nfunction parseStdin(s, ln, prefix, isCommand) {\n    // the special .begin command is only recognized at the beginning\n    if (s.match(/^[\\s]*\\.begin[\\s]*$/)) {\n        ++ln.value;\n        return parseMultiline(ln, prefix);\n    }\n\n    // commands at the beginning are treated as the entire input\n    if (isCommand(s.trim()))\n        s = \"\";\n\n    for (;;) {\n        try {\n            var t = new Tokenizer(s, \"stdin\", ln.value, false);\n            var p = new Parser(t);\n            var n = p.Script(false, false);\n            ln.value = t.lineno;\n            return n;\n        } catch (e) {\n            if (!p.unexpectedEOF)\n                throw e;\n\n            // commands in the middle are not treated as part of the input\n            var more;\n            do {\n                if (prefix)\n                    putstr(prefix);\n                more = readline();\n                if (!more)\n                    throw e;\n            } while (isCommand(more.trim()));\n\n            s += \"\\n\" + more;\n        }\n    }\n}\n\n/*\n * parseMultiline :: ({line number}, string | null) -> program node\n */\nfunction parseMultiline(ln, prefix) {\n    var s = \"\";\n    for (;;) {\n        if (prefix)\n            putstr(prefix);\n        var more = readline();\n        if (more === null)\n            return null;\n        // the only command recognized in multiline mode is .end\n        if (more.match(/^[\\s]*\\.end[\\s]*$/))\n            break;\n        s += \"\\n\" + more;\n    }\n    var t = new Tokenizer(s, \"stdin\", ln.value, false);\n    var p = new Parser(t);\n    var n = p.Script(false, false);\n    ln.value = t.lineno;\n    return n;\n}\n\nexports.parse = parse;\nexports.parseStdin = parseStdin;\nexports.parseFunction = parseFunction;\nexports.Node = Node;\nexports.DECLARED_FORM = DECLARED_FORM;\nexports.EXPRESSED_FORM = EXPRESSED_FORM;\nexports.STATEMENT_FORM = STATEMENT_FORM;\nexports.Tokenizer = Tokenizer;\nexports.Parser = Parser;\nexports.Module = Module;\nexports.Export = Export;\n\n});\n\n/*\n * Narcissus - JS implemented in JS.\n *\n * Lexical scanner.\n */\n\n define('ace/narcissus/lexer', ['require', 'exports', 'module' , 'ace/narcissus/definitions'], function(require, exports, module) {\n\nvar definitions = require('./definitions');\n\n// Set constants in the local scope.\neval(definitions.consts);\n\n// Build up a trie of operator tokens.\nvar opTokens = {};\nfor (var op in definitions.opTypeNames) {\n    if (op === '\\n' || op === '.')\n        continue;\n\n    var node = opTokens;\n    for (var i = 0; i < op.length; i++) {\n        var ch = op[i];\n        if (!(ch in node))\n            node[ch] = {};\n        node = node[ch];\n        node.op = op;\n    }\n}\n\n/*\n * Since JavaScript provides no convenient way to determine if a\n * character is in a particular Unicode category, we use\n * metacircularity to accomplish this (oh yeaaaah!)\n */\nfunction isValidIdentifierChar(ch, first) {\n    // check directly for ASCII\n    if (ch <= \"\\u007F\") {\n        if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '$' || ch === '_' ||\n            (!first && (ch >= '0' && ch <= '9'))) {\n            return true;\n        }\n        return false;\n    }\n\n    // create an object to test this in\n    var x = {};\n    x[\"x\"+ch] = true;\n    x[ch] = true;\n\n    // then use eval to determine if it's a valid character\n    var valid = false;\n    try {\n        valid = (Function(\"x\", \"return (x.\" + (first?\"\":\"x\") + ch + \");\")(x) === true);\n    } catch (ex) {}\n\n    return valid;\n}\n\nfunction isIdentifier(str) {\n    if (typeof str !== \"string\")\n        return false;\n\n    if (str.length === 0)\n        return false;\n\n    if (!isValidIdentifierChar(str[0], true))\n        return false;\n\n    for (var i = 1; i < str.length; i++) {\n        if (!isValidIdentifierChar(str[i], false))\n            return false;\n    }\n\n    return true;\n}\n\n/*\n * Tokenizer :: (source, filename, line number, boolean) -> Tokenizer\n */\nfunction Tokenizer(s, f, l, allowHTMLComments) {\n    this.cursor = 0;\n    this.source = String(s);\n    this.tokens = [];\n    this.tokenIndex = 0;\n    this.lookahead = 0;\n    this.scanNewlines = false;\n    this.filename = f || \"\";\n    this.lineno = l || 1;\n    this.allowHTMLComments = allowHTMLComments;\n    this.blockComments = null;\n}\n\nTokenizer.prototype = {\n    get done() {\n        // We need to set scanOperand to true here because the first thing\n        // might be a regexp.\n        return this.peek(true) === END;\n    },\n\n    get token() {\n        return this.tokens[this.tokenIndex];\n    },\n\n    match: function (tt, scanOperand, keywordIsName) {\n        return this.get(scanOperand, keywordIsName) === tt || this.unget();\n    },\n\n    mustMatch: function (tt, keywordIsName) {\n        if (!this.match(tt, false, keywordIsName)) {\n            throw this.newSyntaxError(\"Missing \" +\n                                      definitions.tokens[tt].toLowerCase());\n        }\n        return this.token;\n    },\n\n    peek: function (scanOperand) {\n        var tt, next;\n        if (this.lookahead) {\n            next = this.tokens[(this.tokenIndex + this.lookahead) & 3];\n            tt = (this.scanNewlines && next.lineno !== this.lineno)\n                ? NEWLINE\n                : next.type;\n        } else {\n            tt = this.get(scanOperand);\n            this.unget();\n        }\n        return tt;\n    },\n\n    peekOnSameLine: function (scanOperand) {\n        this.scanNewlines = true;\n        var tt = this.peek(scanOperand);\n        this.scanNewlines = false;\n        return tt;\n    },\n\n    lastBlockComment: function() {\n        var length = this.blockComments.length;\n        return length ? this.blockComments[length - 1] : null;\n    },\n\n    // Eat comments and whitespace.\n    skip: function () {\n        var input = this.source;\n        this.blockComments = [];\n        for (;;) {\n            var ch = input[this.cursor++];\n            var next = input[this.cursor];\n            // handle \\r, \\r\\n and (always preferable) \\n\n            if (ch === '\\r') {\n                // if the next character is \\n, we don't care about this at all\n                if (next === '\\n') continue;\n\n                // otherwise, we want to consider this as a newline\n                ch = '\\n';\n            }\n\n            if (ch === '\\n' && !this.scanNewlines) {\n                this.lineno++;\n            } else if (ch === '/' && next === '*') {\n                var commentStart = ++this.cursor;\n                for (;;) {\n                    ch = input[this.cursor++];\n                    if (ch === undefined)\n                        throw this.newSyntaxError(\"Unterminated comment\");\n\n                    if (ch === '*') {\n                        next = input[this.cursor];\n                        if (next === '/') {\n                            var commentEnd = this.cursor - 1;\n                            this.cursor++;\n                            break;\n                        }\n                    } else if (ch === '\\n') {\n                        this.lineno++;\n                    }\n                }\n                this.blockComments.push(input.substring(commentStart, commentEnd));\n            } else if ((ch === '/' && next === '/') ||\n                       (this.allowHTMLComments && ch === '<' && next === '!' &&\n                        input[this.cursor + 1] === '-' && input[this.cursor + 2] === '-' &&\n                        (this.cursor += 2))) {\n                this.cursor++;\n                for (;;) {\n                    ch = input[this.cursor++];\n                    next = input[this.cursor];\n                    if (ch === undefined)\n                        return;\n\n                    if (ch === '\\r') {\n                        // check for \\r\\n\n                        if (next !== '\\n') ch = '\\n';\n                    }\n\n                    if (ch === '\\n') {\n                        if (this.scanNewlines) {\n                            this.cursor--;\n                        } else {\n                            this.lineno++;\n                        }\n                        break;\n                    }\n                }\n            } else if (!(ch in definitions.whitespace)) {\n                this.cursor--;\n                return;\n            }\n        }\n    },\n\n    // Lex the exponential part of a number, if present. Return true iff an\n    // exponential part was found.\n    lexExponent: function() {\n        var input = this.source;\n        var next = input[this.cursor];\n        if (next === 'e' || next === 'E') {\n            this.cursor++;\n            ch = input[this.cursor++];\n            if (ch === '+' || ch === '-')\n                ch = input[this.cursor++];\n\n            if (ch < '0' || ch > '9')\n                throw this.newSyntaxError(\"Missing exponent\");\n\n            do {\n                ch = input[this.cursor++];\n            } while (ch >= '0' && ch <= '9');\n            this.cursor--;\n\n            return true;\n        }\n\n        return false;\n    },\n\n    lexZeroNumber: function (ch) {\n        var token = this.token, input = this.source;\n        token.type = NUMBER;\n\n        ch = input[this.cursor++];\n        if (ch === '.') {\n            do {\n                ch = input[this.cursor++];\n            } while (ch >= '0' && ch <= '9');\n            this.cursor--;\n\n            this.lexExponent();\n            token.value = parseFloat(\n                input.substring(token.start, this.cursor));\n        } else if (ch === 'x' || ch === 'X') {\n            do {\n                ch = input[this.cursor++];\n            } while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') ||\n                     (ch >= 'A' && ch <= 'F'));\n            this.cursor--;\n\n            token.value = parseInt(input.substring(token.start, this.cursor));\n        } else if (ch >= '0' && ch <= '7') {\n            do {\n                ch = input[this.cursor++];\n            } while (ch >= '0' && ch <= '7');\n            this.cursor--;\n\n            token.value = parseInt(input.substring(token.start, this.cursor));\n        } else {\n            this.cursor--;\n            this.lexExponent();     // 0E1, &c.\n            token.value = 0;\n        }\n    },\n\n    lexNumber: function (ch) {\n        var token = this.token, input = this.source;\n        token.type = NUMBER;\n\n        var floating = false;\n        do {\n            ch = input[this.cursor++];\n            if (ch === '.' && !floating) {\n                floating = true;\n                ch = input[this.cursor++];\n            }\n        } while (ch >= '0' && ch <= '9');\n\n        this.cursor--;\n\n        var exponent = this.lexExponent();\n        floating = floating || exponent;\n\n        var str = input.substring(token.start, this.cursor);\n        token.value = floating ? parseFloat(str) : parseInt(str);\n    },\n\n    lexDot: function (ch) {\n        var token = this.token, input = this.source;\n        var next = input[this.cursor];\n        if (next >= '0' && next <= '9') {\n            do {\n                ch = input[this.cursor++];\n            } while (ch >= '0' && ch <= '9');\n            this.cursor--;\n\n            this.lexExponent();\n\n            token.type = NUMBER;\n            token.value = parseFloat(\n                input.substring(token.start, this.cursor));\n        } else {\n            token.type = DOT;\n            token.assignOp = null;\n            token.value = '.';\n        }\n    },\n\n    lexString: function (ch) {\n        var token = this.token, input = this.source;\n        token.type = STRING;\n\n        var hasEscapes = false;\n        var delim = ch;\n        if (input.length <= this.cursor)\n            throw this.newSyntaxError(\"Unterminated string literal\");\n        while ((ch = input[this.cursor++]) !== delim) {\n            if (ch == '\\n' || ch == '\\r')\n                throw this.newSyntaxError(\"Unterminated string literal\");\n            if (this.cursor == input.length)\n                throw this.newSyntaxError(\"Unterminated string literal\");\n            if (ch === '\\\\') {\n                hasEscapes = true;\n                if (++this.cursor == input.length)\n                    throw this.newSyntaxError(\"Unterminated string literal\");\n            }\n        }\n\n        token.value = hasEscapes\n            ? eval(input.substring(token.start, this.cursor))\n            : input.substring(token.start + 1, this.cursor - 1);\n    },\n\n    lexRegExp: function (ch) {\n        var token = this.token, input = this.source;\n        token.type = REGEXP;\n\n        do {\n            ch = input[this.cursor++];\n            if (ch === '\\\\') {\n                this.cursor++;\n            } else if (ch === '[') {\n                do {\n                    if (ch === undefined)\n                        throw this.newSyntaxError(\"Unterminated character class\");\n\n                    if (ch === '\\\\')\n                        this.cursor++;\n\n                    ch = input[this.cursor++];\n                } while (ch !== ']');\n            } else if (ch === undefined) {\n                throw this.newSyntaxError(\"Unterminated regex\");\n            }\n        } while (ch !== '/');\n\n        do {\n            ch = input[this.cursor++];\n        } while (ch >= 'a' && ch <= 'z');\n\n        this.cursor--;\n\n        token.value = eval(input.substring(token.start, this.cursor));\n    },\n\n    lexOp: function (ch) {\n        var token = this.token, input = this.source;\n\n        // A bit ugly, but it seems wasteful to write a trie lookup routine\n        // for only 3 characters...\n        var node = opTokens[ch];\n        var next = input[this.cursor];\n        if (next in node) {\n            node = node[next];\n            this.cursor++;\n            next = input[this.cursor];\n            if (next in node) {\n                node = node[next];\n                this.cursor++;\n                next = input[this.cursor];\n            }\n        }\n\n        var op = node.op;\n        if (definitions.assignOps[op] && input[this.cursor] === '=') {\n            this.cursor++;\n            token.type = ASSIGN;\n            token.assignOp = definitions.tokenIds[definitions.opTypeNames[op]];\n            op += '=';\n        } else {\n            token.type = definitions.tokenIds[definitions.opTypeNames[op]];\n            token.assignOp = null;\n        }\n\n        token.value = op;\n    },\n\n    // FIXME: Unicode escape sequences\n    lexIdent: function (ch, keywordIsName) {\n        var token = this.token;\n        var id = ch;\n\n        while ((ch = this.getValidIdentifierChar(false)) !== null) {\n            id += ch;\n        }\n\n        token.type = IDENTIFIER;\n        token.value = id;\n\n        if (keywordIsName)\n            return;\n\n        var kw;\n\n        if (this.parser.mozillaMode) {\n            kw = definitions.mozillaKeywords[id];\n            if (kw) {\n                token.type = kw;\n                return;\n            }\n        }\n\n        if (this.parser.x.strictMode) {\n            kw = definitions.strictKeywords[id];\n            if (kw) {\n                token.type = kw;\n                return;\n            }\n        }\n\n        kw = definitions.keywords[id];\n        if (kw)\n            token.type = kw;\n    },\n\n    /*\n     * Tokenizer.get :: ([boolean[, boolean]]) -> token type\n     *\n     * Consume input *only* if there is no lookahead.\n     * Dispatch to the appropriate lexing function depending on the input.\n     */\n    get: function (scanOperand, keywordIsName) {\n        var token;\n        while (this.lookahead) {\n            --this.lookahead;\n            this.tokenIndex = (this.tokenIndex + 1) & 3;\n            token = this.tokens[this.tokenIndex];\n            if (token.type !== NEWLINE || this.scanNewlines)\n                return token.type;\n        }\n\n        this.skip();\n\n        this.tokenIndex = (this.tokenIndex + 1) & 3;\n        token = this.tokens[this.tokenIndex];\n        if (!token)\n            this.tokens[this.tokenIndex] = token = {};\n\n        var input = this.source;\n        if (this.cursor >= input.length)\n            return token.type = END;\n\n        token.start = this.cursor;\n        token.lineno = this.lineno;\n\n        var ich = this.getValidIdentifierChar(true);\n        var ch = (ich === null) ? input[this.cursor++] : null;\n        if (ich !== null) {\n            this.lexIdent(ich, keywordIsName);\n        } else if (scanOperand && ch === '/') {\n            this.lexRegExp(ch);\n        } else if (ch in opTokens) {\n            this.lexOp(ch);\n        } else if (ch === '.') {\n            this.lexDot(ch);\n        } else if (ch >= '1' && ch <= '9') {\n            this.lexNumber(ch);\n        } else if (ch === '0') {\n            this.lexZeroNumber(ch);\n        } else if (ch === '\"' || ch === \"'\") {\n            this.lexString(ch);\n        } else if (this.scanNewlines && (ch === '\\n' || ch === '\\r')) {\n            // if this was a \\r, look for \\r\\n\n            if (ch === '\\r' && input[this.cursor] === '\\n') this.cursor++;\n            token.type = NEWLINE;\n            token.value = '\\n';\n            this.lineno++;\n        } else {\n            throw this.newSyntaxError(\"Illegal token\");\n        }\n\n        token.end = this.cursor;\n        return token.type;\n    },\n\n    /*\n     * Tokenizer.unget :: void -> undefined\n     *\n     * Match depends on unget returning undefined.\n     */\n    unget: function () {\n        if (++this.lookahead === 4) throw \"PANIC: too much lookahead!\";\n        this.tokenIndex = (this.tokenIndex - 1) & 3;\n    },\n\n    newSyntaxError: function (m) {\n        m = (this.filename ? this.filename + \":\" : \"\") + this.lineno + \": \" + m;\n        var e = new SyntaxError(m, this.filename, this.lineno);\n        e.source = this.source;\n        e.cursor = this.lookahead\n            ? this.tokens[(this.tokenIndex + this.lookahead) & 3].start\n            : this.cursor;\n        return e;\n    },\n\n\n    /* Gets a single valid identifier char from the input stream, or null\n     * if there is none.\n     */\n    getValidIdentifierChar: function(first) {\n        var input = this.source;\n        if (this.cursor >= input.length) return null;\n        var ch = input[this.cursor];\n\n        // first check for \\u escapes\n        if (ch === '\\\\' && input[this.cursor+1] === 'u') {\n            // get the character value\n            try {\n                ch = String.fromCharCode(parseInt(\n                    input.substring(this.cursor + 2, this.cursor + 6),\n                    16));\n            } catch (ex) {\n                return null;\n            }\n            this.cursor += 5;\n        }\n\n        var valid = isValidIdentifierChar(ch, first);\n        if (valid) this.cursor++;\n        return (valid ? ch : null);\n    },\n};\n\n\nexports.isIdentifier = isIdentifier;\nexports.Tokenizer = Tokenizer;\n\n});\n\n/*\n * Narcissus - JS implemented in JS.\n *\n * Well-known constants and lookup tables.  Many consts are generated from the\n * tokens table via eval to minimize redundancy, so consumers must be compiled\n * separately to take advantage of the simple switch-case constant propagation\n * done by SpiderMonkey.\n */\n\ndefine('ace/narcissus/definitions', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nvar tokens = [\n    // End of source.\n    \"END\",\n\n    // Operators and punctuators.  Some pair-wise order matters, e.g. (+, -)\n    // and (UNARY_PLUS, UNARY_MINUS).\n    \"\\n\", \";\",\n    \",\",\n    \"=\",\n    \"?\", \":\", \"CONDITIONAL\",\n    \"||\",\n    \"&&\",\n    \"|\",\n    \"^\",\n    \"&\",\n    \"==\", \"!=\", \"===\", \"!==\",\n    \"<\", \"<=\", \">=\", \">\",\n    \"<<\", \">>\", \">>>\",\n    \"+\", \"-\",\n    \"*\", \"/\", \"%\",\n    \"!\", \"~\", \"UNARY_PLUS\", \"UNARY_MINUS\",\n    \"++\", \"--\",\n    \".\",\n    \"[\", \"]\",\n    \"{\", \"}\",\n    \"(\", \")\",\n\n    // Nonterminal tree node type codes.\n    \"SCRIPT\", \"BLOCK\", \"LABEL\", \"FOR_IN\", \"CALL\", \"NEW_WITH_ARGS\", \"INDEX\",\n    \"ARRAY_INIT\", \"OBJECT_INIT\", \"PROPERTY_INIT\", \"GETTER\", \"SETTER\",\n    \"GROUP\", \"LIST\", \"LET_BLOCK\", \"ARRAY_COMP\", \"GENERATOR\", \"COMP_TAIL\",\n\n    // Contextual keywords.\n    \"IMPLEMENTS\", \"INTERFACE\", \"LET\", \"MODULE\", \"PACKAGE\", \"PRIVATE\",\n    \"PROTECTED\", \"PUBLIC\", \"STATIC\", \"USE\", \"YIELD\",\n\n    // Terminals.\n    \"IDENTIFIER\", \"NUMBER\", \"STRING\", \"REGEXP\",\n\n    // Keywords.\n    \"break\",\n    \"case\", \"catch\", \"const\", \"continue\",\n    \"debugger\", \"default\", \"delete\", \"do\",\n    \"else\", \"export\",\n    \"false\", \"finally\", \"for\", \"function\",\n    \"if\", \"import\", \"in\", \"instanceof\",\n    \"new\", \"null\",\n    \"return\",\n    \"switch\",\n    \"this\", \"throw\", \"true\", \"try\", \"typeof\",\n    \"var\", \"void\",\n    \"while\", \"with\",\n];\n\nvar strictKeywords = {\n    __proto__: null,\n    \"implements\": true,\n    \"interface\": true,\n    \"let\": true,\n    //\"module\": true,\n    \"package\": true,\n    \"private\": true,\n    \"protected\": true,\n    \"public\": true,\n    \"static\": true,\n    \"use\": true,\n    \"yield\": true\n};\n\nvar statementStartTokens = [\n    \"break\",\n    \"const\", \"continue\",\n    \"debugger\", \"do\",\n    \"for\",\n    \"if\",\n    \"let\",\n    \"return\",\n    \"switch\",\n    \"throw\", \"try\",\n    \"var\",\n    \"yield\",\n    \"while\", \"with\",\n];\n\n// Whitespace characters (see ECMA-262 7.2)\nvar whitespaceChars = [\n    // normal whitespace:\n    \"\\u0009\", \"\\u000B\", \"\\u000C\", \"\\u0020\", \"\\u00A0\", \"\\uFEFF\",\n\n    // high-Unicode whitespace:\n    \"\\u1680\", \"\\u180E\",\n    \"\\u2000\", \"\\u2001\", \"\\u2002\", \"\\u2003\", \"\\u2004\", \"\\u2005\", \"\\u2006\",\n    \"\\u2007\", \"\\u2008\", \"\\u2009\", \"\\u200A\",\n    \"\\u202F\", \"\\u205F\", \"\\u3000\"\n];\n\nvar whitespace = {};\nfor (var i = 0; i < whitespaceChars.length; i++) {\n    whitespace[whitespaceChars[i]] = true;\n}\n\n// Operator and punctuator mapping from token to tree node type name.\n// NB: because the lexer doesn't backtrack, all token prefixes must themselves\n// be valid tokens (e.g. !== is acceptable because its prefixes are the valid\n// tokens != and !).\nvar opTypeNames = {\n    '\\n':   \"NEWLINE\",\n    ';':    \"SEMICOLON\",\n    ',':    \"COMMA\",\n    '?':    \"HOOK\",\n    ':':    \"COLON\",\n    '||':   \"OR\",\n    '&&':   \"AND\",\n    '|':    \"BITWISE_OR\",\n    '^':    \"BITWISE_XOR\",\n    '&':    \"BITWISE_AND\",\n    '===':  \"STRICT_EQ\",\n    '==':   \"EQ\",\n    '=':    \"ASSIGN\",\n    '!==':  \"STRICT_NE\",\n    '!=':   \"NE\",\n    '<<':   \"LSH\",\n    '<=':   \"LE\",\n    '<':    \"LT\",\n    '>>>':  \"URSH\",\n    '>>':   \"RSH\",\n    '>=':   \"GE\",\n    '>':    \"GT\",\n    '++':   \"INCREMENT\",\n    '--':   \"DECREMENT\",\n    '+':    \"PLUS\",\n    '-':    \"MINUS\",\n    '*':    \"MUL\",\n    '/':    \"DIV\",\n    '%':    \"MOD\",\n    '!':    \"NOT\",\n    '~':    \"BITWISE_NOT\",\n    '.':    \"DOT\",\n    '[':    \"LEFT_BRACKET\",\n    ']':    \"RIGHT_BRACKET\",\n    '{':    \"LEFT_CURLY\",\n    '}':    \"RIGHT_CURLY\",\n    '(':    \"LEFT_PAREN\",\n    ')':    \"RIGHT_PAREN\"\n};\n\n// Hash of keyword identifier to tokens index.  NB: we must null __proto__ to\n// avoid toString, etc. namespace pollution.\nvar keywords = {__proto__: null};\nvar mozillaKeywords = {__proto__: null};\n\n// Define const END, etc., based on the token names.  Also map name to index.\nvar tokenIds = {};\n\nvar hostSupportsEvalConst = (function() {\n    try {\n        return eval(\"(function(s) { eval(s); return x })('const x = true;')\");\n    } catch (e) {\n        return false;\n    }\n})();\n\n// Building up a string to be eval'd in different contexts.\nvar consts = hostSupportsEvalConst ? \"const \" : \"var \";\nfor (var i = 0, j = tokens.length; i < j; i++) {\n    if (i > 0)\n        consts += \", \";\n    var t = tokens[i];\n    var name;\n    if (/^[a-z]/.test(t)) {\n        name = t.toUpperCase();\n        if (name === \"LET\" || name === \"YIELD\")\n            mozillaKeywords[name] = i;\n        if (strictKeywords[name])\n            strictKeywords[name] = i;\n        keywords[t] = i;\n    } else {\n        name = (/^\\W/.test(t) ? opTypeNames[t] : t);\n    }\n    consts += name + \" = \" + i;\n    tokenIds[name] = i;\n    tokens[t] = i;\n}\nconsts += \";\";\n\nvar isStatementStartCode = {__proto__: null};\nfor (i = 0, j = statementStartTokens.length; i < j; i++)\n    isStatementStartCode[keywords[statementStartTokens[i]]] = true;\n\n// Map assignment operators to their indexes in the tokens array.\nvar assignOps = ['|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%'];\n\nfor (i = 0, j = assignOps.length; i < j; i++) {\n    t = assignOps[i];\n    assignOps[t] = tokens[t];\n}\n\nfunction defineGetter(obj, prop, fn, dontDelete, dontEnum) {\n    Object.defineProperty(obj, prop,\n                          { get: fn, configurable: !dontDelete, enumerable: !dontEnum });\n}\n\nfunction defineGetterSetter(obj, prop, getter, setter, dontDelete, dontEnum) {\n    Object.defineProperty(obj, prop, {\n        get: getter,\n        set: setter,\n        configurable: !dontDelete,\n        enumerable: !dontEnum\n    });\n}\n\nfunction defineMemoGetter(obj, prop, fn, dontDelete, dontEnum) {\n    Object.defineProperty(obj, prop, {\n        get: function() {\n            var val = fn();\n            defineProperty(obj, prop, val, dontDelete, true, dontEnum);\n            return val;\n        },\n        configurable: true,\n        enumerable: !dontEnum\n    });\n}\n\nfunction defineProperty(obj, prop, val, dontDelete, readOnly, dontEnum) {\n    Object.defineProperty(obj, prop,\n                          { value: val, writable: !readOnly, configurable: !dontDelete,\n                            enumerable: !dontEnum });\n}\n\n// Returns true if fn is a native function.  (Note: SpiderMonkey specific.)\nfunction isNativeCode(fn) {\n    // Relies on the toString method to identify native code.\n    return ((typeof fn) === \"function\") && fn.toString().match(/\\[native code\\]/);\n}\n\nvar Fpapply = Function.prototype.apply;\n\nfunction apply(f, o, a) {\n    return Fpapply.call(f, [o].concat(a));\n}\n\nvar applyNew;\n\n// ES5's bind is a simpler way to implement applyNew\nif (Function.prototype.bind) {\n    applyNew = function applyNew(f, a) {\n        return new (f.bind.apply(f, [,].concat(Array.prototype.slice.call(a))))();\n    };\n} else {\n    applyNew = function applyNew(f, a) {\n        switch (a.length) {\n          case 0:\n            return new f();\n          case 1:\n            return new f(a[0]);\n          case 2:\n            return new f(a[0], a[1]);\n          case 3:\n            return new f(a[0], a[1], a[2]);\n          default:\n            var argStr = \"a[0]\";\n            for (var i = 1, n = a.length; i < n; i++)\n                argStr += \",a[\" + i + \"]\";\n            return eval(\"new f(\" + argStr + \")\");\n        }\n    };\n}\n\nfunction getPropertyDescriptor(obj, name) {\n    while (obj) {\n        if (({}).hasOwnProperty.call(obj, name))\n            return Object.getOwnPropertyDescriptor(obj, name);\n        obj = Object.getPrototypeOf(obj);\n    }\n}\n\nfunction getPropertyNames(obj) {\n    var table = Object.create(null, {});\n    while (obj) {\n        var names = Object.getOwnPropertyNames(obj);\n        for (var i = 0, n = names.length; i < n; i++)\n            table[names[i]] = true;\n        obj = Object.getPrototypeOf(obj);\n    }\n    return Object.keys(table);\n}\n\nfunction getOwnProperties(obj) {\n    var map = {};\n    for (var name in Object.getOwnPropertyNames(obj))\n        map[name] = Object.getOwnPropertyDescriptor(obj, name);\n    return map;\n}\n\nfunction blacklistHandler(target, blacklist) {\n    var mask = Object.create(null, {});\n    var redirect = Dict.create(blacklist).mapObject(function(name) { return mask; });\n    return mixinHandler(redirect, target);\n}\n\nfunction whitelistHandler(target, whitelist) {\n    var catchall = Object.create(null, {});\n    var redirect = Dict.create(whitelist).mapObject(function(name) { return target; });\n    return mixinHandler(redirect, catchall);\n}\n\n/*\n * Mixin proxies break the single-inheritance model of prototypes, so\n * the handler treats all properties as own-properties:\n *\n *                  X\n *                  |\n *     +------------+------------+\n *     |                 O       |\n *     |                 |       |\n *     |  O         O    O       |\n *     |  |         |    |       |\n *     |  O    O    O    O       |\n *     |  |    |    |    |       |\n *     |  O    O    O    O    O  |\n *     |  |    |    |    |    |  |\n *     +-(*)--(w)--(x)--(y)--(z)-+\n */\n\nfunction mixinHandler(redirect, catchall) {\n    function targetFor(name) {\n        return hasOwn(redirect, name) ? redirect[name] : catchall;\n    }\n\n    function getMuxPropertyDescriptor(name) {\n        var desc = getPropertyDescriptor(targetFor(name), name);\n        if (desc)\n            desc.configurable = true;\n        return desc;\n    }\n\n    function getMuxPropertyNames() {\n        var names1 = Object.getOwnPropertyNames(redirect).filter(function(name) {\n            return name in redirect[name];\n        });\n        var names2 = getPropertyNames(catchall).filter(function(name) {\n            return !hasOwn(redirect, name);\n        });\n        return names1.concat(names2);\n    }\n\n    function enumerateMux() {\n        var result = Object.getOwnPropertyNames(redirect).filter(function(name) {\n            return name in redirect[name];\n        });\n        for (name in catchall) {\n            if (!hasOwn(redirect, name))\n                result.push(name);\n        };\n        return result;\n    }\n\n    function hasMux(name) {\n        return name in targetFor(name);\n    }\n\n    return {\n        getOwnPropertyDescriptor: getMuxPropertyDescriptor,\n        getPropertyDescriptor: getMuxPropertyDescriptor,\n        getOwnPropertyNames: getMuxPropertyNames,\n        defineProperty: function(name, desc) {\n            Object.defineProperty(targetFor(name), name, desc);\n        },\n        \"delete\": function(name) {\n            var target = targetFor(name);\n            return delete target[name];\n        },\n        // FIXME: ha ha ha\n        fix: function() { },\n        has: hasMux,\n        hasOwn: hasMux,\n        get: function(receiver, name) {\n            var target = targetFor(name);\n            return target[name];\n        },\n        set: function(receiver, name, val) {\n            var target = targetFor(name);\n            target[name] = val;\n            return true;\n        },\n        enumerate: enumerateMux,\n        keys: enumerateMux\n    };\n}\n\nfunction makePassthruHandler(obj) {\n    // Handler copied from\n    // http://wiki.ecmascript.org/doku.php?id=harmony:proxies&s=proxy%20object#examplea_no-op_forwarding_proxy\n    return {\n        getOwnPropertyDescriptor: function(name) {\n            var desc = Object.getOwnPropertyDescriptor(obj, name);\n\n            // a trapping proxy's properties must always be configurable\n            desc.configurable = true;\n            return desc;\n        },\n        getPropertyDescriptor: function(name) {\n            var desc = getPropertyDescriptor(obj, name);\n\n            // a trapping proxy's properties must always be configurable\n            desc.configurable = true;\n            return desc;\n        },\n        getOwnPropertyNames: function() {\n            return Object.getOwnPropertyNames(obj);\n        },\n        defineProperty: function(name, desc) {\n            Object.defineProperty(obj, name, desc);\n        },\n        \"delete\": function(name) { return delete obj[name]; },\n        fix: function() {\n            if (Object.isFrozen(obj)) {\n                return getOwnProperties(obj);\n            }\n\n            // As long as obj is not frozen, the proxy won't allow itself to be fixed.\n            return undefined; // will cause a TypeError to be thrown\n        },\n\n        has: function(name) { return name in obj; },\n        hasOwn: function(name) { return ({}).hasOwnProperty.call(obj, name); },\n        get: function(receiver, name) { return obj[name]; },\n\n        // bad behavior when set fails in non-strict mode\n        set: function(receiver, name, val) { obj[name] = val; return true; },\n        enumerate: function() {\n            var result = [];\n            for (name in obj) { result.push(name); };\n            return result;\n        },\n        keys: function() { return Object.keys(obj); }\n    };\n}\n\nvar hasOwnProperty = ({}).hasOwnProperty;\n\nfunction hasOwn(obj, name) {\n    return hasOwnProperty.call(obj, name);\n}\n\nfunction Dict(table, size) {\n    this.table = table || Object.create(null, {});\n    this.size = size || 0;\n}\n\nDict.create = function(table) {\n    var init = Object.create(null, {});\n    var size = 0;\n    var names = Object.getOwnPropertyNames(table);\n    for (var i = 0, n = names.length; i < n; i++) {\n        var name = names[i];\n        init[name] = table[name];\n        size++;\n    }\n    return new Dict(init, size);\n};\n\nDict.prototype = {\n    has: function(x) { return hasOwnProperty.call(this.table, x); },\n    set: function(x, v) {\n        if (!hasOwnProperty.call(this.table, x))\n            this.size++;\n        this.table[x] = v;\n    },\n    get: function(x) { return this.table[x]; },\n    getDef: function(x, thunk) {\n        if (!hasOwnProperty.call(this.table, x)) {\n            this.size++;\n            this.table[x] = thunk();\n        }\n        return this.table[x];\n    },\n    forEach: function(f) {\n        var table = this.table;\n        for (var key in table)\n            f.call(this, key, table[key]);\n    },\n    map: function(f) {\n        var table1 = this.table;\n        var table2 = Object.create(null, {});\n        this.forEach(function(key, val) {\n            table2[key] = f.call(this, val, key);\n        });\n        return new Dict(table2, this.size);\n    },\n    mapObject: function(f) {\n        var table1 = this.table;\n        var table2 = Object.create(null, {});\n        this.forEach(function(key, val) {\n            table2[key] = f.call(this, val, key);\n        });\n        return table2;\n    },\n    toObject: function() {\n        return this.mapObject(function(val) { return val; });\n    },\n    choose: function() {\n        return Object.getOwnPropertyNames(this.table)[0];\n    },\n    remove: function(x) {\n        if (hasOwnProperty.call(this.table, x)) {\n            this.size--;\n            delete this.table[x];\n        }\n    },\n    copy: function() {\n        var table = Object.create(null, {});\n        for (var key in this.table)\n            table[key] = this.table[key];\n        return new Dict(table, this.size);\n    },\n    keys: function() {\n        return Object.keys(this.table);\n    },\n    toString: function() { return \"[object Dict]\" }\n};\n\nvar _WeakMap = typeof WeakMap === \"function\" ? WeakMap : (function() {\n    // shim for ES6 WeakMap with poor asymptotics\n    function WeakMap(array) {\n        this.array = array || [];\n    }\n\n    function searchMap(map, key, found, notFound) {\n        var a = map.array;\n        for (var i = 0, n = a.length; i < n; i++) {\n            var pair = a[i];\n            if (pair.key === key)\n                return found(pair, i);\n        }\n        return notFound();\n    }\n\n    WeakMap.prototype = {\n        has: function(x) {\n            return searchMap(this, x, function() { return true }, function() { return false });\n        },\n        set: function(x, v) {\n            var a = this.array;\n            searchMap(this, x,\n                      function(pair) { pair.value = v },\n                      function() { a.push({ key: x, value: v }) });\n        },\n        get: function(x) {\n            return searchMap(this, x,\n                             function(pair) { return pair.value },\n                             function() { return null });\n        },\n        \"delete\": function(x) {\n            var a = this.array;\n            searchMap(this, x,\n                      function(pair, i) { a.splice(i, 1) },\n                      function() { });\n        },\n        toString: function() { return \"[object WeakMap]\" }\n    };\n\n    return WeakMap;\n})();\n\n// non-destructive stack\nfunction Stack(elts) {\n    this.elts = elts || null;\n}\n\nStack.prototype = {\n    push: function(x) {\n        return new Stack({ top: x, rest: this.elts });\n    },\n    top: function() {\n        if (!this.elts)\n            throw new Error(\"empty stack\");\n        return this.elts.top;\n    },\n    isEmpty: function() {\n        return this.top === null;\n    },\n    find: function(test) {\n        for (var elts = this.elts; elts; elts = elts.rest) {\n            if (test(elts.top))\n                return elts.top;\n        }\n        return null;\n    },\n    has: function(x) {\n        return Boolean(this.find(function(elt) { return elt === x }));\n    },\n    forEach: function(f) {\n        for (var elts = this.elts; elts; elts = elts.rest) {\n            f(elts.top);\n        }\n    }\n};\n\nif (!Array.prototype.copy) {\n    defineProperty(Array.prototype, \"copy\",\n                   function() {\n                       var result = [];\n                       for (var i = 0, n = this.length; i < n; i++)\n                           result[i] = this[i];\n                       return result;\n                   }, false, false, true);\n}\n\nif (!Array.prototype.top) {\n    defineProperty(Array.prototype, \"top\",\n                   function() {\n                       return this.length && this[this.length-1];\n                   }, false, false, true);\n}\n\nexports.tokens = tokens;\nexports.whitespace = whitespace;\nexports.opTypeNames = opTypeNames;\nexports.keywords = keywords;\nexports.mozillaKeywords = mozillaKeywords;\nexports.strictKeywords = strictKeywords;\nexports.isStatementStartCode = isStatementStartCode;\nexports.tokenIds = tokenIds;\nexports.consts = consts;\nexports.assignOps = assignOps;\nexports.defineGetter = defineGetter;\nexports.defineGetterSetter = defineGetterSetter;\nexports.defineMemoGetter = defineMemoGetter;\nexports.defineProperty = defineProperty;\nexports.isNativeCode = isNativeCode;\nexports.apply = apply;\nexports.applyNew = applyNew;\nexports.mixinHandler = mixinHandler;\nexports.whitelistHandler = whitelistHandler;\nexports.blacklistHandler = blacklistHandler;\nexports.makePassthruHandler = makePassthruHandler;\nexports.Dict = Dict;\nexports.WeakMap = _WeakMap;\nexports.Stack = Stack;\n\n});\n\ndefine('ace/narcissus/options', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n// Global variables to hide from the interpreter\nexports.hiddenHostGlobals = { Narcissus: true };\n\n// Desugar SpiderMonkey language extensions?\nexports.desugarExtensions = false;\n\n// Allow HTML comments?\nexports.allowHTMLComments = false;\n\n// Allow non-standard Mozilla extensions?\nexports.mozillaMode = true;\n\n// Allow experimental paren-free mode?\nexports.parenFreeMode = false;\n\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/worker-json.js",
    "content": "\"no use strict\";\n\nvar console = {\n    log: function(msgs) {\n        postMessage({type: \"log\", data: arguments.join(\" \")});\n    }\n};\nvar window = {\n    console: console\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        var moduleName = base + \"/\" + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            var moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nvar require = function(parentId, id) {\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    var id = normalizeModule(parentId, id);\n    \n    var module = require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    require.id = id;\n    importScripts(path);\n    return require(parentId, id);    \n};\n\nrequire.modules = {};\nrequire.tlns = {};\n\nvar define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        id = require.id;\n    }\n\n    if (id.indexOf(\"text!\") === 0) \n        return;\n    \n    var req = function(deps, factory) {\n        return require(id, deps, factory);\n    };\n\n    require.modules[id] = {\n        factory: function() {\n            var module = {\n                exports: {}\n            };\n            var returnExports = factory(req, module.exports, module);\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\n\nfunction initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n}\n\nfunction initSender() {\n\n    var EventEmitter = require(null, \"ace/lib/event_emitter\").EventEmitter;\n    var oop = require(null, \"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n}\n\nvar main;\nvar sender;\n\nonmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        main[msg.command].apply(main, msg.args);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(null, \"ace/lib/fixoldbrowsers\");\n        sender = initSender();\n        var clazz = require(null, msg.module)[msg.classname];\n        main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._emit(msg.event, msg.data);\n    }\n};\n// vim:set ts=4 sts=4 sw=4 st:\n// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright(C) 2010 XXX No License Specified\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Irakli Gozalishvili Copyright (C) 2010 MIT License\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n \ndefine('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n\n    //---------------------------------\n    //  Overriden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n\n    // Don't override `test` if it won't change anything\n    if (!compliantLastIndexIncrement) {\n        // Fix browser bug in native method\n        RegExp.prototype.test = function (str) {\n            // Use the native `exec` to skip some processing overhead, even though the overriden\n            // `exec` would take care of the `lastIndex` fix\n            var match = real.exec.call(this, str);\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n// vim: ts=4 sts=4 sw=4 expandtab\n// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License\n// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License\n// -- kossnocorp Sasha Koss XXX TODO License or CLA\n// -- bryanforbes Bryan Forbes XXX TODO License or CLA\n// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence\n// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License\n// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License\n// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain)\n// -- iwyg XXX TODO License or CLA\n// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License\n// -- xavierm02 Montillet Xavier XXX TODO License or CLA\n// -- Raynos Raynos XXX TODO License or CLA\n// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License\n// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License\n// -- lexer Alexey Zakharov XXX TODO License or CLA\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n/*\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: http://es5.github.com/ (specific links below)\n * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n *\n * @module\n */\n\n/*whatsupdoc*/\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        // 1. Let Target be the this value.\n        var target = this;\n        // 2. If IsCallable(Target) is false, throw a TypeError exception.\n        if (typeof target != \"function\")\n            throw new TypeError(); // TODO message\n        // 3. Let A be a new (possibly empty) internal list of all of the\n        //   argument values provided after thisArg (arg1, arg2 etc), in order.\n        // XXX slicedArgs will stand in for \"A\" if used\n        var args = slice.call(arguments, 1); // for normal call\n        // 4. Let F be a new native ECMAScript object.\n        // 11. Set the [[Prototype]] internal property of F to the standard\n        //   built-in Function prototype object as specified in 15.3.3.1.\n        // 12. Set the [[Call]] internal property of F as described in\n        //   15.3.4.5.1.\n        // 13. Set the [[Construct]] internal property of F as described in\n        //   15.3.4.5.2.\n        // 14. Set the [[HasInstance]] internal property of F as described in\n        //   15.3.4.5.3.\n        var bound = function () {\n\n            if (this instanceof bound) {\n                // 15.3.4.5.2 [[Construct]]\n                // When the [[Construct]] internal method of a function object,\n                // F that was created using the bind function is called with a\n                // list of arguments ExtraArgs, the following steps are taken:\n                // 1. Let target be the value of F's [[TargetFunction]]\n                //   internal property.\n                // 2. If target has no [[Construct]] internal method, a\n                //   TypeError exception is thrown.\n                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Construct]] internal \n                //   method of target providing args as the arguments.\n\n                var F = function(){};\n                F.prototype = target.prototype;\n                var self = new F;\n\n                var result = target.apply(\n                    self,\n                    args.concat(slice.call(arguments))\n                );\n                if (result !== null && Object(result) === result)\n                    return result;\n                return self;\n\n            } else {\n                // 15.3.4.5.1 [[Call]]\n                // When the [[Call]] internal method of a function object, F,\n                // which was created using the bind function is called with a\n                // this value and a list of arguments ExtraArgs, the following\n                // steps are taken:\n                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                //   property.\n                // 3. Let target be the value of F's [[TargetFunction]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the \n                //   list boundArgs in the same order followed by the same \n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Call]] internal method \n                //   of target providing boundThis as the this value and \n                //   providing args as the arguments.\n\n                // equiv: target.call(this, ...boundArgs, ...args)\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        // XXX bound.length is never writable, so don't even try\n        //\n        // 15. If the [[Class]] internal property of Target is \"Function\", then\n        //     a. Let L be the length property of Target minus the length of A.\n        //     b. Set the length own property of F to either 0 or L, whichever is \n        //       larger.\n        // 16. Else set the length own property of F to 0.\n        // 17. Set the attributes of the length own property of F to the values\n        //   specified in 15.3.5.1.\n\n        // TODO\n        // 18. Set the [[Extensible]] internal property of F to true.\n        \n        // TODO\n        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n        // 20. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and \n        //   false.\n        // 21. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower, \n        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n        //   and false.\n\n        // TODO\n        // NOTE Function objects created using Function.prototype.bind do not \n        // have a prototype property or the [[Code]], [[FormalParameters]], and\n        // [[Scope]] internal properties.\n        // XXX can't delete prototype in pure-js.\n\n        // 22. Return F.\n        return bound;\n    };\n}\n\n// Shortcut to an often accessed properties, in order to avoid multiple\n// dereference that costs universally.\n// _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n// us it in defining shortcuts.\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\n\n// If JS engine supports accessors creating shortcuts.\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\n\n//\n// Array\n// =====\n//\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return toString(obj) == \"[object Array]\";\n    };\n}\n\n// The IsCallable() check in the Array functions\n// has been replaced with a strict check on the\n// internal class of the object to trap cases where\n// the provided function was actually a regular\n// expression literal, which in V8 and\n// JavaScriptCore is a typeof \"function\".  Only in\n// V8 are regular expression literals permitted as\n// reduce parameters, so it is desirable in the\n// general case for the shim to match the more\n// strict and common behavior of rejecting regular\n// expressions.\n\n// ES5 15.4.4.18\n// http://es5.github.com/#x15.4.4.18\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var self = toObject(this),\n            thisp = arguments[1],\n            i = 0,\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (i < length) {\n            if (i in self) {\n                // Invoke the callback function with call, passing arguments:\n                // context, property value, property key, thisArg object context\n                fun.call(thisp, self[i], i, self);\n            }\n            i++;\n        }\n    };\n}\n\n// ES5 15.4.4.19\n// http://es5.github.com/#x15.4.4.19\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, self);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.20\n// http://es5.github.com/#x15.4.4.20\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = [],\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                result.push(self[i]);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.16\n// http://es5.github.com/#x15.4.4.16\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, self))\n                return false;\n        }\n        return true;\n    };\n}\n\n// ES5 15.4.4.17\n// http://es5.github.com/#x15.4.4.17\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                return true;\n        }\n        return false;\n    };\n}\n\n// ES5 15.4.4.21\n// http://es5.github.com/#x15.4.4.21\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value and an empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (++i >= length)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self)\n                result = fun.call(void 0, result, self[i], i, self);\n        }\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.22\n// http://es5.github.com/#x15.4.4.22\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value, empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (--i < 0)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        do {\n            if (i in this)\n                result = fun.call(void 0, result, self[i], i, self);\n        } while (i--);\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n\n        var i = 0;\n        if (arguments.length > 1)\n            i = toInteger(arguments[1]);\n\n        // handle negative indices\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\n// ES5 15.4.4.15\n// http://es5.github.com/#x15.4.4.15\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\nif (!Array.prototype.lastIndexOf) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n        var i = length - 1;\n        if (arguments.length > 1)\n            i = Math.min(i, toInteger(arguments[1]));\n        // handle negative indices\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i])\n                return i;\n        }\n        return -1;\n    };\n}\n\n//\n// Object\n// ======\n//\n\n// ES5 15.2.3.2\n// http://es5.github.com/#x15.2.3.2\nif (!Object.getPrototypeOf) {\n    // https://github.com/kriskowal/es5-shim/issues#issue/2\n    // http://ejohn.org/blog/objectgetprototypeof/\n    // recommended by fschaefer on github\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\n\n// ES5 15.2.3.3\n// http://es5.github.com/#x15.2.3.3\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        // If object does not owns property return undefined immediately.\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n\n        // If object has a property then it's for sure both `enumerable` and\n        // `configurable`.\n        descriptor =  { enumerable: true, configurable: true };\n\n        // If JS engine supports accessor properties then property may be a\n        // getter or setter.\n        if (supportsAccessors) {\n            // Unfortunately `__lookupGetter__` will return a getter even\n            // if object has own non getter property along with a same named\n            // inherited getter. To avoid misbehavior we temporary remove\n            // `__proto__` so that `__lookupGetter__` will return getter only\n            // if it's owned by an object.\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n\n            // Once we have getter and setter we can put values back.\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n\n                // If it was accessor property we're done and return here\n                // in order to avoid adding `value` to the descriptor.\n                return descriptor;\n            }\n        }\n\n        // If we got this far we know that object has an own property that is\n        // not an accessor so we set it as a value and return descriptor.\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\n\n// ES5 15.2.3.4\n// http://es5.github.com/#x15.2.3.4\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\n\n// ES5 15.2.3.5\n// http://es5.github.com/#x15.2.3.5\nif (!Object.create) {\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = { \"__proto__\": null };\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            // IE has no built-in implementation of `Object.getPrototypeOf`\n            // neither `__proto__`, but this manually setting `__proto__` will\n            // guarantee that `Object.getPrototypeOf` will work as expected with\n            // objects created using `Object.create`\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\n// ES5 15.2.3.6\n// http://es5.github.com/#x15.2.3.6\n\n// Patch for WebKit and IE8 standard mode\n// Designed by hax <hax.github.com>\n// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5\n// IE8 Reference:\n//     http://msdn.microsoft.com/en-us/library/dd282900.aspx\n//     http://msdn.microsoft.com/en-us/library/dd229916.aspx\n// WebKit Bugs:\n//     https://bugs.webkit.org/show_bug.cgi?id=36423\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n        // returns falsy\n    }\n}\n\n// check whether defineProperty works if it's given. Otherwise,\n// shim partially.\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n\n        // make a valiant attempt to use the real defineProperty\n        // for I8's DOM elements.\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n                // try the shim if the real one doesn't work\n            }\n        }\n\n        // If it's a data property.\n        if (owns(descriptor, \"value\")) {\n            // fail silently if \"writable\", \"enumerable\", or \"configurable\"\n            // are requested but not supported\n            /*\n            // alternate approach:\n            if ( // can't implement these features; allow false but not true\n                !(owns(descriptor, \"writable\") ? descriptor.writable : true) ||\n                !(owns(descriptor, \"enumerable\") ? descriptor.enumerable : true) ||\n                !(owns(descriptor, \"configurable\") ? descriptor.configurable : true)\n            )\n                throw new RangeError(\n                    \"This implementation of Object.defineProperty does not \" +\n                    \"support configurable, enumerable, or writable.\"\n                );\n            */\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                // As accessors are supported only on engines implementing\n                // `__proto__` we can safely override `__proto__` while defining\n                // a property to make sure that we don't hit an inherited\n                // accessor.\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                // Deleting a property anyway since getter / setter may be\n                // defined on object itself.\n                delete object[property];\n                object[property] = descriptor.value;\n                // Setting original `__proto__` back now.\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            // If we got that far then getters and setters can be defined !!\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\n\n// ES5 15.2.3.7\n// http://es5.github.com/#x15.2.3.7\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\n\n// ES5 15.2.3.8\n// http://es5.github.com/#x15.2.3.8\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.9\n// http://es5.github.com/#x15.2.3.9\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// detect a Rhino bug and patch it\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\n\n// ES5 15.2.3.10\n// http://es5.github.com/#x15.2.3.10\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.11\n// http://es5.github.com/#x15.2.3.11\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.12\n// http://es5.github.com/#x15.2.3.12\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.13\n// http://es5.github.com/#x15.2.3.13\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        // 1. If Type(O) is not Object throw a TypeError exception.\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        // 2. Return the Boolean value of the [[Extensible]] internal property of O.\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\n\n// ES5 15.2.3.14\n// http://es5.github.com/#x15.2.3.14\nif (!Object.keys) {\n    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null})\n        hasDontEnumBug = false;\n\n    Object.keys = function keys(object) {\n\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(\"Object.keys called on a non-object\");\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n\n        return keys;\n    };\n\n}\n\n//\n// Date\n// ====\n//\n\n// ES5 15.9.5.43\n// http://es5.github.com/#x15.9.5.43\n// This function returns a String value represent the instance in time \n// represented by this Date object. The format of the String is the Date Time \n// string format defined in 15.9.1.15. All fields are present in the String. \n// The time zone is always UTC, denoted by the suffix Z. If the time value of \n// this object is not a finite Number a RangeError exception is thrown.\nif (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) {\n    Date.prototype.toISOString = function toISOString() {\n        var result, length, value, year;\n        if (!isFinite(this))\n            throw new RangeError;\n\n        // the date time string format is specified in 15.9.1.15.\n        result = [this.getUTCMonth() + 1, this.getUTCDate(),\n            this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];\n        year = this.getUTCFullYear();\n        year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6);\n\n        length = result.length;\n        while (length--) {\n            value = result[length];\n            // pad months, days, hours, minutes, and seconds to have two digits.\n            if (value < 10)\n                result[length] = \"0\" + value;\n        }\n        // pad milliseconds to have three digits.\n        return year + \"-\" + result.slice(0, 2).join(\"-\") + \"T\" + result.slice(2).join(\":\") + \".\" +\n            (\"000\" + this.getUTCMilliseconds()).slice(-3) + \"Z\";\n    }\n}\n\n// ES5 15.9.4.4\n// http://es5.github.com/#x15.9.4.4\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\n\n// ES5 15.9.5.44\n// http://es5.github.com/#x15.9.5.44\n// This function provides a String representation of a Date object for use by \n// JSON.stringify (15.12.3).\nif (!Date.prototype.toJSON) {\n    Date.prototype.toJSON = function toJSON(key) {\n        // When the toJSON method is called with argument key, the following \n        // steps are taken:\n\n        // 1.  Let O be the result of calling ToObject, giving it the this\n        // value as its argument.\n        // 2. Let tv be ToPrimitive(O, hint Number).\n        // 3. If tv is a Number and is not finite, return null.\n        // XXX\n        // 4. Let toISO be the result of calling the [[Get]] internal method of\n        // O with argument \"toISOString\".\n        // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n        if (typeof this.toISOString != \"function\")\n            throw new TypeError(); // TODO message\n        // 6. Return the result of calling the [[Call]] internal method of\n        //  toISO with O as the this value and an empty argument list.\n        return this.toISOString();\n\n        // NOTE 1 The argument is ignored.\n\n        // NOTE 2 The toJSON function is intentionally generic; it does not\n        // require that its this value be a Date object. Therefore, it can be\n        // transferred to other kinds of objects for use as a method. However,\n        // it does require that any such object have a toISOString method. An\n        // object is free to use the argument key to filter its\n        // stringification.\n    };\n}\n\n// ES5 15.9.4.2\n// http://es5.github.com/#x15.9.4.2\n// based on work shared by Daniel Friesen (dantman)\n// http://gist.github.com/303249\nif (Date.parse(\"+275760-09-13T00:00:00.000Z\") !== 8.64e15) {\n    // XXX global assignment won't work in embeddings that use\n    // an alternate object for the context.\n    Date = (function(NativeDate) {\n\n        // Date.length === 7\n        var Date = function Date(Y, M, D, h, m, s, ms) {\n            var length = arguments.length;\n            if (this instanceof NativeDate) {\n                var date = length == 1 && String(Y) === Y ? // isString(Y)\n                    // We explicitly pass it through parse:\n                    new NativeDate(Date.parse(Y)) :\n                    // We have to manually make calls depending on argument\n                    // length here\n                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\n                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\n                    length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                    length >= 4 ? new NativeDate(Y, M, D, h) :\n                    length >= 3 ? new NativeDate(Y, M, D) :\n                    length >= 2 ? new NativeDate(Y, M) :\n                    length >= 1 ? new NativeDate(Y) :\n                                  new NativeDate();\n                // Prevent mixups with unfixed Date object\n                date.constructor = Date;\n                return date;\n            }\n            return NativeDate.apply(this, arguments);\n        };\n\n        // 15.9.1.15 Date Time String Format.\n        var isoDateExpression = new RegExp(\"^\" +\n            \"(\\\\d{4}|[\\+\\-]\\\\d{6})\" + // four-digit year capture or sign + 6-digit extended year\n            \"(?:-(\\\\d{2})\" + // optional month capture\n            \"(?:-(\\\\d{2})\" + // optional day capture\n            \"(?:\" + // capture hours:minutes:seconds.milliseconds\n                \"T(\\\\d{2})\" + // hours capture\n                \":(\\\\d{2})\" + // minutes capture\n                \"(?:\" + // optional :seconds.milliseconds\n                    \":(\\\\d{2})\" + // seconds capture\n                    \"(?:\\\\.(\\\\d{3}))?\" + // milliseconds capture\n                \")?\" +\n            \"(?:\" + // capture UTC offset component\n                \"Z|\" + // UTC capture\n                \"(?:\" + // offset specifier +/-hours:minutes\n                    \"([-+])\" + // sign capture\n                    \"(\\\\d{2})\" + // hours offset capture\n                    \":(\\\\d{2})\" + // minutes offset capture\n                \")\" +\n            \")?)?)?)?\" +\n        \"$\");\n\n        // Copy any custom methods a 3rd party library may have added\n        for (var key in NativeDate)\n            Date[key] = NativeDate[key];\n\n        // Copy \"native\" methods explicitly; they may be non-enumerable\n        Date.now = NativeDate.now;\n        Date.UTC = NativeDate.UTC;\n        Date.prototype = NativeDate.prototype;\n        Date.prototype.constructor = Date;\n\n        // Upgrade Date.parse to handle simplified ISO 8601 strings\n        Date.parse = function parse(string) {\n            var match = isoDateExpression.exec(string);\n            if (match) {\n                match.shift(); // kill match[0], the full match\n                // parse months, days, hours, minutes, seconds, and milliseconds\n                for (var i = 1; i < 7; i++) {\n                    // provide default values if necessary\n                    match[i] = +(match[i] || (i < 3 ? 1 : 0));\n                    // match[1] is the month. Months are 0-11 in JavaScript\n                    // `Date` objects, but 1-12 in ISO notation, so we\n                    // decrement.\n                    if (i == 1)\n                        match[i]--;\n                }\n\n                // parse the UTC offset component\n                var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop();\n\n                // compute the explicit time zone offset if specified\n                var offset = 0;\n                if (sign) {\n                    // detect invalid offsets and return early\n                    if (hourOffset > 23 || minuteOffset > 59)\n                        return NaN;\n\n                    // express the provided time zone offset in minutes. The offset is\n                    // negative for time zones west of UTC; positive otherwise.\n                    offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == \"+\" ? -1 : 1);\n                }\n\n                // Date.UTC for years between 0 and 99 converts year to 1900 + year\n                // The Gregorian calendar has a 400-year cycle, so \n                // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...),\n                // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years\n                var year = +match[0];\n                if (0 <= year && year <= 99) {\n                    match[0] = year + 400;\n                    return NativeDate.UTC.apply(this, match) + offset - 12622780800000;\n                }\n\n                // compute a new UTC date value, accounting for the optional offset\n                return NativeDate.UTC.apply(this, match) + offset;\n            }\n            return NativeDate.parse.apply(this, arguments);\n        };\n\n        return Date;\n    })(Date);\n}\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.20\n// http://es5.github.com/#x15.5.4.20\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n    // http://perfectionkills.com/whitespace-deviations/\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\n//\n// Util\n// ======\n//\n\n// ES5 9.4\n// http://es5.github.com/#x9.4\n// http://jsperf.com/to-integer\nvar toInteger = function (n) {\n    n = +n;\n    if (n !== n) // isNaN\n        n = 0;\n    else if (n !== 0 && n !== (1/0) && n !== -(1/0))\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    return n;\n};\n\nvar prepareString = \"a\"[0] != \"a\",\n    // ES5 9.9\n    // http://es5.github.com/#x9.9\n    toObject = function (o) {\n        if (o == null) { // this matches both null and undefined\n            throw new TypeError(); // TODO message\n        }\n        // If the implementation doesn't support by-index access of\n        // string characters (ex. IE < 7), split the string\n        if (prepareString && typeof o == \"string\" && o) {\n            return o.split(\"\");\n        }\n        return Object(o);\n    };\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry = this._eventRegistry || {};\n    this._defaultHandlers = this._defaultHandlers || {};\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    \n    if (!e.stopPropagation) {\n        e.stopPropagation = function() {\n            this.propagationStopped = true;\n        };\n    }\n    \n    if (!e.preventDefault) {\n        e.preventDefault = function() {\n            this.defaultPrevented = true;\n        };\n    }\n\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e);\n};\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    this._defaultHandlers = this._defaultHandlers || {};\n    \n    if (this._defaultHandlers[eventName])\n        throw new Error(\"The default handler for '\" + eventName + \"' is already set\");\n        \n    this._defaultHandlers[eventName] = callback;\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners.push(callback);\n};\n\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var tempCtor = function() {};\n    return function(ctor, superCtor) {\n        tempCtor.prototype = superCtor.prototype;\n        ctor.super_ = superCtor.prototype;\n        ctor.prototype = new tempCtor();\n        ctor.prototype.constructor = ctor;\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\ndefine('ace/mode/json_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/json/json_parse'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar parse = require(\"./json/json_parse\");\n\nvar JsonWorker = exports.JsonWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(200);\n};\n\noop.inherits(JsonWorker, Mirror);\n\n(function() {\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n\n        try {\n            var result = parse(value);\n        } catch (e) {\n            var pos = this.charToDocumentPosition(e.at-1);\n            this.sender.emit(\"error\", {\n                row: pos.row,\n                column: pos.column,\n                text: e.message,\n                type: \"error\"\n            });\n            return;\n        }\n        this.sender.emit(\"ok\");\n    };\n\n    this.charToDocumentPosition = function(charPos) {\n        var i = 0;\n        var len = this.doc.getLength();\n        var nl = this.doc.getNewLineCharacter().length;\n\n        if (!len) {\n            return { row: 0, column: 0};\n        }\n\n        var lineStart = 0;\n        while (i < len) {\n            var line = this.doc.getLine(i);\n            var lineLength = line.length + nl;\n            if (lineStart + lineLength > charPos)\n                return {\n                    row: i,\n                    column: charPos - lineStart\n                };\n\n            lineStart += lineLength;\n            i += 1;\n        }\n\n        return {\n            row: i-1,\n            column: line.length\n        };\n    };\n\n}).call(JsonWorker.prototype);\n\n});\ndefine('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas([e.data]);        \n        deferredUpdate.schedule(_self.$timeout);\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n        // abstract method\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\n /**\n * new Document([text])\n * - text (String | Array): The starting text\n *\n * Creates a new `Document`. If `text` is included, the `Document` contains those strings; otherwise, it's empty.\n *\n **/\n\nvar Document = function(text) {\n    this.$lines = [];\n\n    // There has to be one line at least in the document. If you pass an empty\n    // string to the insert function, nothing will happen. Workaround.\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this.insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n\n    // check for IE split bug\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getNewLineCharacter = function() {\n      switch (this.$newLineMode) {\n          case \"windows\":\n              return \"\\r\\n\";\n\n          case \"unix\":\n              return \"\\n\";\n\n          case \"auto\":\n              return this.$autoNewLine;\n      }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.$lines[range.start.row].substring(range.start.column,\n                                                         range.end.column);\n        }\n        else {\n            var lines = this.getLines(range.start.row+1, range.end.row-1);\n            lines.unshift((this.$lines[range.start.row] || \"\").substring(range.start.column));\n            lines.push((this.$lines[range.end.row] || \"\").substring(0, range.end.column));\n            return lines.join(this.getNewLineCharacter());\n        }\n    };\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        }\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n\n        // only detect new lines if the document has no line break yet\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this.insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    /**\n     * Document@change(e)\n     * - e (Object): Contains at least one property called `\"action\"`. `\"action\"` indicates the action that triggered the change. Each action also has a set of additional properties.\n     *\n     * Fires whenever the document changes.\n     *\n     * Several methods trigger different `\"change\"` events. Below is a list of each action type, followed by each property that's also available:\n     *\n     *  * `\"insertLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that are changing\n     *  * `\"insertText\"` (emitted by [[Document.insertNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being added\n     *  * `\"removeLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that were removed\n     *    * `nl`: the new line character (as defined by [[Document.getNewLineCharacter]])\n     *  * `\"removeText\"` (emitted by [[Document.removeInLine]] and [[Document.removeNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being removed\n     *\n     **/\n    this.insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n\n        // apply doesn't work for big arrays (smallest threshold is on safari 0xFFFF)\n        // to circumvent that we have to break huge inserts into smaller chunks here\n        if (lines.length > 0xFFFF) {\n            var end = this.insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        // clip to document\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this.removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n\n        // Shortcut: If the text we want to insert is the same as it is already\n        // in the document, we don't have to replace anything.\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Range\n *\n * This object is used in various places to indicate a region within the editor. To better visualize how this works, imagine a rectangle. Each quadrant of the rectangle is analogus to a range, as ranges contain a starting row and starting column, and an ending row, and ending column.\n *\n **/\n\n/**\n * new Range(startRow, startColumn, endRow, endColumn)\n * - startRow (Number): The starting row\n * - startColumn (Number): The starting column\n * - endRow (Number): The ending row\n * - endColumn (Number): The ending column\n *\n * Creates a new `Range` object with the given starting and ending row and column points.\n *\n **/\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    /**\n     * Range.isEqual(range) -> Boolean\n     * - range (Range): A range to check against\n     *\n     * Returns `true` if and only if the starting row and column, and ending tow and column, are equivalent to those given by `range`.\n     *\n     **/ \n    this.isEqual = function(range) {\n        return this.start.row == range.start.row &&\n            this.end.row == range.end.row &&\n            this.start.column == range.start.column &&\n            this.end.column == range.end.column\n    }; \n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    }; \n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    }; \n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.comparePoint(p) -> Number\n     * - p (Range): A point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1<br/>\n     *\n     * Checks the row and column points of `p` with the row and column points of the calling range.\n     *\n     * \n     *\n     **/ \n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    }\n\n    /** related to: Range.comparePoint\n     * Range.containsRange(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Checks the start and end points of `range` and compares them to the calling range. Returns `true` if the `range` is contained within the caller's range.\n     *\n     **/ \n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    }\n\n    /**\n     * Range.intersects(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Returns `true` if passed in `range` intersects with the one calling this method.\n     *\n     **/\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    }\n\n    /**\n     * Range.isEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's ending row point is the same as `row`, and if the caller's ending column is the same as `column`.\n     *\n     **/\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    }\n\n    /**\n     * Range.isStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's starting row point is the same as `row`, and if the caller's starting column is the same as `column`.\n     *\n     **/ \n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    }\n\n    /**\n     * Range.setStart(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    }\n\n    /**\n     * Range.setEnd(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.inside(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range.\n     *\n     **/ \n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's starting points.\n     *\n     **/ \n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's ending points.\n     *\n     **/ \n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** \n     * Range.compare(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal <br/>\n     * * `-1` if `p.row` is less then the calling range <br/>\n     * * `1` if `p.row` is greater than the calling range <br/>\n     *  <br/>\n     * If the starting row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     * <br/>\n     * If the ending row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0` <br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /**\n     * Range.compareEnd(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range, or if `isEnd` is `true.<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.compareInside(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `1` if the ending row of the calling range is equal to `row`, and the ending column of the calling range is equal to `column`<br/>\n     * * `-1` if the starting row of the calling range is equal to `row`, and the starting column of the calling range is equal to `column`<br/>\n     * <br/>\n     * Otherwise, it returns the value after calling [[Range.compare `compare()`]].\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     *\n     **/\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.clipRows(firstRow, lastRow) -> Range\n     * - firstRow (Number): The starting row\n     * - lastRow (Number): The ending row\n     *\n     * Returns the part of the current `Range` that occurs within the boundaries of `firstRow` and `lastRow` as a new `Range` object.\n     *\n    **/\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow) {\n            var end = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row > lastRow) {\n            var start = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row < firstRow) {\n            var start = {\n                row: firstRow,\n                column: 0\n            };\n        }\n\n        if (this.end.row < firstRow) {\n            var end = {\n                row: firstRow,\n                column: 0\n            };\n        }\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row == this.end.row && this.start.column == this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart =\n            session.documentToScreenPosition(this.start);\n        var screenPosEnd =\n            session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\n\nexports.Range = Range;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n/**\n * new Anchor(doc, row, column)\n * - doc (Document): The document to associate with the anchor\n * - row (Number): The starting row position\n * - column (Number): The starting column position\n *\n * Creates a new `Anchor` and associates it with a document.\n *\n **/\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.document = doc;\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n\n    this.$onChange = this.onChange.bind(this);\n    doc.on(\"change\", this.$onChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n        \n    this.getDocument = function() {\n        return this.document;\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n            \n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n            \n        if (range.start.row > this.row)\n            return;\n            \n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n    \n        var row = this.row;\n        var column = this.column;\n        \n        if (delta.action === \"insertText\") {\n            if (range.start.row === row && range.start.column <= column) {\n                if (range.start.row === range.end.row) {\n                    column += range.end.column - range.start.column;\n                }\n                else {\n                    column -= range.start.column;\n                    row += range.end.row - range.start.row;\n                }\n            }\n            else if (range.start.row !== range.end.row && range.start.row < row) {\n                row += range.end.row - range.start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (range.start.row <= row) {\n                row += range.end.row - range.start.row;\n            }\n        }\n        else if (delta.action == \"removeText\") {\n            if (range.start.row == row && range.start.column < column) {\n                if (range.end.column >= column)\n                    column = range.start.column;\n                else\n                    column = Math.max(0, column - (range.end.column - range.start.column));\n                \n            } else if (range.start.row !== range.end.row && range.start.row < row) {\n                if (range.end.row == row) {\n                    column = Math.max(0, column - range.end.column) + range.start.column;\n                }\n                row -= (range.end.row - range.start.row);\n            }\n            else if (range.end.row == row) {\n                row -= range.end.row - range.start.row;\n                column = Math.max(0, column - range.end.column) + range.start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (range.start.row <= row) {\n                if (range.end.row <= row)\n                    row -= range.end.row - range.start.row;\n                else {\n                    row = range.start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        }\n        else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n        \n        if (this.row == pos.row && this.column == pos.column)\n            return;\n            \n        var old = {\n            row: this.row,\n            column: this.column\n        };\n        \n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n    \n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n        \n        if (column < 0)\n            pos.column = 0;\n            \n        return pos;\n    };\n    \n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n     return new Array(count + 1).join(string);\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj != \"object\") {\n        return obj;\n    }\n    \n    var copy = obj.constructor();\n    for (var key in obj) {\n        if (typeof obj[key] == \"object\") {\n            copy[key] = this.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\n\n\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n\n    return deferred;\n};\n\n});\n\n/*members \"\", \"\\\"\", \"\\/\", \"\\\\\", at, b, call, charAt, f, fromCharCode,\n    hasOwnProperty, message, n, name, push, r, t, text\n*/\n\ndefine('ace/mode/json/json_parse', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n// This is a function that can parse a JSON text, producing a JavaScript\n// data structure. It is a simple, recursive descent parser. It does not use\n// eval or regular expressions, so it can be used as a model for implementing\n// a JSON parser in other languages.\n\n// We are defining the function inside of another function to avoid creating\n// global variables.\n\n    var at,     // The index of the current character\n        ch,     // The current character\n        escapee = {\n            '\"':  '\"',\n            '\\\\': '\\\\',\n            '/':  '/',\n            b:    '\\b',\n            f:    '\\f',\n            n:    '\\n',\n            r:    '\\r',\n            t:    '\\t'\n        },\n        text,\n\n        error = function (m) {\n\n// Call error when something is wrong.\n\n            throw {\n                name:    'SyntaxError',\n                message: m,\n                at:      at,\n                text:    text\n            };\n        },\n\n        next = function (c) {\n\n// If a c parameter is provided, verify that it matches the current character.\n\n            if (c && c !== ch) {\n                error(\"Expected '\" + c + \"' instead of '\" + ch + \"'\");\n            }\n\n// Get the next character. When there are no more characters,\n// return the empty string.\n\n            ch = text.charAt(at);\n            at += 1;\n            return ch;\n        },\n\n        number = function () {\n\n// Parse a number value.\n\n            var number,\n                string = '';\n\n            if (ch === '-') {\n                string = '-';\n                next('-');\n            }\n            while (ch >= '0' && ch <= '9') {\n                string += ch;\n                next();\n            }\n            if (ch === '.') {\n                string += '.';\n                while (next() && ch >= '0' && ch <= '9') {\n                    string += ch;\n                }\n            }\n            if (ch === 'e' || ch === 'E') {\n                string += ch;\n                next();\n                if (ch === '-' || ch === '+') {\n                    string += ch;\n                    next();\n                }\n                while (ch >= '0' && ch <= '9') {\n                    string += ch;\n                    next();\n                }\n            }\n            number = +string;\n            if (isNaN(number)) {\n                error(\"Bad number\");\n            } else {\n                return number;\n            }\n        },\n\n        string = function () {\n\n// Parse a string value.\n\n            var hex,\n                i,\n                string = '',\n                uffff;\n\n// When parsing for string values, we must look for \" and \\ characters.\n\n            if (ch === '\"') {\n                while (next()) {\n                    if (ch === '\"') {\n                        next();\n                        return string;\n                    } else if (ch === '\\\\') {\n                        next();\n                        if (ch === 'u') {\n                            uffff = 0;\n                            for (i = 0; i < 4; i += 1) {\n                                hex = parseInt(next(), 16);\n                                if (!isFinite(hex)) {\n                                    break;\n                                }\n                                uffff = uffff * 16 + hex;\n                            }\n                            string += String.fromCharCode(uffff);\n                        } else if (typeof escapee[ch] === 'string') {\n                            string += escapee[ch];\n                        } else {\n                            break;\n                        }\n                    } else {\n                        string += ch;\n                    }\n                }\n            }\n            error(\"Bad string\");\n        },\n\n        white = function () {\n\n// Skip whitespace.\n\n            while (ch && ch <= ' ') {\n                next();\n            }\n        },\n\n        word = function () {\n\n// true, false, or null.\n\n            switch (ch) {\n            case 't':\n                next('t');\n                next('r');\n                next('u');\n                next('e');\n                return true;\n            case 'f':\n                next('f');\n                next('a');\n                next('l');\n                next('s');\n                next('e');\n                return false;\n            case 'n':\n                next('n');\n                next('u');\n                next('l');\n                next('l');\n                return null;\n            }\n            error(\"Unexpected '\" + ch + \"'\");\n        },\n\n        value,  // Place holder for the value function.\n\n        array = function () {\n\n// Parse an array value.\n\n            var array = [];\n\n            if (ch === '[') {\n                next('[');\n                white();\n                if (ch === ']') {\n                    next(']');\n                    return array;   // empty array\n                }\n                while (ch) {\n                    array.push(value());\n                    white();\n                    if (ch === ']') {\n                        next(']');\n                        return array;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error(\"Bad array\");\n        },\n\n        object = function () {\n\n// Parse an object value.\n\n            var key,\n                object = {};\n\n            if (ch === '{') {\n                next('{');\n                white();\n                if (ch === '}') {\n                    next('}');\n                    return object;   // empty object\n                }\n                while (ch) {\n                    key = string();\n                    white();\n                    next(':');\n                    if (Object.hasOwnProperty.call(object, key)) {\n                        error('Duplicate key \"' + key + '\"');\n                    }\n                    object[key] = value();\n                    white();\n                    if (ch === '}') {\n                        next('}');\n                        return object;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error(\"Bad object\");\n        };\n\n    value = function () {\n\n// Parse a JSON value. It could be an object, an array, a string, a number,\n// or a word.\n\n        white();\n        switch (ch) {\n        case '{':\n            return object();\n        case '[':\n            return array();\n        case '\"':\n            return string();\n        case '-':\n            return number();\n        default:\n            return ch >= '0' && ch <= '9' ? number() : word();\n        }\n    };\n\n// Return the json_parse function. It will have access to all of the above\n// functions and variables.\n\n    return function (source, reviver) {\n        var result;\n\n        text = source;\n        at = 0;\n        ch = ' ';\n        result = value();\n        white();\n        if (ch) {\n            error(\"Syntax error\");\n        }\n\n// If there is a reviver function, we recursively walk the new structure,\n// passing each name/value pair to the reviver function for possible\n// transformation, starting with a temporary root object that holds the result\n// in an empty key. If there is not a reviver function, we simply return the\n// result.\n\n        return typeof reviver === 'function' ? function walk(holder, key) {\n            var k, v, value = holder[key];\n            if (value && typeof value === 'object') {\n                for (k in value) {\n                    if (Object.hasOwnProperty.call(value, k)) {\n                        v = walk(value, k);\n                        if (v !== undefined) {\n                            value[k] = v;\n                        } else {\n                            delete value[k];\n                        }\n                    }\n                }\n            }\n            return reviver.call(holder, key, value);\n        }({'': result}, '') : result;\n    };\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/ace/worker-xquery.js",
    "content": "\"no use strict\";\n\nvar console = {\n    log: function(msgs) {\n        postMessage({type: \"log\", data: arguments.join(\" \")});\n    }\n};\nvar window = {\n    console: console\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        var moduleName = base + \"/\" + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            var moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nvar require = function(parentId, id) {\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    var id = normalizeModule(parentId, id);\n    \n    var module = require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    require.id = id;\n    importScripts(path);\n    return require(parentId, id);    \n};\n\nrequire.modules = {};\nrequire.tlns = {};\n\nvar define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        id = require.id;\n    }\n\n    if (id.indexOf(\"text!\") === 0) \n        return;\n    \n    var req = function(deps, factory) {\n        return require(id, deps, factory);\n    };\n\n    require.modules[id] = {\n        factory: function() {\n            var module = {\n                exports: {}\n            };\n            var returnExports = factory(req, module.exports, module);\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\n\nfunction initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n}\n\nfunction initSender() {\n\n    var EventEmitter = require(null, \"ace/lib/event_emitter\").EventEmitter;\n    var oop = require(null, \"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n}\n\nvar main;\nvar sender;\n\nonmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        main[msg.command].apply(main, msg.args);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(null, \"ace/lib/fixoldbrowsers\");\n        sender = initSender();\n        var clazz = require(null, msg.module)[msg.classname];\n        main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._emit(msg.event, msg.data);\n    }\n};\n// vim:set ts=4 sts=4 sw=4 st:\n// -- kriskowal Kris Kowal Copyright (C) 2009-2010 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright(C) 2010 XXX No License Specified\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Irakli Gozalishvili Copyright (C) 2010 MIT License\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n \ndefine('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n\n    //---------------------------------\n    //  Overriden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n\n    // Don't override `test` if it won't change anything\n    if (!compliantLastIndexIncrement) {\n        // Fix browser bug in native method\n        RegExp.prototype.test = function (str) {\n            // Use the native `exec` to skip some processing overhead, even though the overriden\n            // `exec` would take care of the `lastIndex` fix\n            var match = real.exec.call(this, str);\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n// vim: ts=4 sts=4 sw=4 expandtab\n// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License\n// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project)\n// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA\n// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License\n// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License\n// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License\n// -- kossnocorp Sasha Koss XXX TODO License or CLA\n// -- bryanforbes Bryan Forbes XXX TODO License or CLA\n// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence\n// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License\n// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License\n// -- bbqsrc Brendan Molloy (C) 2011 Creative Commons Zero (public domain)\n// -- iwyg XXX TODO License or CLA\n// -- DomenicDenicola Domenic Denicola Copyright (C) 2011 MIT License\n// -- xavierm02 Montillet Xavier XXX TODO License or CLA\n// -- Raynos Raynos XXX TODO License or CLA\n// -- samsonjs Sami Samhuri Copyright (C) 2010 MIT License\n// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License\n// -- lexer Alexey Zakharov XXX TODO License or CLA\n\n/*!\n    Copyright (c) 2009, 280 North Inc. http://280north.com/\n    MIT License. http://github.com/280north/narwhal/blob/master/README.md\n*/\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n/*\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: http://es5.github.com/ (specific links below)\n * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n *\n * @module\n */\n\n/*whatsupdoc*/\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        // 1. Let Target be the this value.\n        var target = this;\n        // 2. If IsCallable(Target) is false, throw a TypeError exception.\n        if (typeof target != \"function\")\n            throw new TypeError(); // TODO message\n        // 3. Let A be a new (possibly empty) internal list of all of the\n        //   argument values provided after thisArg (arg1, arg2 etc), in order.\n        // XXX slicedArgs will stand in for \"A\" if used\n        var args = slice.call(arguments, 1); // for normal call\n        // 4. Let F be a new native ECMAScript object.\n        // 11. Set the [[Prototype]] internal property of F to the standard\n        //   built-in Function prototype object as specified in 15.3.3.1.\n        // 12. Set the [[Call]] internal property of F as described in\n        //   15.3.4.5.1.\n        // 13. Set the [[Construct]] internal property of F as described in\n        //   15.3.4.5.2.\n        // 14. Set the [[HasInstance]] internal property of F as described in\n        //   15.3.4.5.3.\n        var bound = function () {\n\n            if (this instanceof bound) {\n                // 15.3.4.5.2 [[Construct]]\n                // When the [[Construct]] internal method of a function object,\n                // F that was created using the bind function is called with a\n                // list of arguments ExtraArgs, the following steps are taken:\n                // 1. Let target be the value of F's [[TargetFunction]]\n                //   internal property.\n                // 2. If target has no [[Construct]] internal method, a\n                //   TypeError exception is thrown.\n                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Construct]] internal \n                //   method of target providing args as the arguments.\n\n                var F = function(){};\n                F.prototype = target.prototype;\n                var self = new F;\n\n                var result = target.apply(\n                    self,\n                    args.concat(slice.call(arguments))\n                );\n                if (result !== null && Object(result) === result)\n                    return result;\n                return self;\n\n            } else {\n                // 15.3.4.5.1 [[Call]]\n                // When the [[Call]] internal method of a function object, F,\n                // which was created using the bind function is called with a\n                // this value and a list of arguments ExtraArgs, the following\n                // steps are taken:\n                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                //   property.\n                // 3. Let target be the value of F's [[TargetFunction]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the \n                //   list boundArgs in the same order followed by the same \n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Call]] internal method \n                //   of target providing boundThis as the this value and \n                //   providing args as the arguments.\n\n                // equiv: target.call(this, ...boundArgs, ...args)\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        // XXX bound.length is never writable, so don't even try\n        //\n        // 15. If the [[Class]] internal property of Target is \"Function\", then\n        //     a. Let L be the length property of Target minus the length of A.\n        //     b. Set the length own property of F to either 0 or L, whichever is \n        //       larger.\n        // 16. Else set the length own property of F to 0.\n        // 17. Set the attributes of the length own property of F to the values\n        //   specified in 15.3.5.1.\n\n        // TODO\n        // 18. Set the [[Extensible]] internal property of F to true.\n        \n        // TODO\n        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n        // 20. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and \n        //   false.\n        // 21. Call the [[DefineOwnProperty]] internal method of F with \n        //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower, \n        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n        //   and false.\n\n        // TODO\n        // NOTE Function objects created using Function.prototype.bind do not \n        // have a prototype property or the [[Code]], [[FormalParameters]], and\n        // [[Scope]] internal properties.\n        // XXX can't delete prototype in pure-js.\n\n        // 22. Return F.\n        return bound;\n    };\n}\n\n// Shortcut to an often accessed properties, in order to avoid multiple\n// dereference that costs universally.\n// _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n// us it in defining shortcuts.\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\n\n// If JS engine supports accessors creating shortcuts.\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\n\n//\n// Array\n// =====\n//\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return toString(obj) == \"[object Array]\";\n    };\n}\n\n// The IsCallable() check in the Array functions\n// has been replaced with a strict check on the\n// internal class of the object to trap cases where\n// the provided function was actually a regular\n// expression literal, which in V8 and\n// JavaScriptCore is a typeof \"function\".  Only in\n// V8 are regular expression literals permitted as\n// reduce parameters, so it is desirable in the\n// general case for the shim to match the more\n// strict and common behavior of rejecting regular\n// expressions.\n\n// ES5 15.4.4.18\n// http://es5.github.com/#x15.4.4.18\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var self = toObject(this),\n            thisp = arguments[1],\n            i = 0,\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (i < length) {\n            if (i in self) {\n                // Invoke the callback function with call, passing arguments:\n                // context, property value, property key, thisArg object context\n                fun.call(thisp, self[i], i, self);\n            }\n            i++;\n        }\n    };\n}\n\n// ES5 15.4.4.19\n// http://es5.github.com/#x15.4.4.19\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, self);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.20\n// http://es5.github.com/#x15.4.4.20\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            result = [],\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                result.push(self[i]);\n        }\n        return result;\n    };\n}\n\n// ES5 15.4.4.16\n// http://es5.github.com/#x15.4.4.16\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, self))\n                return false;\n        }\n        return true;\n    };\n}\n\n// ES5 15.4.4.17\n// http://es5.github.com/#x15.4.4.17\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var self = toObject(this),\n            length = self.length >>> 0,\n            thisp = arguments[1];\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, self))\n                return true;\n        }\n        return false;\n    };\n}\n\n// ES5 15.4.4.21\n// http://es5.github.com/#x15.4.4.21\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value and an empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (++i >= length)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self)\n                result = fun.call(void 0, result, self[i], i, self);\n        }\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.22\n// http://es5.github.com/#x15.4.4.22\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        // no value to return if no initial value, empty array\n        if (!length && arguments.length == 1)\n            throw new TypeError(); // TODO message\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (--i < 0)\n                    throw new TypeError(); // TODO message\n            } while (true);\n        }\n\n        do {\n            if (i in this)\n                result = fun.call(void 0, result, self[i], i, self);\n        } while (i--);\n\n        return result;\n    };\n}\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n\n        var i = 0;\n        if (arguments.length > 1)\n            i = toInteger(arguments[1]);\n\n        // handle negative indices\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\n// ES5 15.4.4.15\n// http://es5.github.com/#x15.4.4.15\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\nif (!Array.prototype.lastIndexOf) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = toObject(this),\n            length = self.length >>> 0;\n\n        if (!length)\n            return -1;\n        var i = length - 1;\n        if (arguments.length > 1)\n            i = Math.min(i, toInteger(arguments[1]));\n        // handle negative indices\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i])\n                return i;\n        }\n        return -1;\n    };\n}\n\n//\n// Object\n// ======\n//\n\n// ES5 15.2.3.2\n// http://es5.github.com/#x15.2.3.2\nif (!Object.getPrototypeOf) {\n    // https://github.com/kriskowal/es5-shim/issues#issue/2\n    // http://ejohn.org/blog/objectgetprototypeof/\n    // recommended by fschaefer on github\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\n\n// ES5 15.2.3.3\n// http://es5.github.com/#x15.2.3.3\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        // If object does not owns property return undefined immediately.\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n\n        // If object has a property then it's for sure both `enumerable` and\n        // `configurable`.\n        descriptor =  { enumerable: true, configurable: true };\n\n        // If JS engine supports accessor properties then property may be a\n        // getter or setter.\n        if (supportsAccessors) {\n            // Unfortunately `__lookupGetter__` will return a getter even\n            // if object has own non getter property along with a same named\n            // inherited getter. To avoid misbehavior we temporary remove\n            // `__proto__` so that `__lookupGetter__` will return getter only\n            // if it's owned by an object.\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n\n            // Once we have getter and setter we can put values back.\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n\n                // If it was accessor property we're done and return here\n                // in order to avoid adding `value` to the descriptor.\n                return descriptor;\n            }\n        }\n\n        // If we got this far we know that object has an own property that is\n        // not an accessor so we set it as a value and return descriptor.\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\n\n// ES5 15.2.3.4\n// http://es5.github.com/#x15.2.3.4\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\n\n// ES5 15.2.3.5\n// http://es5.github.com/#x15.2.3.5\nif (!Object.create) {\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = { \"__proto__\": null };\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            // IE has no built-in implementation of `Object.getPrototypeOf`\n            // neither `__proto__`, but this manually setting `__proto__` will\n            // guarantee that `Object.getPrototypeOf` will work as expected with\n            // objects created using `Object.create`\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\n// ES5 15.2.3.6\n// http://es5.github.com/#x15.2.3.6\n\n// Patch for WebKit and IE8 standard mode\n// Designed by hax <hax.github.com>\n// related issue: https://github.com/kriskowal/es5-shim/issues#issue/5\n// IE8 Reference:\n//     http://msdn.microsoft.com/en-us/library/dd282900.aspx\n//     http://msdn.microsoft.com/en-us/library/dd229916.aspx\n// WebKit Bugs:\n//     https://bugs.webkit.org/show_bug.cgi?id=36423\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n        // returns falsy\n    }\n}\n\n// check whether defineProperty works if it's given. Otherwise,\n// shim partially.\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n\n        // make a valiant attempt to use the real defineProperty\n        // for I8's DOM elements.\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n                // try the shim if the real one doesn't work\n            }\n        }\n\n        // If it's a data property.\n        if (owns(descriptor, \"value\")) {\n            // fail silently if \"writable\", \"enumerable\", or \"configurable\"\n            // are requested but not supported\n            /*\n            // alternate approach:\n            if ( // can't implement these features; allow false but not true\n                !(owns(descriptor, \"writable\") ? descriptor.writable : true) ||\n                !(owns(descriptor, \"enumerable\") ? descriptor.enumerable : true) ||\n                !(owns(descriptor, \"configurable\") ? descriptor.configurable : true)\n            )\n                throw new RangeError(\n                    \"This implementation of Object.defineProperty does not \" +\n                    \"support configurable, enumerable, or writable.\"\n                );\n            */\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                // As accessors are supported only on engines implementing\n                // `__proto__` we can safely override `__proto__` while defining\n                // a property to make sure that we don't hit an inherited\n                // accessor.\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                // Deleting a property anyway since getter / setter may be\n                // defined on object itself.\n                delete object[property];\n                object[property] = descriptor.value;\n                // Setting original `__proto__` back now.\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            // If we got that far then getters and setters can be defined !!\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\n\n// ES5 15.2.3.7\n// http://es5.github.com/#x15.2.3.7\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\n\n// ES5 15.2.3.8\n// http://es5.github.com/#x15.2.3.8\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.9\n// http://es5.github.com/#x15.2.3.9\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// detect a Rhino bug and patch it\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\n\n// ES5 15.2.3.10\n// http://es5.github.com/#x15.2.3.10\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        // this is misleading and breaks feature-detection, but\n        // allows \"securable\" code to \"gracefully\" degrade to working\n        // but insecure code.\n        return object;\n    };\n}\n\n// ES5 15.2.3.11\n// http://es5.github.com/#x15.2.3.11\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.12\n// http://es5.github.com/#x15.2.3.12\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\n\n// ES5 15.2.3.13\n// http://es5.github.com/#x15.2.3.13\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        // 1. If Type(O) is not Object throw a TypeError exception.\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        // 2. Return the Boolean value of the [[Extensible]] internal property of O.\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\n\n// ES5 15.2.3.14\n// http://es5.github.com/#x15.2.3.14\nif (!Object.keys) {\n    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null})\n        hasDontEnumBug = false;\n\n    Object.keys = function keys(object) {\n\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(\"Object.keys called on a non-object\");\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n\n        return keys;\n    };\n\n}\n\n//\n// Date\n// ====\n//\n\n// ES5 15.9.5.43\n// http://es5.github.com/#x15.9.5.43\n// This function returns a String value represent the instance in time \n// represented by this Date object. The format of the String is the Date Time \n// string format defined in 15.9.1.15. All fields are present in the String. \n// The time zone is always UTC, denoted by the suffix Z. If the time value of \n// this object is not a finite Number a RangeError exception is thrown.\nif (!Date.prototype.toISOString || (new Date(-62198755200000).toISOString().indexOf('-000001') === -1)) {\n    Date.prototype.toISOString = function toISOString() {\n        var result, length, value, year;\n        if (!isFinite(this))\n            throw new RangeError;\n\n        // the date time string format is specified in 15.9.1.15.\n        result = [this.getUTCMonth() + 1, this.getUTCDate(),\n            this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];\n        year = this.getUTCFullYear();\n        year = (year < 0 ? '-' : (year > 9999 ? '+' : '')) + ('00000' + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6);\n\n        length = result.length;\n        while (length--) {\n            value = result[length];\n            // pad months, days, hours, minutes, and seconds to have two digits.\n            if (value < 10)\n                result[length] = \"0\" + value;\n        }\n        // pad milliseconds to have three digits.\n        return year + \"-\" + result.slice(0, 2).join(\"-\") + \"T\" + result.slice(2).join(\":\") + \".\" +\n            (\"000\" + this.getUTCMilliseconds()).slice(-3) + \"Z\";\n    }\n}\n\n// ES5 15.9.4.4\n// http://es5.github.com/#x15.9.4.4\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\n\n// ES5 15.9.5.44\n// http://es5.github.com/#x15.9.5.44\n// This function provides a String representation of a Date object for use by \n// JSON.stringify (15.12.3).\nif (!Date.prototype.toJSON) {\n    Date.prototype.toJSON = function toJSON(key) {\n        // When the toJSON method is called with argument key, the following \n        // steps are taken:\n\n        // 1.  Let O be the result of calling ToObject, giving it the this\n        // value as its argument.\n        // 2. Let tv be ToPrimitive(O, hint Number).\n        // 3. If tv is a Number and is not finite, return null.\n        // XXX\n        // 4. Let toISO be the result of calling the [[Get]] internal method of\n        // O with argument \"toISOString\".\n        // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n        if (typeof this.toISOString != \"function\")\n            throw new TypeError(); // TODO message\n        // 6. Return the result of calling the [[Call]] internal method of\n        //  toISO with O as the this value and an empty argument list.\n        return this.toISOString();\n\n        // NOTE 1 The argument is ignored.\n\n        // NOTE 2 The toJSON function is intentionally generic; it does not\n        // require that its this value be a Date object. Therefore, it can be\n        // transferred to other kinds of objects for use as a method. However,\n        // it does require that any such object have a toISOString method. An\n        // object is free to use the argument key to filter its\n        // stringification.\n    };\n}\n\n// ES5 15.9.4.2\n// http://es5.github.com/#x15.9.4.2\n// based on work shared by Daniel Friesen (dantman)\n// http://gist.github.com/303249\nif (Date.parse(\"+275760-09-13T00:00:00.000Z\") !== 8.64e15) {\n    // XXX global assignment won't work in embeddings that use\n    // an alternate object for the context.\n    Date = (function(NativeDate) {\n\n        // Date.length === 7\n        var Date = function Date(Y, M, D, h, m, s, ms) {\n            var length = arguments.length;\n            if (this instanceof NativeDate) {\n                var date = length == 1 && String(Y) === Y ? // isString(Y)\n                    // We explicitly pass it through parse:\n                    new NativeDate(Date.parse(Y)) :\n                    // We have to manually make calls depending on argument\n                    // length here\n                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\n                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\n                    length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                    length >= 4 ? new NativeDate(Y, M, D, h) :\n                    length >= 3 ? new NativeDate(Y, M, D) :\n                    length >= 2 ? new NativeDate(Y, M) :\n                    length >= 1 ? new NativeDate(Y) :\n                                  new NativeDate();\n                // Prevent mixups with unfixed Date object\n                date.constructor = Date;\n                return date;\n            }\n            return NativeDate.apply(this, arguments);\n        };\n\n        // 15.9.1.15 Date Time String Format.\n        var isoDateExpression = new RegExp(\"^\" +\n            \"(\\\\d{4}|[\\+\\-]\\\\d{6})\" + // four-digit year capture or sign + 6-digit extended year\n            \"(?:-(\\\\d{2})\" + // optional month capture\n            \"(?:-(\\\\d{2})\" + // optional day capture\n            \"(?:\" + // capture hours:minutes:seconds.milliseconds\n                \"T(\\\\d{2})\" + // hours capture\n                \":(\\\\d{2})\" + // minutes capture\n                \"(?:\" + // optional :seconds.milliseconds\n                    \":(\\\\d{2})\" + // seconds capture\n                    \"(?:\\\\.(\\\\d{3}))?\" + // milliseconds capture\n                \")?\" +\n            \"(?:\" + // capture UTC offset component\n                \"Z|\" + // UTC capture\n                \"(?:\" + // offset specifier +/-hours:minutes\n                    \"([-+])\" + // sign capture\n                    \"(\\\\d{2})\" + // hours offset capture\n                    \":(\\\\d{2})\" + // minutes offset capture\n                \")\" +\n            \")?)?)?)?\" +\n        \"$\");\n\n        // Copy any custom methods a 3rd party library may have added\n        for (var key in NativeDate)\n            Date[key] = NativeDate[key];\n\n        // Copy \"native\" methods explicitly; they may be non-enumerable\n        Date.now = NativeDate.now;\n        Date.UTC = NativeDate.UTC;\n        Date.prototype = NativeDate.prototype;\n        Date.prototype.constructor = Date;\n\n        // Upgrade Date.parse to handle simplified ISO 8601 strings\n        Date.parse = function parse(string) {\n            var match = isoDateExpression.exec(string);\n            if (match) {\n                match.shift(); // kill match[0], the full match\n                // parse months, days, hours, minutes, seconds, and milliseconds\n                for (var i = 1; i < 7; i++) {\n                    // provide default values if necessary\n                    match[i] = +(match[i] || (i < 3 ? 1 : 0));\n                    // match[1] is the month. Months are 0-11 in JavaScript\n                    // `Date` objects, but 1-12 in ISO notation, so we\n                    // decrement.\n                    if (i == 1)\n                        match[i]--;\n                }\n\n                // parse the UTC offset component\n                var minuteOffset = +match.pop(), hourOffset = +match.pop(), sign = match.pop();\n\n                // compute the explicit time zone offset if specified\n                var offset = 0;\n                if (sign) {\n                    // detect invalid offsets and return early\n                    if (hourOffset > 23 || minuteOffset > 59)\n                        return NaN;\n\n                    // express the provided time zone offset in minutes. The offset is\n                    // negative for time zones west of UTC; positive otherwise.\n                    offset = (hourOffset * 60 + minuteOffset) * 6e4 * (sign == \"+\" ? -1 : 1);\n                }\n\n                // Date.UTC for years between 0 and 99 converts year to 1900 + year\n                // The Gregorian calendar has a 400-year cycle, so \n                // to Date.UTC(year + 400, .... ) - 12622780800000 == Date.UTC(year, ...),\n                // where 12622780800000 - number of milliseconds in Gregorian calendar 400 years\n                var year = +match[0];\n                if (0 <= year && year <= 99) {\n                    match[0] = year + 400;\n                    return NativeDate.UTC.apply(this, match) + offset - 12622780800000;\n                }\n\n                // compute a new UTC date value, accounting for the optional offset\n                return NativeDate.UTC.apply(this, match) + offset;\n            }\n            return NativeDate.parse.apply(this, arguments);\n        };\n\n        return Date;\n    })(Date);\n}\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.20\n// http://es5.github.com/#x15.5.4.20\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n    // http://perfectionkills.com/whitespace-deviations/\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\n//\n// Util\n// ======\n//\n\n// ES5 9.4\n// http://es5.github.com/#x9.4\n// http://jsperf.com/to-integer\nvar toInteger = function (n) {\n    n = +n;\n    if (n !== n) // isNaN\n        n = 0;\n    else if (n !== 0 && n !== (1/0) && n !== -(1/0))\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    return n;\n};\n\nvar prepareString = \"a\"[0] != \"a\",\n    // ES5 9.9\n    // http://es5.github.com/#x9.9\n    toObject = function (o) {\n        if (o == null) { // this matches both null and undefined\n            throw new TypeError(); // TODO message\n        }\n        // If the implementation doesn't support by-index access of\n        // string characters (ex. IE < 7), split the string\n        if (prepareString && typeof o == \"string\" && o) {\n            return o.split(\"\");\n        }\n        return Object(o);\n    };\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry = this._eventRegistry || {};\n    this._defaultHandlers = this._defaultHandlers || {};\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    \n    if (!e.stopPropagation) {\n        e.stopPropagation = function() {\n            this.propagationStopped = true;\n        };\n    }\n    \n    if (!e.preventDefault) {\n        e.preventDefault = function() {\n            this.defaultPrevented = true;\n        };\n    }\n\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e);\n};\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    this._defaultHandlers = this._defaultHandlers || {};\n    \n    if (this._defaultHandlers[eventName])\n        throw new Error(\"The default handler for '\" + eventName + \"' is already set\");\n        \n    this._defaultHandlers[eventName] = callback;\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners.push(callback);\n};\n\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var tempCtor = function() {};\n    return function(ctor, superCtor) {\n        tempCtor.prototype = superCtor.prototype;\n        ctor.super_ = superCtor.prototype;\n        ctor.prototype = new tempCtor();\n        ctor.prototype.constructor = ctor;\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n \ndefine('ace/mode/xquery_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/xquery/xquery', 'ace/tokenizer', 'ace/mode/xquery_highlight_rules'], function(require, exports, module) {\n\n    \nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar xquery = require(\"../mode/xquery/xquery\");\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar XQueryHighlightRules = require(\"./xquery_highlight_rules\").XQueryHighlightRules;\n\nwindow.addEventListener = function() {};\n\n\nvar XQueryWorker = exports.XQueryWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(200);\n};\n\noop.inherits(XQueryWorker, Mirror);\n\n(function() {\n    \n  this.onUpdate = function() {\n    this.sender.emit(\"start\");\n    var value = this.doc.getValue();    \n    var parser = xquery.getParser(value);\n    var ast = parser.p_Module();\n    if(parser.hasErrors()) {\n\t\t  var errors = parser.getErrors();\n\t    var i = 0;\n      for(i in errors) {\n\t      var error = errors[i];\n\t      this.sender.emit(\"error\", {\n\t        row: error.line,\n          column: error.column,\n\t        text: error.message,\n\t        type: \"error\"\n       });\n      }\t\n    } else {\n     this.sender.emit(\"ok\");\n    }\n    parser.highlighter.tokenizer = new Tokenizer(new XQueryHighlightRules().getRules());\n    var tokens = parser.highlighter.getTokens();\n    this.sender.emit(\"highlight\", tokens);\n  };\n    \n}).call(XQueryWorker.prototype);\n\n});\ndefine('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas([e.data]);        \n        deferredUpdate.schedule(_self.$timeout);\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n        // abstract method\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\n /**\n * new Document([text])\n * - text (String | Array): The starting text\n *\n * Creates a new `Document`. If `text` is included, the `Document` contains those strings; otherwise, it's empty.\n *\n **/\n\nvar Document = function(text) {\n    this.$lines = [];\n\n    // There has to be one line at least in the document. If you pass an empty\n    // string to the insert function, nothing will happen. Workaround.\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this.insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n\n    // check for IE split bug\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getNewLineCharacter = function() {\n      switch (this.$newLineMode) {\n          case \"windows\":\n              return \"\\r\\n\";\n\n          case \"unix\":\n              return \"\\n\";\n\n          case \"auto\":\n              return this.$autoNewLine;\n      }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.$lines[range.start.row].substring(range.start.column,\n                                                         range.end.column);\n        }\n        else {\n            var lines = this.getLines(range.start.row+1, range.end.row-1);\n            lines.unshift((this.$lines[range.start.row] || \"\").substring(range.start.column));\n            lines.push((this.$lines[range.end.row] || \"\").substring(0, range.end.column));\n            return lines.join(this.getNewLineCharacter());\n        }\n    };\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        }\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n\n        // only detect new lines if the document has no line break yet\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this.insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    /**\n     * Document@change(e)\n     * - e (Object): Contains at least one property called `\"action\"`. `\"action\"` indicates the action that triggered the change. Each action also has a set of additional properties.\n     *\n     * Fires whenever the document changes.\n     *\n     * Several methods trigger different `\"change\"` events. Below is a list of each action type, followed by each property that's also available:\n     *\n     *  * `\"insertLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that are changing\n     *  * `\"insertText\"` (emitted by [[Document.insertNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being added\n     *  * `\"removeLines\"` (emitted by [[Document.insertLines]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `lines`: the lines in the document that were removed\n     *    * `nl`: the new line character (as defined by [[Document.getNewLineCharacter]])\n     *  * `\"removeText\"` (emitted by [[Document.removeInLine]] and [[Document.removeNewLine]])\n     *    * `range`: the [[Range]] of the change within the document\n     *    * `text`: the text that's being removed\n     *\n     **/\n    this.insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n\n        // apply doesn't work for big arrays (smallest threshold is on safari 0xFFFF)\n        // to circumvent that we have to break huge inserts into smaller chunks here\n        if (lines.length > 0xFFFF) {\n            var end = this.insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        // clip to document\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this.removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n\n        // Shortcut: If the text we want to insert is the same as it is already\n        // in the document, we don't have to replace anything.\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Range\n *\n * This object is used in various places to indicate a region within the editor. To better visualize how this works, imagine a rectangle. Each quadrant of the rectangle is analogus to a range, as ranges contain a starting row and starting column, and an ending row, and ending column.\n *\n **/\n\n/**\n * new Range(startRow, startColumn, endRow, endColumn)\n * - startRow (Number): The starting row\n * - startColumn (Number): The starting column\n * - endRow (Number): The ending row\n * - endColumn (Number): The ending column\n *\n * Creates a new `Range` object with the given starting and ending row and column points.\n *\n **/\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    /**\n     * Range.isEqual(range) -> Boolean\n     * - range (Range): A range to check against\n     *\n     * Returns `true` if and only if the starting row and column, and ending tow and column, are equivalent to those given by `range`.\n     *\n     **/ \n    this.isEqual = function(range) {\n        return this.start.row == range.start.row &&\n            this.end.row == range.end.row &&\n            this.start.column == range.start.column &&\n            this.end.column == range.end.column\n    }; \n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    }; \n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    }; \n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.comparePoint(p) -> Number\n     * - p (Range): A point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1<br/>\n     *\n     * Checks the row and column points of `p` with the row and column points of the calling range.\n     *\n     * \n     *\n     **/ \n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    }\n\n    /** related to: Range.comparePoint\n     * Range.containsRange(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Checks the start and end points of `range` and compares them to the calling range. Returns `true` if the `range` is contained within the caller's range.\n     *\n     **/ \n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    }\n\n    /**\n     * Range.intersects(range) -> Boolean\n     * - range (Range): A range to compare with\n     *\n     * Returns `true` if passed in `range` intersects with the one calling this method.\n     *\n     **/\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    }\n\n    /**\n     * Range.isEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's ending row point is the same as `row`, and if the caller's ending column is the same as `column`.\n     *\n     **/\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    }\n\n    /**\n     * Range.isStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the caller's starting row point is the same as `row`, and if the caller's starting column is the same as `column`.\n     *\n     **/ \n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    }\n\n    /**\n     * Range.setStart(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    }\n\n    /**\n     * Range.setEnd(row, column)\n     * - row (Number): A row point to set\n     * - column (Number): A column point to set\n     *\n     * Sets the starting row and column for the range.\n     *\n     **/ \n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    }\n\n    /** related to: Range.compare\n     * Range.inside(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range.\n     *\n     **/ \n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideStart(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's starting points.\n     *\n     **/ \n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** related to: Range.compare\n     * Range.insideEnd(row, column) -> Boolean\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     *\n     * Returns `true` if the `row` and `column` are within the given range's ending points.\n     *\n     **/ \n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /** \n     * Range.compare(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal <br/>\n     * * `-1` if `p.row` is less then the calling range <br/>\n     * * `1` if `p.row` is greater than the calling range <br/>\n     *  <br/>\n     * If the starting row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     * <br/>\n     * If the ending row of the calling range is equal to `p.row`, and: <br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0` <br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /**\n     * Range.compareEnd(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `0` if the two points are exactly equal<br/>\n     * * `-1` if `p.row` is less then the calling range<br/>\n     * * `1` if `p.row` is greater than the calling range, or if `isEnd` is `true.<br/>\n     * <br/>\n     * If the starting row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is greater than or equal to the calling range's starting column, this returns `0`<br/>\n     * * Otherwise, it returns -1<br/>\n     *<br/>\n     * If the ending row of the calling range is equal to `p.row`, and:<br/>\n     * * `p.column` is less than or equal to the calling range's ending column, this returns `0`<br/>\n     * * Otherwise, it returns 1\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     **/\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.compareInside(row, column) -> Number\n     * - row (Number): A row point to compare with\n     * - column (Number): A column point to compare with\n     * + (Number): This method returns one of the following numbers:<br/>\n     * * `1` if the ending row of the calling range is equal to `row`, and the ending column of the calling range is equal to `column`<br/>\n     * * `-1` if the starting row of the calling range is equal to `row`, and the starting column of the calling range is equal to `column`<br/>\n     * <br/>\n     * Otherwise, it returns the value after calling [[Range.compare `compare()`]].\n     *\n     * Checks the row and column points with the row and column points of the calling range.\n     *\n     *\n     *\n     **/\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    }\n\n    /** \n     * Range.clipRows(firstRow, lastRow) -> Range\n     * - firstRow (Number): The starting row\n     * - lastRow (Number): The ending row\n     *\n     * Returns the part of the current `Range` that occurs within the boundaries of `firstRow` and `lastRow` as a new `Range` object.\n     *\n    **/\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow) {\n            var end = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row > lastRow) {\n            var start = {\n                row: lastRow+1,\n                column: 0\n            };\n        }\n\n        if (this.start.row < firstRow) {\n            var start = {\n                row: firstRow,\n                column: 0\n            };\n        }\n\n        if (this.end.row < firstRow) {\n            var end = {\n                row: firstRow,\n                column: 0\n            };\n        }\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row == this.end.row && this.start.column == this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart =\n            session.documentToScreenPosition(this.start);\n        var screenPosEnd =\n            session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\n\nexports.Range = Range;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\n/**\n * new Anchor(doc, row, column)\n * - doc (Document): The document to associate with the anchor\n * - row (Number): The starting row position\n * - column (Number): The starting column position\n *\n * Creates a new `Anchor` and associates it with a document.\n *\n **/\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.document = doc;\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n\n    this.$onChange = this.onChange.bind(this);\n    doc.on(\"change\", this.$onChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n        \n    this.getDocument = function() {\n        return this.document;\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n            \n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n            \n        if (range.start.row > this.row)\n            return;\n            \n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n    \n        var row = this.row;\n        var column = this.column;\n        \n        if (delta.action === \"insertText\") {\n            if (range.start.row === row && range.start.column <= column) {\n                if (range.start.row === range.end.row) {\n                    column += range.end.column - range.start.column;\n                }\n                else {\n                    column -= range.start.column;\n                    row += range.end.row - range.start.row;\n                }\n            }\n            else if (range.start.row !== range.end.row && range.start.row < row) {\n                row += range.end.row - range.start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (range.start.row <= row) {\n                row += range.end.row - range.start.row;\n            }\n        }\n        else if (delta.action == \"removeText\") {\n            if (range.start.row == row && range.start.column < column) {\n                if (range.end.column >= column)\n                    column = range.start.column;\n                else\n                    column = Math.max(0, column - (range.end.column - range.start.column));\n                \n            } else if (range.start.row !== range.end.row && range.start.row < row) {\n                if (range.end.row == row) {\n                    column = Math.max(0, column - range.end.column) + range.start.column;\n                }\n                row -= (range.end.row - range.start.row);\n            }\n            else if (range.end.row == row) {\n                row -= range.end.row - range.start.row;\n                column = Math.max(0, column - range.end.column) + range.start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (range.start.row <= row) {\n                if (range.end.row <= row)\n                    row -= range.end.row - range.start.row;\n                else {\n                    row = range.start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        }\n        else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n        \n        if (this.row == pos.row && this.column == pos.column)\n            return;\n            \n        var old = {\n            row: this.row,\n            column: this.column\n        };\n        \n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n    \n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n        \n        if (column < 0)\n            pos.column = 0;\n            \n        return pos;\n    };\n    \n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n     return new Array(count + 1).join(string);\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj != \"object\") {\n        return obj;\n    }\n    \n    var copy = obj.constructor();\n    for (var key in obj) {\n        if (typeof obj[key] == \"object\") {\n            copy[key] = this.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\n\n\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n\n    return deferred;\n};\n\n});\n \ndefine('ace/mode/xquery/xquery', ['require', 'exports', 'module' , 'ace/mode/xquery/antlr3-all', 'ace/mode/xquery/XQueryLexer', 'ace/mode/xquery/XQueryParser'], function(require, exports, module) {\n\n  var antlr = require(\"./antlr3-all\");\n  var org =  antlr.org;\n  var NewLazyTokenStream = antlr.NewLazyTokenStream;\n  var XQueryLexer   = require(\"./XQueryLexer\").XQueryLexer;\n  var XQueryParser  = require(\"./XQueryParser\").XQueryParser;\n\n  exports.getParser = function(code) {\n    var cstream = new org.antlr.runtime.ANTLRStringStream(code);\n    var lexer = new XQueryLexer(cstream);\n    var tstream = new NewLazyTokenStream(lexer);\n    tstream.jumpToFirstValidToken();\n    var parser = new XQueryParser(tstream);\n    parser.setSource(cstream);\n    return parser;\n  };\n});\n/*\nSome portions:\nCopyright (c) 2008, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttp://developer.yahoo.net/yui/license.txt\nversion: 2.5.1\n*/\ndefine('ace/mode/xquery/antlr3-all', ['require', 'exports', 'module' ], function(require, exports, module) {\nvar NewLazyTokenStream = exports.NewLazyTokenStream = function(tokenSource) {\n\n  this.tokenSource = tokenSource;\n  this.tokens = [];\n  this.isWsExplicit = false;\n  this.p = 0;\n  this.channel = org.antlr.runtime.Token.DEFAULT_CHANNEL;\n  \n  this.LT = function(k) {\n    if (k == 0)\n      return null;\n    if (k < 0)\n      return this.readReverseNthGoodToken(-k);\n\n    return this.readNthGoodToken(k);\n  };\n\n  this.get = function(i) {\n    if (i >= this.tokens.length)\n      return org.antlr.runtime.Token.EOF_TOKEN;\n    else\n      return this.tokens[i];\n  };\n\n  this.getTokenSource = function() {\n    return this.tokenSource;\n  };\n\n  this.toString = function(start, stop) {\n     if(start == undefined) {\n       return this.toString(0, this.tokens.length - 1);\n     } else\n     if(start instanceof org.antlr.runtime.Token) {\n       return this.toString(start.getTokenIndex(), stop.getTokenIndex());\n     } else {\n      if (start < 0)\n        start = 0;\n      if (this.p <= stop) {\n        this.readNTokens(stop - this.p + 1);\n      }\n\n          var sb = \"\";\n          for (var i = start; i <= stop && i < this.tokens.length; i++) {\n              sb += this.tokens[i].getText();\n          }\n          return sb;\n      }\n    };\n\n    this.LA = function(i) {\n        return this.LT(i).getType();\n    };\n\n    this.done = false;\n\n    this.consume = function() {\n        if (this.done) {\n          return;\n        }\n        this.p++;\n        if (!this.isWsExplicit) {\n            this.jumpToFirstValidToken();\n        }\n    };\n\n    this.getSourceName = function() {\n      return this.getTokenSource().getSourceName();\n    };\n\n    this.index = function() {\n        return this.p;\n    };\n\n    this.mark = function() {\n        this.lastMarker = this.index();\n        return this.lastMarker;\n    };\n\n    this.release = function(marker) {\n    };\n\n    this.rewind = function(marker) {\n      if(arguments.length == 1) {\n        this.seek(marker);\n      } else {\n        this.seek(this.lastMarker);\n      }\n    };\n\n    this.seek = function(index) {\n        this.p = index;\n        this.done = false;\n    };\n\n    this.size = function() {\n        return this.tokens.length;\n    };\n\n    this.setTokenSource = function(source) {\n        this.tokenSource = source;\n        this.setWsExplicit(source.isWsExplicit);\n        // un-read the unused tokens\n        // they are different for the new source\n        if (this.p < this.tokens.length) {\n            var rIndex = this.p > 0 ? this.tokens[this.p - 1].getStopIndex() : 0;\n            this.tokenSource.rewindToIndex(rIndex + 1);\n            for (var i = this.tokens.length - 1; i >= this.p; i--) {\n                this.tokens.splice(i, 1);\n            }\n        }\n\n        // if we ignore WS, jump to next token\n        if (!this.isWsExplicit) {\n            this.jumpToFirstValidToken();\n        }\n    };\n\n    this.setWsExplicit = function(explicit) {\n        this.isWsExplicit = explicit;\n        if (!explicit) {\n          this.jumpToFirstValidToken();\n        }\n    };\n\n    this.readNthGoodToken = function(n) {\n        var count = this.tokens.length;\n        // number of buffered tokens available\n        var avt = count - this.p;\n        // i counts good tokens, j counts all tokens\n        var i = 1, j = 0;\n        var t = null;\n        while (i <= n) {\n            if (j < avt) // read from buffer\n                t = this.tokens[this.p + j];\n            else { // read from source\n                t = this.tokenSource.nextToken();\n                if (t == org.antlr.runtime.Token.EOF_TOKEN) {\n                    return t;\n                }\n                t.setTokenIndex(count++);\n                this.tokens.push(t);\n            }\n            if (this.isWsExplicit || t.getChannel() == this.channel) {\n               i++;\n            }\n            j++;\n        }\n        return t;\n    };\n\n    this.readReverseNthGoodToken = function(n) {\n        if (n == 0 || (this.p - n) < 0)\n            return null;\n\n        // i counts good tokens, j counts all tokens\n        var i = 1, j = 0;\n        var t = null;\n        while (this.p - 1 - j >= 0) {\n            t = this.get(this.p - 1 - j);\n\n            if (this.isWsExplicit || t.getChannel() == this.channel) {\n                if (i++ == n)\n                    return t;\n            }\n            j++;\n        }\n        return null;\n    };\n\n    this.readNTokens = function(n) {\n        var t = null;\n        for (var i = 0; i < n; i++) {\n            if (this.tokens.length > this.p + i)\n                continue;\n\n            t = this.tokenSource.nextToken();\n            if (t == org.antlr.runtime.Token.EOF_TOKEN)\n                return;\n            \n            t.setTokenIndex(this.p + i);\n            this.tokens.push(t);\n        }\n    };\n\n    this.jumpToFirstValidToken = function() {\n        var t = this.LT(1);\n        if (t != org.antlr.runtime.Token.EOF_TOKEN) {\n            this.done = false;\n            this.p = t.getTokenIndex();\n        }\n    }; \n};\n\n// create org.antlr module\nif (typeof org == \"undefined\" || !org) {\n    var org = {};\n}\nif (typeof org.antlr == \"undefined\" || !org.antlr) {\n    /**\n     * The org.antlr global namespace object.  If antlr is already defined, the\n     * existing antlr object will not be overwritten so that defined\n     * namespaces are preserved.\n     * @namespace org.antlr\n     */\n    org.antlr = {};\n}\n\n/**\n * The global JavaScript object.\n */\norg.antlr.global = (function() {\n    return this;\n}).call(null);\norg.antlr.namespace = function() {\n    var a=arguments, o=null, i, j, d;\n    for (i=0; i<a.length; i=i+1) {\n        d=a[i].split(\".\");\n        o=org.antlr.global;\n\n        // ANTLR is implied, so it is ignored if it is included\n        for (j=0; j<d.length; j=j+1) {\n            o[d[j]]=o[d[j]] || {};\n            o=o[d[j]];\n        }\n    }\n\n    return o;\n};\norg.antlr.env = org.antlr.env || {};\n/**\n * JavaScript runtime library tree parser code.\n * @name org.antlr.runtime.tree\n * @namespace\n */\norg.antlr.namespace(\"org.antlr.runtime.tree\");\norg.antlr.lang = org.antlr.lang || /** @lends org.antlr.lang */ {\n    /**\n     * Determines whether or not the provided object is an array.\n     * Testing typeof/instanceof/constructor of arrays across frame \n     * boundaries isn't possible in Safari unless you have a reference\n     * to the other frame to test against its Array prototype.  To\n     * handle this case, we test well-known array properties instead.\n     * properties.\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */\n    isArray: function(o) { \n        if (o) {\n           var l = org.antlr.lang;\n           return l.isNumber(o.length) && l.isFunction(o.splice);\n        }\n        return false;\n    },\n\n    /**\n     * Determines whether or not the provided object is a boolean\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */\n    isBoolean: function(o) {\n        return typeof o === 'boolean';\n    },\n    \n    /**\n     * Determines whether or not the provided object is a function\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */\n    isFunction: function(o) {\n        return typeof o === 'function';\n    },\n        \n    /**\n     * Determines whether or not the provided object is null\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */\n    isNull: function(o) {\n        return o === null;\n    },\n        \n    /**\n     * Determines whether or not the provided object is a legal number\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */\n    isNumber: function(o) {\n        return typeof o === 'number' && isFinite(o);\n    },\n      \n    /**\n     * Determines whether or not the provided object is of type object\n     * or function\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */  \n    isObject: function(o) {\nreturn (o && (typeof o === 'object' || org.antlr.lang.isFunction(o))) || false;\n    },\n        \n    /**\n     * Determines whether or not the provided object is a string\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */\n    isString: function(o) {\n        return typeof o === 'string';\n    },\n        \n    /**\n     * Determines whether or not the provided object is undefined\n     * @param {any} o The object being testing\n     * @return {boolean} the result\n     */\n    isUndefined: function(o) {\n        return typeof o === 'undefined';\n    },\n    \n    /**\n     * IE will not enumerate native functions in a derived object even if the\n     * function was overridden.  This is a workaround for specific functions \n     * we care about on the Object prototype. \n     * @param {Function} r  the object to receive the augmentation\n     * @param {Function} s  the object that supplies the properties to augment\n     * @private\n     */\n    _IEEnumFix: function(r, s) {\n        if (false) {\n            var add=[\"toString\", \"valueOf\"], i;\n            for (i=0;i<add.length;i=i+1) {\n                var fname=add[i],f=s[fname];\n                if (org.antlr.lang.isFunction(f) && f!=Object.prototype[fname]) {\n                    r[fname]=f;\n                }\n            }\n        }\n    },\n       \n    /**\n     * Utility to set up the prototype, constructor and superclass properties to\n     * support an inheritance strategy that can chain constructors and methods.\n     * Static members will not be inherited.\n     *\n     * @method extend\n     * @static\n     * @param {Function} subc   the object to modify\n     * @param {Function} superc the object to inherit\n     * @param {Object} [overrides]  additional properties/methods to add to the\n     *                              subclass prototype.  These will override the\n     *                              matching items obtained from the superclass \n     *                              if present.\n     */\n    extend: function(subc, superc, overrides) {\n        if (!superc||!subc) {\n            throw new Error(\"org.antlr.lang.extend failed, please check that \" +\n                            \"all dependencies are included.\");\n        }\n        var F = function() {};\n        F.prototype=superc.prototype;\n        subc.prototype=new F();\n        subc.prototype.constructor=subc;\n        subc.superclass=superc.prototype;\n        if (superc.prototype.constructor == Object.prototype.constructor) {\n            superc.prototype.constructor=superc;\n        }\n    \n        if (overrides) {\n            for (var i in overrides) {\n                subc.prototype[i]=overrides[i];\n            }\n\n            org.antlr.lang._IEEnumFix(subc.prototype, overrides);\n        }\n    },\n   \n    /**\n     * Applies all properties in the supplier to the receiver if the\n     * receiver does not have these properties yet.  Optionally, one or \n     * more methods/properties can be specified (as additional \n     * parameters).  This option will overwrite the property if receiver \n     * has it already.  If true is passed as the third parameter, all \n     * properties will be applied and _will_ overwrite properties in \n     * the receiver.\n     *\n     * @param {Function} r  the object to receive the augmentation\n     * @param {Function} s  the object that supplies the properties to augment\n     * @param {String*|boolean}  [arguments] zero or more properties methods \n     *        to augment the receiver with.  If none specified, everything\n     *        in the supplier will be used unless it would\n     *        overwrite an existing property in the receiver. If true\n     *        is specified as the third parameter, all properties will\n     *        be applied and will overwrite an existing property in\n     *        the receiver\n     */\n    augmentObject: function(r, s) {\n        if (!s||!r) {\n            throw new Error(\"Absorb failed, verify dependencies.\");\n        }\n        var a=arguments, i, p, override=a[2];\n        if (override && override!==true) { // only absorb the specified properties\n            for (i=2; i<a.length; i=i+1) {\n                r[a[i]] = s[a[i]];\n            }\n        } else { // take everything, overwriting only if the third parameter is true\n            for (p in s) { \n                if (override || !r[p]) {\n                    r[p] = s[p];\n                }\n            }\n            \n            org.antlr.lang._IEEnumFix(r, s);\n        }\n    },\n \n    /**\n     * Same as org.antlr.lang.augmentObject, except it only applies prototype properties\n     * @see org.antlr.lang.augmentObject\n     * @param {Function} r  the object to receive the augmentation\n     * @param {Function} s  the object that supplies the properties to augment\n     * @param {String*|boolean}  [arguments] zero or more properties methods \n     *        to augment the receiver with.  If none specified, everything \n     *        in the supplier will be used unless it would overwrite an existing \n     *        property in the receiver.  if true is specified as the third \n     *        parameter, all properties will be applied and will overwrite an \n     *        existing property in the receiver\n     */\n    augmentProto: function(r, s) {\n        if (!s||!r) {\n            throw new Error(\"Augment failed, verify dependencies.\");\n        }\n        //var a=[].concat(arguments);\n        var a=[r.prototype,s.prototype];\n        for (var i=2;i<arguments.length;i=i+1) {\n            a.push(arguments[i]);\n        }\n        org.antlr.lang.augmentObject.apply(this, a);\n    },\n\n    /**\n     * Returns a new object containing all of the properties of\n     * all the supplied objects.  The properties from later objects\n     * will overwrite those in earlier objects.\n     * @param arguments {Object*} the objects to merge\n     * @return the new merged object\n     */\n    merge: function() {\n        var o={}, a=arguments;\n        for (var i=0, l=a.length; i<l; i=i+1) {\n            org.antlr.lang.augmentObject(o, a[i], true);\n        }\n        return o;\n    },\n\n    /**\n     * A convenience method for detecting a legitimate non-null value.\n     * Returns false for null/undefined/NaN, true for other values, \n     * including 0/false/''\n     * @param o {any} the item to test\n     * @return {boolean} true if it is not null/undefined/NaN || false\n     */\n    isValue: function(o) {\n        var l = org.antlr.lang;\nreturn (l.isObject(o) || l.isString(o) || l.isNumber(o) || l.isBoolean(o));\n    },\n\n    /** @namespace org.antlr.lang.array Array convenience methods. */\n    array: /** @lends org.antlr.lang.array */ {\n        /**\n         * Retrieve the last element of an array. Throws an error if a is not\n         * an array or empty.\n         * @param a {Array} the array stack to peek in\n         * @return the last element of the array\n         */\n         peek: function(a) {\n            if (!org.antlr.lang.isArray(a)) {\n                throw new Error(\"org.antlr.lang.array.peek: a is not an array.\");\n            }\n            var l = a.length;\n            if (l<=0) {\n                throw new Error(\"org.antlr.lang.array.peek: a is empty.\");\n            }\n            return a[l-1];\n        }\n    }\n};\norg.antlr.runtime = {};\norg.antlr.runtime.RecognizerSharedState = function() {\n    /** Track the set of token types that can follow any rule invocation.\n     *  Stack grows upwards.  When it hits the max, it grows 2x in size\n     *  and keeps going.\n     */\n    this.following = [];\n\n    this._fsp = -1;\n    this.errorRecovery = false;\n    this.lastErrorIndex = -1;\n    this.failed = false;\n    this.syntaxErrors = 0;\n    this.backtracking = 0;\n    this.ruleMemo = null;\n\n\n    // LEXER FIELDS (must be in same state object to avoid casting\n    //               constantly in generated code and Lexer object) :(\n\n\n    /** The goal of all lexer rules/methods is to create a token object.\n     *  This is an instance variable as multiple rules may collaborate to\n     *  create a single token.  nextToken will return this object after\n     *  matching lexer rule(s).  If you subclass to allow multiple token\n     *  emissions, then set this to the last token to be matched or\n     *  something nonnull so that the auto token emit mechanism will not\n     *  emit another token.\n     */\n    this.token = null;\n    this.tokenStartCharIndex = -1;\n    // this.tokenStartLine;\n    // this.tokenStartCharPositionInLine;\n    // this.channel;\n    // this.type;\n    this.text = null;\n};\norg.antlr.runtime.IndexOutOfBoundsException = function(m) {\n    org.antlr.runtime.IndexOutOfBoundsException.superclass.constructor.call(this, m);\n};\n\norg.antlr.lang.extend(org.antlr.runtime.IndexOutOfBoundsException, Error, {\n    name: \"org.antlr.runtime.IndexOutOfBoundsException\"\n});\norg.antlr.runtime.RecognitionException = function(input) {\n    org.antlr.runtime.RecognitionException.superclass.constructor.call(this);\n    this.input = input;\n    this.index = input.index();\n    if ( input instanceof NewLazyTokenStream ) {//org.antlr.runtime.CommonTokenStream ) {\n        this.token = input.LT(1);\n        this.line = this.token.getLine();\n        this.charPositionInLine = this.token.getCharPositionInLine();\n    }\n    if ( input instanceof org.antlr.runtime.tree.TreeNodeStream ) {\n        this.extractInformationFromTreeNodeStream(input);\n    }\n    else if ( input instanceof org.antlr.runtime.ANTLRStringStream ) {\n        // Note: removed CharStream from hierarchy in JS port so checking for\n        // StringStream instead\n        this.c = input.LA(1);\n        this.line = input.getLine();\n        this.charPositionInLine = input.getCharPositionInLine();\n    }\n    else {\n        this.c = input.LA(1);\n    }\n\n    this.message = this.toString();\n};\n\norg.antlr.lang.extend(org.antlr.runtime.RecognitionException, Error,\n/** @lends org.antlr.runtime.RecognitionException.prototype */\n{\n\t/**\n     * What input stream did the error occur in?\n     */\n    input: null,\n\n    /** What is index of token/char were we looking at when the error occurred?\n     *  @type Number\n     */\n\tindex: null,\n\n\t/** The current Token when an error occurred.  Since not all streams\n\t *  can retrieve the ith Token, we have to track the Token object.\n\t *  For parsers.  Even when it's a tree parser, token might be set.\n     *  @type org.antlr.runtime.CommonToken\n\t */\n\ttoken: null,\n\n\t/** If this is a tree parser exception, node is set to the node with\n\t *  the problem.\n     *  @type Object\n\t */\n\tnode: null,\n\n\t/** The current char when an error occurred. For lexers.\n     *  @type Number\n     */\n\tc: null,\n\n\t/** Track the line at which the error occurred in case this is\n\t *  generated from a lexer.  We need to track this since the\n\t *  unexpected char doesn't carry the line info.\n     *  @type Number\n\t */\n\tline: null,\n\n    /** The exception's class name.\n     *  @type String\n     */\n    name: \"org.antlr.runtime.RecognitionException\",\n\n    /** Position in the line where exception occurred.\n     *  @type Number\n     */\n\tcharPositionInLine: null,\n\n\t/** If you are parsing a tree node stream, you will encounter som\n\t *  imaginary nodes w/o line/col info.  We now search backwards looking\n\t *  for most recent token with line/col info, but notify getErrorHeader()\n\t *  that info is approximate.\n     *  @type Boolean\n\t */\n\tapproximateLineInfo: null,\n\n    /** Gather exception information from input stream.\n     *  @param {org.antlr.runtime.CommonTokenStream|org.antlr.runtime.tree.TreeNodeStream|org.antlr.runtime.ANTLRStringStream} input input stream that has an exception.\n     */\n\textractInformationFromTreeNodeStream: function(input) {\n\t\tvar nodes = input,\n            priorNode,\n            priorPayLoad,\n            type,\n            text,\n            i;\n\n\t\tthis.node = nodes.LT(1);\n\t\tvar adaptor = nodes.getTreeAdaptor(),\n\t\t    payload = adaptor.getToken(this.node);\n\t\tif ( payload ) {\n\t\t\tthis.token = payload;\n\t\t\tif ( payload.getLine()<= 0 ) {\n\t\t\t\t// imaginary node; no line/pos info; scan backwards\n\t\t\t\ti = -1;\n\t\t\t\tpriorNode = nodes.LT(i);\n\t\t\t\twhile ( priorNode ) {\n\t\t\t\t\tpriorPayload = adaptor.getToken(priorNode);\n\t\t\t\t\tif ( priorPayload && priorPayload.getLine()>0 ) {\n\t\t\t\t\t\t// we found the most recent real line / pos info\n\t\t\t\t\t\tthis.line = priorPayload.getLine();\n\t\t\t\t\t\tthis.charPositionInLine = priorPayload.getCharPositionInLine();\n\t\t\t\t\t\tthis.approximateLineInfo = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t--i;\n\t\t\t\t\tpriorNode = nodes.LT(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse { // node created from real token\n\t\t\t\tthis.line = payload.getLine();\n\t\t\t\tthis.charPositionInLine = payload.getCharPositionInLine();\n\t\t\t}\n\t\t}\n\t\telse if ( this.node instanceof org.antlr.runtime.tree.CommonTree) {\n\t\t\tthis.line = this.node.getLine();\n\t\t\tthis.charPositionInLine = this.node.getCharPositionInLine();\n\t\t\tif ( this.node instanceof org.antlr.runtime.tree.CommonTree) {\n\t\t\t\tthis.token = this.node.token;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\ttype = adaptor.getType(this.node);\n\t\t\ttext = adaptor.getText(this.node);\n\t\t\tthis.token = new org.antlr.runtime.CommonToken(type, text);\n\t\t}\n\t},\n\n\t/** Return the token type or char of the unexpected input element\n     *  @return {Number} type of the unexpected input element.\n     */\n    getUnexpectedType: function() {\n\t\tif ( this.input instanceof NewLazyTokenStream) {//org.antlr.runtime.CommonTokenStream ) {\n\t\t\treturn this.token.getType();\n\t\t}\n\t\telse if ( this.input instanceof org.antlr.runtime.tree.TreeNodeStream ) {\n\t\t\tvar nodes = this.input;\n\t\t\tvar adaptor = nodes.getTreeAdaptor();\n\t\t\treturn adaptor.getType(this.node);\n\t\t}\n\t\telse {\n\t\t\treturn this.c;\n\t\t}\n\t}\n});\norg.antlr.runtime.MismatchedTokenException = function(expecting, input) {\n    if (arguments.length===0) {\n        this.expecting = org.antlr.runtime.Token.INVALID_TOKEN_TYPE;\n    } else {\n        org.antlr.runtime.MismatchedTokenException.superclass.constructor.call(\n                this, input);\n        this.expecting = expecting;\n    }\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.MismatchedTokenException,\n    org.antlr.runtime.RecognitionException, {\n    toString: function() {\n        return \"MismatchedTokenException(\" +\n                this.getUnexpectedType() + \"!=\" + this.expecting + \")\";\n    },\n    name: \"org.antlr.runtime.MismatchedTokenException\"\n});\norg.antlr.runtime.UnwantedTokenException = function(expecting, input) {\n    if (arguments.length>0) {\n        org.antlr.runtime.UnwantedTokenException.superclass.constructor.call(\n                this, expecting, input);\n    }\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.UnwantedTokenException,\n    org.antlr.runtime.MismatchedTokenException, {\n    getUnexpectedToken: function() {\n        return this.token;\n    },\n    toString: function() {\n        var exp = \", expected \"+this.expecting;\n        if ( this.expecting===org.antlr.runtime.Token.INVALID_TOKEN_TYPE ) {\n            exp = \"\";\n        }\n        if ( !org.antlr.lang.isValue(this.token) ) {\n            return \"UnwantedTokenException(found=\"+exp+\")\";\n        }\n        return \"UnwantedTokenException(found=\"+this.token.getText()+exp+\")\";\n    },\n    name: \"org.antlr.runtime.UnwantedTokenException\"\n});\norg.antlr.runtime.MissingTokenException = function(expecting, input, inserted) {\n    if (arguments.length>0) {\n        org.antlr.runtime.MissingTokenException.superclass.constructor.call(\n                this, expecting, input);\n        this.inserted = inserted;\n    }\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.MissingTokenException,\n    org.antlr.runtime.MismatchedTokenException, {\n    getMissingType: function() {\n        return this.expecting;\n    },\n\n    toString: function() {\n        if (org.antlr.lang.isValue(this.inserted) &&\n            org.antlr.lang.isValue(this.token))\n        {\n            return \"MissingTokenException(inserted \"+this.inserted+\" at \"+this.token.getText()+\")\";\n        }\n        if ( org.antlr.lang.isValue(this.token) ) {\n            return \"MissingTokenException(at \"+this.token.getText()+\")\";\n        }\n        return \"MissingTokenException\";\n    },\n    name: \"org.antlr.runtime.MissingTokenException\"\n});\norg.antlr.runtime.NoViableAltException = function(grammarDecisionDescription,\n                                            decisionNumber,\n                                            stateNumber,\n                                            input)\n{\n    org.antlr.runtime.NoViableAltException.superclass.constructor.call(this, input);\n    this.grammarDecisionDescription = grammarDecisionDescription;\n    this.decisionNumber = decisionNumber;\n    this.stateNumber = stateNumber;\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.NoViableAltException,\n    org.antlr.runtime.RecognitionException, {\n    toString: function() {\n        if ( this.input instanceof org.antlr.runtime.ANTLRStringStream ) {\n            return \"NoViableAltException('\"+this.getUnexpectedType()+\"'@[\"+this.grammarDecisionDescription+\"])\";\n        }\n        else {\n            return \"NoViableAltException(\"+this.getUnexpectedType()+\"@[\"+this.grammarDecisionDescription+\"])\";\n        }\n    },\n    name: \"org.antlr.runtime.NoViableAltException\"\n});\norg.antlr.runtime.EarlyExitException = function(decisionNumber, input) {\n    org.antlr.runtime.EarlyExitException.superclass.constructor.call(\n            this, input);\n    this.decisionNumber = decisionNumber;\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.EarlyExitException,\n    org.antlr.runtime.RecognitionException,\n/** @lends org.antlr.runtime.EarlyExitException.prototype */\n{\n    /** Name of this class.\n     *  @type String\n     */\n    name: \"org.antlr.runtime.EarlyExitException\"\n});\norg.antlr.runtime.MismatchedSetException = function(expecting, input) {\n    org.antlr.runtime.MismatchedSetException.superclass.constructor.call(\n            this, input);\n    this.expecting = expecting;\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.MismatchedSetException,\n    org.antlr.runtime.RecognitionException, {\n    toString: function() {\n        return \"MismatchedSetException(\" +\n                this.getUnexpectedType() + \"!=\" + this.expecting + \")\";\n    },\n    name: \"org.antlr.runtime.MismatchedSetException\"\n});\norg.antlr.runtime.MismatchedNotSetException = function(expecting, input) {\n    org.antlr.runtime.MismatchedNotSetException.superclass.constructor.call(this, expecting, input);\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.MismatchedNotSetException,\n    org.antlr.runtime.MismatchedSetException, {\n    toString: function() {\n        return \"MismatchedNotSetException(\" +\n                this.getUnexpectedType() + \"!=\" + this.expecting + \")\";\n    },\n    name: \"org.antlr.runtime.MismatchedNotSetException\"\n});\norg.antlr.runtime.MismatchedRangeException = function(a, b, input) {\n    if (arguments.length===0) {\n        return this;\n    }\n\n    org.antlr.runtime.MismatchedRangeException.superclass.constructor.call(\n            this, input);\n    this.a = a;\n    this.b = b;\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.MismatchedRangeException,\n    org.antlr.runtime.RecognitionException, {\n    toString: function() {\n        return \"MismatchedRangeException(\" +\n                this.getUnexpectedType()+\" not in [\"+this.a+\",\"+this.b+\"])\";\n    },\n    name: \"org.antlr.runtime.MismatchedRangeException\"\n});\norg.antlr.runtime.FailedPredicateException = function(input, ruleName, predicateText){\n    org.antlr.runtime.FailedPredicateException.superclass.constructor.call(this, input);\n    this.ruleName = ruleName;\n    this.predicateText = predicateText;\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.FailedPredicateException,\n    org.antlr.runtime.RecognitionException,\n/** @lends org.antlr.runtime.FailedPredicateException.prototype */\n{\n    /** Create a string representation of this exception.\n     *  @returns {String}\n     */ \n    toString: function() {\n        return \"FailedPredicateException(\"+this.ruleName+\",{\"+this.predicateText+\"}?)\";\n    },\n\n    /** Name of this class.\n     *  @type String\n     */\n    name: \"org.antlr.runtime.FailedPredicateException\"\n});\norg.antlr.runtime.BitSet = function(bits) {\n    if (!bits) {\n        bits = org.antlr.runtime.BitSet.BITS;\n    }\n\n    if (org.antlr.lang.isArray(bits)) {\n        /**\n         * An array of Numbers representing the BitSet.\n         * @type Array\n         */\n        this.bits = bits;\n    } else if(org.antlr.lang.isNumber(bits)) {\n        this.bits = [];\n    }\n};\n\norg.antlr.lang.augmentObject(org.antlr.runtime.BitSet, {\n    /**\n     * Number of bits in each number.\n     * @constant\n     * @memberOf org.antlr.runtime.BitSet\n     */\n    BITS: 32,\n\n    /**\n     * Log (base 2) of the number of bits in each number.\n     * @constant\n     * @memberOf org.antlr.runtime.BitSet\n     */\n    LOG_BITS: 5,  // 2^5 == 32 \n\n    /**\n     * We will often need to do a mod operator (i mod nbits).  Its\n     * turns out that, for powers of two, this mod operation is\n     * same as (i & (nbits-1)).  Since mod is slow, we use a\n     * precomputed mod mask to do the mod instead.\n     * @constant\n     * @memberOf org.antlr.runtime.BitSet\n     */\n    MOD_MASK: 31, // BITS - 1\n\n    /**\n     * Create mask for bit modded to fit in a single word.\n     * @example\n     * bitmask(35) => 00000000000000000000000000000100\n     * bitmask(3)  => 00000000000000000000000000000100\n     * @param {Number} bitNumber the bit to create a mask for.\n     * @returns {Number} the bitmask.\n     * @memberOf org.antlr.runtime.BitSet\n     * @private\n     */\n    bitMask: function(bitNumber) {\n        var bitPosition = bitNumber & org.antlr.runtime.BitSet.MOD_MASK;\n        return 1 << bitPosition;\n    },\n\n    /**\n     * Calculate the minimum number of bits needed to represent el.\n     * @param {Number} el a number to be included in the BitSet.\n     * @returns {Number} the number of bits need to create a BitSet with member\n     *                   el.\n     * @memberOf org.antlr.runtime.BitSet\n     * @private\n     */\n    numWordsToHold: function(el) {\n        return (el >> org.antlr.runtime.BitSet.LOG_BITS) + 1;\n    },\n\n    /**\n     * @param {Number} bit a number to be included in the BitSet\n     * @returns {Number} the index of the word in the field bits that would\n     *                   hold bit.\n     * @memberOf org.antlr.runtime.BitSet\n     * @private\n     */\n    wordNumber: function(bit) {\n        return bit >> org.antlr.runtime.BitSet.LOG_BITS; // bit / BITS\n    },\n\n    /**\n     * BitSet factory method.\n     * \n     * <p>Operates in a number of modes:\n     * <ul>\n     * <li>If el is a number create the BitSet containing that number.</li>\n     * <li>If el is an array create the BitSet containing each number in the\n     * array.</li>\n     * <li>If el is a BitSet return el.</li>\n     * <li>If el is an Object create the BitSet containing each numeric value\n     * in el.</li>\n     * <li>If el is a number and el2 is a number return a BitSet containing\n     * the numbers between el and el2 (inclusive).</li>\n     * </ul>\n     * </p>\n     * @param {Number|Array|org.antlr.runtime.BitSet|Object} el\n     * @param {Number} el2\n     * @returns {org.antlr.runtime.BitSet}\n     * @memberOf org.antlr.runtime.BitSet\n     */\n    of: function(el, el2) {\n        var i, n, s, keys;\n\n        if (org.antlr.lang.isNumber(el)) {\n            if (org.antlr.lang.isNumber(el2)) {\n                s = new org.antlr.runtime.BitSet(el2 + 1);\n                for (i = el; i <= el2; i++) {\n                    n = org.antlr.runtime.BitSet.wordNumber(i);\n                    s.bits[n] |= org.antlr.runtime.BitSet.bitMask(i);\n                }\n                return s;\n            } else {\n                s = new org.antlr.runtime.BitSet(el + 1);\n                s.add(el);\n                return s;\n            }\n        } else if(org.antlr.lang.isArray(el)) {\n            s = new org.antlr.runtime.BitSet();\n            for (i=el.length-1; i>=0; i--) {\n                s.add(el[i]);\n            }\n            return s;\n        } else if (el instanceof org.antlr.runtime.BitSet) {\n            if (!el) {\n                return null;\n            }\n            return el;\n        } else if (el instanceof org.antlr.runtime.IntervalSet) {\n            if (!el) {\n                return null;\n            }\n            s = new org.antlr.runtime.BitSet();\n            s.addAll(el);\n            return s;\n        } else if (org.antlr.lang.isObject(el)) {\n            keys = [];\n            for (i in el) {\n                if (org.antlr.lang.isNumber(i)) {\n                    keys.push(i);\n                }\n            }\n            return org.antlr.runtime.BitSet.of(keys);\n        }\n    }\n});\n\n\n\norg.antlr.runtime.BitSet.prototype = {\n    /**\n     * Add el into this set.\n     * @param {Number} el the number to add to the set.\n     */\n    add: function(el) {\n        var n = org.antlr.runtime.BitSet.wordNumber(el);\n        if (n >= this.bits.length) {\n            this.growToInclude(el);\n        }\n        this.bits[n] |= org.antlr.runtime.BitSet.bitMask(el);\n    },\n\n    /**\n     * Add multiple elements into this set.\n     * @param {Array|org.antlr.runtime.BitSet} elements the elements to be added to\n     *                                           this set.\n     */\n    addAll: function(elements) {\n        var other,\n            i,\n            e;\n\n        if ( elements instanceof org.antlr.runtime.BitSet ) {\n            this.orInPlace(elements);\n        }\n\t\telse if ( elements instanceof org.antlr.runtime.IntervalSet ) {\n\t\t\tother = elements;\n\t\t\t// walk set and add each interval\n            /* @todo after implementing intervalset\n\t\t\tfor (Iterator iter = other.intervals.iterator(); iter.hasNext();) {\n\t\t\t\tInterval I = (Interval) iter.next();\n\t\t\t\tthis.orInPlace(BitSet.range(I.a,I.b));\n\t\t\t}*/\n\t\t} else if (org.antlr.lang.isArray(elements)) {\n    \t\tfor (i = 0; i < elements.length; i++) {\n\t    \t\te = elements[i];\n\t\t    \tthis.add(e);\n    \t\t}\n        } else {\n            return;\n        }\n\t},\n\n    /**\n     * Clone this BitSet and then {@link #andInPlace} with a.\n     * @param {org.antlr.runtime.BitSet} a a bit set.\n     * @returns {org.antlr.runtime.BitSet}\n     */\n    and: function(a) {\n        var s = this.clone();\n        s.andInPlace(a);\n        return s;\n    },\n\n    /**\n     * Perform a logical AND of this target BitSet with the argument BitSet.\n     *\n     * This bit set is modified so that each bit in it has the value true if \n     * and only if it both initially had the value true and the corresponding \n     * bit in the bit set argument also had the value true. \n     * @param {org.antlr.runtime.BitSet} a a bit set.\n     * @returns {org.antlr.runtime.BitSet}\n     */\n    andInPlace: function(a) {\n        var min = Math.min(this.bits.length, a.bits.length),\n            i;\n        for (i = min - 1; i >= 0; i--) {\n            this.bits[i] &= a.bits[i];\n        }\n        // clear all bits in this not present in a (if this bigger than a).\n        for (i = min; i < this.bits.length; i++) {\n            this.bits[i] = 0;\n        }\n    },\n\n    /**\n     * Clear all bits or a specific bit.\n     *\n     * If no arguments given, sets all of the bits in this BitSet to false.\n     * If one argument given, sets the bit specified by the index to false.\n     * @param {Number} [el] the index of the bit to be cleared.\n     */\n    clear: function(el) {\n        if (arguments.length===0) {\n            var i;\n            for (i = this.bits.length - 1; i >= 0; i--) {\n                this.bits[i] = 0;\n            }\n            return;\n        }\n\n        var n = org.antlr.runtime.BitSet.wordNumber(el);\n        if (n >= this.bits.length) {\t// grow as necessary to accommodate\n            this.growToInclude(el);\n        }\n        this.bits[n] &= ~org.antlr.runtime.BitSet.bitMask(el);\n    },\n\n    /**\n     * Cloning this BitSet produces a new BitSet  that is equal to it. \n     *\n     * The clone of the bit set is another bit set that has exactly the same\n     * bit set to true as this bit set. \n     * @returns {org.antlr.runtime.BitSet} a clone of this BitSet.\n     */\n    clone: function() {\n        var i, len, b=[];\n        for (i=0, len=this.bits.length; i<len; i++) {\n            b[i] = this.bits[i];\n        }\n        return new org.antlr.runtime.BitSet(b);\n    },\n\n    /**\n     * Returns the number of bits of space actually in use by this BitSet to \n     * represent bit values.\n     *\n     * The maximum element in the set is the size - 1st element. \n     * @returns {Number} the number of bits currently in this bit set.\n     */\n    size: function() {\n        var deg = 0, i, word, bit;\n        for (i = this.bits.length - 1; i >= 0; i--) {\n            word = this.bits[i];\n            if (word !== 0) {\n                for (bit = org.antlr.runtime.BitSet.BITS - 1; bit >= 0; bit--) {\n                    if ((word & (1 << bit)) !== 0) {\n                        deg++;\n                    }\n                }\n            }\n        }\n        return deg;\n    },\n\n    /**\n     * Compares this object against the specified object.\n     *\n     * The result is true if and only if the argument is not null and is a\n     * BitSet object that has exactly the same set of bits set to true as\n     * this bit set. That is, for every nonnegative int index k,\n     * <pre><code>\n     * ((BitSet)obj).get(k) == this.get(k)\n     * </code></pre>\n     * must be true. The current sizes of the two bit sets are not compared.\n     * @param {Object} other the object to compare with.\n     * @returns {Boolean} if the objects are the same; false otherwise.\n     */\n    equals: function(other) {\n        if ( !other || !(other instanceof org.antlr.runtime.BitSet) ) {\n            return false;\n        }\n\n        var otherSet = other,\n            i,\n            n = Math.min(this.bits.length, otherSet.bits.length);\n\n        // for any bits in common, compare\n        for (i=0; i<n; i++) {\n            if (this.bits[i] != otherSet.bits[i]) {\n                return false;\n            }\n        }\n\n        // make sure any extra bits are off\n\n        if (this.bits.length > n) {\n            for (i = n+1; i<this.bits.length; i++) {\n                if (this.bits[i] !== 0) {\n                    return false;\n                }\n            }\n        }\n        else if (otherSet.bits.length > n) {\n            for (i = n+1; i<otherSet.bits.length; i++) {\n                if (otherSet.bits[i] !== 0) {\n                    return false;\n                }\n            }\n        }\n\n        return true;\n    },\n\n    /**\n     * Grows the set to a larger number of bits.\n     * @param {Number} bit element that must fit in set\n     * @private\n     */\n    growToInclude: function(bit) {\n        var newSize = Math.max(this.bits.length << 1, org.antlr.runtime.BitSet.numWordsToHold(bit)),\n            newbits = [], //new Array(newSize),\n            i;\n        for (i=0, len=this.bits.length; i<len; i++) {\n            newbits[i] = this.bits[i];\n        }\n        this.bits = newbits;\n    },\n\n    /**\n     * Returns the value of the bit with the specified index.\n     *\n     * The value is true if the bit with the index el is currently set \n     * in this BitSet; otherwise, the result is false.\n     * @param {Number} el the bit index.\n     * @returns {Boolean} the value of the bit with the specified index.\n     */\n    member: function(el) {\n        var n = org.antlr.runtime.BitSet.wordNumber(el);\n        if (n >= this.bits.length) { return false; }\n        return (this.bits[n] & org.antlr.runtime.BitSet.bitMask(el)) !== 0;\n    },\n\n    /**\n     * Returns the index of the first bit that is set to true.\n     * If no such bit exists then -1 is returned.\n     * @returns {Number} the index of the next set bit.\n     */\n    getSingleElement: function() {\n        var i;\n        for (i = 0; i < (this.bits.length << org.antlr.runtime.BitSet.LOG_BITS); i++) {\n            if (this.member(i)) {\n                return i;\n            }\n        }\n        return -1; //Label.INVALID;\n    },\n\n    /**\n     * Returns true if this BitSet contains no bits that are set to true.\n     * @returns {Boolean} boolean indicating whether this BitSet is empty.\n     */\n    isNil: function() {\n        var i;\n        for (i = this.bits.length - 1; i >= 0; i--) {\n            if (this.bits[i] !== 0) {\n                return false;\n            }\n        }\n        return true;\n    },\n\n    /**\n     * If a bit set argument is passed performs a {@link #subtract} of this bit\n     * set with the argument bit set.  If no argument is passed, clone this bit\n     * set and {@link #notInPlace}.\n     * @param {org.antlr.runtime.BitSet} [set]\n     * @returns {org.antlr.runtime.BitSet}\n     */\n    complement: function(set) {\n        if (set) {\n            return set.subtract(this);\n        } else {\n            var s = this.clone();\n            s.notInPlace();\n            return s;\n        }\n    },\n\n    /**\n     * If no arguments are passed sets all bits to the complement of their\n     * current values.  If one argument is passed sets each bit from the\n     * beginning of the bit set to index1 (inclusive) to the complement of its\n     * current value.  If two arguments are passed sets each bit from the\n     * specified index1 (inclusive) to the sepcified index2 (inclusive) to the\n     * complement of its current value.\n     * @param {Number} index1\n     * @param {Number} index2\n     */\n    notInPlace: function() {\n        var minBit, maxBit, i, n;\n        if (arguments.length===0) {\n            for (i = this.bits.length - 1; i >= 0; i--) {\n                this.bits[i] = ~this.bits[i];\n            }\n        } else {\n            if (arguments.length===1) {\n                minBit = 0;\n                maxBit = arguments[0];\n            } else {\n                minBit = arguments[0];\n                maxBit = arguments[1];\n            }\n            // make sure that we have room for maxBit\n            this.growToInclude(maxBit);\n            for (i = minBit; i <= maxBit; i++) {\n                n = org.antlr.runtime.BitSet.wordNumber(i);\n                this.bits[n] ^= org.antlr.runtime.BitSet.bitMask(i);\n            }\n        }\n\n    },\n\n    /**\n     * Performs a logical OR of this bit set with the bit set argument.\n     * If no argument is passed, return this bit set.  Otherwise a clone of\n     * this bit set is modified so that a bit in it has the value true if and\n     * only if it either already had the value true or the corresponding bit\n     * in the bit set argument has the value true.\n     * @param {org.antlr.runtime.BitSet} [a] a bit set.\n     * @returns {org.antlr.runtime.BitSet}\n     */\n    or: function(a) {\n\t\tif ( !a ) {\n\t\t\treturn this;\n\t\t}\n        var s = this.clone();\n        s.orInPlace(a);\n        return s;\n    },\n\n    /**\n     * Performs a logical {@link #or} in place.\n     * @param {org.antlr.runtime.BitSet} [a]\n     * @returns {org.antlr.runtime.BitSet}\n     */\n    orInPlace: function(a) {\n\t\tif ( !a ) {\n\t\t\treturn;\n\t\t}\n        // If this is smaller than a, grow this first\n        if (a.bits.length > this.bits.length) {\n            this.setSize(a.bits.length);\n        }\n        var min = Math.min(this.bits.length, a.bits.length),\n            i;\n        for (i = min - 1; i >= 0; i--) {\n            this.bits[i] |= a.bits[i];\n        }\n    },\n\n    /**\n     * Sets the bit specified by the index to false.\n     * @param {Number} bitIndex the index of the bit to be cleared.\n     */\n    remove: function(el) {\n        var n = org.antlr.runtime.BitSet.wordNumber(el);\n        if (n >= this.bits.length) {\n            this.growToInclude(el);\n        }\n        this.bits[n] &= ~org.antlr.runtime.BitSet.bitMask(el);\n    },\n\n    /**\n     * Grows the internal bits array to include at least nwords numbers.\n     * @private\n     * @param {Number} nwords how many words the new set should be\n     * @private\n     */\n    setSize: function(nwords) {\n        var n = nwords - this.bits.length;\n        while (n>=0) {\n            this.bits.push(0);\n            n--;\n        }\n    },\n\n    /**\n     * Returns the number of bits capable of being represented by this bit set\n     * given its current size.\n     * @returns {Number} the maximum number of bits that can be represented at\n     *                   the moment.\n     * @private\n     */\n    numBits: function() {\n        return this.bits.length << org.antlr.runtime.BitSet.LOG_BITS; // num words * bits per word\n    },\n\n    /**\n     * Return how much space is being used by the bits array not\n     * how many actually have member bits on.\n     * @returns {Number} the length of the internal bits array.\n     * @private\n     */\n    lengthInLongWords: function() {\n        return this.bits.length;\n    },\n\n    /**\n     * Is this bit set contained within a?\n     * @param {org.antlr.runtime.BitSet} a bit set\n     * @returns {Boolean} true if and only if a is a subset of this bit set.\n     */\n    subset: function(a) {\n        if (!a) { return false; }\n        return this.and(a).equals(this);\n    },\n\n    /**\n     * Subtract the elements of the argument bit set from this bit set in place.\n     * That is, for each set bit in the argument bit set, set the corresponding\n     * bit in this bit set to false.\n     * @param {org.antlr.runtime.BitSet} a bit set.\n     */\n    subtractInPlace: function(a) {\n        if (!a) { return; }\n        // for all words of 'a', turn off corresponding bits of 'this'\n        var i;\n        for (i = 0; i < this.bits.length && i < a.bits.length; i++) {\n            this.bits[i] &= ~a.bits[i];\n        }\n    },\n\n    /**\n     * Perform a {@link #subtractInPlace} on a clone of this bit set.\n     * @param {org.antlr.runtime.BitSet} a bit set.\n     * @returns {org.antlr.runtime.BitSet} the new bit set.\n     */\n    subtract: function(a) {\n        if (!a || !(a instanceof org.antlr.runtime.BitSet)) { return null; }\n\n        var s = this.clone();\n        s.subtractInPlace(a);\n        return s;\n    },\n\n    /* antlr-java needs this to make its class hierarchy happy . . .\n    toList: function() {\n\t\tthrow new Error(\"BitSet.toList() unimplemented\");\n\t},\n    */\n\n    /**\n     * Creates an array of the indexes of each bit set in this bit set.\n     * @returns {Array}\n     */\n    toArray: function() {\n        var elems = [], //new Array(this.size()),\n            i,\n            en = 0;\n        for (i = 0; i < (this.bits.length << org.antlr.runtime.BitSet.LOG_BITS); i++) {\n            if (this.member(i)) {\n                elems[en++] = i;\n            }\n        }\n        return elems;\n    },\n\n    /**\n     * Returns the internal representation of this bit set.\n     * This representation is an array of numbers, each representing 32 bits.\n     * @returns {Array}\n     */\n    toPackedArray: function() {\n        return this.bits;\n    },\n\n    /**\n     * Returns a string representation of this bit set.\n     * <p>For every index for which this BitSet contains a bit in the set state,\n     * the decimal representation of that index is included in the result.\n     * Such indices are listed in order from lowest to highest, separated by\n     * \", \" (a comma and a space) and surrounded by braces, resulting in the\n     * usual mathematical notation for a set of integers.</p>\n     * \n     * <p>If a grammar g is passed, print g.getTokenDisplayName(i) for each set\n     * index instead of the numerical index.</p>\n     *\n     * <>If two arguments are passed, the first will be used as a custom\n     * separator string.  The second argument is an array whose i-th element\n     * will be added if the corresponding bit is set.</p>\n     *\n     * @param {Object|String} [arg1] an Object with function property\n     *      getTokenDispalyName or a String that will be used as a list\n     *      separator.\n     * @param {Array} [vocabulary] array from which the i-th value will be\n     *      drawn if the corresponding bit is set.  Must pass a string as the\n     *      first argument if using this option.\n     * @return A commma-separated list of values\n     */\n    toString: function() {\n        if (arguments.length===0) {\n            return this.toString1(null);\n        } else {\n            if (org.antlr.lang.isString(arguments[0])) {\n                if (!org.antlr.lang.isValue(arguments[1])) {\n                    return this.toString1(null);\n                } else {\n                    return this.toString2(arguments[0], arguments[1]);\n                }\n            } else {\n                return this.toString1(arguments[0]);\n            }\n        }\n    },\n\n    /**\n     * Transform a bit set into a string by formatting each element as an\n     * integer separator The string to put in between elements\n     * @private\n     * @return A commma-separated list of values\n     */\n    toString1: function(g) {\n        var buf = \"{\",\n            separator = \",\",\n            i,\n\t\t    havePrintedAnElement = false;\n\n        for (i = 0; i < (this.bits.length << org.antlr.runtime.BitSet.LOG_BITS); i++) {\n            if (this.member(i)) {\n                if (i > 0 && havePrintedAnElement ) {\n                    buf += separator;\n                }\n                if ( g ) {\n                    buf += g.getTokenDisplayName(i);\n                }\n                else {\n                    buf += i.toString();\n                }\n\t\t\t\thavePrintedAnElement = true;\n            }\n        }\n        return buf + \"}\";\n    },\n\n    /**\n     * Create a string representation where instead of integer elements, the\n     * ith element of vocabulary is displayed instead.  Vocabulary is a Vector\n     * of Strings.\n     * separator The string to put in between elements\n     * @private\n     * @return A commma-separated list of character constants.\n     */\n    toString2: function(separator, vocabulary) {\n        var str = \"\",\n            i;\n        for (i = 0; i < (this.bits.length << org.antlr.runtime.BitSet.LOG_BITS); i++) {\n            if (this.member(i)) {\n                if (str.length > 0) {\n                    str += separator;\n                }\n                if (i >= vocabulary.size()) {\n                    str += \"'\" + i + \"'\";\n                }\n                else if (!org.antlr.lang.isValue(vocabulary.get(i))) {\n                    str += \"'\" + i + \"'\";\n                }\n                else {\n                    str += vocabulary.get(i);\n                }\n            }\n        }\n        return str;\n    }\n\n    /*\n     * Dump a comma-separated list of the words making up the bit set.\n     * Split each 32 bit number into two more manageable 16 bit numbers.\n     * @returns {String} comma separated list view of the this.bits property.\n     *\n    toStringOfHalfWords: function() {\n        var s = \"\",\n            tmp,\n            i;\n        for (i = 0; i < this.bits.length; i++) {\n            if (i !== 0) {\n                s+=\", \";\n            }\n            tmp = this.bits[i];\n            tmp &= 0xFFFF;\n            s += tmp + \"UL, \";\n            tmp = this.bits[i] >> 16;\n            tmp &= 0xFFFF;\n            s += tmp+\"UL\";\n        }\n\t\treturn s;\n    },\n    */\n\n    /*\n     * Dump a comma-separated list of the words making up the bit set.\n     * This generates a comma-separated list of Java-like long int constants.\n     *\n    toStringOfWords: function() {\n        var s=\"\",\n            i;\n        for (i = 0; i < this.bits.length; i++) {\n            if (i !== 0) {\n                s+=\", \";\n            }\n            s += this.bits[i]+\"L\";\n        }\n        return s;\n    },\n\n    toStringWithRanges: function() {\n        return this.toString();\n    }\n    */\n};\norg.antlr.runtime.CharStream = {\n    EOF: -1\n};\norg.antlr.runtime.CommonToken = function() {\n    var oldToken;\n\n    this.charPositionInLine = -1; // set to invalid position\n    this.channel = 0; // org.antlr.runtime.CommonToken.DEFAULT_CHANNEL\n    this.index = -1;\n\n    if (arguments.length == 1) {\n        if (org.antlr.lang.isNumber(arguments[0])) {\n            this.type = arguments[0];\n        } else {\n            oldToken = arguments[0];\n            this.text = oldToken.getText();\n            this.type = oldToken.getType();\n            this.line = oldToken.getLine();\n            this.index = oldToken.getTokenIndex();\n            this.charPositionInLine = oldToken.getCharPositionInLine();\n            this.channel = oldToken.getChannel();\n            if ( oldToken instanceof org.antlr.runtime.CommonToken ) {\n                this.start = oldToken.start;\n                this.stop = oldToken.stop;\n            }\n        }\n    } else if (arguments.length == 2) {\n        this.type = arguments[0];\n        this.text = arguments[1];\n        this.channel = 0; // org.antlr.runtime.CommonToken.DEFAULT_CHANNEL\n    } else if (arguments.length == 5) {\n        this.input = arguments[0];\n        this.type = arguments[1];\n        this.channel = arguments[2];\n        this.start = arguments[3];\n        this.stop = arguments[4];\n    }\n};\n\norg.antlr.runtime.CommonToken.prototype = {\n    getType: function() {\n        return this.type;\n    },\n\n    setLine: function(line) {\n        this.line = line;\n    },\n\n    getText: function() {\n        if ( org.antlr.lang.isString(this.text) ) {\n            return this.text;\n        }\n        if ( !this.input ) {\n            return null;\n        }\n        this.text = this.input.substring(this.start,this.stop);\n        return this.text;\n    },\n\n    /** Override the text for this token.  getText() will return this text\n     *  rather than pulling from the buffer.  Note that this does not mean\n     *  that start/stop indexes are not valid.  It means that that input\n     *  was converted to a new string in the token object.\n     */\n    setText: function(text) {\n        this.text = text;\n    },\n\n    getLine: function() {\n        return this.line;\n    },\n\n    getCharPositionInLine: function() {\n        return this.charPositionInLine;\n    },\n\n    setCharPositionInLine: function(charPositionInLine) {\n        this.charPositionInLine = charPositionInLine;\n    },\n\n    getChannel: function() {\n        return this.channel;\n    },\n\n    setChannel: function(channel) {\n        this.channel = channel;\n    },\n\n    setType: function(type) {\n        this.type = type;\n    },\n\n    getStartIndex: function() {\n        return this.start;\n    },\n\n    setStartIndex: function(start) {\n        this.start = start;\n    },\n\n    getStopIndex: function() {\n        return this.stop;\n    },\n\n    setStopIndex: function(stop) {\n        this.stop = stop;\n    },\n\n    getTokenIndex: function() {\n        return this.index;\n    },\n\n    setTokenIndex: function(index) {\n        this.index = index;\n    },\n\n    getInputStream: function() {\n        return this.input;\n    },\n\n    setInputStream: function(input) {\n        this.input = input;\n    },\n\n    toString: function() {\n        var channelStr = \"\";\n        if ( this.channel>0 ) {\n            channelStr=\",channel=\"+this.channel;\n        }\n        var txt = this.getText();\n        if ( !org.antlr.lang.isNull(txt) ) {\n            txt = txt.replace(/\\n/g,\"\\\\\\\\n\");\n            txt = txt.replace(/\\r/g,\"\\\\\\\\r\");\n            txt = txt.replace(/\\t/g,\"\\\\\\\\t\");\n        }\n        else {\n            txt = \"<no text>\";\n        }\n        return \"[@\"+this.getTokenIndex()+\",\"+this.start+\":\"+this.stop+\"='\"+txt+\"',<\"+this.type+\">\"+channelStr+\",\"+this.line+\":\"+this.getCharPositionInLine()+\"]\";\n    }\n};\n// NB: Because Token has static members of type CommonToken, the Token dummy\n// constructor is defined in CommonToken.  All methods and vars of Token are\n// defined here.  Token is an interface, not a subclass in the Java runtime.\n\n/**\n * @class Abstract base class of all token types.\n * @name Token\n * @memberOf org.antlr.runtime\n */\norg.antlr.runtime.Token = function() {};\norg.antlr.lang.augmentObject(org.antlr.runtime.Token, /** @lends Token */ {\n    EOR_TOKEN_TYPE: 1,\n\n    /** imaginary tree navigation type; traverse \"get child\" link */\n    DOWN: 2,\n    /** imaginary tree navigation type; finish with a child list */\n    UP: 3,\n\n    MIN_TOKEN_TYPE: 4, // UP+1,\n\n    EOF: org.antlr.runtime.CharStream.EOF,\n    EOF_TOKEN: new org.antlr.runtime.CommonToken(org.antlr.runtime.CharStream.EOF),\n\n    INVALID_TOKEN_TYPE: 0,\n    INVALID_TOKEN: new org.antlr.runtime.CommonToken(0),\n\n    /** In an action, a lexer rule can set token to this SKIP_TOKEN and ANTLR\n     *  will avoid creating a token for this symbol and try to fetch another.\n     */\n    SKIP_TOKEN: new org.antlr.runtime.CommonToken(0),\n\n    /** All tokens go to the parser (unless skip() is called in that rule)\n     *  on a particular \"channel\".  The parser tunes to a particular channel\n     *  so that whitespace etc... can go to the parser on a \"hidden\" channel.\n     */\n    DEFAULT_CHANNEL: 0,\n\n    /** Anything on different channel than DEFAULT_CHANNEL is not parsed\n     *  by parser.\n     */\n    HIDDEN_CHANNEL: 99\n});\n\norg.antlr.lang.augmentObject(org.antlr.runtime.CommonToken, org.antlr.runtime.Token);\norg.antlr.runtime.tree = {};\norg.antlr.runtime.tree.RewriteCardinalityException = function(elementDescription) {\n    this.elementDescription = elementDescription;\n};\norg.antlr.lang.extend(org.antlr.runtime.tree.RewriteCardinalityException, Error, {\n    getMessage: function() {\n\t\tif ( org.antlr.lang.isString(this.elementDescription) ) {\n\t\t\treturn this.elementDescription;\n\t\t}\n\t\treturn null;\n\t},\n    name: function() {\n        return \"org.antlr.runtime.tree.RewriteCardinalityException\";\n    }\n});\norg.antlr.runtime.tree.RewriteEmptyStreamException = function(elementDescription) {\n    var sup = org.antlr.runtime.tree.RewriteEmptyStreamException.superclass; \n    sup.constructor.call(this, elementDescription);\n};\n\norg.antlr.lang.extend(org.antlr.runtime.tree.RewriteEmptyStreamException,\n                  org.antlr.runtime.tree.RewriteCardinalityException, {\n    name: function() {\n        return \"org.antlr.runtime.tree.RewriteEmptyStreamException\";\n    }\n});\norg.antlr.runtime.tree.RewriteEarlyExitException = function(elementDescription) {\n    var sup = org.antlr.runtime.tree.RewriteEarlyExitException.superclass;\n    if (org.antlr.lang.isUndefined(elementDescription)) {\n        elementDescription = null;\n    }\n    sup.constructor.call(this, elementDescription);\n};\n\norg.antlr.lang.extend(org.antlr.runtime.tree.RewriteEarlyExitException,\n                  org.antlr.runtime.tree.RewriteCardinalityException, {\n    name: function() {\n        return \"org.antlr.runtime.tree.RewriteEarlyExitException\";\n    }    \n});\norg.antlr.runtime.MismatchedTreeNodeException = function(expecting, input) {\n    if (expecting && input) {\n        org.antlr.runtime.MismatchedTreeNodeException.superclass.constructor.call(\n                this, input);\n        this.expecting = expecting;\n    }\n};\n\norg.antlr.lang.extend(\n    org.antlr.runtime.MismatchedTreeNodeException,\n    org.antlr.runtime.RecognitionException, {\n    toString: function() {\n        return \"MismatchedTreeNodeException(\" +\n                this.getUnexpectedType() + \"!=\" + this.expecting + \")\";\n    },\n    name: \"org.antlr.runtime.MismatchedTreeNodeException\"\n});\norg.antlr.runtime.tree.BaseTree = function() {};\n\norg.antlr.runtime.tree.BaseTree.prototype = {\n    getChild: function(i) {\n        if ( !this.children || i>=this.children.length ) {\n            return null;\n        }\n        return this.children[i];\n    },\n\n    /** Get the children internal List; note that if you directly mess with\n     *  the list, do so at your own risk.\n     */\n    getChildren: function() {\n        return this.children;\n    },\n\n    getFirstChildWithType: function(type) {\n        var i, t;\n        for (i = 0; this.children && i < this.children.length; i++) {\n            t = this.children[i];\n            if ( t.getType()===type ) {\n                return t;\n            }\n        }    \n        return null;\n    },\n\n    getChildCount: function() {\n        if ( !this.children ) {\n            return 0;\n        }\n        return this.children.length;\n    },\n\n    /** Add t as child of this node.\n     *\n     *  Warning: if t has no children, but child does\n     *  and child isNil then this routine moves children to t via\n     *  t.children = child.children; i.e., without copying the array.\n     */\n    addChild: function(t) {\n        if ( !org.antlr.lang.isValue(t) ) {\n            return; // do nothing upon addChild(null)\n        }\n        var childTree = t, n, i, c;\n        if ( childTree.isNil() ) { // t is an empty node possibly with children\n            if ( this.children && this.children == childTree.children ) {\n                throw new Error(\"attempt to add child list to itself\");\n            }\n            // just add all of childTree's children to this\n            if ( childTree.children ) {\n                if ( this.children ) { // must copy, this has children already\n                    n = childTree.children.length;\n                    for (i = 0; i < n; i++) {\n                        c = childTree.children[i];\n                        this.children.push(c);\n                        // handle double-link stuff for each child of nil root\n                        c.setParent(this);\n                        c.setChildIndex(this.children.length-1);\n                    }\n                }\n                else {\n                    // no children for this but t has children; just set pointer\n                    // call general freshener routine\n                    this.children = childTree.children;\n                    this.freshenParentAndChildIndexes();\n                }\n            }\n        }\n        else { // child is not nil (don't care about children)\n            if ( !this.children ) {\n                this.children = this.createChildrenList(); // create children list on demand\n            }\n            this.children.push(t);\n            childTree.setParent(this);\n            childTree.setChildIndex(this.children.length-1);\n        }\n    },\n\n    /** Add all elements of kids list as children of this node */\n    addChildren: function(kids) {\n        var i, t;\n        for (i = 0; i < kids.length; i++) {\n            t = kids[i];\n            this.addChild(t);\n        }\n    },\n\n    setChild: function(i, t) {\n        if ( !t ) {\n            return;\n        }\n        if ( t.isNil() ) {\n            throw new Error(\"Can't set single child to a list\");\n        }\n        if ( !this.children ) {\n            this.children = this.createChildrenList();\n        }\n        this.children[i] = t;\n        t.setParent(this);\n        t.setChildIndex(i);\n    },\n\n    deleteChild: function(i) {\n        if ( !this.children ) {\n            return null;\n        }\n        if (i<0 || i>=this.children.length) {\n            throw new Error(\"Index out of bounds.\");\n        }\n        var killed = this.children.splice(i, 1)[0];\n        // walk rest and decrement their child indexes\n        this.freshenParentAndChildIndexes(i);\n        return killed;\n    },\n\n    /** Delete children from start to stop and replace with t even if t is\n     *  a list (nil-root tree).  num of children can increase or decrease.\n     *  For huge child lists, inserting children can force walking rest of\n     *  children to set their childindex; could be slow.\n     */\n    replaceChildren: function(startChildIndex, stopChildIndex, t) {\n        if ( !this.children ) {\n            throw new Error(\"indexes invalid; no children in list\");\n        }\n        var replacingHowMany = stopChildIndex - startChildIndex + 1;\n        var replacingWithHowMany;\n        var newTree = t;\n        var newChildren = null;\n        // normalize to a list of children to add: newChildren\n        if ( newTree.isNil() ) {\n            newChildren = newTree.children;\n        }\n        else {\n            newChildren = [];\n            newChildren.push(newTree);\n        }\n        replacingWithHowMany = newChildren.length;\n        var numNewChildren = newChildren.length;\n        var delta = replacingHowMany - replacingWithHowMany;\n        var j, i, child, indexToDelete, c, killed, numToInsert;\n        // if same number of nodes, do direct replace\n        if ( delta === 0 ) {\n            j = 0; // index into new children\n            for (i=startChildIndex; i<=stopChildIndex; i++) {\n                child = newChildren[j];\n                this.children[i] = child;\n                child.setParent(this);\n                child.setChildIndex(i);\n                j++;\n            }\n        }\n        else if ( delta > 0 ) { // fewer new nodes than there were\n            // set children and then delete extra\n            for (j=0; j<numNewChildren; j++) {\n                this.children[startChildIndex+j] = newChildren[j];\n            }\n            indexToDelete = startChildIndex+numNewChildren;\n            for (c=indexToDelete; c<=stopChildIndex; c++) {\n                // delete same index, shifting everybody down each time\n                killed = this.children.splice(indexToDelete, 1)[0];\n            }\n            this.freshenParentAndChildIndexes(startChildIndex);\n        }\n        else { // more new nodes than were there before\n            // fill in as many children as we can (replacingHowMany) w/o moving data\n            for (j=0; j<replacingHowMany; j++) {\n                this.children[startChildIndex+j] = newChildren[j];\n            }\n            numToInsert = replacingWithHowMany-replacingHowMany;\n            for (j=replacingHowMany; j<replacingWithHowMany; j++) {\n                this.children.splice(startChildIndex+j, 0, newChildren[j]);\n            }\n            this.freshenParentAndChildIndexes(startChildIndex);\n        }\n    },\n\n    /** Override in a subclass to change the impl of children list */\n    createChildrenList: function() {\n        return [];\n    },\n\n    isNil: function() {\n        return false;\n    },\n\n    freshenParentAndChildIndexes: function(offset) {\n        if (!org.antlr.lang.isNumber(offset)) {\n            offset = 0;\n        }\n        var n = this.getChildCount(),\n            c,\n            child;\n        for (c = offset; c < n; c++) {\n            child = this.getChild(c);\n            child.setChildIndex(c);\n            child.setParent(this);\n        }\n    },\n\n    sanityCheckParentAndChildIndexes: function(parent, i) {\n        if (arguments.length===0) {\n            parent = null;\n            i = -1;\n        }\n\n        if ( parent!==this.getParent() ) {\n            throw new Error(\"parents don't match; expected \"+parent+\" found \"+this.getParent());\n        }\n        if ( i!==this.getChildIndex() ) {\n            throw new Error(\"child indexes don't match; expected \"+i+\" found \"+this.getChildIndex());\n        }\n        var n = this.getChildCount(),\n            c,\n            child;\n        for (c = 0; c < n; c++) {\n            child = this.getChild(c);\n            child.sanityCheckParentAndChildIndexes(this, c);\n        }\n    },\n\n    /** BaseTree doesn't track child indexes. */\n    getChildIndex: function() {\n        return 0;\n    },\n    setChildIndex: function(index) {\n    },\n\n    /** BaseTree doesn't track parent pointers. */\n    getParent: function() {\n        return null;\n    },\n    setParent: function(t) {\n    },\n\n    getTree: function() {\n        return this;\n    },\n\n    /** Print out a whole tree not just a node */\n    toStringTree: function() {\n        if ( !this.children || this.children.length===0 ) {\n            return this.toString();\n        }\n        var buf = \"\",\n            i,\n            t;\n        if ( !this.isNil() ) {\n            buf += \"(\";\n            buf += this.toString();\n            buf += ' ';\n        }\n        for (i = 0; this.children && i < this.children.length; i++) {\n            t = this.children[i];\n            if ( i>0 ) {\n                buf += ' ';\n            }\n            buf += t.toStringTree();\n        }\n        if ( !this.isNil() ) {\n            buf += \")\";\n        }\n        return buf;\n    },\n\n    getLine: function() {\n        return 0;\n    },\n\n    getCharPositionInLine: function() {\n        return 0;\n    }\n};\norg.antlr.runtime.tree.CommonTree = function(node) {\n    /** What token indexes bracket all tokens associated with this node\n     *  and below?\n     */\n    this.startIndex = -1;\n    this.stopIndex = -1;\n    this.childIndex = -1;\n    this.parent = null;\n    this.token = null;\n\n    if (node instanceof org.antlr.runtime.tree.CommonTree) {\n        org.antlr.runtime.tree.CommonTree.superclass.constructor.call(this, node);\n        this.token = node.token;\n        this.startIndex = node.startIndex;\n        this.stopIndex = node.stopIndex;\n    } else if (node instanceof org.antlr.runtime.CommonToken) {\n        this.token = node;\n    }\n};\norg.antlr.lang.extend(org.antlr.runtime.tree.CommonTree, org.antlr.runtime.tree.BaseTree, {\n    getToken: function() {\n        return this.token;\n    },\n\n    dupNode: function() {\n        return new org.antlr.runtime.tree.CommonTree(this);\n    },\n\n    isNil: function() {\n        return !this.token;\n    },\n\n    getType: function() {\n        if ( !this.token ) {\n            return org.antlr.runtime.Token.INVALID_TOKEN_TYPE;\n        }\n        return this.token.getType();\n    },\n\n    getText: function() {\n        if ( !this.token ) {\n            return null;\n        }\n        return this.token.getText();\n    },\n\n    getLine: function() {\n        if ( !this.token || this.token.getLine()===0 ) {\n            if ( this.getChildCount()>0 ) {\n                return this.getChild(0).getLine();\n            }\n            return 0;\n        }\n        return this.token.getLine();\n    },\n\n    getCharPositionInLine: function() {\n        if ( !this.token || this.token.getCharPositionInLine()===-1 ) {\n            if ( this.getChildCount()>0 ) {\n                return this.getChild(0).getCharPositionInLine();\n            }\n            return 0;\n        }\n        return this.token.getCharPositionInLine();\n    },\n\n    getTokenStartIndex: function() {\n        if ( this.token ) {\n            return this.token.getTokenIndex();\n        }\n        return this.startIndex;\n    },\n\n    setTokenStartIndex: function(index) {\n        this.startIndex = index;\n    },\n\n    getTokenStopIndex: function() {\n        if ( this.token ) {\n            return this.token.getTokenIndex();\n        }\n        return this.stopIndex;\n    },\n\n    setTokenStopIndex: function(index) {\n        this.stopIndex = index;\n    },\n\n    getChildIndex: function() {\n        return this.childIndex;\n    },\n\n    getParent: function() {\n        return this.parent;\n    },\n\n    setParent: function(t) {\n        this.parent = t;\n    },\n\n    setChildIndex: function(index) {\n        this.childIndex = index;\n    },\n\n    toString: function() {\n        if ( this.isNil() ) {\n            return \"nil\";\n        }\n        if ( this.getType()===org.antlr.runtime.Token.INVALID_TOKEN_TYPE ) {\n            return \"<errornode>\";\n        }\n        if ( !this.token ) {\n            return null;\n        }\n        return this.token.getText();\n    }\n});\norg.antlr.runtime.tree.Tree = {\n    INVALID_NODE: new org.antlr.runtime.tree.CommonTree(org.antlr.runtime.Token.INVALID_TOKEN)\n};\norg.antlr.runtime.tree.CommonErrorNode = function(input, start, stop, e) {\n    if ( !stop ||\n            (stop.getTokenIndex() < start.getTokenIndex() &&\n             stop.getType()!=org.antlr.runtime.Token.EOF) )\n    {\n        // sometimes resync does not consume a token (when LT(1) is\n        // in follow set.  So, stop will be 1 to left to start. adjust.\n        // Also handle case where start is the first token and no token\n        // is consumed during recovery; LT(-1) will return null.\n        stop = start;\n    }\n    this.input = input;\n    this.start = start;\n    this.stop = stop;\n    this.trappedException = e;\n};\n\norg.antlr.lang.extend(org.antlr.runtime.tree.CommonErrorNode, org.antlr.runtime.tree.CommonTree, {\n    isNil: function() {\n        return false;\n    },\n\n    getType: function() {\n        return org.antlr.runtime.Token.INVALID_TOKEN_TYPE;\n    },\n\n    getText: function() {\n        var badText = null;\n        if ( this.start instanceof org.antlr.runtime.CommonToken ) {\n            var i = this.start.getTokenIndex();\n            var j = this.stop.getTokenIndex();\n            if ( this.stop.getType() === org.antlr.runtime.Token.EOF ) {\n                j = this.input.size();\n            }\n            badText = this.input.toString(i, j);\n        }\n        else if ( this.start instanceof org.antlr.runtime.tree.CommonTree ) {\n            badText = this.input.toString(this.start, this.stop);\n        }\n        else {\n            // people should subclass if they alter the tree type so this\n            // next one is for sure correct.\n            badText = \"<unknown>\";\n        }\n        return badText;\n    },\n\n    toString: function() {\n        if ( this.trappedException instanceof org.antlr.runtime.MissingTokenException ) {\n            return \"<missing type: \"+\n                   this.trappedException.getMissingType()+\n                   \">\";\n        }\n        else if ( this.trappedException instanceof org.antlr.runtime.UnwantedTokenException ) {\n            return \"<extraneous: \"+\n                   this.trappedException.getUnexpectedToken()+\n                   \", resync=\"+this.getText()+\">\";\n        }\n        else if ( this.trappedException instanceof org.antlr.runtime.MismatchedTokenException ) {\n            return \"<mismatched token: \"+this.trappedException.token+\", resync=\"+this.getText()+\">\";\n        }\n        else if ( this.trappedException instanceof org.antlr.runtime.NoViableAltException ) {\n            return \"<unexpected: \"+this.trappedException.token+\n                   \", resync=\"+this.getText()+\">\";\n        }\n        return \"<error: \"+this.getText()+\">\";\n    }\n});\norg.antlr.runtime.tree.BaseTreeAdaptor = function() {\n    this.uniqueNodeID = 1;\n};\n\norg.antlr.runtime.tree.BaseTreeAdaptor.prototype = {\n    nil: function() {\n        return this.create(null);\n    },\n\n    /** create tree node that holds the start and stop tokens associated\n     *  with an error.\n     *\n     *  If you specify your own kind of tree nodes, you will likely have to\n     *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE\n     *  if no token payload but you might have to set token type for diff\n     *  node type.\n     */\n    errorNode: function(input, start, stop, e) {\n        var t = new org.antlr.runtime.tree.CommonErrorNode(input, start, stop, e);\n        return t;\n    },\n\n    isNil: function(tree) {\n        return tree.isNil();\n    },\n\n    /** This is generic in the sense that it will work with any kind of\n     *  tree (not just Tree interface).  It invokes the adaptor routines\n     *  not the tree node routines to do the construction.  \n     */\n    dupTree: function(t, parent) {\n        if (arguments.length===1) {\n            parent = null;\n        }\n        if ( !t ) {\n            return null;\n        }\n        var newTree = this.dupNode(t);\n        // ensure new subtree root has parent/child index set\n        this.setChildIndex(newTree, this.getChildIndex(t)); // same index in new tree\n        this.setParent(newTree, parent);\n        var n = this.getChildCount(t),\n            i, child, newSubTree;\n        for (i = 0; i < n; i++) {\n            child = this.getChild(t, i);\n            newSubTree = this.dupTree(child, t);\n            this.addChild(newTree, newSubTree);\n        }\n        return newTree;\n    },\n\n    /** Add a child to the tree t.  If child is a flat tree (a list), make all\n     *  in list children of t.  Warning: if t has no children, but child does\n     *  and child isNil then you can decide it is ok to move children to t via\n     *  t.children = child.children; i.e., without copying the array.  Just\n     *  make sure that this is consistent with have the user will build\n     *  ASTs.\n     */\n    addChild: function(t, child) {\n        if ( t && org.antlr.lang.isValue(child) ) {\n            t.addChild(child);\n        }\n    },\n\n    /** If oldRoot is a nil root, just copy or move the children to newRoot.\n     *  If not a nil root, make oldRoot a child of newRoot.\n     *\n     *    old=^(nil a b c), new=r yields ^(r a b c)\n     *    old=^(a b c), new=r yields ^(r ^(a b c))\n     *\n     *  If newRoot is a nil-rooted single child tree, use the single\n     *  child as the new root node.\n     *\n     *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)\n     *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))\n     *\n     *  If oldRoot was null, it's ok, just return newRoot (even if isNil).\n     *\n     *    old=null, new=r yields r\n     *    old=null, new=^(nil r) yields ^(nil r)\n     *\n     *  Return newRoot.  Throw an exception if newRoot is not a\n     *  simple node or nil root with a single child node--it must be a root\n     *  node.  If newRoot is ^(nil x) return x as newRoot.\n     *\n     *  Be advised that it's ok for newRoot to point at oldRoot's\n     *  children; i.e., you don't have to copy the list.  We are\n     *  constructing these nodes so we should have this control for\n     *  efficiency.\n     */\n    becomeRoot: function(newRoot, oldRoot) {\n        if (newRoot instanceof org.antlr.runtime.CommonToken || !newRoot) {\n            newRoot = this.create(newRoot);\n        }\n\n        var newRootTree = newRoot,\n            oldRootTree = oldRoot;\n        if ( !oldRoot ) {\n            return newRoot;\n        }\n        // handle ^(nil real-node)\n        if ( newRootTree.isNil() ) {\n            if ( newRootTree.getChildCount()>1 ) {\n                // TODO: make tree run time exceptions hierarchy\n                throw new Error(\"more than one node as root (TODO: make exception hierarchy)\");\n            }\n            newRootTree = newRootTree.getChild(0);\n        }\n        // add oldRoot to newRoot; addChild takes care of case where oldRoot\n        // is a flat list (i.e., nil-rooted tree).  All children of oldRoot\n        // are added to newRoot.\n        newRootTree.addChild(oldRootTree);\n        return newRootTree;\n    },\n\n    /** Transform ^(nil x) to x */\n    rulePostProcessing: function(root) {\n        var r = root;\n        if ( r && r.isNil() ) {\n            if ( r.getChildCount()===0 ) {\n                r = null;\n            }\n            else if ( r.getChildCount()===1 ) {\n                r = r.getChild(0);\n                // whoever invokes rule will set parent and child index\n                r.setParent(null);\n                r.setChildIndex(-1);\n            }\n        }\n        return r;\n    },\n\n    create: function(tokenType, fromToken) {\n        var text, t;\n        if (arguments.length===2) {\n            if (org.antlr.lang.isString(arguments[1])) {\n                text = arguments[1];\n                fromToken = this.createToken(tokenType, text);\n                t = this.create(fromToken);\n                return t;\n            } else {\n                fromToken = this.createToken(fromToken);\n                fromToken.setType(tokenType);\n                t = this.create(fromToken);\n                return t;\n            }\n        } else if (arguments.length===3) {\n            text = arguments[2];\n            fromToken = this.createToken(fromToken);\n            fromToken.setType(tokenType);\n            fromToken.setText(text);\n            t = this.create(fromToken);\n            return t;\n        }\n    },\n\n    getType: function(t) {\n        t.getType();\n        return 0;\n    },\n\n    setType: function(t, type) {\n        throw new Error(\"don't know enough about Tree node\");\n    },\n\n    getText: function(t) {\n        return t.getText();\n    },\n\n    setText: function(t, text) {\n        throw new Error(\"don't know enough about Tree node\");\n    },\n\n    getChild: function(t, i) {\n        return t.getChild(i);\n    },\n\n    setChild: function(t, i, child) {\n        t.setChild(i, child);\n    },\n\n    deleteChild: function(t, i) {\n        return t.deleteChild(i);\n    },\n\n    getChildCount: function(t) {\n        return t.getChildCount();\n    },\n\n    getUniqueID: function(node) {\n        if ( !this.treeToUniqueIDMap ) {\n             this.treeToUniqueIDMap = {};\n        }\n        var prevID = this.treeToUniqueIDMap[node];\n        if ( org.antlr.lang.isValue(prevID) ) {\n            return prevID;\n        }\n        var ID = this.uniqueNodeID;\n        this.treeToUniqueIDMap[node] = ID;\n        this.uniqueNodeID++;\n        return ID;\n        // GC makes these nonunique:\n        // return System.identityHashCode(node);\n    }\n};\norg.antlr.runtime.tree.CommonTreeAdaptor = function() {};\n\norg.antlr.lang.extend(org.antlr.runtime.tree.CommonTreeAdaptor,\n                  org.antlr.runtime.tree.BaseTreeAdaptor, {\n    /** Duplicate a node.  This is part of the factory;\n     *    override if you want another kind of node to be built.\n     *\n     *  I could use reflection to prevent having to override this\n     *  but reflection is slow.\n     */\n    dupNode: function(t) {\n        if ( !org.antlr.lang.isValue(t) ) {\n            return null;\n        }\n        return t.dupNode();\n    },\n\n    create: function(payload) {\n        if (arguments.length>1) {\n            return org.antlr.runtime.tree.CommonTreeAdaptor.superclass.create.apply(this, arguments);\n        }\n        return new org.antlr.runtime.tree.CommonTree(payload);\n    },\n\n    /** Tell me how to create a token for use with imaginary token nodes.\n     *  For example, there is probably no input symbol associated with imaginary\n     *  token DECL, but you need to create it as a payload or whatever for\n     *  the DECL node as in ^(DECL type ID).\n     *\n     *  If you care what the token payload objects' type is, you should\n     *  override this method and any other createToken variant.\n     *\n     * Tell me how to create a token for use with imaginary token nodes.\n     *  For example, there is probably no input symbol associated with imaginary\n     *  token DECL, but you need to create it as a payload or whatever for\n     *  the DECL node as in ^(DECL type ID).\n     *\n     *  This is a variant of createToken where the new token is derived from\n     *  an actual real input token.  Typically this is for converting '{'\n     *  tokens to BLOCK etc...  You'll see\n     *\n     *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;\n     *\n     *  If you care what the token payload objects' type is, you should\n     *  override this method and any other createToken variant.\n     */\n    createToken: function(fromToken) {\n        if (arguments.length===2) {\n            return new org.antlr.runtime.CommonToken(arguments[0], arguments[1]);\n        } else {\n            return new org.antlr.runtime.CommonToken(arguments[0]);\n        }\n    },\n\n    /** Track start/stop token for subtree root created for a rule.\n     *  Only works with Tree nodes.  For rules that match nothing,\n     *  seems like this will yield start=i and stop=i-1 in a nil node.\n     *  Might be useful info so I'll not force to be i..i.\n     */\n    setTokenBoundaries: function(t, startToken, stopToken) {\n        if ( !org.antlr.lang.isValue(t) ) {\n            return;\n        }\n        var start = 0,\n            stop = 0;\n        if ( org.antlr.lang.isValue(startToken) ) {\n            if (startToken.getTokenIndex) {\n                start = startToken.getTokenIndex();\n            } else if (startToken.getStartIndex) {\n                start = startToken.getStartIndex();\n            } else {\n                start = startToken.getTokenStartIndex();\n            }\n        }\n        if ( org.antlr.lang.isValue(stopToken) ) {\n            if (stop.getTokenIndex) {\n                stop = stopToken.getTokenIndex();\n            } else if (stopToken.getStopIndex) {\n                stop = stopToken.getStopIndex();\n            } else {\n                stop = stopToken.getTokenStopIndex();\n            }\n        }\n        t.setTokenStartIndex(start);\n        t.setTokenStopIndex(stop);\n    },\n\n    getTokenStartIndex: function(t) {\n        if (!t) {\n            return -1;\n        }\n        return t.getTokenStartIndex();\n    },\n\n    getTokenStopIndex: function(t) {\n        if (!t) {\n            return -1;\n        }\n        return t.getTokenStopIndex();\n    },\n\n    getText: function(t) {\n        if (!t) {\n            return null;\n        }\n        return t.getText();\n    },\n\n    getType: function(t) {\n        if (!t) {\n            return org.antlr.runtime.Token.INVALID_TOKEN_TYPE;\n        }\n        return t.getType();\n    },\n\n    /** What is the Token associated with this node?  If\n     *  you are not using CommonTree, then you must\n     *  override this in your own adaptor.\n     */\n    getToken: function(t) {\n        if ( t instanceof org.antlr.runtime.tree.CommonTree ) {\n            return t.getToken();\n        }\n        return null; // no idea what to do\n    },\n\n    getChild: function(t, i) {\n        if (!t) {\n            return null;\n        }\n        return t.getChild(i);\n    },\n\n    getChildCount: function(t) {\n        if (!t) {\n            return 0;\n        }\n        return t.getChildCount();\n    },\n\n    getParent: function(t) {\n        return t.getParent();\n    },\n\n    setParent: function(t, parent) {\n        t.setParent(parent);\n    },\n\n    getChildIndex: function(t) {\n        return t.getChildIndex();\n    },\n\n    setChildIndex: function(t, index) {\n        t.setChildIndex(index);\n    },\n\n    replaceChildren: function(parent, startChildIndex, stopChildIndex, t) {\n        if ( parent ) {\n            parent.replaceChildren(startChildIndex, stopChildIndex, t);\n        }\n    }\n});\norg.antlr.runtime.ANTLRStringStream = function(data) {\n    /**\n     * Location in the stream.\n     * Ranges from 0 to (stream length - 1).\n     * @private\n     * @type Number\n     */\n    this.p = 0;\n    this.line = 1;\n    this.charPositionInLine = 0;\n    this.markDepth = 0;\n    this.markers = null;\n    this.lastMarker = null;\n    this.data = data;\n    this.n = data.length;\n};\n\norg.antlr.runtime.ANTLRStringStream.prototype = {\n    /**\n     * Reset the stream so that it's in the same state it was\n     * when the object was created *except* the data array is not\n     * touched.\n     */\n    reset: function() {\n       this.p = 0;\n       this.line = 1;\n       this.charPositionInLine = 0;\n       this.markDepth = 0;\n    },\n\n    /**\n     * Consume the next character of data in the stream.\n     */\n    consume: function() {\n        //console.log(\"prev p=\"+ this.p +\", c=\"+ this.data.charAt(this.p));\n        if ( this.p < this.n ) {\n            this.charPositionInLine++;\n            if ( this.data.charAt(this.p)===\"\\n\" ) {\n                this.line++;\n                this.charPositionInLine=0;\n            }\n            this.p++;\n            //console.log(\"p moves to \" + this.p + \" (c='\"+ this.data.charAt(this.p) +\"')\");\n        }\n    },\n\n    /**\n     * Get character at current input pointer + i ahead where i=1 is next int.\n     * Negative indexes are allowed.  LA(-1) is previous token (token\n     * just matched).  LA(-i) where i is before first token should\n     * yield -1, invalid char / EOF.\n     * @param {Number} i non-zero amount of lookahead or lookback\n     * @returns {String|Number} The charcter at the specified position or -1 if\n     *      you fell off either end of the stream.\n     */\n    LA: function(i) {\n        if ( i<0 ) {\n            i++; // e.g., translate LA(-1) to use offset i=0; then data[p+0-1]\n        }\n\n        var new_pos = this.p+i-1;\n        if (new_pos>=this.n || new_pos<0) {\n            return org.antlr.runtime.CharStream.EOF;\n        }\n        return this.data.charAt(new_pos);\n    },\n\n\n    /**\n     * Return the current input symbol index 0..n where n indicates the\n     * last symbol has been read.  The index is the index of char to\n     * be returned from LA(1) (i.e. the one about to be consumed).\n     * @returns {Number} the index of the current input symbol\n     */\n    index: function() {\n        return this.p;\n    },\n\n    /**\n     * The length of this stream.\n     * @returns {Number} the length of this stream.\n     */\n    size: function() {\n        return this.n;\n    },\n\n    /**\n     * Tell the stream to start buffering if it hasn't already.  Return\n     * current input position, index(), or some other marker so that\n     * when passed to rewind() you get back to the same spot.\n     * rewind(mark()) should not affect the input cursor.  The Lexer\n     * tracks line/col info as well as input index so its markers are\n     * not pure input indexes.  Same for tree node streams.\n     *\n     * <p>Marking is a mechanism for storing the current position of a stream\n     * in a stack.  This corresponds with the predictive look-ahead mechanism\n     * used in Lexers.</p>\n     * @returns {Number} the current size of the mark stack.\n     */\n    mark: function() {\n        if ( !this.markers ) {\n            this.markers = [];\n            this.markers.push(null); // depth 0 means no backtracking, leave blank\n        }\n        this.markDepth++;\n        var state = null;\n        if ( this.markDepth>=this.markers.length ) {\n            state = {};\n            this.markers.push(state);\n        }\n        else {\n            state = this.markers[this.markDepth];\n        }\n        state.p = this.p;\n        state.line = this.line;\n        state.charPositionInLine = this.charPositionInLine;\n        this.lastMarker = this.markDepth;\n        return this.markDepth;\n    },\n\n    /**\n     * Rewind to the input position of the last marker.\n     * Used currently only after a cyclic DFA and just\n     * before starting a sem/syn predicate to get the\n     * input position back to the start of the decision.\n     * Do not \"pop\" the marker off the state.  mark(i)\n     * and rewind(i) should balance still. It is\n     * like invoking rewind(last marker) but it should not \"pop\"\n     * the marker off.  It's like seek(last marker's input position).\n     * @param {Number} [m] the index in the mark stack to load instead of the\n     *      last.\n     */\n    rewind: function(m) {\n        if (!org.antlr.lang.isNumber(m)) {\n            m = this.lastMarker;\n        }\n\n        var state = this.markers[m];\n        // restore stream state\n        this.seek(state.p);\n        this.line = state.line;\n        this.charPositionInLine = state.charPositionInLine;\n        this.release(m);\n    },\n\n    /**\n     * You may want to commit to a backtrack but don't want to force the\n     * stream to keep bookkeeping objects around for a marker that is\n     * no longer necessary.  This will have the same behavior as\n     * rewind() except it releases resources without the backward seek.\n     * This must throw away resources for all markers back to the marker\n     * argument.  So if you're nested 5 levels of mark(), and then release(2)\n     * you have to release resources for depths 2..5.\n     * @param {Number} marker the mark depth above which all mark states will\n     *      be released.\n     */\n    release: function(marker) {\n        // unwind any other markers made after m and release m\n        this.markDepth = marker;\n        // release this marker\n        this.markDepth--;\n    },\n\n    /**\n     * Set the input cursor to the position indicated by index.  This is\n     * normally used to seek ahead in the input stream.  No buffering is\n     * required to do this unless you know your stream will use seek to\n     * move backwards such as when backtracking.\n     *\n     * <p>This is different from rewind in its multi-directional\n     * requirement and in that its argument is strictly an input cursor\n     * (index).</p>\n     *\n     * <p>For char streams, seeking forward must update the stream state such\n     * as line number.  For seeking backwards, you will be presumably\n     * backtracking using the mark/rewind mechanism that restores state and\n     * so this method does not need to update state when seeking backwards.</p>\n     *\n     * <p>Currently, this method is only used for efficient backtracking using\n     * memoization, but in the future it may be used for incremental\n     * parsing.</p>\n     *\n     * <p>The index is 0..n-1.  A seek to position i means that LA(1) will\n     * return the ith symbol.  So, seeking to 0 means LA(1) will return the\n     * first element in the stream.</p>\n     *\n     * <p>Esentially this method method moves the input position,\n     * {@link #consume}-ing data if necessary.</p>\n     *\n     * @param {Number} index the position to seek to.\n     */\n    seek: function(index) {\n        if ( index<=this.p ) {\n            this.p = index; // just jump; don't update stream state (line, ...)\n            return;\n        }\n        // seek forward, consume until p hits index\n        while ( this.p<index ) {\n            this.consume();\n        }\n    },\n\n    /**\n     * Retrieve a substring from this stream.\n     * @param {Number} start the starting index of the substring (inclusive).\n     * @param {Number} stop the last index of the substring (inclusive).\n     * @returns {String}\n     */\n    substring: function(start, stop) {\n        return this.data.substr(start,stop-start+1);\n    },\n\n    /**\n     * Return the current line position in the stream.\n     * @returns {Number} the current line position in the stream (1..numlines).\n     */\n    getLine: function() {\n        return this.line;\n    },\n\n    /**\n     * Get the index of the character relative to the beginning of the line.\n     * Ranges from 0 to (length of line - 1).\n     * @returns {Number}\n     */\n    getCharPositionInLine: function() {\n        return this.charPositionInLine;\n    },\n\n    /**\n     * Set the current line in the input stream.\n     * This is used internally when performing rewinds.\n     * @param {Number} line\n     * @private\n     */\n    setLine: function(line) {\n        this.line = line;\n    },\n\n    /**\n     * Set the index of the character relative to the beginning of the line.\n     * Ranges from 0 to (length of line - 1).\n     * @param {Number} pos\n     * @private\n     */\n    setCharPositionInLine: function(pos) {\n        this.charPositionInLine = pos;\n    },\n\n    /** Where are you getting symbols from? Normally, implementations will\n     *  pass the buck all the way to the lexer who can ask its input stream\n     *  for the file name or whatever.\n     */\n    getSourceName: function() {\n        return null;\n    }\n};\norg.antlr.runtime.ANTLRStringStream.LT = org.antlr.runtime.ANTLRStringStream.LA;\norg.antlr.runtime.CommonTokenStream = function(tokenSource, channel) {\n    this.p = -1;\n    this.channel = org.antlr.runtime.Token.DEFAULT_CHANNEL;\n    this.v_discardOffChannelTokens = false;\n\n    this.tokens = [];\n    if (arguments.length >= 2) {\n        this.channel = channel;\n    } else if (arguments.length === 1) {\n        this.tokenSource = tokenSource;\n    }\n};\n\norg.antlr.runtime.CommonTokenStream.prototype = {\n    /** Reset this token stream by setting its token source. */\n    setTokenSource: function(tokenSource) {\n        this.tokenSource = tokenSource;\n        this.tokens = [];\n        this.p = -1;\n        this.channel = org.antlr.runtime.Token.DEFAULT_CHANNEL;\n    },\n\n    /** Load all tokens from the token source and put in tokens.\n     *  This is done upon first LT request because you might want to\n     *  set some token type / channel overrides before filling buffer.\n     */\n    fillBuffer: function() {\n        var index = 0,\n            t = this.tokenSource.nextToken(),\n            discard,\n            channelI;\n        while ( org.antlr.lang.isValue(t) && \n                t.getType()!=org.antlr.runtime.CharStream.EOF )\n        {\n            discard = false;\n            // is there a channel override for token type?\n            if ( this.channelOverrideMap ) {\n                channelI = this.channelOverrideMap[t.getType()];\n                if ( org.antlr.lang.isValue(channelI) ) {\n                    t.setChannel(channelI);\n                }\n            }\n            if ( this.discardSet && this.discardSet[t.getType()] )\n            {\n                discard = true;\n            }\n            else if ( this.v_discardOffChannelTokens &&\n                    t.getChannel()!=this.channel )\n            {\n                discard = true;\n            }\n            if ( !discard )    {\n                t.setTokenIndex(index);\n                this.tokens.push(t);\n                index++;\n            }\n            t = this.tokenSource.nextToken();\n        }\n        // leave p pointing at first token on channel\n        this.p = 0;\n        this.p = this.skipOffTokenChannels(this.p);\n    },\n\n    /** Move the input pointer to the next incoming token.  The stream\n     *  must become active with LT(1) available.  consume() simply\n     *  moves the input pointer so that LT(1) points at the next\n     *  input symbol. Consume at least one token.\n     *\n     *  Walk past any token not on the channel the parser is listening to.\n     */\n    consume: function() {\n        if ( this.p<this.tokens.length ) {\n            this.p++;\n            this.p = this.skipOffTokenChannels(this.p); // leave p on valid token\n        }\n    },\n\n    /** Given a starting index, return the index of the first on-channel\n     *  token.\n     */\n    skipOffTokenChannels: function(i) {\n        var n = this.tokens.length;\n        while ( i<n && (this.tokens[i]).getChannel()!=this.channel ) {\n            i++;\n        }\n        return i;\n    },\n\n    skipOffTokenChannelsReverse: function(i) {\n        while ( i>=0 && (this.tokens[i]).getChannel()!=this.channel ) {\n            i--;\n        }\n        return i;\n    },\n\n    /** A simple filter mechanism whereby you can tell this token stream\n     *  to force all tokens of type ttype to be on channel.  For example,\n     *  when interpreting, we cannot exec actions so we need to tell\n     *  the stream to force all WS and NEWLINE to be a different, ignored\n     *  channel.\n     */\n    setTokenTypeChannel: function(ttype, channel) {\n        if ( !this.channelOverrideMap ) {\n            this.channelOverrideMap = {};\n        }\n        this.channelOverrideMap[ttype] = channel;\n    },\n\n    discardTokenType: function(ttype) {\n        if ( !this.discardSet ) {\n            this.discardSet = {};\n        }\n        this.discardSet[ttype] = true;\n    },\n\n    discardOffChannelTokens: function(b) {\n        this.v_discardOffChannelTokens = b;\n    },\n\n    /** Given a start and stop index, return a List of all tokens in\n     *  the token type BitSet.  Return null if no tokens were found.  This\n     *  method looks at both on and off channel tokens.\n     */\n    getTokens: function(start, stop, types) {\n        if ( this.p === -1 ) {\n            this.fillBuffer();\n        }\n\n        if (arguments.length===0) {\n            return this.tokens;\n        }\n\n        if (org.antlr.lang.isArray(types)) {\n            types = new org.antlr.runtime.BitSet(types);\n        } else if (org.antlr.lang.isNumber(types)) {\n            types = org.antlr.runtime.BitSet.of(types);\n        }\n\n        if ( stop>=this.tokens.length ) {\n            stop=this.tokens.length-1;\n        }\n        if ( start<0 ) {\n            start=0;\n        }\n        if ( start>stop ) {\n            return null;\n        }\n\n        // list = tokens[start:stop]:{Token t, t.getType() in types}\n        var filteredTokens = [],\n            i,\n            t;\n        for (i=start; i<=stop; i++) {\n            t = this.tokens[i];\n            if ( !this.types || types.member(t.getType()) ) {\n                filteredTokens.push(t);\n            }\n        }\n        if ( filteredTokens.length===0 ) {\n            filteredTokens = null;\n        }\n        return filteredTokens;\n    },\n\n    /** Get the ith token from the current position 1..n where k=1 is the\n     *  first symbol of lookahead.\n     */\n    LT: function(k) {\n        if ( this.p === -1 ) {\n            this.fillBuffer();\n        }\n        if ( k===0 ) {\n            return null;\n        }\n        if ( k<0 ) {\n            return this.LB(-1*k);\n        }\n        if ( (this.p+k-1) >= this.tokens.length ) {\n            return org.antlr.runtime.Token.EOF_TOKEN;\n        }\n        var i = this.p,\n            n = 1;\n        // find k good tokens\n        while ( n<k ) {\n            // skip off-channel tokens\n            i = this.skipOffTokenChannels(i+1); // leave p on valid token\n            n++;\n        }\n        if ( i>=this.tokens.length ) {\n            return org.antlr.runtime.Token.EOF_TOKEN;\n        }\n        return this.tokens[i];\n    },\n\n    /** Look backwards k tokens on-channel tokens */\n    LB: function(k) {\n        if ( this.p === -1 ) {\n            this.fillBuffer();\n        }\n        if ( k===0 ) {\n            return null;\n        }\n        if ( (this.p-k)<0 ) {\n            return null;\n        }\n\n        var i = this.p,\n            n = 1;\n        // find k good tokens looking backwards\n        while ( n<=k ) {\n            // skip off-channel tokens\n            i = this.skipOffTokenChannelsReverse(i-1); // leave p on valid token\n            n++;\n        }\n        if ( i<0 ) {\n            return null;\n        }\n        return this.tokens[i];\n    },\n\n    /** Return absolute token i; ignore which channel the tokens are on;\n     *  that is, count all tokens not just on-channel tokens.\n     */\n    get: function(i) {\n        return this.tokens[i];\n    },\n\n    LA: function(i) {\n        return this.LT(i).getType();\n    },\n\n    mark: function() {\n        if ( this.p === -1 ) {\n            this.fillBuffer();\n        }\n        this.lastMarker = this.index();\n        return this.lastMarker;\n    },\n\n    release: function(marker) {\n        // no resources to release\n    },\n\n    size: function() {\n        return this.tokens.length;\n    },\n\n    index: function() {\n        return this.p;\n    },\n\n    rewind: function(marker) {\n        if (!org.antlr.lang.isNumber(marker)) {\n            marker = this.lastMarker;\n        }\n        this.seek(marker);\n    },\n\n    reset: function() {\n        this.p = -1;\n        this.lastMarker = 0;\n    },\n\n    seek: function(index) {\n        this.p = index;\n    },\n\n    getTokenSource: function() {\n        return this.tokenSource;\n    },\n\n    getSourceName: function() {\n        return this.getTokenSource().getSourceName();\n    },\n\n    toString: function(start, stop) {\n        if (arguments.length===0) {\n            if ( this.p === -1 ) {\n                this.fillBuffer();\n            }\n            start = 0;\n            stop = this.tokens.length-1;\n        }\n\n        if (!org.antlr.lang.isNumber(start) && !org.antlr.lang.isNumber(stop)) {\n            if ( org.antlr.lang.isValue(start) && org.antlr.lang.isValue(stop) ) {\n                start = start.getTokenIndex();\n                stop = stop.getTokenIndex();\n            } else {\n                return null;\n            }\n        }\n\n        var buf = \"\",\n            i;\n \n        if ( start<0 || stop<0 ) {\n            return null;\n        }\n        if ( this.p == -1 ) {\n            this.fillBuffer();\n        }\n        if ( stop>=this.tokens.length ) {\n            stop = this.tokens.length-1;\n        }\n        for (i = start; i <= stop; i++) {\n            t = this.tokens[i];\n            buf = buf + this.tokens[i].getText();\n        }\n        return buf;\n    }\n};\n\norg.antlr.runtime.TokenRewriteStream = function() {\n    var sup = org.antlr.runtime.TokenRewriteStream.superclass;\n    this.programs = null;\n    this.lastRewriteTokenIndexes = null;\n\n\n    if (arguments.length===0) {\n        this.init();\n    } else {\n        sup.constructor.apply(this, arguments);\n        this.init();\n    }\n};\n\n(function(){\nvar trs = org.antlr.runtime.TokenRewriteStream;\n\norg.antlr.lang.augmentObject(trs, {\n    DEFAULT_PROGRAM_NAME: \"default\",\n    PROGRAM_INIT_SIZE: 100,\n    MIN_TOKEN_INDEX: 0\n});\n\n//\n// Define the rewrite operation hierarchy\n//\n\ntrs.RewriteOperation = function(index, text) {\n    this.index = index;\n    this.text = text;\n};\ntrs.RewriteOperation.prototype = {\n    execute: function(buf) {\n        return this.index;\n    },\n    toString: function() {\n        /*String opName = getClass().getName();\n        int $index = opName.indexOf('$');\n        opName = opName.substring($index+1, opName.length());\n        return opName+\"@\"+index+'\"'+text+'\"';*/\n        return this.text;\n    }\n};\n\ntrs.InsertBeforeOp = function(index, text) {\n    trs.InsertBeforeOp.superclass.constructor.call(this, index, text);\n};\norg.antlr.lang.extend(trs.InsertBeforeOp, trs.RewriteOperation, {\n    execute: function(buf) {\n        buf.push(this.text);\n        return this.index;\n    }\n});\ntrs.ReplaceOp = function(from, to, text) {\n    trs.ReplaceOp.superclass.constructor.call(this, from, text); \n    this.lastIndex = to;\n};\norg.antlr.lang.extend(trs.ReplaceOp, trs.RewriteOperation, {\n    execute: function(buf) {\n        if (org.antlr.lang.isValue(this.text)) {\n            buf.push(this.text);\n        }\n        return this.lastIndex+1;\n    }\n});\n\ntrs.DeleteOp = function(from, to) {\n    trs.DeleteOp.superclass.constructor.call(this, from, to); \n};\norg.antlr.lang.extend(trs.DeleteOp, trs.ReplaceOp);\n\norg.antlr.lang.extend(trs, org.antlr.runtime.CommonTokenStream, {\n    init: function() {\n        this.programs = {};\n        this.programs[trs.DEFAULT_PROGRAM_NAME] = [];\n        this.lastRewriteTokenIndexes = {};\n    },\n\n    /** Rollback the instruction stream for a program so that\n     *  the indicated instruction (via instructionIndex) is no\n     *  longer in the stream.  UNTESTED!\n     */\n    rollback: function() {\n        var programName,\n            instructionIndex;\n\n        if (arguments.length===1) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            instructionIndex = arguments[0];\n        } else if (arguments.length===2) {\n            programName = arguments[0];\n            instructionIndex = arguments[1];\n        }\n        var is = this.programs[programName];\n        if (is) {\n            programs[programName] = is.slice(trs.MIN_TOKEN_INDEX, this.instructionIndex);\n        }\n    },\n\n    /** Reset the program so that no instructions exist */\n    deleteProgram: function(programName) {\n        programName = programName || trs.DEFAULT_PROGRAM_NAME;\n        this.rollback(programName, trs.MIN_TOKEN_INDEX);\n    },\n\n    /** Add an instruction to the rewrite instruction list ordered by\n     *  the instruction number (use a binary search for efficiency).\n     *  The list is ordered so that toString() can be done efficiently.\n     *\n     *  When there are multiple instructions at the same index, the instructions\n     *  must be ordered to ensure proper behavior.  For example, a delete at\n     *  index i must kill any replace operation at i.  Insert-before operations\n     *  must come before any replace / delete instructions.  If there are\n     *  multiple insert instructions for a single index, they are done in\n     *  reverse insertion order so that \"insert foo\" then \"insert bar\" yields\n     *  \"foobar\" in front rather than \"barfoo\".  This is convenient because\n     *  I can insert new InsertOp instructions at the index returned by\n     *  the binary search.  A ReplaceOp kills any previous replace op.  Since\n     *  delete is the same as replace with null text, i can check for\n     *  ReplaceOp and cover DeleteOp at same time. :)\n     */\n    addToSortedRewriteList: function() {\n        var programName,\n            op;\n        if (arguments.length===1) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            op = arguments[0];\n        } else if (arguments.length===2) {\n            programName = arguments[0];\n            op = arguments[1];\n        }\n\n        var rewrites = this.getProgram(programName);\n        var len, pos, searchOp, replaced, prevOp, i;\n        for (pos=0, len=rewrites.length; pos<len; pos++) {\n            searchOp = rewrites[pos];\n            if (searchOp.index===op.index) {\n                // now pos is the index in rewrites of first op with op.index\n\n                // an instruction operating already on that index was found;\n                // make this one happen after all the others\n                if (op instanceof trs.ReplaceOp) {\n                    replaced = false;\n                    // look for an existing replace\n                    for (i=pos; i<rewrites.length; i++) {\n                        prevOp = rewrites[pos];\n                        if (prevOp.index!==op.index) {\n                            break;\n                        }\n                        if (prevOp instanceof trs.ReplaceOp) {\n                            rewrites[pos] = op; // replace old with new\n                            replaced=true;\n                            break;\n                        }\n                        // keep going; must be an insert\n                    }\n                    if ( !replaced ) {\n                        // add replace op to the end of all the inserts\n                        rewrites.splice(i, 0, op);\n                    }\n                } else {\n                    // inserts are added in front of existing inserts\n                    rewrites.splice(pos, 0, op);\n                }\n                break;\n            } else if (searchOp.index > op.index) {\n                rewrites.splice(pos, 0, op);\n                break;\n            }\n        }\n        if (pos===len) {\n            rewrites.push(op);\n        }\n    },\n\n    insertAfter: function() {\n        var index, programName, text;\n        if (arguments.length===2) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            index = arguments[0];\n            text = arguments[1];\n        } else if (arguments.length===3) {\n            programName = arguments[0];\n            index = arguments[1];\n            text = arguments[2];\n        }\n\n        if (index instanceof org.antlr.runtime.CommonToken) {\n            // index is a Token, grab it's stream index\n            index = index.index; // that's ugly\n        }\n\n        // insert after is the same as insert before the next index\n        this.insertBefore(programName, index+1, text);\n    },\n\n    insertBefore: function() {\n        var index, programName, text;\n        if (arguments.length===2) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            index = arguments[0];\n            text = arguments[1];\n        } else if (arguments.length===3) {\n            programName = arguments[0];\n            index = arguments[1];\n            text = arguments[2];\n        }\n\n        if (index instanceof org.antlr.runtime.CommonToken) {\n            // index is a Token, grab it's stream index\n            index = index.index; // that's ugly\n        }\n\n        this.addToSortedRewriteList(\n                programName,\n                new trs.InsertBeforeOp(index,text)\n                );\n    },\n\n    replace: function() {\n        var programName, first, last, text;\n        if (arguments.length===2) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            first = arguments[0];\n            last = arguments[0];\n            text = arguments[1];\n        } else if (arguments.length===3) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            first = arguments[0];\n            last = arguments[1];\n            text = arguments[2];\n        } if (arguments.length===4) {\n            programName = arguments[0];\n            first = arguments[1];\n            last = arguments[2];\n            text = arguments[3];\n        } \n\n        if (first instanceof org.antlr.runtime.CommonToken) {\n            first = first.index;\n        }\n\n        if (last instanceof org.antlr.runtime.CommonToken) {\n            last = last.index; // that's ugly\n        }\n\n        if ( first > last || last<0 || first<0 ) {\n            return;\n        }\n        this.addToSortedRewriteList(\n                programName,\n                new trs.ReplaceOp(first, last, text));\n    },\n\n    // !!! API Break: delete is a JS keyword, so using remove instead.\n    remove: function() {\n        // convert arguments to a real array\n        var args=[], i=arguments.length-1;\n        while (i>=0) {\n            args[i] = arguments[i];\n            i--;\n        }\n\n        args.push(\"\");\n        this.replace.apply(this, args);\n    },\n\n    getLastRewriteTokenIndex: function(programName) {\n        programName = programName || trs.DEFAULT_PROGRAM_NAME;\n        return this.lastRewriteTokenIndexes[programName] || -1;\n    },\n\n    setLastRewriteTokenIndex: function(programName, i) {\n        this.lastRewriteTokenIndexes[programName] = i;\n    },\n\n    getProgram: function(name) {\n        var is = this.programs[name];\n        if ( !is ) {\n            is = this.initializeProgram(name);\n        }\n        return is;\n    },\n\n    initializeProgram: function(name) {\n        var is = [];\n        this.programs[name] = is;\n        return is;\n    },\n\n    toOriginalString: function(start, end) {\n        if (!org.antlr.lang.isNumber(start)) {\n            start = trs.MIN_TOKEN_INDEX;\n        }\n        if (!org.antlr.lang.isNumber(end)) {\n            end = this.size()-1;\n        }\n\n        var buf = [], i;\n        for (i=start; i>=trs.MIN_TOKEN_INDEX && i<=end && i<this.tokens.length; i++) {\n            buf.push(this.get(i).getText());\n        }\n        return buf.join(\"\");\n    },\n\n    toString: function() {\n        var programName, start, end;\n        if (arguments.length===0) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            start = trs.MIN_TOKEN_INDEX;\n            end = this.size() - 1;\n        } else if (arguments.length===1) {\n            programName = arguments[0];\n            start = trs.MIN_TOKEN_INDEX;\n            end = this.size() - 1;\n        } else if (arguments.length===2) {\n            programName = trs.DEFAULT_PROGRAM_NAME;\n            start = arguments[0];\n            end = arguments[1];\n        }\n\n        var rewrites = this.programs[programName];\n        if ( !rewrites || rewrites.length===0 ) {\n            return this.toOriginalString(start,end);\n        }\n\n        /// Index of first rewrite we have not done\n        var rewriteOpIndex = 0,\n            tokenCursor=start,\n            buf = [],\n            op;\n        while ( tokenCursor>=trs.MIN_TOKEN_INDEX &&\n                tokenCursor<=end &&\n                tokenCursor<this.tokens.length )\n        {\n            // execute instructions associated with this token index\n            if ( rewriteOpIndex<rewrites.length ) {\n                op = rewrites[rewriteOpIndex];\n\n                // skip all ops at lower index\n                while (op.index<tokenCursor && rewriteOpIndex<rewrites.length) {\n                    rewriteOpIndex++;\n                    if ( rewriteOpIndex<rewrites.length ) {\n                        op = rewrites[rewriteOpIndex];\n                    }\n                }\n\n                // while we have ops for this token index, exec them\n                while (tokenCursor===op.index && rewriteOpIndex<rewrites.length) {\n                    //System.out.println(\"execute \"+op+\" at instruction \"+rewriteOpIndex);\n                    tokenCursor = op.execute(buf);\n                    //System.out.println(\"after execute tokenCursor = \"+tokenCursor);\n                    rewriteOpIndex++;\n                    if ( rewriteOpIndex<rewrites.length ) {\n                        op = rewrites[rewriteOpIndex];\n                    }\n                }\n            }\n            // dump the token at this index\n            if ( tokenCursor<=end ) {\n                buf.push(this.get(tokenCursor).getText());\n                tokenCursor++;\n            }\n        }\n        // now see if there are operations (append) beyond last token index\n        var opi;\n        for (opi=rewriteOpIndex; opi<rewrites.length; opi++) {\n            op = rewrites[opi];\n            if ( op.index>=this.size() ) {\n                op.execute(buf); // must be insertions if after last token\n            }\n        }\n\n        return buf.join(\"\");\n    },\n\n    toDebugString: function(start, end) {\n        if (!org.antlr.lang.isNumber(start)) {\n            start = trs.MIN_TOKEN_INDEX;\n        }\n        if (!org.antlr.lang.isNumber(end)) {\n            end = this.size()-1;\n        }\n\n        var buf = [],\n            i;\n        for (i=start; i>=trs.MIN_TOKEN_INDEX && i<=end && i<this.tokens.length; i++) {\n            buf.push(this.get(i));\n        }\n        return buf.join(\"\");\n    }\n});\n\n})();\norg.antlr.runtime.tree.TreeNodeStream = function() {};\norg.antlr.runtime.tree.CommonTreeNodeStream = function(adaptor,\n                                                    tree,\n                                                    initialBufferSize)\n{\n    if (arguments.length===1) {\n        tree = adaptor;\n        adaptor = new org.antlr.runtime.tree.CommonTreeAdaptor();\n    }\n    if (arguments.length <= 2) {\n        initialBufferSize =\n            org.antlr.runtime.tree.CommonTreeNodeStream.DEFAULT_INITIAL_BUFFER_SIZE;\n    }\n\n    /** Reuse same DOWN, UP navigation nodes unless this is true */\n    this.uniqueNavigationNodes = false;\n    this.p = -1;\n\n    var Token = org.antlr.runtime.Token;\n    this.root = tree;\n    this.adaptor = adaptor;\n    this.nodes = []; //new ArrayList(initialBufferSize);\n    this.down = this.adaptor.create(Token.DOWN, \"DOWN\");\n    this.up = this.adaptor.create(Token.UP, \"UP\");\n    this.eof = this.adaptor.create(Token.EOF, \"EOF\");\n};\n\norg.antlr.lang.augmentObject(org.antlr.runtime.tree.CommonTreeNodeStream, {\n    DEFAULT_INITIAL_BUFFER_SIZE: 100,\n    INITIAL_CALL_STACK_SIZE: 10\n});\n\norg.antlr.lang.extend(org.antlr.runtime.tree.CommonTreeNodeStream,\n                  org.antlr.runtime.tree.TreeNodeStream, \n{\n    StreamIterator: function() {\n        var i = 0,\n            nodes = this.nodes,\n            eof = this.eof;\n\n        return {\n            hasNext: function() {\n                return i<nodes.length;\n            },\n\n            next: function() {\n                var current = i;\n                i++;\n                if ( current < nodes.length ) {\n                    return nodes[current];\n                }\n                return eof;\n            },\n\n            remove: function() {\n                throw new Error(\"cannot remove nodes from stream\");\n            }\n        };\n    },\n\n    /** Walk tree with depth-first-search and fill nodes buffer.\n     *  Don't do DOWN, UP nodes if its a list (t is isNil).\n     */\n    fillBuffer: function(t) {\n        var reset_p = false;\n        if (org.antlr.lang.isUndefined(t)) {\n            t = this.root;\n            reset_p = true;\n        }\n\n        var nil = this.adaptor.isNil(t);\n        if ( !nil ) {\n            this.nodes.push(t); // add this node\n        }\n        // add DOWN node if t has children\n        var n = this.adaptor.getChildCount(t);\n        if ( !nil && n>0 ) {\n            this.addNavigationNode(org.antlr.runtime.Token.DOWN);\n        }\n        // and now add all its children\n        var c, child;\n        for (c=0; c<n; c++) {\n            child = this.adaptor.getChild(t,c);\n            this.fillBuffer(child);\n        }\n        // add UP node if t has children\n        if ( !nil && n>0 ) {\n            this.addNavigationNode(org.antlr.runtime.Token.UP);\n        }\n\n        if (reset_p) {\n            this.p = 0; // buffer of nodes intialized now\n        }\n    },\n\n    getNodeIndex: function(node) {\n        if ( this.p==-1 ) {\n            this.fillBuffer();\n        }\n        var i, t;\n        for (i=0; i<this.nodes.length; i++) {\n            t = this.nodes[i];\n            if ( t===node ) {\n                return i;\n            }\n        }\n        return -1;\n    },\n\n    /** As we flatten the tree, we use UP, DOWN nodes to represent\n     *  the tree structure.  When debugging we need unique nodes\n     *  so instantiate new ones when uniqueNavigationNodes is true.\n     */\n    addNavigationNode: function(ttype) {\n        var navNode = null;\n        if ( ttype===org.antlr.runtime.Token.DOWN ) {\n            if ( this.hasUniqueNavigationNodes() ) {\n                navNode = this.adaptor.create(org.antlr.runtime.Token.DOWN, \"DOWN\");\n            }\n            else {\n                navNode = this.down;\n            }\n        }\n        else {\n            if ( this.hasUniqueNavigationNodes() ) {\n                navNode = this.adaptor.create(org.antlr.runtime.Token.UP, \"UP\");\n            }\n            else {\n                navNode = this.up;\n            }\n        }\n        this.nodes.push(navNode);\n    },\n\n    get: function(i) {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        return this.nodes[i];\n    },\n\n    LT: function(k) {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        if ( k===0 ) {\n            return null;\n        }\n        if ( k<0 ) {\n            return this.LB(-1*k);\n        }\n        if ( (this.p+k-1) >= this.nodes.length ) {\n            return this.eof;\n        }\n        return this.nodes[this.p+k-1];\n    },\n\n    getCurrentSymbol: function() { return this.LT(1); },\n\n    /** Look backwards k nodes */\n    LB: function(k) {\n        if ( k===0 ) {\n            return null;\n        }\n        if ( (this.p-k)<0 ) {\n            return null;\n        }\n        return this.nodes[this.p-k];\n    },\n\n    getTreeSource: function() {\n        return this.root;\n    },\n\n    getSourceName: function() {\n        return this.getTokenStream().getSourceName();\n    },\n\n    getTokenStream: function() {\n        return this.tokens;\n    },\n\n    setTokenStream: function(tokens) {\n        this.tokens = tokens;\n    },\n\n    getTreeAdaptor: function() {\n        return this.adaptor;\n    },\n\n    setTreeAdaptor: function(adaptor) {\n        this.adaptor = adaptor;\n    },\n\n    hasUniqueNavigationNodes: function() {\n        return this.uniqueNavigationNodes;\n    },\n\n    setUniqueNavigationNodes: function(uniqueNavigationNodes) {\n        this.uniqueNavigationNodes = uniqueNavigationNodes;\n    },\n\n    consume: function() {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        this.p++;\n    },\n\n    LA: function(i) {\n        return this.adaptor.getType(this.LT(i));\n    },\n\n    mark: function() {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        this.lastMarker = this.index();\n        return this.lastMarker;\n    },\n\n    release: function(marker) {\n        // no resources to release\n    },\n\n    index: function() {\n        return this.p;\n    },\n\n    rewind: function(marker) {\n        if (!org.antlr.lang.isNumber(marker)) {\n            marker = this.lastMarker;\n        }\n        this.seek(marker);\n    },\n\n    seek: function(index) {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        this.p = index;\n    },\n\n    /** Make stream jump to a new location, saving old location.\n     *  Switch back with pop().\n     */\n    push: function(index) {\n        if ( !this.calls ) {\n            this.calls = [];\n        }\n        this.calls.push(this.p); // save current index\n        this.seek(index);\n    },\n\n    /** Seek back to previous index saved during last push() call.\n     *  Return top of stack (return index).\n     */\n    pop: function() {\n        var ret = this.calls.pop();\n        this.seek(ret);\n        return ret;\n    },\n\n    reset: function() {\n        this.p = -1;\n        this.lastMarker = 0;\n        if (this.calls) {\n            this.calls = [];\n        }\n    },\n\n    size: function() {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        return this.nodes.length;\n    },\n\n    iterator: function() {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        return this.StreamIterator();\n    },\n\n    replaceChildren: function(parent, startChildIndex, stopChildIndex, t) {\n        if ( parent ) {\n            this.adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t);\n        }\n    },\n\n    /** Debugging */\n    toTokenString: function(start, stop) {\n        if ( this.p===-1 ) {\n            this.fillBuffer();\n        }\n        var buf='', i, t;\n        for (i = start; i < this.nodes.length && i <= stop; i++) {\n            t = this.nodes[i];\n            buf += \" \"+this.adaptor.getToken(t);\n        }\n        return buf;\n    },\n\n    /** Used for testing, just return the token type stream */\n    toString: function(start, stop) {\n        var buf = \"\",\n            text,\n            t,\n            i;\n        if (arguments.length===0) {\n            if ( this.p===-1 ) {\n                this.fillBuffer();\n            }\n            for (i = 0; i < this.nodes.length; i++) {\n                t = this.nodes[i];\n                buf += \" \";\n                buf += this.adaptor.getType(t);\n            }\n            return buf;\n        } else {\n            if ( !org.antlr.lang.isNumber(start) || !org.antlr.lang.isNumber(stop) ) {\n                return null;\n            }\n            if ( this.p===-1 ) {\n                this.fillBuffer();\n            }\n            //System.out.println(\"stop: \"+stop);\n            if ( start instanceof org.antlr.runtime.tree.CommonTree ) {\n                //System.out.print(\"toString: \"+((CommonTree)start).getToken()+\", \");\n            } else {\n                //System.out.println(start);\n            }\n            if ( stop instanceof org.antlr.runtime.tree.CommonTree ) {\n                //System.out.println(((CommonTree)stop).getToken());\n            } else {\n                //System.out.println(stop);\n            }\n            // if we have the token stream, use that to dump text in order\n            var beginTokenIndex,\n                endTokenIndex;\n            if ( this.tokens ) {\n                beginTokenIndex = this.adaptor.getTokenStartIndex(start);\n                endTokenIndex = this.adaptor.getTokenStopIndex(stop);\n                // if it's a tree, use start/stop index from start node\n                // else use token range from start/stop nodes\n                if ( this.adaptor.getType(stop)===org.antlr.runtime.Token.UP ) {\n                    endTokenIndex = this.adaptor.getTokenStopIndex(start);\n                }\n                else if ( this.adaptor.getType(stop)==org.antlr.runtime.Token.EOF )\n                {\n                    endTokenIndex = this.size()-2; // don't use EOF\n                }\n                return this.tokens.toString(beginTokenIndex, endTokenIndex);\n            }\n            // walk nodes looking for start\n            t = null;\n            i = 0;\n            for (; i < this.nodes.length; i++) {\n                t = this.nodes[i];\n                if ( t===start ) {\n                    break;\n                }\n            }\n            // now walk until we see stop, filling string buffer with text\n            buf = text = \"\";\n            t = this.nodes[i];\n            while ( t!==stop ) {\n                text = this.adaptor.getText(t);\n                if ( !org.antlr.lang.isString(text) ) {\n                    text = \" \"+this.adaptor.getType(t).toString();\n                }\n                buf += text;\n                i++;\n                t = nodes[i];\n            }\n            // include stop node too\n            text = this.adaptor.getText(stop);\n            if ( !org.antlr.lang.isString(text) ) {\n                text = \" \"+this.adaptor.getType(stop).toString();\n            }\n            buf += text;\n            return buf;\n        }\n    }\n});\norg.antlr.runtime.tree.RewriteRuleElementStream = function(adaptor, elementDescription, el) {\n    /** Cursor 0..n-1.  If singleElement!=null, cursor is 0 until you next(),\n     *  which bumps it to 1 meaning no more elements.\n     */\n    this.cursor = 0;\n    this.dirty = false;\n\n    this.elementDescription = elementDescription;\n    this.adaptor = adaptor;\n    if (el) {\n        if (org.antlr.lang.isArray(el)) {\n            this.singleElement = null;\n            this.elements = el;\n        } else {\n            this.add(el);\n        }\n    }\n};\n\norg.antlr.runtime.tree.RewriteRuleElementStream.prototype = {\n    /** Reset the condition of this stream so that it appears we have\n     *  not consumed any of its elements.  Elements themselves are untouched.\n     *  Once we reset the stream, any future use will need duplicates.  Set\n     *  the dirty bit.\n     */\n    reset: function() {\n        this.cursor = 0;\n        this.dirty = true;\n    },\n\n    add: function(el) {\n        if ( !org.antlr.lang.isValue(el) ) {\n            return;\n        }\n        if ( this.elements ) { // if in list, just add\n            this.elements.push(el);\n            return;\n        }\n        if ( !org.antlr.lang.isValue(this.singleElement) ) { // no elements yet, track w/o list\n            this.singleElement = el;\n            return;\n        }\n        // adding 2nd element, move to list\n        this.elements = [];\n        this.elements.push(this.singleElement);\n        this.singleElement = null;\n        this.elements.push(el);\n    },\n\n    /** Return the next element in the stream.  If out of elements, throw\n     *  an exception unless size()==1.  If size is 1, then return elements[0].\n     *  Return a duplicate node/subtree if stream is out of elements and\n     *  size==1.  If we've already used the element, dup (dirty bit set).\n     */\n    nextTree: function() {\n        var n = this.size(),\n            el;\n        if ( this.dirty || (this.cursor>=n && n==1) ) {\n            // if out of elements and size is 1, dup\n            el = this._next();\n            return this.dup(el);\n        }\n        // test size above then fetch\n        el = this._next();\n        return el;\n    },\n\n    /** do the work of getting the next element, making sure that it's\n     *  a tree node or subtree.  Deal with the optimization of single-\n     *  element list versus list of size > 1.  Throw an exception\n     *  if the stream is empty or we're out of elements and size>1.\n     *  protected so you can override in a subclass if necessary.\n     */\n    _next: function() {\n        var n = this.size();\n        if (n===0) {\n            throw new org.antlr.runtime.tree.RewriteEmptyStreamException(this.elementDescription);\n        }\n        if ( this.cursor>= n) { // out of elements?\n            if ( n===1 ) {  // if size is 1, it's ok; return and we'll dup\n                return this.toTree(this.singleElement);\n            }\n            // out of elements and size was not 1, so we can't dup\n            throw new org.antlr.runtime.tree.RewriteCardinalityException(this.elementDescription);\n        }\n        // we have elements\n        if ( org.antlr.lang.isValue(this.singleElement) ) {\n            this.cursor++; // move cursor even for single element list\n            return this.toTree(this.singleElement);\n        }\n        // must have more than one in list, pull from elements\n        var o = this.toTree(this.elements[this.cursor]);\n        this.cursor++;\n        return o;\n    },\n\n    /** Ensure stream emits trees; tokens must be converted to AST nodes.\n     *  AST nodes can be passed through unmolested.\n     */\n    toTree: function(el) {\n        if (el && el.getTree) {\n            return el.getTree();\n        }\n        return el;\n    },\n\n    hasNext: function() {\n         return (org.antlr.lang.isValue(this.singleElement) && this.cursor < 1) ||\n               (this.elements && this.cursor < this.elements.length);\n    },\n\n    size: function() {\n        var n = 0;\n        if ( org.antlr.lang.isValue(this.singleElement) ) {\n            n = 1;\n        }\n        if ( this.elements ) {\n            return this.elements.length;\n        }\n        return n;\n    },\n\n    getDescription: function() {\n        return this.elementDescription;\n    }\n};\norg.antlr.runtime.tree.RewriteRuleNodeStream = function(adaptor, elementDescription, el) {\n    org.antlr.runtime.tree.RewriteRuleNodeStream.superclass.constructor.apply(this, arguments);\n};\n\norg.antlr.lang.extend(org.antlr.runtime.tree.RewriteRuleNodeStream,\n                  org.antlr.runtime.tree.RewriteRuleElementStream,\n{\n    nextNode: function() {\n        return this._next();\n    },\n\n    toTree: function(el) {\n        return this.adaptor.dupNode(el);\n    },\n\n    dup: function() {\n        // we dup every node, so don't have to worry about calling dup; short-\n        // circuited next() so it doesn't call.\n        throw new Error(\"dup can't be called for a node stream.\");\n    }\n});\norg.antlr.runtime.tree.RewriteRuleTokenStream = function(adaptor, elementDescription, el) {\n    var sup = org.antlr.runtime.tree.RewriteRuleTokenStream.superclass;\n    sup.constructor.apply(this, arguments);\n};\n\norg.antlr.lang.extend(org.antlr.runtime.tree.RewriteRuleTokenStream,\n                  org.antlr.runtime.tree.RewriteRuleElementStream, {\n    /** Get next token from stream and make a node for it */\n    nextNode: function() {\n        var t = this._next();\n        return this.adaptor.create(t);\n    },\n\n    nextToken: function() {\n        return this._next();\n    },\n\n    /** Don't convert to a tree unless they explicitly call nextTree.\n     *  This way we can do hetero tree nodes in rewrite.\n     */\n    toTree: function(el) {\n        return el;\n    },\n\n    dup: function(el) {\n        throw new Error(\"dup can't be called for a token stream.\");\n    }\n});\norg.antlr.runtime.tree.RewriteRuleSubtreeStream = function() {\n    var sup = org.antlr.runtime.tree.RewriteRuleSubtreeStream.superclass;\n    sup.constructor.apply(this, arguments);\n};\n\norg.antlr.lang.extend(org.antlr.runtime.tree.RewriteRuleSubtreeStream,\n                  org.antlr.runtime.tree.RewriteRuleElementStream, {\n\t/** Treat next element as a single node even if it's a subtree.\n\t *  This is used instead of next() when the result has to be a\n\t *  tree root node.  Also prevents us from duplicating recently-added\n\t *  children; e.g., ^(type ID)+ adds ID to type and then 2nd iteration\n\t *  must dup the type node, but ID has been added.\n\t *\n\t *  Referencing a rule result twice is ok; dup entire tree as\n\t *  we can't be adding trees as root; e.g., expr expr.\n\t *\n\t *  Hideous code duplication here with super.next().  Can't think of\n\t *  a proper way to refactor.  This needs to always call dup node\n\t *  and super.next() doesn't know which to call: dup node or dup tree.\n\t */\n    nextNode: function() {\n\t\tvar n = this.size(),\n            el;\n\t\tif ( this.dirty || (this.cursor>=n && n===1) ) {\n\t\t\t// if out of elements and size is 1, dup (at most a single node\n\t\t\t// since this is for making root nodes).\n\t\t\tel = this._next();\n\t\t\treturn this.adaptor.dupNode(el);\n\t\t}\n\t\t// test size above then fetch\n\t\tel = this._next();\n\t\treturn el;\n\t},\n\n    dup: function(el) {\n\t\treturn this.adaptor.dupTree(el);\n\t}\n});\norg.antlr.runtime.BaseRecognizer = function(state) {\n    /** State of a lexer, parser, or tree parser are collected into a state\n     *  object so the state can be shared.  This sharing is needed to\n     *  have one grammar import others and share same error variables\n     *  and other state variables.  It's a kind of explicit multiple\n     *  inheritance via delegation of methods and shared state.\n     */\n    this.state = state || new org.antlr.runtime.RecognizerSharedState();\n};\norg.antlr.lang.augmentObject(org.antlr.runtime.BaseRecognizer, {\n    MEMO_RULE_FAILED: -2,\n    MEMO_RULE_UNKNOWN: -1,\n    INITIAL_FOLLOW_STACK_SIZE: 100,\n    MEMO_RULE_FAILED_I: -2,\n    DEFAULT_TOKEN_CHANNEL: org.antlr.runtime.Token.DEFAULT_CHANNEL,\n    HIDDEN: org.antlr.runtime.Token.HIDDEN_CHANNEL,\n    NEXT_TOKEN_RULE_NAME: \"nextToken\"\n});\n\norg.antlr.runtime.BaseRecognizer.prototype = {\n    /** Reset the parser's state.  Subclasses must rewinds the input stream */\n    reset: function() {\n        var i, len;\n\n        // wack everything related to error recovery\n        if (!this.state) {\n            return; // no shared state work to do\n        }\n        this.state._fsp = -1;\n        this.state.errorRecovery = false;\n        this.state.lastErrorIndex = -1;\n        this.state.failed = false;\n        this.state.syntaxErrors = 0;\n        // wack everything related to backtracking and memoization\n        this.state.backtracking = 0;\n        // wipe cache\n        if (this.state.ruleMemo) {\n            for (i=0, len=this.state.ruleMemo.length; i<len; i++) {\n                this.state.ruleMemo[i] = null;\n            }\n        }\n    },\n\n    /** Match current input symbol against ttype.  Attempt\n     *  single token insertion or deletion error recovery.  If\n     *  that fails, throw {@link org.antlr.runtime.MismatchedTokenException}.\n     *\n     *  <p>To turn off single token insertion or deletion error\n     *  recovery, override {@link #mismatchRecover} and have it call\n     *  plain {@link #mismatch}, which does not recover.  Then any error\n     *  in a rule will cause an exception and immediate exit from\n     *  rule.  Rule would recover by resynchronizing to the set of\n     *  symbols that can follow rule ref.</p>\n     *\n     *  @param {org.antlr.runtime.IntStream} input input stream to match against.\n     *  @param {Number} ttype  input type to match.\n     *  @param {org.antlr.runtime.BitSet} [follow] set of tokens that can follow the\n     *      matched token.\n     *  @returns {Object} the matched symbol\n     */\n    match: function(input, ttype, follow) {\n        var matchedSymbol = this.getCurrentInputSymbol(input);\n        if ( input.LA(1)===ttype ) {\n            input.consume();\n            this.state.errorRecovery = false;\n            this.state.failed = false;\n            return matchedSymbol;\n        }\n        if ( this.state.backtracking>0 ) {\n            this.state.failed = true;\n            return matchedSymbol;\n        }\n        matchedSymbol = this.recoverFromMismatchedToken(input, ttype, follow);\n        return matchedSymbol;\n    },\n\n    /**\n     * Match any token.\n     * @param {org.antlr.runtime.IntStream} input input stream to match against.\n     */\n    matchAny: function(input) {\n        this.state.errorRecovery = false;\n        this.state.failed = false;\n        input.consume();\n    },\n\n    /**\n     * Is the following token (LA(2)) the unwanted type (ttype)?\n     * @param {org.antlr.runtime.IntStream} input input stream to match against.\n     * @param {Number} ttype the undesired token type.\n     * @returns {Boolean} true if and only if the following token is the\n     *      unwanted type.\n     */\n    mismatchIsUnwantedToken: function(input, ttype) {\n        return input.LA(2)===ttype;\n    },\n\n    /**\n     * Does the stream appear to be missing a single token?\n     * @param {org.antlr.runtime.IntStream} input input stream to match against.\n     * @param {org.antlr.runtime.BitSet} [follow] set of tokens that can follow the\n     *      matched token.\n     * @returns {Boolean} true if and only if it appears that the stream is\n     *      missing a single token.\n     */\n    mismatchIsMissingToken: function(input, follow) {\n        if ( !follow ) {\n            // we have no information about the follow; we can only consume\n            // a single token and hope for the best\n            return false;\n        }\n        // compute what can follow this grammar element reference\n        if ( follow.member(org.antlr.runtime.Token.EOR_TOKEN_TYPE) ) {\n            if ( this.state._fsp>=0 ) { // remove EOR if we're not the start symbol\n                follow.remove(org.antlr.runtime.Token.EOR_TOKEN_TYPE);\n            }\n            var viableTokensFollowingThisRule = this.computeContextSensitiveRuleFOLLOW();\n            follow = follow.or(this.viableTokensFollowingThisRule);\n        }\n        // if current token is consistent with what could come after set\n        // then we know we're missing a token; error recovery is free to\n        // \"insert\" the missing token\n\n        // BitSet cannot handle negative numbers like -1 (EOF) so I leave EOR\n        // in follow set to indicate that the fall of the start symbol is\n        // in the set (EOF can follow).\n        if ( follow.member(input.LA(1)) ||\n             follow.member(org.antlr.runtime.Token.EOR_TOKEN_TYPE) )\n        {\n            return true;\n        }\n        return false;\n    },\n\n    /** Factor out what to do upon token mismatch so tree parsers can behave\n     *  differently.  Override and call {@link #mismatchRecover}\n     *  to get single token insertion and deletion.\n     *\n     *  @param {org.antlr.runtime.IntStream} input input stream to match against.\n     *  @param {Number} ttype  input type to match.\n     *  @param {org.antlr.runtime.BitSet} [follow] set of tokens that can follow the\n     *      matched token.\n     */\n    mismatch: function(input, ttype, follow) {\n        if ( this.mismatchIsUnwantedToken(input, ttype) ) {\n            throw new org.antlr.runtime.UnwantedTokenException(ttype, input);\n        } else if ( this.mismatchIsMissingToken(input, follow) ) {\n            throw new org.antlr.runtime.MissingTokenException(ttype, input, null);\n        }\n        throw new org.antlr.runtime.MismatchedTokenException(ttype, input);\n    },\n\n    /** Report a recognition problem.\n     *\n     *  <p>This method sets errorRecovery to indicate the parser is recovering\n     *  not parsing.  Once in recovery mode, no errors are generated.\n     *  To get out of recovery mode, the parser must successfully match\n     *  a token (after a resync).  So it will go:</p>\n     *  <ol>\n     *      <li>error occurs</li>\n     *      <li>enter recovery mode, report error</li>\n     *      <li>consume until token found in resynch set</li>\n     *      <li>try to resume parsing</li>\n     *      <li>next match() will reset errorRecovery mode</li>\n     *  </ol>\n     *\n     *  <p>If you override, make sure to update this.state.syntaxErrors if you\n     *  care about that.</p>\n     *  @param {org.antlr.runtime.RecognitionException} e the error to be reported.\n     */\n    reportError: function(e) {\n      if(this.input.size() != 0) {\n        var token = this.input.get(e.index);\n        var errorMessage = \"\";\n        var column = 0;\n        var line = 0;\n        if(token.getType() == -1) {\n          token = this.input.get(this.input.size() - 1);\n        }\n        errorMessage = this.getErrorMessage(e, this.getTokenNames());\n        column = token.getStartIndex();\n        line = token.getLine() - 1;\n\n        var error = {\n          line: line,\n          message: errorMessage,\n          column: column\n        };\n        this.addError(error);\n      }\n        // if we've already reported an error and have not matched a token\n        // yet successfully, don't report any errors.\n        if ( this.state.errorRecovery ) {\n            return;\n        }\n        this.state.syntaxErrors++;\n        this.state.errorRecovery = true;\n\n        this.displayRecognitionError(this.getTokenNames(), e);\n    },\n\n    /**\n     * Assemble recognition error message.\n     * @param {Array} tokenNames array of token names (strings).\n     * @param {org.antlr.runtime.RecognitionException} e the error to be reported.\n     */\n    displayRecognitionError: function(tokenNames, e) {\n        var hdr = this.getErrorHeader(e),\n            msg = this.getErrorMessage(e, tokenNames);\n        this.emitErrorMessage(hdr+\" \"+msg);\n    },\n\n    /**\n     * Create error header message.  Format is <q>line\n     * lineNumber:positionInLine</q>.\n     * @param {org.antlr.runtime.RecognitionException} e the error to be reported.\n     * @returns {String} The error header.\n     */\n    getErrorHeader: function(e) {\n        /* handle null input */\n        if (!org.antlr.lang.isNumber(e.line)) {\n            e.line = 0;\n        }\n        return \"line \"+e.line+\":\"+e.charPositionInLine;\n    },\n\n    /**\n     * Override this method to change where error messages go.\n     * Defaults to \"alert\"-ing the error in browsers and \"print\"-ing the error\n     * in other environments (e.g. Rhino, SpiderMonkey).\n     * @param {String} msg the error message to be displayed.\n     */\n    emitErrorMessage: function(msg) {\n      //throw msg;\n      console.log(msg);\n    },\n\n    /** What error message should be generated for the various\n     *  exception types?\n     *\n     *  <p>Not very object-oriented code, but I like having all error message\n     *  generation within one method rather than spread among all of the\n     *  exception classes. This also makes it much easier for the exception\n     *  handling because the exception classes do not have to have pointers back\n     *  to this object to access utility routines and so on. Also, changing\n     *  the message for an exception type would be difficult because you\n     *  would have to be subclassing exceptions, but then somehow get ANTLR\n     *  to make those kinds of exception objects instead of the default.</p>\n     *\n     *  <p>For grammar debugging, you will want to override this to add\n     *  more information such as the stack frame and no viable alts.</p>\n     *\n     *  <p>Override this to change the message generated for one or more\n     *  exception types.</p>\n     *\n     * @param {Array} tokenNames array of token names (strings).\n     * @param {org.antlr.runtime.RecognitionException} e the error to be reported.\n     * @returns {String} the error message to be emitted.\n     */\n    getErrorMessage: function(e, tokenNames) {\n        var msg = (e && e.getMessage) ? e.getMessage() : null,\n            mte,\n            tokenName;\n        if ( e instanceof org.antlr.runtime.UnwantedTokenException ) {\n            var ute = e;\n            tokenName=\"<unknown>\";\n            if ( ute.expecting== org.antlr.runtime.Token.EOF ) {\n                tokenName = \"EOF\";\n            } else {\n                tokenName = tokenNames[ute.expecting];\n            }\n            msg = \"extraneous input \"+this.getTokenErrorDisplay(ute.getUnexpectedToken())+\n                \" expecting \"+tokenName;\n        }\n        else if ( e instanceof org.antlr.runtime.MissingTokenException ) {\n            mte = e;\n            tokenName=\"<unknown>\";\n            if ( mte.expecting== org.antlr.runtime.Token.EOF ) {\n                tokenName = \"EOF\";\n            } else {\n                tokenName = tokenNames[mte.expecting];\n            }\n            msg = \"missing \"+tokenName+\" at \"+this.getTokenErrorDisplay(e.token);\n        }\n        else if ( e instanceof org.antlr.runtime.MismatchedTokenException ) {\n            mte = e;\n            tokenName=\"<unknown>\";\n            if ( mte.expecting== org.antlr.runtime.Token.EOF ) {\n                tokenName = \"EOF\";\n            }\n            else {\n                tokenName = tokenNames[mte.expecting];\n            }\n            msg = \"mismatched input \"+this.getTokenErrorDisplay(e.token)+\n                \" expecting \"+tokenName;\n        }\n        else if ( e instanceof org.antlr.runtime.NoViableAltException ) {\n            msg = \"no viable alternative at input \"+this.getTokenErrorDisplay(e.token);\n        }\n        else if ( e instanceof org.antlr.runtime.EarlyExitException ) {\n            msg = \"required (...)+ loop did not match anything at input \"+\n                this.getTokenErrorDisplay(e.token);\n        }\n        else if ( e instanceof org.antlr.runtime.MismatchedSetException ) {\n            msg = \"mismatched input \"+this.getTokenErrorDisplay(e.token)+\n                \" expecting set \"+e.expecting;\n        }\n        else if ( e instanceof org.antlr.runtime.MismatchedNotSetException ) {\n            msg = \"mismatched input \"+this.getTokenErrorDisplay(e.token)+\n                \" expecting set \"+e.expecting;\n        }\n        else if ( e instanceof org.antlr.runtime.FailedPredicateException ) {\n            msg = \"rule \"+e.ruleName+\" failed predicate: {\"+\n                e.predicateText+\"}?\";\n        }\n        return msg;\n    },\n\n    /** Get number of recognition errors (lexer, parser, tree parser).  Each\n     *  recognizer tracks its own number.  So parser and lexer each have\n     *  separate count.  Does not count the spurious errors found between\n     *  an error and next valid token match\n     *\n     *  See also reportError()\n     */\n    getNumberOfSyntaxErrors: function() {\n        return this.state.syntaxErrors;\n    },\n\n    /** How should a token be displayed in an error message? The default\n     *  is to display just the text, but during development you might\n     *  want to have a lot of information spit out.  Override in that case\n     *  to use t.toString() (which, for CommonToken, dumps everything about\n     *  the token). This is better than forcing you to override a method in\n     *  your token objects because you don't have to go modify your lexer\n     *  so that it creates a new Java type.\n     */\n    getTokenErrorDisplay: function(t) {\n        var s = t.getText();\n        if ( !org.antlr.lang.isValue(s) ) {\n            if ( t.getType()==org.antlr.runtime.Token.EOF ) {\n                s = \"<EOF>\";\n            }\n            else {\n                s = \"<\"+t.getType()+\">\";\n            }\n        }\n        s = s.replace(/\\n/g,\"\\\\n\");\n        s = s.replace(/\\r/g,\"\\\\r\");\n        s = s.replace(/\\t/g,\"\\\\t\");\n        return \"'\"+s+\"'\";\n    },\n\n    /** Recover from an error found on the input stream.  This is\n     *  for NoViableAlt and mismatched symbol exceptions.  If you enable\n     *  single token insertion and deletion, this will usually not\n     *  handle mismatched symbol exceptions but there could be a mismatched\n     *  token that the match() routine could not recover from.\n     */\n    recover: function(input, re) {\n        if ( this.state.lastErrorIndex==input.index() ) {\n            // uh oh, another error at same token index; must be a case\n            // where LT(1) is in the recovery token set so nothing is\n            // consumed; consume a single token so at least to prevent\n            // an infinite loop; this is a failsafe.\n            input.consume();\n        }\n        this.state.lastErrorIndex = input.index();\n        var followSet = this.computeErrorRecoverySet();\n        this.beginResync();\n        this.consumeUntil(input, followSet);\n        this.endResync();\n    },\n\n    /** A hook to listen in on the token consumption during error recovery.\n     *  The DebugParser subclasses this to fire events to the listenter.\n     */\n    beginResync: function() {\n    },\n\n    endResync: function() {\n    },\n\n    /*  Compute the error recovery set for the current rule.  During\n     *  rule invocation, the parser pushes the set of tokens that can\n     *  follow that rule reference on the stack; this amounts to\n     *  computing FIRST of what follows the rule reference in the\n     *  enclosing rule. This local follow set only includes tokens\n     *  from within the rule; i.e., the FIRST computation done by\n     *  ANTLR stops at the end of a rule.\n     *\n     *  EXAMPLE\n     *\n     *  When you find a \"no viable alt exception\", the input is not\n     *  consistent with any of the alternatives for rule r.  The best\n     *  thing to do is to consume tokens until you see something that\n     *  can legally follow a call to r *or* any rule that called r.\n     *  You don't want the exact set of viable next tokens because the\n     *  input might just be missing a token--you might consume the\n     *  rest of the input looking for one of the missing tokens.\n     *\n     *  Consider grammar:\n     *\n     *  a : '[' b ']'\n     *    | '(' b ')'\n     *    ;\n     *  b : c '^' INT ;\n     *  c : ID\n     *    | INT\n     *    ;\n     *\n     *  At each rule invocation, the set of tokens that could follow\n     *  that rule is pushed on a stack.  Here are the various \"local\"\n     *  follow sets:\n     *\n     *  FOLLOW(b1_in_a) = FIRST(']') = ']'\n     *  FOLLOW(b2_in_a) = FIRST(')') = ')'\n     *  FOLLOW(c_in_b) = FIRST('^') = '^'\n     *\n     *  Upon erroneous input \"[]\", the call chain is\n     *\n     *  a -> b -> c\n     *\n     *  and, hence, the follow context stack is:\n     *\n     *  depth  local follow set     after call to rule\n     *    0         <EOF>                    a (from main())\n     *    1          ']'                     b\n     *    3          '^'                     c\n     *\n     *  Notice that ')' is not included, because b would have to have\n     *  been called from a different context in rule a for ')' to be\n     *  included.\n     *\n     *  For error recovery, we cannot consider FOLLOW(c)\n     *  (context-sensitive or otherwise).  We need the combined set of\n     *  all context-sensitive FOLLOW sets--the set of all tokens that\n     *  could follow any reference in the call chain.  We need to\n     *  resync to one of those tokens.  Note that FOLLOW(c)='^' and if\n     *  we resync'd to that token, we'd consume until EOF.  We need to\n     *  sync to context-sensitive FOLLOWs for a, b, and c: {']','^'}.\n     *  In this case, for input \"[]\", LA(1) is in this set so we would\n     *  not consume anything and after printing an error rule c would\n     *  return normally.  It would not find the required '^' though.\n     *  At this point, it gets a mismatched token error and throws an\n     *  exception (since LA(1) is not in the viable following token\n     *  set).  The rule exception handler tries to recover, but finds\n     *  the same recovery set and doesn't consume anything.  Rule b\n     *  exits normally returning to rule a.  Now it finds the ']' (and\n     *  with the successful match exits errorRecovery mode).\n     *\n     *  So, you cna see that the parser walks up call chain looking\n     *  for the token that was a member of the recovery set.\n     *\n     *  Errors are not generated in errorRecovery mode.\n     *\n     *  ANTLR's error recovery mechanism is based upon original ideas:\n     *\n     *  \"Algorithms + Data Structures = Programs\" by Niklaus Wirth\n     *\n     *  and\n     *\n     *  \"A note on error recovery in recursive descent parsers\":\n     *  http://portal.acm.org/citation.cfm?id=947902.947905\n     *\n     *  Later, Josef Grosch had some good ideas:\n     *\n     *  \"Efficient and Comfortable Error Recovery in Recursive Descent\n     *  Parsers\":\n     *  ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip\n     *\n     *  Like Grosch I implemented local FOLLOW sets that are combined\n     *  at run-time upon error to avoid overhead during parsing.\n     */\n    computeErrorRecoverySet: function() {\n        return this.combineFollows(false);\n    },\n\n\n    /** Compute the context-sensitive FOLLOW set for current rule.\n     *  This is set of token types that can follow a specific rule\n     *  reference given a specific call chain.  You get the set of\n     *  viable tokens that can possibly come next (lookahead depth 1)\n     *  given the current call chain.  Contrast this with the\n     *  definition of plain FOLLOW for rule r:\n     *\n     *   FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)}\n     *\n     *  where x in T* and alpha, beta in V*; T is set of terminals and\n     *  V is the set of terminals and nonterminals.  In other words,\n     *  FOLLOW(r) is the set of all tokens that can possibly follow\n     *  references to r in *any* sentential form (context).  At\n     *  runtime, however, we know precisely which context applies as\n     *  we have the call chain.  We may compute the exact (rather\n     *  than covering superset) set of following tokens.\n     *\n     *  For example, consider grammar:\n     *\n     *  stat : ID '=' expr ';'      // FOLLOW(stat)=={EOF}\n     *       | \"return\" expr '.'\n     *       ;\n     *  expr : atom ('+' atom)* ;   // FOLLOW(expr)=={';','.',')'}\n     *  atom : INT                  // FOLLOW(atom)=={'+',')',';','.'}\n     *       | '(' expr ')'\n     *       ;\n     *\n     *  The FOLLOW sets are all inclusive whereas context-sensitive\n     *  FOLLOW sets are precisely what could follow a rule reference.\n     *  For input input \"i=(3);\", here is the derivation:\n     *\n     *  stat => ID '=' expr ';'\n     *       => ID '=' atom ('+' atom)* ';'\n     *       => ID '=' '(' expr ')' ('+' atom)* ';'\n     *       => ID '=' '(' atom ')' ('+' atom)* ';'\n     *       => ID '=' '(' INT ')' ('+' atom)* ';'\n     *       => ID '=' '(' INT ')' ';'\n     *\n     *  At the \"3\" token, you'd have a call chain of\n     *\n     *    stat -> expr -> atom -> expr -> atom\n     *\n     *  What can follow that specific nested ref to atom?  Exactly ')'\n     *  as you can see by looking at the derivation of this specific\n     *  input.  Contrast this with the FOLLOW(atom)={'+',')',';','.'}.\n     *\n     *  You want the exact viable token set when recovering from a\n     *  token mismatch.  Upon token mismatch, if LA(1) is member of\n     *  the viable next token set, then you know there is most likely\n     *  a missing token in the input stream.  \"Insert\" one by just not\n     *  throwing an exception.\n     */\n    computeContextSensitiveRuleFOLLOW: function() {\n        return this.combineFollows(true);\n    },\n\n    combineFollows: function(exact) {\n        var top = this.state._fsp,\n            i,\n            localFollowSet,\n            followSet = new org.antlr.runtime.BitSet();\n        for (i=top; i>=0; i--) {\n            localFollowSet = this.state.following[i];\n            followSet.orInPlace(localFollowSet);\n            if ( exact ) {\n                // can we see end of rule?\n                if ( localFollowSet.member(org.antlr.runtime.Token.EOR_TOKEN_TYPE) )\n                {\n                    // Only leave EOR in set if at top (start rule); this lets\n                    // us know if have to include follow(start rule); i.e., EOF\n                    if ( i>0 ) {\n                        followSet.remove(org.antlr.runtime.Token.EOR_TOKEN_TYPE);\n                    }\n                }\n                else { // can't see end of rule, quit\n                    break;\n                }\n            }\n        }\n        return followSet;\n    },\n\n    /** Attempt to recover from a single missing or extra token.\n     *\n     *  EXTRA TOKEN\n     *\n     *  LA(1) is not what we are looking for.  If LA(2) has the right token,\n     *  however, then assume LA(1) is some extra spurious token.  Delete it\n     *  and LA(2) as if we were doing a normal match(), which advances the\n     *  input.\n     *\n     *  MISSING TOKEN\n     *\n     *  If current token is consistent with what could come after\n     *  ttype then it is ok to \"insert\" the missing token, else throw\n     *  exception For example, Input \"i=(3;\" is clearly missing the\n     *  ')'.  When the parser returns from the nested call to expr, it\n     *  will have call chain:\n     *\n     *    stat -> expr -> atom\n     *\n     *  and it will be trying to match the ')' at this point in the\n     *  derivation:\n     *\n     *       => ID '=' '(' INT ')' ('+' atom)* ';'\n     *                          ^\n     *  match() will see that ';' doesn't match ')' and report a\n     *  mismatched token error.  To recover, it sees that LA(1)==';'\n     *  is in the set of tokens that can follow the ')' token\n     *  reference in rule atom.  It can assume that you forgot the ')'.\n     */\n    recoverFromMismatchedToken: function(input,\n                                         ttype,\n                                         follow)\n    {\n        var e = null;\n        // if next token is what we are looking for then \"delete\" this token\n        if ( this.mismatchIsUnwantedToken(input, ttype) ) {\n            e = new org.antlr.runtime.UnwantedTokenException(ttype, input);\n            this.beginResync();\n            input.consume(); // simply delete extra token\n            this.endResync();\n            this.reportError(e);  // report after consuming so AW sees the token in the exception\n            // we want to return the token we're actually matching\n            var matchedSymbol = this.getCurrentInputSymbol(input);\n            input.consume(); // move past ttype token as if all were ok\n            return matchedSymbol;\n        }\n        // can't recover with single token deletion, try insertion\n        if ( this.mismatchIsMissingToken(input, follow) ) {\n            var inserted = this.getMissingSymbol(input, e, ttype, follow);\n            e = new org.antlr.runtime.MissingTokenException(ttype, input, inserted);\n            this.reportError(e);  // report after inserting so AW sees the token in the exception\n            return inserted;\n        }\n        // even that didn't work; must throw the exception\n        e = new org.antlr.runtime.MismatchedTokenException(ttype, input);\n        throw e;\n    },\n\n    recoverFromMismatchedSet: function(input,\n                                       e,\n                                       follow)\n    {\n        if ( this.mismatchIsMissingToken(input, follow) ) {\n            // System.out.println(\"missing token\");\n            this.reportError(e);\n            // we don't know how to conjure up a token for sets yet\n            return this.getMissingSymbol(input, e, org.antlr.runtime.Token.INVALID_TOKEN_TYPE, follow);\n        }\n        throw e;\n    },\n\n    /** Match needs to return the current input symbol, which gets put\n     *  into the label for the associated token ref; e.g., x=ID.  Token\n     *  and tree parsers need to return different objects. Rather than test\n     *  for input stream type or change the IntStream interface, I use\n     *  a simple method to ask the recognizer to tell me what the current\n     *  input symbol is.\n     * \n     *  This is ignored for lexers.\n     */\n    getCurrentInputSymbol: function(input) { return null; },\n\n    /** Conjure up a missing token during error recovery.\n     *\n     *  The recognizer attempts to recover from single missing\n     *  symbols. But, actions might refer to that missing symbol.\n     *  For example, x=ID {f($x);}. The action clearly assumes\n     *  that there has been an identifier matched previously and that\n     *  $x points at that token. If that token is missing, but\n     *  the next token in the stream is what we want we assume that\n     *  this token is missing and we keep going. Because we\n     *  have to return some token to replace the missing token,\n     *  we have to conjure one up. This method gives the user control\n     *  over the tokens returned for missing tokens. Mostly,\n     *  you will want to create something special for identifier\n     *  tokens. For literals such as '{' and ',', the default\n     *  action in the parser or tree parser works. It simply creates\n     *  a CommonToken of the appropriate type. The text will be the token.\n     *  If you change what tokens must be created by the lexer,\n     *  override this method to create the appropriate tokens.\n     */\n    getMissingSymbol: function(input,\n                               e,\n                               expectedTokenType,\n                               follow)\n    {\n        return null;\n    },\n\n\n    /** Consume tokens until one matches the given token set */\n    consumeUntil: function(input, set) {\n        var ttype = input.LA(1);\n        while (ttype != org.antlr.runtime.Token.EOF && !set.member(ttype) ) {\n            input.consume();\n            ttype = input.LA(1);\n        }\n    },\n\n    /** Push a rule's follow set using our own hardcoded stack */\n    pushFollow: function(fset) {\n        if ( (this.state._fsp +1)>=this.state.following.length ) {\n            var f = [];\n            var i;\n            for (i=this.state.following.length-1; i>=0; i--) {\n                f[i] = this.state.following[i];\n            }\n            this.state.following = f;\n        }\n        this.state._fsp++;\n        this.state.following[this.state._fsp] = fset;\n    },\n\n    /** Return List<String> of the rules in your parser instance\n     *  leading up to a call to this method.  You could override if\n     *  you want more details such as the file/line info of where\n     *  in the parser java code a rule is invoked.\n     *\n     *  This is very useful for error messages and for context-sensitive\n     *  error recovery.\n     *\n     *  A more general version of getRuleInvocationStack where you can\n     *  pass in, for example, a RecognitionException to get it's rule\n     *  stack trace.  This routine is shared with all recognizers, hence,\n     *  static.\n     *\n     *  TODO: move to a utility class or something; weird having lexer call this\n     *\n     *  Most JS interpreters can't do real stack reflection.  See this\n     *  spidermonkey bug, for example:\n     *  https://bugzilla.mozilla.org/show_bug.cgi?id=332104\n     *\n     *  JS is supposed to get real stack traces in v4, at which time it would\n     *  be easy to implement this function.\n     *\n     *  Until then I'll leave this unimplemented.  If there is enough clamor\n     *  it would be possible to keep track of the invocation stack using an\n     *  auxillary array, but that will definitely be a performance hit.\n     */\n    getRuleInvocationStack: function(e, recognizerClassName)\n    {\n        throw new Error(\"Not implemented.\");\n    },\n\n    getBacktrackingLevel: function() {\n        return this.state.backtracking;\n    },\n\n    /** Used to print out token names like ID during debugging and\n     *  error reporting.  The generated parsers implement a method\n     *  that overrides this to point to their String[] tokenNames.\n     */\n    getTokenNames: function() {\n        return null;\n    },\n\n    /** For debugging and other purposes, might want the grammar name.\n     *  Have ANTLR generate an implementation for this method.\n     */\n    getGrammarFileName: function() {\n        return null;\n    },\n\n    /** A convenience method for use most often with template rewrites.\n     *  Convert a List<Token> to List<String>\n     */\n    toStrings: function(tokens) {\n        if ( !tokens ) {\n            return null;\n        }\n        var strings = [];\n        var i;\n        for (i=0; i<tokens.length; i++) {\n            strings.push(tokens[i].getText());\n        }\n        return strings;\n    },\n\n    /** Given a rule number and a start token index number, return\n     *  MEMO_RULE_UNKNOWN if the rule has not parsed input starting from\n     *  start index.  If this rule has parsed input starting from the\n     *  start index before, then return where the rule stopped parsing.\n     *  It returns the index of the last token matched by the rule.\n     *\n     *  For now we use a hashtable and just the slow Object-based one.\n     *  Later, we can make a special one for ints and also one that\n     *  tosses out data after we commit past input position i.\n     */\n    getRuleMemoization: function(ruleIndex, ruleStartIndex) {\n        if ( !this.state.ruleMemo[ruleIndex] ) {\n            this.state.ruleMemo[ruleIndex] = {};\n        }\n        var stopIndexI =\n            this.state.ruleMemo[ruleIndex][ruleStartIndex];\n        if ( !org.antlr.lang.isNumber(stopIndexI) ) {\n            return org.antlr.runtime.BaseRecognizer.MEMO_RULE_UNKNOWN;\n        }\n        return stopIndexI;\n    },\n\n    /** Has this rule already parsed input at the current index in the\n     *  input stream?  Return the stop token index or MEMO_RULE_UNKNOWN.\n     *  If we attempted but failed to parse properly before, return\n     *  MEMO_RULE_FAILED.\n     *\n     *  This method has a side-effect: if we have seen this input for\n     *  this rule and successfully parsed before, then seek ahead to\n     *  1 past the stop token matched for this rule last time.\n     */\n    alreadyParsedRule: function(input, ruleIndex) {\n        var stopIndex = this.getRuleMemoization(ruleIndex, input.index());\n        if ( stopIndex==org.antlr.runtime.BaseRecognizer.MEMO_RULE_UNKNOWN ) {\n            return false;\n        }\n        if ( stopIndex==org.antlr.runtime.BaseRecognizer.MEMO_RULE_FAILED ) {\n            //System.out.println(\"rule \"+ruleIndex+\" will never succeed\");\n            this.state.failed=true;\n        }\n        else {\n            input.seek(stopIndex+1); // jump to one past stop token\n        }\n        return true;\n    },\n\n    /** Record whether or not this rule parsed the input at this position\n     *  successfully.  Use a standard java hashtable for now.\n     */\n    memoize: function(input,\n                      ruleIndex,\n                      ruleStartIndex)\n    {\n        var stopTokenIndex = this.state.failed ? \n            org.antlr.runtime.BaseRecognizer.MEMO_RULE_FAILED : input.index()-1;\n        if ( !org.antlr.lang.isValue(this.state.ruleMemo) ) {\n            throw new Error(\"!!!!!!!!! memo array is null for \"+ this.getGrammarFileName());\n        }\n        if ( ruleIndex >= this.state.ruleMemo.length ) {\n            throw new Error(\"!!!!!!!!! memo size is \"+this.state.ruleMemo.length+\", but rule index is \"+ruleIndex);\n        }\n        if ( org.antlr.lang.isValue(this.state.ruleMemo[ruleIndex]) ) {\n            this.state.ruleMemo[ruleIndex][ruleStartIndex] = stopTokenIndex;\n        }\n    },\n\n    /** return how many rule/input-index pairs there are in total.\n     *  TODO: this includes synpreds.\n     */\n    getRuleMemoizationCacheSize: function() {\n        var n = 0, i;\n        for (i = 0; this.state.ruleMemo && i < this.state.ruleMemo.length; i++) {\n            var ruleMap = this.state.ruleMemo[i];\n            if ( ruleMap ) {\n                // @todo need to get size of rulemap?\n                n += ruleMap.length; // how many input indexes are recorded?\n            }\n        }\n        return n;\n    },\n\n    traceIn: function(ruleName, ruleIndex, inputSymbol)  {\n        this.emitErrorMessage(\"enter \"+ruleName+\" \"+inputSymbol);\n        if ( this.state.failed ) {\n            this.emitErrorMessage(\" failed=\"+this.failed);\n        }\n        if ( this.state.backtracking>0 ) {\n            this.emitErrorMessage(\" backtracking=\"+this.state.backtracking);\n        }\n        // System.out.println();\n    },\n\n    traceOut: function(ruleName, ruleIndex, inputSymbol) {\n        this.emitErrorMessage(\"exit \"+ruleName+\" \"+inputSymbol);\n        if ( this.state.failed ) {\n            this.emitErrorMessage(\" failed=\"+this.state.failed);\n        }\n        if ( this.state.backtracking>0 ) {\n            this.emitErrorMessage(\" backtracking=\"+this.state.backtracking);\n        }\n    }\n};\norg.antlr.runtime.Lexer = function(input, state) {\n    if (state) {\n        org.antlr.runtime.Lexer.superclass.constructor.call(this, state);\n    }\n    if (input) {\n        this.input = input;\n    }\n};\n\norg.antlr.lang.extend(org.antlr.runtime.Lexer, org.antlr.runtime.BaseRecognizer, {\n    reset: function() {\n        // reset all recognizer state variables\n        org.antlr.runtime.Lexer.superclass.reset.call(this);\n        if ( org.antlr.lang.isValue(this.input) ) {\n            this.input.seek(0); // rewind the input\n        }\n        if ( !org.antlr.lang.isValue(this.state) ) {\n            return; // no shared state work to do\n        }\n        this.state.token = null;\n        this.state.type = org.antlr.runtime.Token.INVALID_TOKEN_TYPE;\n        this.state.channel = org.antlr.runtime.Token.DEFAULT_CHANNEL;\n        this.state.tokenStartCharIndex = -1;\n        this.state.tokenStartCharPositionInLine = -1;\n        this.state.tokenStartLine = -1;\n        this.state.text = null;\n    },\n\n    /** Return a token from this source; i.e., match a token on the char\n     *  stream.\n     */\n    nextToken: function() {\n        while (true) {\n            this.state.token = null;\n            this.state.channel = org.antlr.runtime.Token.DEFAULT_CHANNEL;\n            this.state.tokenStartCharIndex = this.input.index();\n            this.state.tokenStartCharPositionInLine = this.input.getCharPositionInLine();\n            this.state.tokenStartLine = this.input.getLine();\n            this.state.text = null;\n            if ( this.input.LA(1)===org.antlr.runtime.CharStream.EOF ) {\n                return org.antlr.runtime.Token.EOF_TOKEN;\n            }\n            try {\n                this.mTokens();\n                if ( !org.antlr.lang.isValue(this.state.token) ) {\n                    this.emit();\n                }\n                else if ( this.state.token==org.antlr.runtime.Token.SKIP_TOKEN ) {\n                    continue;\n                }\n                return this.state.token;\n            }\n            catch (re) {\n                if (re instanceof org.antlr.runtime.NoViableAltException) {\n                    this.reportError(re);\n                    this.recover(re);\n                } else if ( re instanceof org.antlr.runtime.RecognitionException ) {\n                    this.reportError(re);\n                } else {\n                    throw re;\n                }\n            }\n        }\n    },\n\n    /** Instruct the lexer to skip creating a token for current lexer rule\n     *  and look for another token.  nextToken() knows to keep looking when\n     *  a lexer rule finishes with token set to SKIP_TOKEN.  Recall that\n     *  if token==null at end of any token rule, it creates one for you\n     *  and emits it.\n     */\n    skip: function() {\n        this.state.token = org.antlr.runtime.Token.SKIP_TOKEN;\n    },\n\n    /** Set the char stream and reset the lexer */\n    setCharStream: function(input) {\n        this.input = null;\n        this.reset();\n        this.input = input;\n    },\n\n    getCharStream: function() {\n        return this.input;\n    },\n\n    getSourceName: function() {\n        return this.input.getSourceName();\n    },\n\n    /** Currently does not support multiple emits per nextToken invocation\n     *  for efficiency reasons.  Subclass and override this method and\n     *  nextToken (to push tokens into a list and pull from that list rather\n     *  than a single variable as this implementation does).\n     *\n     *  The standard method called to automatically emit a token at the\n     *  outermost lexical rule.  The token object should point into the\n     *  char buffer start..stop.  If there is a text override in 'text',\n     *  use that to set the token's text.  Override this method to emit\n     *  custom Token objects.\n     *\n     *  If you are building trees, then you should also override\n     *  Parser or TreeParser.getMissingSymbol().\n     */\n    emit: function() {\n        if (arguments.length===0) {\n            var t = new org.antlr.runtime.CommonToken(this.input, this.state.type, this.state.channel, this.state.tokenStartCharIndex, this.getCharIndex()-1);\n            t.setLine(this.state.tokenStartLine);\n            t.setText(this.state.text);\n            t.setCharPositionInLine(this.state.tokenStartCharPositionInLine);\n            this.state.token = t;\n            return t;\n        } else {\n            this.state.token = arguments[0];\n        }\n    },\n\n    match: function(s) {\n        var i = 0,\n            mte;\n\n        if (org.antlr.lang.isString(s)) {\n            while ( i<s.length ) {\n                if ( this.input.LA(1)!=s.charAt(i) ) {\n                    if ( this.state.backtracking>0 ) {\n                        this.state.failed = true;\n                        return;\n                    }\n                    mte = new org.antlr.runtime.MismatchedTokenException(s.charAt(i), this.input);\n                    this.recover(mte);\n                    throw mte;\n                }\n                i++;\n                this.input.consume();\n                this.state.failed = false;\n            }\n        } else if (org.antlr.lang.isNumber(s)) {\n            if ( this.input.LA(1)!=s ) {\n                if ( this.state.backtracking>0 ) {\n                    this.state.failed = true;\n                    return;\n                }\n                mte = new org.antlr.runtime.MismatchedTokenException(s, this.input);\n                this.recover(mte);\n                throw mte;\n            }\n            this.input.consume();\n            this.state.failed = false;\n        }\n    },\n\n    matchAny: function() {\n        this.input.consume();\n    },\n\n    matchRange: function(a, b) {\n        if ( this.input.LA(1)<a || this.input.LA(1)>b ) {\n            if ( this.state.backtracking>0 ) {\n                this.state.failed = true;\n                return;\n            }\n            mre = new org.antlr.runtime.MismatchedRangeException(a,b,this.input);\n            this.recover(mre);\n            throw mre;\n        }\n        this.input.consume();\n        this.state.failed = false;\n    },\n\n    getLine: function() {\n        return this.input.getLine();\n    },\n\n    getCharPositionInLine: function() {\n        return this.input.getCharPositionInLine();\n    },\n\n    /** What is the index of the current character of lookahead? */\n    getCharIndex: function() {\n        return this.input.index();\n    },\n\n    /** Return the text matched so far for the current token or any\n     *  text override.\n     */\n    getText: function() {\n        if ( org.antlr.lang.isString(this.state.text) ) {\n            return this.state.text;\n        }\n        return this.input.substring(this.state.tokenStartCharIndex,this.getCharIndex()-1);\n    },\n\n    /** Set the complete text of this token; it wipes any previous\n     *  changes to the text.\n     */\n    setText: function(text) {\n        this.state.text = text;\n    },\n\n    reportError: function(e) {\n        /** TODO: not thought about recovery in lexer yet.\n         *\n        // if we've already reported an error and have not matched a token\n        // yet successfully, don't report any errors.\n        if ( errorRecovery ) {\n            //System.err.print(\"[SPURIOUS] \");\n            return;\n        }\n        errorRecovery = true;\n         */\n\n        this.displayRecognitionError(this.getTokenNames(), e);\n    },\n\n    getErrorMessage: function(e, tokenNames) {\n        var msg = null;\n        if ( e instanceof org.antlr.runtime.MismatchedTokenException ) {\n            msg = \"mismatched character \"+this.getCharErrorDisplay(e.c)+\" expecting \"+this.getCharErrorDisplay(e.expecting);\n        }\n        else if ( e instanceof org.antlr.runtime.NoViableAltException ) {\n            msg = \"no viable alternative at character \"+this.getCharErrorDisplay(e.c);\n        }\n        else if ( e instanceof org.antlr.runtime.EarlyExitException ) {\n            msg = \"required (...)+ loop did not match anything at character \"+this.getCharErrorDisplay(e.c);\n        }\n        else if ( e instanceof org.antlr.runtime.MismatchedNotSetException ) {\n            msg = \"mismatched character \"+this.getCharErrorDisplay(e.c)+\" expecting set \"+e.expecting;\n        }\n        else if ( e instanceof org.antlr.runtime.MismatchedSetException ) {\n            msg = \"mismatched character \"+this.getCharErrorDisplay(e.c)+\" expecting set \"+e.expecting;\n        }\n        else if ( e instanceof org.antlr.runtime.MismatchedRangeException ) {\n            msg = \"mismatched character \"+this.getCharErrorDisplay(e.c)+\" expecting set \"+\n                this.getCharErrorDisplay(e.a)+\"..\"+this.getCharErrorDisplay(e.b);\n        }\n        else {\n            msg = org.antlr.runtime.Lexer.superclass.getErrorMessage.call(this, e, tokenNames);\n        }\n        return msg;\n    },\n\n    getCharErrorDisplay: function(c) {\n        var s = c; //String.fromCharCode(c);\n        switch ( s ) {\n            case org.antlr.runtime.Token.EOF :\n                s = \"<EOF>\";\n                break;\n            case \"\\n\" :\n                s = \"\\\\n\";\n                break;\n            case \"\\t\" :\n                s = \"\\\\t\";\n                break;\n            case \"\\r\" :\n                s = \"\\\\r\";\n                break;\n        }\n        return \"'\"+s+\"'\";\n    },\n\n    /** Lexers can normally match any char in it's vocabulary after matching\n     *  a token, so do the easy thing and just kill a character and hope\n     *  it all works out.  You can instead use the rule invocation stack\n     *  to do sophisticated error recovery if you are in a fragment rule.\n     */\n    recover: function(re) {\n        this.input.consume();\n    },\n\n    traceIn: function(ruleName, ruleIndex)  {\n        var inputSymbol = String.fromCharCode(this.input.LT(1))+\" line=\"+this.getLine()+\":\"+this.getCharPositionInLine();\n        org.antlr.runtime.Lexer.superclass.traceIn.call(this, ruleName, ruleIndex, inputSymbol);\n    },\n\n    traceOut: function(ruleName, ruleIndex)  {\n\t\tvar inputSymbol = String.fromCharCode(this.input.LT(1))+\" line=\"+this.getLine()+\":\"+this.getCharPositionInLine();\n\t\torg.antlr.runtime.Lexer.superclass.traceOut.call(this, ruleName, ruleIndex, inputSymbol);\n\t}\n});\norg.antlr.runtime.ParserRuleReturnScope = function() {};\n\norg.antlr.runtime.ParserRuleReturnScope.prototype = {\n    getStart: function() { return this.start; },\n    getStop: function() { return this.stop; }\n};\norg.antlr.runtime.tree.TreeRuleReturnScope = function(){};\n\norg.antlr.runtime.tree.TreeRuleReturnScope.prototype = {\n    getStart: function() { return this.start; }\n};\norg.antlr.runtime.Parser = function(input, state) {\n    org.antlr.runtime.Parser.superclass.constructor.call(this, state);\n    this.setTokenStream(input);\n};\n\norg.antlr.lang.extend(org.antlr.runtime.Parser, org.antlr.runtime.BaseRecognizer, {\n    reset: function() {\n        // reset all recognizer state variables\n\t\torg.antlr.runtime.Parser.superclass.reset.call(this);\n\t\tif ( org.antlr.lang.isValue(this.input) ) {\n\t\t\tthis.input.seek(0); // rewind the input\n\t\t}\n\t},\n\n    getCurrentInputSymbol: function(input) {\n        return input.LT(1);\n    },\n\n    getMissingSymbol: function(input,\n                               e,\n                               expectedTokenType,\n                               follow)\n    {\n        var tokenText =\n            \"<missing \"+this.getTokenNames()[expectedTokenType]+\">\";\n        var t = new org.antlr.runtime.CommonToken(expectedTokenType, tokenText);\n        var current = input.LT(1);\n        var old_current;\n        if ( current.getType() === org.antlr.runtime.Token.EOF ) {\n            old_current = current;\n            current = input.LT(-1);\n            // handle edge case where there are no good tokens in the stream\n            if (!current) {\n                current = old_current;\n            }\n        }\n        t.line = current.getLine();\n        t.charPositionInLine = current.getCharPositionInLine();\n        t.channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n        return t;\n    },\n\n\n\t/** Set the token stream and reset the parser */\n    setTokenStream: function(input) {\n\t\tthis.input = null;\n\t\tthis.reset();\n\t\tthis.input = input;\n\t},\n\n    getTokenStream: function() {\n\t\treturn this.input;\n\t},\n\n    getSourceName: function() {\n        return this.input.getSourceName();\n    },\n\n    traceIn: function(ruleName, ruleIndex)  {\n\t\torg.antlr.runtime.Parser.superclass.traceIn.call(\n                this, ruleName, ruleIndex, this.input.LT(1));\n\t},\n\n    traceOut: function(ruleName, ruleIndex)  {\n\t\torg.antlr.runtime.Parser.superclass.traceOut.call(\n                this, ruleName, ruleIndex, this.input.LT(1));\n\t}\n});\norg.antlr.runtime.DFA = function() {};\n\norg.antlr.runtime.DFA.prototype = {\n    /** From the input stream, predict what alternative will succeed\n     *  using this DFA (representing the covering regular approximation\n     *  to the underlying CFL).  Return an alternative number 1..n.  Throw\n     *  an exception upon error.\n     */\n    predict: function(input) {\n        var mark = input.mark(), // remember where decision started in input\n            s = 0, // we always start at s0\n            specialState,\n            c,\n            snext;\n\n        try {\n            while ( true ) {\n                specialState = this.special[s];\n                if ( specialState>=0 ) {\n                    s = this.specialStateTransition(specialState,input);\n                    if (s===-1) {\n                        this.noViableAlt(s, input);\n                        return 0;\n                    }\n                    input.consume();\n                    continue;\n                }\n                if ( this.accept[s] >= 1 ) {\n                    return this.accept[s];\n                }\n                // look for a normal char transition\n                c = input.LA(1); // -1 == \\uFFFF, all tokens fit in 65000 space\n\n                if (c===org.antlr.runtime.Token.EOF) {\n                    c = -1;\n                } else if (org.antlr.lang.isString(c)) {\n                    c = c.charCodeAt(0);\n                }\n\n                if (c>=this.min[s] && c<=this.max[s]) {\n                    snext = this.transition[s][c-this.min[s]]; // move to next state\n                    if ( snext < 0 ) {\n                        // was in range but not a normal transition\n                        // must check EOT, which is like the else clause.\n                        // eot[s]>=0 indicates that an EOT edge goes to another\n                        // state.\n                        if ( this.eot[s]>=0 ) {  // EOT Transition to accept state?\n                            s = this.eot[s];\n                            input.consume();\n                            // TODO: I had this as return accept[eot[s]]\n                            // which assumed here that the EOT edge always\n                            // went to an accept...faster to do this, but\n                            // what about predicated edges coming from EOT\n                            // target?\n                            continue;\n                        }\n                        this.noViableAlt(s,input);\n                        return 0;\n                    }\n                    s = snext;\n                    input.consume();\n                    continue;\n                }\n                if ( this.eot[s]>=0 ) {  // EOT Transition?\n                    s = this.eot[s];\n                    input.consume();\n                    continue;\n                }\n                if ( c==org.antlr.runtime.Token.EOF && this.eof[s]>=0 ) {  // EOF Transition to accept state?\n                    return this.accept[this.eof[s]];\n                }\n                // not in range and not EOF/EOT, must be invalid symbol\n                this.noViableAlt(s,input);\n                return 0;\n            }\n        }\n        finally {\n            input.rewind(mark);\n        }\n    },\n\n    noViableAlt: function(s, input) {\n        if (this.recognizer.state.backtracking>0) {\n            this.recognizer.state.failed=true;\n            return;\n        }\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(),\n                                     this.decisionNumber,\n                                     s,\n                                     input);\n        this.error(nvae);\n        throw nvae;\n    },\n\n    /** A hook for debugging interface */\n    error: function(nvae) { },\n\n    specialStateTransition: function(s, input) {\n        return -1;\n    },\n\n    getDescription: function() {\n        return \"n/a\";\n    }\n};\n\norg.antlr.lang.augmentObject(org.antlr.runtime.DFA, {\n    /** Given a String that has a run-length-encoding of some unsigned shorts\n     *  like \"\\1\\2\\3\\9\", convert to short[] {2,9,9,9}.\n     */\n    unpackEncodedString: function(encodedString) {\n        // walk first to find how big it is.\n        var i,\n            data = [],\n            di = 0,\n            n,\n            v,\n            j;\n        for (i=0; i<encodedString.length; i+=2) {\n            n = encodedString.charCodeAt(i);\n            v = encodedString.charCodeAt(i+1);\n            if (v===0xffff) {\n                v = -1; // overflow at 16 bits\n            }\n            // add v n times to data\n            for (j=1; j<=n; j++) {\n                data[di++] = v;\n            }\n        }\n        return data;\n    },\n\n    // alias\n    unpackEncodedStringToUnsignedChars: function(encodedString) {\n        return org.antlr.runtime.DFA.unpackEncodedString(encodedString);\n    }\n});\norg.antlr.runtime.tree.TreeParser = function(input) {\n    org.antlr.runtime.tree.TreeParser.superclass.constructor.call(this, arguments[1]);\n    this.setTreeNodeStream(input);\n};\n\n(function(){\nvar TP = org.antlr.runtime.tree.TreeParser;\n\norg.antlr.lang.augmentObject(TP, {\n    DOWN: org.antlr.runtime.Token.DOWN,\n    UP: org.antlr.runtime.Token.UP\n});\n\norg.antlr.lang.extend(TP, org.antlr.runtime.BaseRecognizer, {\n    reset: function() {\n        TP.superclass.reset.call(this); // reset all recognizer state variables\n        if ( this.input ) {\n            this.input.seek(0); // rewind the input\n        }\n    },\n\n    /** Set the input stream */\n    setTreeNodeStream: function(input) {\n        this.input = input;\n    },\n\n    getTreeNodeStream: function() {\n        return this.input;\n    },\n\n    getSourceName: function() {\n        return this.input.getSourceName();\n    },\n\n    getCurrentInputSymbol: function(input) {\n        return input.LT(1);\n    },\n\n    getMissingSymbol: function(input, e, expectedTokenType, follow) {\n        var tokenText =\n            \"<missing \"+this.getTokenNames()[expectedTokenType]+\">\";\n        return new org.antlr.runtime.tree.CommonTree(new org.antlr.runtime.CommonToken(expectedTokenType, tokenText));\n    },\n\n    /** Match '.' in tree parser has special meaning.  Skip node or\n     *  entire tree if node has children.  If children, scan until\n     *  corresponding UP node.\n     */\n    matchAny: function(ignore) { // ignore stream, copy of this.input\n        this.state.errorRecovery = false;\n        this.state.failed = false;\n        var look = this.input.LT(1);\n        if ( this.input.getTreeAdaptor().getChildCount(look)===0 ) {\n            this.input.consume(); // not subtree, consume 1 node and return\n            return;\n        }\n        // current node is a subtree, skip to corresponding UP.\n        // must count nesting level to get right UP\n        var level=0,\n            tokenType = this.input.getTreeAdaptor().getType(look);\n        while ( tokenType!==org.antlr.runtime.Token.EOF &&\n                !(tokenType===TP.UP && level===0) )\n        {\n            this.input.consume();\n            look = this.input.LT(1);\n            tokenType = this.input.getTreeAdaptor().getType(look);\n            if ( tokenType === TP.DOWN ) {\n                level++;\n            }\n            else if ( tokenType === TP.UP ) {\n                level--;\n            }\n        }\n        this.input.consume(); // consume UP\n    },\n\n    /** We have DOWN/UP nodes in the stream that have no line info; override.\n     *  plus we want to alter the exception type.  Don't try to recover\n     *       *  from tree parser errors inline...\n     */\n    mismatch: function(input, ttype, follow) {\n        throw new org.antlr.runtime.MismatchedTreeNodeException(ttype, input);\n    },\n\n    /** Prefix error message with the grammar name because message is\n     *  always intended for the programmer because the parser built\n     *  the input tree not the user.\n     */\n    getErrorHeader: function(e) {\n        return this.getGrammarFileName()+\": node from \"+\n               (e.approximateLineInfo?\"after \":\"\")+\"line \"+e.line+\":\"+e.charPositionInLine;\n    },\n\n    /** Tree parsers parse nodes they usually have a token object as\n     *  payload. Set the exception token and do the default behavior.\n     */\n    getErrorMessage: function(e, tokenNames) {\n        var adaptor;\n        if ( this instanceof TP ) {\n            adaptor = e.input.getTreeAdaptor();\n            e.token = adaptor.getToken(e.node);\n            if ( !org.antlr.lang.isValue(e.token) ) { // could be an UP/DOWN node\n                e.token = new org.antlr.runtime.CommonToken(\n                        adaptor.getType(e.node),\n                        adaptor.getText(e.node));\n            }\n        }\n        return TP.superclass.getErrorMessage.call(this, e, tokenNames);\n    },\n\n    traceIn: function(ruleName, ruleIndex) {\n        TP.superclass.traceIn.call(this, ruleName, ruleIndex, this.input.LT(1));\n    },\n\n    traceOut: function(ruleName, ruleIndex) {\n        TP.superclass.traceOut.call(this, ruleName, ruleIndex, this.input.LT(1));\n    }\n});\n\n})();\n\nexports.org = org;\n\n});\ndefine('ace/mode/xquery/XQueryLexer', ['require', 'exports', 'module' , 'ace/mode/xquery/antlr3-all', 'ace/mode/xquery/XQDTLexer'], function(require, exports, module) {// $ANTLR 3.3 Nov 30, 2010 12:50:56 /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g 2012-09-05 10:41:37\n\n/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\nvar org =  require(\"./antlr3-all\").org;\nvar XQDTLexer   = require(\"./XQDTLexer\").XQDTLexer;\n\n\nvar XQueryLexer = function(input, state) {\n// alternate constructor @todo\n// public XQueryLexer(CharStream input)\n// public XQueryLexer(CharStream input, RecognizerSharedState state) {\n    if (!state) {\n        state = new org.antlr.runtime.RecognizerSharedState();\n    }\n\n    (function(){\n\n\n        this.inStr = false;\n\n        // dummy list for warning elimination\n        //List<Stack<Object>> dummy = new ArrayList<Stack<Object>>();\n\n        // when we start, the '<' has already been eaten by the other lexer\n        //boolean inStr = false;\n        //\n        //public boolean isInString()\n        //{\n        //   return inStr;\n        //}\n\n\n    }).call(this);\n\n    this.dfa19 = new XQueryLexer.DFA19(this);\n    XQueryLexer.superclass.constructor.call(this, input, state);\n\n\n};\n\norg.antlr.lang.augmentObject(XQueryLexer, {\n    EOF: -1,\n    L_QuotAttrContentChar: 4,\n    L_AposAttrContentChar: 5,\n    L_ElementContentChar: 6,\n    L_CDataSection: 7,\n    L_PredefinedEntityRef: 8,\n    L_CharRef: 9,\n    ESCAPE_LBRACKET: 10,\n    ESCAPE_RBRACKET: 11,\n    ESCAPE_APOS: 12,\n    ESCAPE_QUOT: 13,\n    CDATA_START: 14,\n    CDATA_END: 15,\n    ANCESTOR: 16,\n    ANCESTOR_OR_SELF: 17,\n    AND: 18,\n    AS: 19,\n    ASCENDING: 20,\n    AT: 21,\n    ATTRIBUTE: 22,\n    BASE_URI: 23,\n    BOUNDARY_SPACE: 24,\n    BY: 25,\n    CASE: 26,\n    CAST: 27,\n    CASTABLE: 28,\n    CHILD: 29,\n    COLLATION: 30,\n    COMMENT: 31,\n    CONSTRUCTION: 32,\n    COPY_NAMESPACES: 33,\n    DECLARE: 34,\n    DEFAULT: 35,\n    DESCENDANT: 36,\n    DESCENDANT_OR_SELF: 37,\n    DESCENDING: 38,\n    DIV: 39,\n    DOCUMENT: 40,\n    DOCUMENT_NODE: 41,\n    ELEMENT: 42,\n    ELSE: 43,\n    EMPTY: 44,\n    EMPTY_SEQUENCE: 45,\n    ENCODING: 46,\n    EQ: 47,\n    EVERY: 48,\n    EXCEPT: 49,\n    EXTERNAL: 50,\n    FOLLOWING: 51,\n    FOLLOWING_SIBLING: 52,\n    FOR: 53,\n    FUNCTION: 54,\n    GE: 55,\n    GREATEST: 56,\n    GT: 57,\n    IDIV: 58,\n    IF: 59,\n    IMPORT: 60,\n    IN: 61,\n    INHERIT: 62,\n    INSTANCE: 63,\n    INTERSECT: 64,\n    IS: 65,\n    ITEM: 66,\n    LAX: 67,\n    LE: 68,\n    LEAST: 69,\n    LET: 70,\n    LT: 71,\n    MOD: 72,\n    MODULE: 73,\n    NAMESPACE: 74,\n    NE: 75,\n    NO_INHERIT: 76,\n    NO_PRESERVE: 77,\n    NODE: 78,\n    JSON: 79,\n    OF: 80,\n    OPTION: 81,\n    OR: 82,\n    ORDER: 83,\n    ORDERED: 84,\n    ORDERING: 85,\n    PARENT: 86,\n    PRECEDING: 87,\n    PRECEDING_SIBLING: 88,\n    PRESERVE: 89,\n    PROCESSING_INSTRUCTION: 90,\n    STRUCTURED_ITEM: 91,\n    JSON_ITEM: 92,\n    OBJECT: 93,\n    ARRAY: 94,\n    RETURN: 95,\n    SATISFIES: 96,\n    SCHEMA: 97,\n    SCHEMA_ATTRIBUTE: 98,\n    SCHEMA_ELEMENT: 99,\n    SELF: 100,\n    SOME: 101,\n    STABLE: 102,\n    STRICT: 103,\n    STRIP: 104,\n    TEXT: 105,\n    THEN: 106,\n    TO: 107,\n    TREAT: 108,\n    TYPESWITCH: 109,\n    UNION: 110,\n    UNORDERED: 111,\n    VALIDATE: 112,\n    VARIABLE: 113,\n    VERSION: 114,\n    WHERE: 115,\n    XQUERY: 116,\n    ALLOWING: 117,\n    CATCH: 118,\n    CONTEXT: 119,\n    COUNT: 120,\n    DECIMAL_FORMAT: 121,\n    DECIMAL_SEPARATOR: 122,\n    DIGIT: 123,\n    END: 124,\n    GROUP: 125,\n    GROUPING_SEPARATOR: 126,\n    INFINITY: 127,\n    MINUS_SIGN: 128,\n    NAMESPACE_NODE: 129,\n    NAN: 130,\n    NEXT: 131,\n    ONLY: 132,\n    PATTERN_SEPARATOR: 133,\n    PERCENT: 134,\n    PER_MILLE: 135,\n    PREVIOUS: 136,\n    SLIDING: 137,\n    START: 138,\n    SWITCH: 139,\n    TRY: 140,\n    TUMBLING: 141,\n    TYPE: 142,\n    WHEN: 143,\n    WINDOW: 144,\n    ZERO_DIGIT: 145,\n    AFTER: 146,\n    BEFORE: 147,\n    COPY: 148,\n    DELETE: 149,\n    FIRST: 150,\n    INSERT: 151,\n    INTO: 152,\n    POSITION: 153,\n    APPEND: 154,\n    LAST: 155,\n    MODIFY: 156,\n    NODES: 157,\n    RENAME: 158,\n    REPLACE: 159,\n    REVALIDATION: 160,\n    SKIP: 161,\n    UPDATING: 162,\n    VALUE: 163,\n    WITH: 164,\n    ALL: 165,\n    ANY: 166,\n    CONTAINS: 167,\n    CONTENT: 168,\n    DIACRITICS: 169,\n    DIFFERENT: 170,\n    DISTANCE: 171,\n    ENTIRE: 172,\n    EXACTLY: 173,\n    FROM: 174,\n    FT_OPTION: 175,\n    FTAND: 176,\n    FTNOT: 177,\n    FTOR: 178,\n    INSENSITIVE: 179,\n    LANGUAGE: 180,\n    LEVELS: 181,\n    LOWERCASE: 182,\n    MOST: 183,\n    NO: 184,\n    NOT: 185,\n    OCCURS: 186,\n    PARAGRAPH: 187,\n    PARAGRAPHS: 188,\n    PHRASE: 189,\n    RELATIONSHIP: 190,\n    SAME: 191,\n    SCORE: 192,\n    SENSITIVE: 193,\n    SENTENCE: 194,\n    SENTENCES: 195,\n    STEMMING: 196,\n    STOP: 197,\n    THESAURUS: 198,\n    TIMES: 199,\n    UPPERCASE: 200,\n    USING: 201,\n    WEIGHT: 202,\n    WILDCARDS: 203,\n    WITHOUT: 204,\n    WORD: 205,\n    WORDS: 206,\n    BREAK: 207,\n    CONTINUE: 208,\n    EXIT: 209,\n    LOOP: 210,\n    RETURNING: 211,\n    WHILE: 212,\n    CHECK: 213,\n    COLLECTION: 214,\n    CONSTRAINT: 215,\n    FOREACH: 216,\n    FOREIGN: 217,\n    INDEX: 218,\n    INTEGRITY: 219,\n    KEY: 220,\n    ON: 221,\n    UNIQUE: 222,\n    AMP_ER: 223,\n    APOS_ER: 224,\n    QUOT_ER: 225,\n    CONCAT: 226,\n    LPAREN: 227,\n    RPAREN: 228,\n    DOLLAR: 229,\n    L_UNION_BRACKET: 230,\n    R_UNION_BRACKET: 231,\n    LBRACKET: 232,\n    RBRACKET: 233,\n    LSQUARE: 234,\n    RSQUARE: 235,\n    EQUAL: 236,\n    BIND: 237,\n    NOTEQUAL: 238,\n    ANN_PERCENT: 239,\n    HASH: 240,\n    AMP: 241,\n    COMMA: 242,\n    QUESTION: 243,\n    STAR: 244,\n    PLUS: 245,\n    MINUS: 246,\n    SMALLER: 247,\n    GREATER: 248,\n    SMALLEREQ: 249,\n    GREATEREQ: 250,\n    SMALLER_SMALLER: 251,\n    GREATER_GREATER: 252,\n    SLASH: 253,\n    SLASH_SLASH: 254,\n    BANG: 255,\n    DOT: 256,\n    DOT_DOT: 257,\n    COLON: 258,\n    COLON_COLON: 259,\n    EMPTY_CLOSE_TAG: 260,\n    CLOSE_TAG: 261,\n    SEMICOLON: 262,\n    VBAR: 263,\n    PRAGMA_START: 264,\n    PRAGMA_END: 265,\n    XML_COMMENT_START: 266,\n    XML_COMMENT_END: 267,\n    PI_START: 268,\n    PI_END: 269,\n    ATTR_SIGN: 270,\n    Q: 271,\n    CHARREF_DEC: 272,\n    CHARREF_HEX: 273,\n    APOS: 274,\n    QUOT: 275,\n    NCNameStartChar: 276,\n    NCNameChar: 277,\n    L_NCName: 278,\n    Letter: 279,\n    HexLetter: 280,\n    Digit: 281,\n    Digits: 282,\n    S: 283,\n    SU: 284,\n    L_Pragma: 285,\n    L_DirCommentConstructor: 286,\n    L_DirPIConstructor: 287,\n    L_IntegerLiteral: 288,\n    L_DecimalLiteral: 289,\n    L_DoubleLiteral: 290,\n    L_Comment: 291,\n    L_AnyChar: 292\n});\n\n(function(){\nvar HIDDEN = org.antlr.runtime.Token.HIDDEN_CHANNEL,\n    EOF = org.antlr.runtime.Token.EOF;\norg.antlr.lang.extend(XQueryLexer, XQDTLexer, {\n    EOF : -1,\n    L_QuotAttrContentChar : 4,\n    L_AposAttrContentChar : 5,\n    L_ElementContentChar : 6,\n    L_CDataSection : 7,\n    L_PredefinedEntityRef : 8,\n    L_CharRef : 9,\n    ESCAPE_LBRACKET : 10,\n    ESCAPE_RBRACKET : 11,\n    ESCAPE_APOS : 12,\n    ESCAPE_QUOT : 13,\n    CDATA_START : 14,\n    CDATA_END : 15,\n    ANCESTOR : 16,\n    ANCESTOR_OR_SELF : 17,\n    AND : 18,\n    AS : 19,\n    ASCENDING : 20,\n    AT : 21,\n    ATTRIBUTE : 22,\n    BASE_URI : 23,\n    BOUNDARY_SPACE : 24,\n    BY : 25,\n    CASE : 26,\n    CAST : 27,\n    CASTABLE : 28,\n    CHILD : 29,\n    COLLATION : 30,\n    COMMENT : 31,\n    CONSTRUCTION : 32,\n    COPY_NAMESPACES : 33,\n    DECLARE : 34,\n    DEFAULT : 35,\n    DESCENDANT : 36,\n    DESCENDANT_OR_SELF : 37,\n    DESCENDING : 38,\n    DIV : 39,\n    DOCUMENT : 40,\n    DOCUMENT_NODE : 41,\n    ELEMENT : 42,\n    ELSE : 43,\n    EMPTY : 44,\n    EMPTY_SEQUENCE : 45,\n    ENCODING : 46,\n    EQ : 47,\n    EVERY : 48,\n    EXCEPT : 49,\n    EXTERNAL : 50,\n    FOLLOWING : 51,\n    FOLLOWING_SIBLING : 52,\n    FOR : 53,\n    FUNCTION : 54,\n    GE : 55,\n    GREATEST : 56,\n    GT : 57,\n    IDIV : 58,\n    IF : 59,\n    IMPORT : 60,\n    IN : 61,\n    INHERIT : 62,\n    INSTANCE : 63,\n    INTERSECT : 64,\n    IS : 65,\n    ITEM : 66,\n    LAX : 67,\n    LE : 68,\n    LEAST : 69,\n    LET : 70,\n    LT : 71,\n    MOD : 72,\n    MODULE : 73,\n    NAMESPACE : 74,\n    NE : 75,\n    NO_INHERIT : 76,\n    NO_PRESERVE : 77,\n    NODE : 78,\n    JSON : 79,\n    OF : 80,\n    OPTION : 81,\n    OR : 82,\n    ORDER : 83,\n    ORDERED : 84,\n    ORDERING : 85,\n    PARENT : 86,\n    PRECEDING : 87,\n    PRECEDING_SIBLING : 88,\n    PRESERVE : 89,\n    PROCESSING_INSTRUCTION : 90,\n    STRUCTURED_ITEM : 91,\n    JSON_ITEM : 92,\n    OBJECT : 93,\n    ARRAY : 94,\n    RETURN : 95,\n    SATISFIES : 96,\n    SCHEMA : 97,\n    SCHEMA_ATTRIBUTE : 98,\n    SCHEMA_ELEMENT : 99,\n    SELF : 100,\n    SOME : 101,\n    STABLE : 102,\n    STRICT : 103,\n    STRIP : 104,\n    TEXT : 105,\n    THEN : 106,\n    TO : 107,\n    TREAT : 108,\n    TYPESWITCH : 109,\n    UNION : 110,\n    UNORDERED : 111,\n    VALIDATE : 112,\n    VARIABLE : 113,\n    VERSION : 114,\n    WHERE : 115,\n    XQUERY : 116,\n    ALLOWING : 117,\n    CATCH : 118,\n    CONTEXT : 119,\n    COUNT : 120,\n    DECIMAL_FORMAT : 121,\n    DECIMAL_SEPARATOR : 122,\n    DIGIT : 123,\n    END : 124,\n    GROUP : 125,\n    GROUPING_SEPARATOR : 126,\n    INFINITY : 127,\n    MINUS_SIGN : 128,\n    NAMESPACE_NODE : 129,\n    NAN : 130,\n    NEXT : 131,\n    ONLY : 132,\n    PATTERN_SEPARATOR : 133,\n    PERCENT : 134,\n    PER_MILLE : 135,\n    PREVIOUS : 136,\n    SLIDING : 137,\n    START : 138,\n    SWITCH : 139,\n    TRY : 140,\n    TUMBLING : 141,\n    TYPE : 142,\n    WHEN : 143,\n    WINDOW : 144,\n    ZERO_DIGIT : 145,\n    AFTER : 146,\n    BEFORE : 147,\n    COPY : 148,\n    DELETE : 149,\n    FIRST : 150,\n    INSERT : 151,\n    INTO : 152,\n    POSITION : 153,\n    APPEND : 154,\n    LAST : 155,\n    MODIFY : 156,\n    NODES : 157,\n    RENAME : 158,\n    REPLACE : 159,\n    REVALIDATION : 160,\n    SKIP : 161,\n    UPDATING : 162,\n    VALUE : 163,\n    WITH : 164,\n    ALL : 165,\n    ANY : 166,\n    CONTAINS : 167,\n    CONTENT : 168,\n    DIACRITICS : 169,\n    DIFFERENT : 170,\n    DISTANCE : 171,\n    ENTIRE : 172,\n    EXACTLY : 173,\n    FROM : 174,\n    FT_OPTION : 175,\n    FTAND : 176,\n    FTNOT : 177,\n    FTOR : 178,\n    INSENSITIVE : 179,\n    LANGUAGE : 180,\n    LEVELS : 181,\n    LOWERCASE : 182,\n    MOST : 183,\n    NO : 184,\n    NOT : 185,\n    OCCURS : 186,\n    PARAGRAPH : 187,\n    PARAGRAPHS : 188,\n    PHRASE : 189,\n    RELATIONSHIP : 190,\n    SAME : 191,\n    SCORE : 192,\n    SENSITIVE : 193,\n    SENTENCE : 194,\n    SENTENCES : 195,\n    STEMMING : 196,\n    STOP : 197,\n    THESAURUS : 198,\n    TIMES : 199,\n    UPPERCASE : 200,\n    USING : 201,\n    WEIGHT : 202,\n    WILDCARDS : 203,\n    WITHOUT : 204,\n    WORD : 205,\n    WORDS : 206,\n    BREAK : 207,\n    CONTINUE : 208,\n    EXIT : 209,\n    LOOP : 210,\n    RETURNING : 211,\n    WHILE : 212,\n    CHECK : 213,\n    COLLECTION : 214,\n    CONSTRAINT : 215,\n    FOREACH : 216,\n    FOREIGN : 217,\n    INDEX : 218,\n    INTEGRITY : 219,\n    KEY : 220,\n    ON : 221,\n    UNIQUE : 222,\n    AMP_ER : 223,\n    APOS_ER : 224,\n    QUOT_ER : 225,\n    CONCAT : 226,\n    LPAREN : 227,\n    RPAREN : 228,\n    DOLLAR : 229,\n    L_UNION_BRACKET : 230,\n    R_UNION_BRACKET : 231,\n    LBRACKET : 232,\n    RBRACKET : 233,\n    LSQUARE : 234,\n    RSQUARE : 235,\n    EQUAL : 236,\n    BIND : 237,\n    NOTEQUAL : 238,\n    ANN_PERCENT : 239,\n    HASH : 240,\n    AMP : 241,\n    COMMA : 242,\n    QUESTION : 243,\n    STAR : 244,\n    PLUS : 245,\n    MINUS : 246,\n    SMALLER : 247,\n    GREATER : 248,\n    SMALLEREQ : 249,\n    GREATEREQ : 250,\n    SMALLER_SMALLER : 251,\n    GREATER_GREATER : 252,\n    SLASH : 253,\n    SLASH_SLASH : 254,\n    BANG : 255,\n    DOT : 256,\n    DOT_DOT : 257,\n    COLON : 258,\n    COLON_COLON : 259,\n    EMPTY_CLOSE_TAG : 260,\n    CLOSE_TAG : 261,\n    SEMICOLON : 262,\n    VBAR : 263,\n    PRAGMA_START : 264,\n    PRAGMA_END : 265,\n    XML_COMMENT_START : 266,\n    XML_COMMENT_END : 267,\n    PI_START : 268,\n    PI_END : 269,\n    ATTR_SIGN : 270,\n    Q : 271,\n    CHARREF_DEC : 272,\n    CHARREF_HEX : 273,\n    APOS : 274,\n    QUOT : 275,\n    NCNameStartChar : 276,\n    NCNameChar : 277,\n    L_NCName : 278,\n    Letter : 279,\n    HexLetter : 280,\n    Digit : 281,\n    Digits : 282,\n    S : 283,\n    SU : 284,\n    L_Pragma : 285,\n    L_DirCommentConstructor : 286,\n    L_DirPIConstructor : 287,\n    L_IntegerLiteral : 288,\n    L_DecimalLiteral : 289,\n    L_DoubleLiteral : 290,\n    L_Comment : 291,\n    L_AnyChar : 292,\n    getGrammarFileName: function() { return \"/Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g\"; }\n});\norg.antlr.lang.augmentObject(XQueryLexer.prototype, {\n    // $ANTLR start ANCESTOR\n    mANCESTOR: function()  {\n        try {\n            var _type = this.ANCESTOR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:85:29: ( 'ancestor' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:85:31: 'ancestor'\n            this.match(\"ancestor\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ANCESTOR\",\n\n    // $ANTLR start ANCESTOR_OR_SELF\n    mANCESTOR_OR_SELF: function()  {\n        try {\n            var _type = this.ANCESTOR_OR_SELF;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:86:29: ( 'ancestor-or-self' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:86:31: 'ancestor-or-self'\n            this.match(\"ancestor-or-self\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ANCESTOR_OR_SELF\",\n\n    // $ANTLR start AND\n    mAND: function()  {\n        try {\n            var _type = this.AND;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:87:29: ( 'and' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:87:31: 'and'\n            this.match(\"and\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"AND\",\n\n    // $ANTLR start AS\n    mAS: function()  {\n        try {\n            var _type = this.AS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:88:29: ( 'as' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:88:31: 'as'\n            this.match(\"as\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"AS\",\n\n    // $ANTLR start ASCENDING\n    mASCENDING: function()  {\n        try {\n            var _type = this.ASCENDING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:89:29: ( 'ascending' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:89:31: 'ascending'\n            this.match(\"ascending\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ASCENDING\",\n\n    // $ANTLR start AT\n    mAT: function()  {\n        try {\n            var _type = this.AT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:90:29: ( 'at' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:90:31: 'at'\n            this.match(\"at\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"AT\",\n\n    // $ANTLR start ATTRIBUTE\n    mATTRIBUTE: function()  {\n        try {\n            var _type = this.ATTRIBUTE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:91:29: ( 'attribute' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:91:31: 'attribute'\n            this.match(\"attribute\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ATTRIBUTE\",\n\n    // $ANTLR start BASE_URI\n    mBASE_URI: function()  {\n        try {\n            var _type = this.BASE_URI;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:92:29: ( 'base-uri' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:92:31: 'base-uri'\n            this.match(\"base-uri\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"BASE_URI\",\n\n    // $ANTLR start BOUNDARY_SPACE\n    mBOUNDARY_SPACE: function()  {\n        try {\n            var _type = this.BOUNDARY_SPACE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:93:29: ( 'boundary-space' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:93:31: 'boundary-space'\n            this.match(\"boundary-space\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"BOUNDARY_SPACE\",\n\n    // $ANTLR start BY\n    mBY: function()  {\n        try {\n            var _type = this.BY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:94:29: ( 'by' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:94:31: 'by'\n            this.match(\"by\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"BY\",\n\n    // $ANTLR start CASE\n    mCASE: function()  {\n        try {\n            var _type = this.CASE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:95:29: ( 'case' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:95:31: 'case'\n            this.match(\"case\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CASE\",\n\n    // $ANTLR start CAST\n    mCAST: function()  {\n        try {\n            var _type = this.CAST;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:96:29: ( 'cast' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:96:31: 'cast'\n            this.match(\"cast\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CAST\",\n\n    // $ANTLR start CASTABLE\n    mCASTABLE: function()  {\n        try {\n            var _type = this.CASTABLE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:97:29: ( 'castable' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:97:31: 'castable'\n            this.match(\"castable\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CASTABLE\",\n\n    // $ANTLR start CHILD\n    mCHILD: function()  {\n        try {\n            var _type = this.CHILD;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:98:29: ( 'child' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:98:31: 'child'\n            this.match(\"child\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CHILD\",\n\n    // $ANTLR start COLLATION\n    mCOLLATION: function()  {\n        try {\n            var _type = this.COLLATION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:99:29: ( 'collation' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:99:31: 'collation'\n            this.match(\"collation\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COLLATION\",\n\n    // $ANTLR start COMMENT\n    mCOMMENT: function()  {\n        try {\n            var _type = this.COMMENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:100:29: ( 'comment' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:100:31: 'comment'\n            this.match(\"comment\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COMMENT\",\n\n    // $ANTLR start CONSTRUCTION\n    mCONSTRUCTION: function()  {\n        try {\n            var _type = this.CONSTRUCTION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:101:29: ( 'construction' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:101:31: 'construction'\n            this.match(\"construction\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CONSTRUCTION\",\n\n    // $ANTLR start COPY_NAMESPACES\n    mCOPY_NAMESPACES: function()  {\n        try {\n            var _type = this.COPY_NAMESPACES;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:102:29: ( 'copy-namespaces' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:102:31: 'copy-namespaces'\n            this.match(\"copy-namespaces\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COPY_NAMESPACES\",\n\n    // $ANTLR start DECLARE\n    mDECLARE: function()  {\n        try {\n            var _type = this.DECLARE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:103:29: ( 'declare' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:103:31: 'declare'\n            this.match(\"declare\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DECLARE\",\n\n    // $ANTLR start DEFAULT\n    mDEFAULT: function()  {\n        try {\n            var _type = this.DEFAULT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:104:29: ( 'default' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:104:31: 'default'\n            this.match(\"default\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DEFAULT\",\n\n    // $ANTLR start DESCENDANT\n    mDESCENDANT: function()  {\n        try {\n            var _type = this.DESCENDANT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:105:29: ( 'descendant' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:105:31: 'descendant'\n            this.match(\"descendant\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DESCENDANT\",\n\n    // $ANTLR start DESCENDANT_OR_SELF\n    mDESCENDANT_OR_SELF: function()  {\n        try {\n            var _type = this.DESCENDANT_OR_SELF;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:106:29: ( 'descendant-or-self' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:106:31: 'descendant-or-self'\n            this.match(\"descendant-or-self\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DESCENDANT_OR_SELF\",\n\n    // $ANTLR start DESCENDING\n    mDESCENDING: function()  {\n        try {\n            var _type = this.DESCENDING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:107:29: ( 'descending' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:107:31: 'descending'\n            this.match(\"descending\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DESCENDING\",\n\n    // $ANTLR start DIV\n    mDIV: function()  {\n        try {\n            var _type = this.DIV;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:108:29: ( 'div' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:108:31: 'div'\n            this.match(\"div\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DIV\",\n\n    // $ANTLR start DOCUMENT\n    mDOCUMENT: function()  {\n        try {\n            var _type = this.DOCUMENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:109:29: ( 'document' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:109:31: 'document'\n            this.match(\"document\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DOCUMENT\",\n\n    // $ANTLR start DOCUMENT_NODE\n    mDOCUMENT_NODE: function()  {\n        try {\n            var _type = this.DOCUMENT_NODE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:110:29: ( 'document-node' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:110:31: 'document-node'\n            this.match(\"document-node\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DOCUMENT_NODE\",\n\n    // $ANTLR start ELEMENT\n    mELEMENT: function()  {\n        try {\n            var _type = this.ELEMENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:111:29: ( 'element' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:111:31: 'element'\n            this.match(\"element\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ELEMENT\",\n\n    // $ANTLR start ELSE\n    mELSE: function()  {\n        try {\n            var _type = this.ELSE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:112:29: ( 'else' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:112:31: 'else'\n            this.match(\"else\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ELSE\",\n\n    // $ANTLR start EMPTY\n    mEMPTY: function()  {\n        try {\n            var _type = this.EMPTY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:113:29: ( 'empty' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:113:31: 'empty'\n            this.match(\"empty\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EMPTY\",\n\n    // $ANTLR start EMPTY_SEQUENCE\n    mEMPTY_SEQUENCE: function()  {\n        try {\n            var _type = this.EMPTY_SEQUENCE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:114:29: ( 'empty-sequence' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:114:31: 'empty-sequence'\n            this.match(\"empty-sequence\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EMPTY_SEQUENCE\",\n\n    // $ANTLR start ENCODING\n    mENCODING: function()  {\n        try {\n            var _type = this.ENCODING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:115:29: ( 'encoding' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:115:31: 'encoding'\n            this.match(\"encoding\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ENCODING\",\n\n    // $ANTLR start EQ\n    mEQ: function()  {\n        try {\n            var _type = this.EQ;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:116:29: ( 'eq' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:116:31: 'eq'\n            this.match(\"eq\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EQ\",\n\n    // $ANTLR start EVERY\n    mEVERY: function()  {\n        try {\n            var _type = this.EVERY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:117:29: ( 'every' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:117:31: 'every'\n            this.match(\"every\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EVERY\",\n\n    // $ANTLR start EXCEPT\n    mEXCEPT: function()  {\n        try {\n            var _type = this.EXCEPT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:118:29: ( 'except' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:118:31: 'except'\n            this.match(\"except\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EXCEPT\",\n\n    // $ANTLR start EXTERNAL\n    mEXTERNAL: function()  {\n        try {\n            var _type = this.EXTERNAL;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:119:29: ( 'external' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:119:31: 'external'\n            this.match(\"external\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EXTERNAL\",\n\n    // $ANTLR start FOLLOWING\n    mFOLLOWING: function()  {\n        try {\n            var _type = this.FOLLOWING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:120:29: ( 'following' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:120:31: 'following'\n            this.match(\"following\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FOLLOWING\",\n\n    // $ANTLR start FOLLOWING_SIBLING\n    mFOLLOWING_SIBLING: function()  {\n        try {\n            var _type = this.FOLLOWING_SIBLING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:121:29: ( 'following-sibling' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:121:31: 'following-sibling'\n            this.match(\"following-sibling\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FOLLOWING_SIBLING\",\n\n    // $ANTLR start FOR\n    mFOR: function()  {\n        try {\n            var _type = this.FOR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:122:29: ( 'for' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:122:31: 'for'\n            this.match(\"for\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FOR\",\n\n    // $ANTLR start FUNCTION\n    mFUNCTION: function()  {\n        try {\n            var _type = this.FUNCTION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:123:29: ( 'function' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:123:31: 'function'\n            this.match(\"function\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FUNCTION\",\n\n    // $ANTLR start GE\n    mGE: function()  {\n        try {\n            var _type = this.GE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:124:29: ( 'ge' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:124:31: 'ge'\n            this.match(\"ge\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GE\",\n\n    // $ANTLR start GREATEST\n    mGREATEST: function()  {\n        try {\n            var _type = this.GREATEST;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:125:29: ( 'greatest' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:125:31: 'greatest'\n            this.match(\"greatest\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GREATEST\",\n\n    // $ANTLR start GT\n    mGT: function()  {\n        try {\n            var _type = this.GT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:126:29: ( 'gt' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:126:31: 'gt'\n            this.match(\"gt\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GT\",\n\n    // $ANTLR start IDIV\n    mIDIV: function()  {\n        try {\n            var _type = this.IDIV;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:127:29: ( 'idiv' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:127:31: 'idiv'\n            this.match(\"idiv\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"IDIV\",\n\n    // $ANTLR start IF\n    mIF: function()  {\n        try {\n            var _type = this.IF;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:128:29: ( 'if' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:128:31: 'if'\n            this.match(\"if\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"IF\",\n\n    // $ANTLR start IMPORT\n    mIMPORT: function()  {\n        try {\n            var _type = this.IMPORT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:129:29: ( 'import' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:129:31: 'import'\n            this.match(\"import\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"IMPORT\",\n\n    // $ANTLR start IN\n    mIN: function()  {\n        try {\n            var _type = this.IN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:130:29: ( 'in' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:130:31: 'in'\n            this.match(\"in\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"IN\",\n\n    // $ANTLR start INHERIT\n    mINHERIT: function()  {\n        try {\n            var _type = this.INHERIT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:131:29: ( 'inherit' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:131:31: 'inherit'\n            this.match(\"inherit\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INHERIT\",\n\n    // $ANTLR start INSTANCE\n    mINSTANCE: function()  {\n        try {\n            var _type = this.INSTANCE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:132:29: ( 'instance' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:132:31: 'instance'\n            this.match(\"instance\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INSTANCE\",\n\n    // $ANTLR start INTERSECT\n    mINTERSECT: function()  {\n        try {\n            var _type = this.INTERSECT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:133:29: ( 'intersect' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:133:31: 'intersect'\n            this.match(\"intersect\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INTERSECT\",\n\n    // $ANTLR start IS\n    mIS: function()  {\n        try {\n            var _type = this.IS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:134:29: ( 'is' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:134:31: 'is'\n            this.match(\"is\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"IS\",\n\n    // $ANTLR start ITEM\n    mITEM: function()  {\n        try {\n            var _type = this.ITEM;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:135:29: ( 'item' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:135:31: 'item'\n            this.match(\"item\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ITEM\",\n\n    // $ANTLR start LAX\n    mLAX: function()  {\n        try {\n            var _type = this.LAX;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:136:29: ( 'lax' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:136:31: 'lax'\n            this.match(\"lax\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LAX\",\n\n    // $ANTLR start LE\n    mLE: function()  {\n        try {\n            var _type = this.LE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:137:29: ( 'le' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:137:31: 'le'\n            this.match(\"le\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LE\",\n\n    // $ANTLR start LEAST\n    mLEAST: function()  {\n        try {\n            var _type = this.LEAST;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:138:29: ( 'least' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:138:31: 'least'\n            this.match(\"least\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LEAST\",\n\n    // $ANTLR start LET\n    mLET: function()  {\n        try {\n            var _type = this.LET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:139:29: ( 'let' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:139:31: 'let'\n            this.match(\"let\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LET\",\n\n    // $ANTLR start LT\n    mLT: function()  {\n        try {\n            var _type = this.LT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:140:29: ( 'lt' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:140:31: 'lt'\n            this.match(\"lt\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LT\",\n\n    // $ANTLR start MOD\n    mMOD: function()  {\n        try {\n            var _type = this.MOD;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:141:29: ( 'mod' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:141:31: 'mod'\n            this.match(\"mod\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"MOD\",\n\n    // $ANTLR start MODULE\n    mMODULE: function()  {\n        try {\n            var _type = this.MODULE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:142:29: ( 'module' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:142:31: 'module'\n            this.match(\"module\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"MODULE\",\n\n    // $ANTLR start NAMESPACE\n    mNAMESPACE: function()  {\n        try {\n            var _type = this.NAMESPACE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:143:29: ( 'namespace' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:143:31: 'namespace'\n            this.match(\"namespace\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NAMESPACE\",\n\n    // $ANTLR start NE\n    mNE: function()  {\n        try {\n            var _type = this.NE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:144:29: ( 'ne' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:144:31: 'ne'\n            this.match(\"ne\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NE\",\n\n    // $ANTLR start NO_INHERIT\n    mNO_INHERIT: function()  {\n        try {\n            var _type = this.NO_INHERIT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:145:29: ( 'no-inherit' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:145:31: 'no-inherit'\n            this.match(\"no-inherit\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NO_INHERIT\",\n\n    // $ANTLR start NO_PRESERVE\n    mNO_PRESERVE: function()  {\n        try {\n            var _type = this.NO_PRESERVE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:146:29: ( 'no-preserve' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:146:31: 'no-preserve'\n            this.match(\"no-preserve\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NO_PRESERVE\",\n\n    // $ANTLR start NODE\n    mNODE: function()  {\n        try {\n            var _type = this.NODE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:147:29: ( 'node' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:147:31: 'node'\n            this.match(\"node\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NODE\",\n\n    // $ANTLR start JSON\n    mJSON: function()  {\n        try {\n            var _type = this.JSON;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:148:29: ( 'json' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:148:31: 'json'\n            this.match(\"json\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"JSON\",\n\n    // $ANTLR start OF\n    mOF: function()  {\n        try {\n            var _type = this.OF;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:149:29: ( 'of' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:149:31: 'of'\n            this.match(\"of\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"OF\",\n\n    // $ANTLR start OPTION\n    mOPTION: function()  {\n        try {\n            var _type = this.OPTION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:150:29: ( 'option' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:150:31: 'option'\n            this.match(\"option\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"OPTION\",\n\n    // $ANTLR start OR\n    mOR: function()  {\n        try {\n            var _type = this.OR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:151:29: ( 'or' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:151:31: 'or'\n            this.match(\"or\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"OR\",\n\n    // $ANTLR start ORDER\n    mORDER: function()  {\n        try {\n            var _type = this.ORDER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:152:29: ( 'order' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:152:31: 'order'\n            this.match(\"order\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ORDER\",\n\n    // $ANTLR start ORDERED\n    mORDERED: function()  {\n        try {\n            var _type = this.ORDERED;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:153:29: ( 'ordered' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:153:31: 'ordered'\n            this.match(\"ordered\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ORDERED\",\n\n    // $ANTLR start ORDERING\n    mORDERING: function()  {\n        try {\n            var _type = this.ORDERING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:154:29: ( 'ordering' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:154:31: 'ordering'\n            this.match(\"ordering\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ORDERING\",\n\n    // $ANTLR start PARENT\n    mPARENT: function()  {\n        try {\n            var _type = this.PARENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:155:29: ( 'parent' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:155:31: 'parent'\n            this.match(\"parent\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PARENT\",\n\n    // $ANTLR start PRECEDING\n    mPRECEDING: function()  {\n        try {\n            var _type = this.PRECEDING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:156:29: ( 'preceding' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:156:31: 'preceding'\n            this.match(\"preceding\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PRECEDING\",\n\n    // $ANTLR start PRECEDING_SIBLING\n    mPRECEDING_SIBLING: function()  {\n        try {\n            var _type = this.PRECEDING_SIBLING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:157:29: ( 'preceding-sibling' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:157:31: 'preceding-sibling'\n            this.match(\"preceding-sibling\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PRECEDING_SIBLING\",\n\n    // $ANTLR start PRESERVE\n    mPRESERVE: function()  {\n        try {\n            var _type = this.PRESERVE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:158:29: ( 'preserve' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:158:31: 'preserve'\n            this.match(\"preserve\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PRESERVE\",\n\n    // $ANTLR start PROCESSING_INSTRUCTION\n    mPROCESSING_INSTRUCTION: function()  {\n        try {\n            var _type = this.PROCESSING_INSTRUCTION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:159:29: ( 'processing-instruction' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:159:31: 'processing-instruction'\n            this.match(\"processing-instruction\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PROCESSING_INSTRUCTION\",\n\n    // $ANTLR start STRUCTURED_ITEM\n    mSTRUCTURED_ITEM: function()  {\n        try {\n            var _type = this.STRUCTURED_ITEM;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:160:29: ( 'structured-item' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:160:31: 'structured-item'\n            this.match(\"structured-item\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"STRUCTURED_ITEM\",\n\n    // $ANTLR start JSON_ITEM\n    mJSON_ITEM: function()  {\n        try {\n            var _type = this.JSON_ITEM;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:161:29: ( 'json-item' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:161:31: 'json-item'\n            this.match(\"json-item\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"JSON_ITEM\",\n\n    // $ANTLR start OBJECT\n    mOBJECT: function()  {\n        try {\n            var _type = this.OBJECT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:162:29: ( 'object' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:162:31: 'object'\n            this.match(\"object\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"OBJECT\",\n\n    // $ANTLR start ARRAY\n    mARRAY: function()  {\n        try {\n            var _type = this.ARRAY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:163:29: ( 'array' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:163:31: 'array'\n            this.match(\"array\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ARRAY\",\n\n    // $ANTLR start RETURN\n    mRETURN: function()  {\n        try {\n            var _type = this.RETURN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:164:29: ( 'return' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:164:31: 'return'\n            this.match(\"return\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RETURN\",\n\n    // $ANTLR start SATISFIES\n    mSATISFIES: function()  {\n        try {\n            var _type = this.SATISFIES;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:165:29: ( 'satisfies' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:165:31: 'satisfies'\n            this.match(\"satisfies\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SATISFIES\",\n\n    // $ANTLR start SCHEMA\n    mSCHEMA: function()  {\n        try {\n            var _type = this.SCHEMA;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:166:29: ( 'schema' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:166:31: 'schema'\n            this.match(\"schema\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SCHEMA\",\n\n    // $ANTLR start SCHEMA_ATTRIBUTE\n    mSCHEMA_ATTRIBUTE: function()  {\n        try {\n            var _type = this.SCHEMA_ATTRIBUTE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:167:29: ( 'schema-attribute' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:167:31: 'schema-attribute'\n            this.match(\"schema-attribute\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SCHEMA_ATTRIBUTE\",\n\n    // $ANTLR start SCHEMA_ELEMENT\n    mSCHEMA_ELEMENT: function()  {\n        try {\n            var _type = this.SCHEMA_ELEMENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:168:29: ( 'schema-element' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:168:31: 'schema-element'\n            this.match(\"schema-element\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SCHEMA_ELEMENT\",\n\n    // $ANTLR start SELF\n    mSELF: function()  {\n        try {\n            var _type = this.SELF;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:169:29: ( 'self' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:169:31: 'self'\n            this.match(\"self\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SELF\",\n\n    // $ANTLR start SOME\n    mSOME: function()  {\n        try {\n            var _type = this.SOME;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:170:29: ( 'some' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:170:31: 'some'\n            this.match(\"some\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SOME\",\n\n    // $ANTLR start STABLE\n    mSTABLE: function()  {\n        try {\n            var _type = this.STABLE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:171:29: ( 'stable' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:171:31: 'stable'\n            this.match(\"stable\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"STABLE\",\n\n    // $ANTLR start STRICT\n    mSTRICT: function()  {\n        try {\n            var _type = this.STRICT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:172:29: ( 'strict' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:172:31: 'strict'\n            this.match(\"strict\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"STRICT\",\n\n    // $ANTLR start STRIP\n    mSTRIP: function()  {\n        try {\n            var _type = this.STRIP;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:173:29: ( 'strip' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:173:31: 'strip'\n            this.match(\"strip\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"STRIP\",\n\n    // $ANTLR start TEXT\n    mTEXT: function()  {\n        try {\n            var _type = this.TEXT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:174:29: ( 'text' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:174:31: 'text'\n            this.match(\"text\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TEXT\",\n\n    // $ANTLR start THEN\n    mTHEN: function()  {\n        try {\n            var _type = this.THEN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:175:29: ( 'then' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:175:31: 'then'\n            this.match(\"then\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"THEN\",\n\n    // $ANTLR start TO\n    mTO: function()  {\n        try {\n            var _type = this.TO;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:176:29: ( 'to' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:176:31: 'to'\n            this.match(\"to\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TO\",\n\n    // $ANTLR start TREAT\n    mTREAT: function()  {\n        try {\n            var _type = this.TREAT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:177:29: ( 'treat' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:177:31: 'treat'\n            this.match(\"treat\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TREAT\",\n\n    // $ANTLR start TYPESWITCH\n    mTYPESWITCH: function()  {\n        try {\n            var _type = this.TYPESWITCH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:178:29: ( 'typeswitch' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:178:31: 'typeswitch'\n            this.match(\"typeswitch\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TYPESWITCH\",\n\n    // $ANTLR start UNION\n    mUNION: function()  {\n        try {\n            var _type = this.UNION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:179:29: ( 'union' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:179:31: 'union'\n            this.match(\"union\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"UNION\",\n\n    // $ANTLR start UNORDERED\n    mUNORDERED: function()  {\n        try {\n            var _type = this.UNORDERED;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:180:29: ( 'unordered' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:180:31: 'unordered'\n            this.match(\"unordered\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"UNORDERED\",\n\n    // $ANTLR start VALIDATE\n    mVALIDATE: function()  {\n        try {\n            var _type = this.VALIDATE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:181:29: ( 'validate' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:181:31: 'validate'\n            this.match(\"validate\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"VALIDATE\",\n\n    // $ANTLR start VARIABLE\n    mVARIABLE: function()  {\n        try {\n            var _type = this.VARIABLE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:182:29: ( 'variable' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:182:31: 'variable'\n            this.match(\"variable\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"VARIABLE\",\n\n    // $ANTLR start VERSION\n    mVERSION: function()  {\n        try {\n            var _type = this.VERSION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:183:29: ( 'version' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:183:31: 'version'\n            this.match(\"version\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"VERSION\",\n\n    // $ANTLR start WHERE\n    mWHERE: function()  {\n        try {\n            var _type = this.WHERE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:184:29: ( 'where' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:184:31: 'where'\n            this.match(\"where\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WHERE\",\n\n    // $ANTLR start XQUERY\n    mXQUERY: function()  {\n        try {\n            var _type = this.XQUERY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:185:29: ( 'xquery' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:185:31: 'xquery'\n            this.match(\"xquery\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"XQUERY\",\n\n    // $ANTLR start ALLOWING\n    mALLOWING: function()  {\n        try {\n            var _type = this.ALLOWING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:187:29: ( 'allowing' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:187:31: 'allowing'\n            this.match(\"allowing\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ALLOWING\",\n\n    // $ANTLR start CATCH\n    mCATCH: function()  {\n        try {\n            var _type = this.CATCH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:188:29: ( 'catch' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:188:31: 'catch'\n            this.match(\"catch\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CATCH\",\n\n    // $ANTLR start CONTEXT\n    mCONTEXT: function()  {\n        try {\n            var _type = this.CONTEXT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:189:29: ( 'context' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:189:31: 'context'\n            this.match(\"context\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CONTEXT\",\n\n    // $ANTLR start COUNT\n    mCOUNT: function()  {\n        try {\n            var _type = this.COUNT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:190:29: ( 'count' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:190:31: 'count'\n            this.match(\"count\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COUNT\",\n\n    // $ANTLR start DECIMAL_FORMAT\n    mDECIMAL_FORMAT: function()  {\n        try {\n            var _type = this.DECIMAL_FORMAT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:191:29: ( 'decimal-format' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:191:31: 'decimal-format'\n            this.match(\"decimal-format\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DECIMAL_FORMAT\",\n\n    // $ANTLR start DECIMAL_SEPARATOR\n    mDECIMAL_SEPARATOR: function()  {\n        try {\n            var _type = this.DECIMAL_SEPARATOR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:192:29: ( 'decimal-separator' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:192:31: 'decimal-separator'\n            this.match(\"decimal-separator\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DECIMAL_SEPARATOR\",\n\n    // $ANTLR start DIGIT\n    mDIGIT: function()  {\n        try {\n            var _type = this.DIGIT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:193:29: ( 'digit' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:193:31: 'digit'\n            this.match(\"digit\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DIGIT\",\n\n    // $ANTLR start END\n    mEND: function()  {\n        try {\n            var _type = this.END;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:194:29: ( 'end' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:194:31: 'end'\n            this.match(\"end\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"END\",\n\n    // $ANTLR start GROUP\n    mGROUP: function()  {\n        try {\n            var _type = this.GROUP;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:195:29: ( 'group' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:195:31: 'group'\n            this.match(\"group\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GROUP\",\n\n    // $ANTLR start GROUPING_SEPARATOR\n    mGROUPING_SEPARATOR: function()  {\n        try {\n            var _type = this.GROUPING_SEPARATOR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:196:29: ( 'grouping-separator' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:196:31: 'grouping-separator'\n            this.match(\"grouping-separator\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GROUPING_SEPARATOR\",\n\n    // $ANTLR start INFINITY\n    mINFINITY: function()  {\n        try {\n            var _type = this.INFINITY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:197:29: ( 'infinity' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:197:31: 'infinity'\n            this.match(\"infinity\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INFINITY\",\n\n    // $ANTLR start MINUS_SIGN\n    mMINUS_SIGN: function()  {\n        try {\n            var _type = this.MINUS_SIGN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:198:29: ( 'minus-sign' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:198:31: 'minus-sign'\n            this.match(\"minus-sign\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"MINUS_SIGN\",\n\n    // $ANTLR start NAMESPACE_NODE\n    mNAMESPACE_NODE: function()  {\n        try {\n            var _type = this.NAMESPACE_NODE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:199:29: ( 'namespace-node' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:199:31: 'namespace-node'\n            this.match(\"namespace-node\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NAMESPACE_NODE\",\n\n    // $ANTLR start NAN\n    mNAN: function()  {\n        try {\n            var _type = this.NAN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:200:29: ( 'NaN' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:200:31: 'NaN'\n            this.match(\"NaN\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NAN\",\n\n    // $ANTLR start NEXT\n    mNEXT: function()  {\n        try {\n            var _type = this.NEXT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:201:29: ( 'next' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:201:31: 'next'\n            this.match(\"next\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NEXT\",\n\n    // $ANTLR start ONLY\n    mONLY: function()  {\n        try {\n            var _type = this.ONLY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:202:29: ( 'only' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:202:31: 'only'\n            this.match(\"only\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ONLY\",\n\n    // $ANTLR start PATTERN_SEPARATOR\n    mPATTERN_SEPARATOR: function()  {\n        try {\n            var _type = this.PATTERN_SEPARATOR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:203:29: ( 'pattern-separator' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:203:31: 'pattern-separator'\n            this.match(\"pattern-separator\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PATTERN_SEPARATOR\",\n\n    // $ANTLR start PERCENT\n    mPERCENT: function()  {\n        try {\n            var _type = this.PERCENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:204:29: ( 'percent' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:204:31: 'percent'\n            this.match(\"percent\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PERCENT\",\n\n    // $ANTLR start PER_MILLE\n    mPER_MILLE: function()  {\n        try {\n            var _type = this.PER_MILLE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:205:29: ( 'per-mille' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:205:31: 'per-mille'\n            this.match(\"per-mille\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PER_MILLE\",\n\n    // $ANTLR start PREVIOUS\n    mPREVIOUS: function()  {\n        try {\n            var _type = this.PREVIOUS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:206:29: ( 'previous' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:206:31: 'previous'\n            this.match(\"previous\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PREVIOUS\",\n\n    // $ANTLR start SLIDING\n    mSLIDING: function()  {\n        try {\n            var _type = this.SLIDING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:207:29: ( 'sliding' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:207:31: 'sliding'\n            this.match(\"sliding\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SLIDING\",\n\n    // $ANTLR start START\n    mSTART: function()  {\n        try {\n            var _type = this.START;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:208:29: ( 'start' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:208:31: 'start'\n            this.match(\"start\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"START\",\n\n    // $ANTLR start SWITCH\n    mSWITCH: function()  {\n        try {\n            var _type = this.SWITCH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:209:29: ( 'switch' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:209:31: 'switch'\n            this.match(\"switch\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SWITCH\",\n\n    // $ANTLR start TRY\n    mTRY: function()  {\n        try {\n            var _type = this.TRY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:210:29: ( 'try' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:210:31: 'try'\n            this.match(\"try\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TRY\",\n\n    // $ANTLR start TUMBLING\n    mTUMBLING: function()  {\n        try {\n            var _type = this.TUMBLING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:211:29: ( 'tumbling' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:211:31: 'tumbling'\n            this.match(\"tumbling\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TUMBLING\",\n\n    // $ANTLR start TYPE\n    mTYPE: function()  {\n        try {\n            var _type = this.TYPE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:212:29: ( 'type' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:212:31: 'type'\n            this.match(\"type\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TYPE\",\n\n    // $ANTLR start WHEN\n    mWHEN: function()  {\n        try {\n            var _type = this.WHEN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:213:29: ( 'when' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:213:31: 'when'\n            this.match(\"when\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WHEN\",\n\n    // $ANTLR start WINDOW\n    mWINDOW: function()  {\n        try {\n            var _type = this.WINDOW;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:214:29: ( 'window' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:214:31: 'window'\n            this.match(\"window\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WINDOW\",\n\n    // $ANTLR start ZERO_DIGIT\n    mZERO_DIGIT: function()  {\n        try {\n            var _type = this.ZERO_DIGIT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:215:29: ( 'zero-digit' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:215:31: 'zero-digit'\n            this.match(\"zero-digit\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ZERO_DIGIT\",\n\n    // $ANTLR start AFTER\n    mAFTER: function()  {\n        try {\n            var _type = this.AFTER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:217:29: ( 'after' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:217:31: 'after'\n            this.match(\"after\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"AFTER\",\n\n    // $ANTLR start BEFORE\n    mBEFORE: function()  {\n        try {\n            var _type = this.BEFORE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:218:29: ( 'before' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:218:31: 'before'\n            this.match(\"before\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"BEFORE\",\n\n    // $ANTLR start COPY\n    mCOPY: function()  {\n        try {\n            var _type = this.COPY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:219:29: ( 'copy' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:219:31: 'copy'\n            this.match(\"copy\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COPY\",\n\n    // $ANTLR start DELETE\n    mDELETE: function()  {\n        try {\n            var _type = this.DELETE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:220:29: ( 'delete' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:220:31: 'delete'\n            this.match(\"delete\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DELETE\",\n\n    // $ANTLR start FIRST\n    mFIRST: function()  {\n        try {\n            var _type = this.FIRST;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:221:29: ( 'first' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:221:31: 'first'\n            this.match(\"first\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FIRST\",\n\n    // $ANTLR start INSERT\n    mINSERT: function()  {\n        try {\n            var _type = this.INSERT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:222:29: ( 'insert' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:222:31: 'insert'\n            this.match(\"insert\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INSERT\",\n\n    // $ANTLR start INTO\n    mINTO: function()  {\n        try {\n            var _type = this.INTO;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:223:29: ( 'into' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:223:31: 'into'\n            this.match(\"into\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INTO\",\n\n    // $ANTLR start POSITION\n    mPOSITION: function()  {\n        try {\n            var _type = this.POSITION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:224:29: ( 'position' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:224:31: 'position'\n            this.match(\"position\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"POSITION\",\n\n    // $ANTLR start APPEND\n    mAPPEND: function()  {\n        try {\n            var _type = this.APPEND;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:225:29: ( 'append' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:225:31: 'append'\n            this.match(\"append\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"APPEND\",\n\n    // $ANTLR start LAST\n    mLAST: function()  {\n        try {\n            var _type = this.LAST;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:226:29: ( 'last' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:226:31: 'last'\n            this.match(\"last\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LAST\",\n\n    // $ANTLR start MODIFY\n    mMODIFY: function()  {\n        try {\n            var _type = this.MODIFY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:227:29: ( 'modify' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:227:31: 'modify'\n            this.match(\"modify\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"MODIFY\",\n\n    // $ANTLR start NODES\n    mNODES: function()  {\n        try {\n            var _type = this.NODES;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:228:29: ( 'nodes' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:228:31: 'nodes'\n            this.match(\"nodes\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NODES\",\n\n    // $ANTLR start RENAME\n    mRENAME: function()  {\n        try {\n            var _type = this.RENAME;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:229:29: ( 'rename' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:229:31: 'rename'\n            this.match(\"rename\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RENAME\",\n\n    // $ANTLR start REPLACE\n    mREPLACE: function()  {\n        try {\n            var _type = this.REPLACE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:230:29: ( 'replace' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:230:31: 'replace'\n            this.match(\"replace\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"REPLACE\",\n\n    // $ANTLR start REVALIDATION\n    mREVALIDATION: function()  {\n        try {\n            var _type = this.REVALIDATION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:231:29: ( 'revalidation' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:231:31: 'revalidation'\n            this.match(\"revalidation\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"REVALIDATION\",\n\n    // $ANTLR start SKIP\n    mSKIP: function()  {\n        try {\n            var _type = this.SKIP;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:232:29: ( 'skip' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:232:31: 'skip'\n            this.match(\"skip\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SKIP\",\n\n    // $ANTLR start UPDATING\n    mUPDATING: function()  {\n        try {\n            var _type = this.UPDATING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:233:29: ( 'updating' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:233:31: 'updating'\n            this.match(\"updating\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"UPDATING\",\n\n    // $ANTLR start VALUE\n    mVALUE: function()  {\n        try {\n            var _type = this.VALUE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:234:29: ( 'value' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:234:31: 'value'\n            this.match(\"value\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"VALUE\",\n\n    // $ANTLR start WITH\n    mWITH: function()  {\n        try {\n            var _type = this.WITH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:235:29: ( 'with' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:235:31: 'with'\n            this.match(\"with\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WITH\",\n\n    // $ANTLR start ALL\n    mALL: function()  {\n        try {\n            var _type = this.ALL;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:237:29: ( 'all' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:237:31: 'all'\n            this.match(\"all\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ALL\",\n\n    // $ANTLR start ANY\n    mANY: function()  {\n        try {\n            var _type = this.ANY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:238:29: ( 'any' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:238:31: 'any'\n            this.match(\"any\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ANY\",\n\n    // $ANTLR start CONTAINS\n    mCONTAINS: function()  {\n        try {\n            var _type = this.CONTAINS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:239:29: ( 'contains' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:239:31: 'contains'\n            this.match(\"contains\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CONTAINS\",\n\n    // $ANTLR start CONTENT\n    mCONTENT: function()  {\n        try {\n            var _type = this.CONTENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:240:29: ( 'content' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:240:31: 'content'\n            this.match(\"content\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CONTENT\",\n\n    // $ANTLR start DIACRITICS\n    mDIACRITICS: function()  {\n        try {\n            var _type = this.DIACRITICS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:241:29: ( 'diacritics' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:241:31: 'diacritics'\n            this.match(\"diacritics\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DIACRITICS\",\n\n    // $ANTLR start DIFFERENT\n    mDIFFERENT: function()  {\n        try {\n            var _type = this.DIFFERENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:242:29: ( 'different' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:242:31: 'different'\n            this.match(\"different\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DIFFERENT\",\n\n    // $ANTLR start DISTANCE\n    mDISTANCE: function()  {\n        try {\n            var _type = this.DISTANCE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:243:29: ( 'distance' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:243:31: 'distance'\n            this.match(\"distance\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DISTANCE\",\n\n    // $ANTLR start ENTIRE\n    mENTIRE: function()  {\n        try {\n            var _type = this.ENTIRE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:244:29: ( 'entire' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:244:31: 'entire'\n            this.match(\"entire\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ENTIRE\",\n\n    // $ANTLR start EXACTLY\n    mEXACTLY: function()  {\n        try {\n            var _type = this.EXACTLY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:245:29: ( 'exactly' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:245:31: 'exactly'\n            this.match(\"exactly\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EXACTLY\",\n\n    // $ANTLR start FROM\n    mFROM: function()  {\n        try {\n            var _type = this.FROM;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:246:29: ( 'from' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:246:31: 'from'\n            this.match(\"from\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FROM\",\n\n    // $ANTLR start FT_OPTION\n    mFT_OPTION: function()  {\n        try {\n            var _type = this.FT_OPTION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:247:29: ( 'ft-option' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:247:31: 'ft-option'\n            this.match(\"ft-option\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FT_OPTION\",\n\n    // $ANTLR start FTAND\n    mFTAND: function()  {\n        try {\n            var _type = this.FTAND;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:248:29: ( 'ftand' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:248:31: 'ftand'\n            this.match(\"ftand\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FTAND\",\n\n    // $ANTLR start FTNOT\n    mFTNOT: function()  {\n        try {\n            var _type = this.FTNOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:249:29: ( 'ftnot' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:249:31: 'ftnot'\n            this.match(\"ftnot\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FTNOT\",\n\n    // $ANTLR start FTOR\n    mFTOR: function()  {\n        try {\n            var _type = this.FTOR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:250:29: ( 'ftor' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:250:31: 'ftor'\n            this.match(\"ftor\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FTOR\",\n\n    // $ANTLR start INSENSITIVE\n    mINSENSITIVE: function()  {\n        try {\n            var _type = this.INSENSITIVE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:251:29: ( 'insensitive' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:251:31: 'insensitive'\n            this.match(\"insensitive\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INSENSITIVE\",\n\n    // $ANTLR start LANGUAGE\n    mLANGUAGE: function()  {\n        try {\n            var _type = this.LANGUAGE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:252:29: ( 'language' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:252:31: 'language'\n            this.match(\"language\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LANGUAGE\",\n\n    // $ANTLR start LEVELS\n    mLEVELS: function()  {\n        try {\n            var _type = this.LEVELS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:253:29: ( 'levels' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:253:31: 'levels'\n            this.match(\"levels\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LEVELS\",\n\n    // $ANTLR start LOWERCASE\n    mLOWERCASE: function()  {\n        try {\n            var _type = this.LOWERCASE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:254:29: ( 'lowercase' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:254:31: 'lowercase'\n            this.match(\"lowercase\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LOWERCASE\",\n\n    // $ANTLR start MOST\n    mMOST: function()  {\n        try {\n            var _type = this.MOST;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:255:29: ( 'most' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:255:31: 'most'\n            this.match(\"most\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"MOST\",\n\n    // $ANTLR start NO\n    mNO: function()  {\n        try {\n            var _type = this.NO;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:256:29: ( 'no' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:256:31: 'no'\n            this.match(\"no\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NO\",\n\n    // $ANTLR start NOT\n    mNOT: function()  {\n        try {\n            var _type = this.NOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:257:29: ( 'not' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:257:31: 'not'\n            this.match(\"not\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NOT\",\n\n    // $ANTLR start OCCURS\n    mOCCURS: function()  {\n        try {\n            var _type = this.OCCURS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:258:29: ( 'occurs' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:258:31: 'occurs'\n            this.match(\"occurs\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"OCCURS\",\n\n    // $ANTLR start PARAGRAPH\n    mPARAGRAPH: function()  {\n        try {\n            var _type = this.PARAGRAPH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:259:29: ( 'paragraph' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:259:31: 'paragraph'\n            this.match(\"paragraph\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PARAGRAPH\",\n\n    // $ANTLR start PARAGRAPHS\n    mPARAGRAPHS: function()  {\n        try {\n            var _type = this.PARAGRAPHS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:260:29: ( 'paragraphs' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:260:31: 'paragraphs'\n            this.match(\"paragraphs\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PARAGRAPHS\",\n\n    // $ANTLR start PHRASE\n    mPHRASE: function()  {\n        try {\n            var _type = this.PHRASE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:261:29: ( 'phrase' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:261:31: 'phrase'\n            this.match(\"phrase\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PHRASE\",\n\n    // $ANTLR start RELATIONSHIP\n    mRELATIONSHIP: function()  {\n        try {\n            var _type = this.RELATIONSHIP;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:262:29: ( 'relationship' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:262:31: 'relationship'\n            this.match(\"relationship\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RELATIONSHIP\",\n\n    // $ANTLR start SAME\n    mSAME: function()  {\n        try {\n            var _type = this.SAME;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:263:29: ( 'same' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:263:31: 'same'\n            this.match(\"same\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SAME\",\n\n    // $ANTLR start SCORE\n    mSCORE: function()  {\n        try {\n            var _type = this.SCORE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:264:29: ( 'score' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:264:31: 'score'\n            this.match(\"score\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SCORE\",\n\n    // $ANTLR start SENSITIVE\n    mSENSITIVE: function()  {\n        try {\n            var _type = this.SENSITIVE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:265:29: ( 'sensitive' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:265:31: 'sensitive'\n            this.match(\"sensitive\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SENSITIVE\",\n\n    // $ANTLR start SENTENCE\n    mSENTENCE: function()  {\n        try {\n            var _type = this.SENTENCE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:266:29: ( 'sentence' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:266:31: 'sentence'\n            this.match(\"sentence\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SENTENCE\",\n\n    // $ANTLR start SENTENCES\n    mSENTENCES: function()  {\n        try {\n            var _type = this.SENTENCES;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:267:29: ( 'sentences' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:267:31: 'sentences'\n            this.match(\"sentences\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SENTENCES\",\n\n    // $ANTLR start STEMMING\n    mSTEMMING: function()  {\n        try {\n            var _type = this.STEMMING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:268:29: ( 'stemming' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:268:31: 'stemming'\n            this.match(\"stemming\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"STEMMING\",\n\n    // $ANTLR start STOP\n    mSTOP: function()  {\n        try {\n            var _type = this.STOP;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:269:29: ( 'stop' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:269:31: 'stop'\n            this.match(\"stop\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"STOP\",\n\n    // $ANTLR start THESAURUS\n    mTHESAURUS: function()  {\n        try {\n            var _type = this.THESAURUS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:270:29: ( 'thesaurus' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:270:31: 'thesaurus'\n            this.match(\"thesaurus\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"THESAURUS\",\n\n    // $ANTLR start TIMES\n    mTIMES: function()  {\n        try {\n            var _type = this.TIMES;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:271:29: ( 'times' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:271:31: 'times'\n            this.match(\"times\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"TIMES\",\n\n    // $ANTLR start UPPERCASE\n    mUPPERCASE: function()  {\n        try {\n            var _type = this.UPPERCASE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:272:29: ( 'uppercase' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:272:31: 'uppercase'\n            this.match(\"uppercase\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"UPPERCASE\",\n\n    // $ANTLR start USING\n    mUSING: function()  {\n        try {\n            var _type = this.USING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:273:29: ( 'using' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:273:31: 'using'\n            this.match(\"using\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"USING\",\n\n    // $ANTLR start WEIGHT\n    mWEIGHT: function()  {\n        try {\n            var _type = this.WEIGHT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:274:29: ( 'weight' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:274:31: 'weight'\n            this.match(\"weight\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WEIGHT\",\n\n    // $ANTLR start WILDCARDS\n    mWILDCARDS: function()  {\n        try {\n            var _type = this.WILDCARDS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:275:29: ( 'wildcards' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:275:31: 'wildcards'\n            this.match(\"wildcards\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WILDCARDS\",\n\n    // $ANTLR start WITHOUT\n    mWITHOUT: function()  {\n        try {\n            var _type = this.WITHOUT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:276:29: ( 'without' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:276:31: 'without'\n            this.match(\"without\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WITHOUT\",\n\n    // $ANTLR start WORD\n    mWORD: function()  {\n        try {\n            var _type = this.WORD;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:277:29: ( 'word' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:277:31: 'word'\n            this.match(\"word\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WORD\",\n\n    // $ANTLR start WORDS\n    mWORDS: function()  {\n        try {\n            var _type = this.WORDS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:278:29: ( 'words' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:278:31: 'words'\n            this.match(\"words\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WORDS\",\n\n    // $ANTLR start BREAK\n    mBREAK: function()  {\n        try {\n            var _type = this.BREAK;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:280:29: ( 'break' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:280:31: 'break'\n            this.match(\"break\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"BREAK\",\n\n    // $ANTLR start CONTINUE\n    mCONTINUE: function()  {\n        try {\n            var _type = this.CONTINUE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:281:29: ( 'continue' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:281:31: 'continue'\n            this.match(\"continue\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CONTINUE\",\n\n    // $ANTLR start EXIT\n    mEXIT: function()  {\n        try {\n            var _type = this.EXIT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:282:29: ( 'exit' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:282:31: 'exit'\n            this.match(\"exit\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EXIT\",\n\n    // $ANTLR start LOOP\n    mLOOP: function()  {\n        try {\n            var _type = this.LOOP;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:283:29: ( 'loop' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:283:31: 'loop'\n            this.match(\"loop\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LOOP\",\n\n    // $ANTLR start RETURNING\n    mRETURNING: function()  {\n        try {\n            var _type = this.RETURNING;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:284:29: ( 'returning' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:284:31: 'returning'\n            this.match(\"returning\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RETURNING\",\n\n    // $ANTLR start WHILE\n    mWHILE: function()  {\n        try {\n            var _type = this.WHILE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:285:29: ( 'while' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:285:31: 'while'\n            this.match(\"while\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"WHILE\",\n\n    // $ANTLR start CHECK\n    mCHECK: function()  {\n        try {\n            var _type = this.CHECK;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:287:29: ( 'check' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:287:31: 'check'\n            this.match(\"check\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CHECK\",\n\n    // $ANTLR start COLLECTION\n    mCOLLECTION: function()  {\n        try {\n            var _type = this.COLLECTION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:288:29: ( 'collection' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:288:31: 'collection'\n            this.match(\"collection\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COLLECTION\",\n\n    // $ANTLR start CONSTRAINT\n    mCONSTRAINT: function()  {\n        try {\n            var _type = this.CONSTRAINT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:289:29: ( 'constraint' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:289:31: 'constraint'\n            this.match(\"constraint\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CONSTRAINT\",\n\n    // $ANTLR start FOREACH\n    mFOREACH: function()  {\n        try {\n            var _type = this.FOREACH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:290:29: ( 'foreach' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:290:31: 'foreach'\n            this.match(\"foreach\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FOREACH\",\n\n    // $ANTLR start FOREIGN\n    mFOREIGN: function()  {\n        try {\n            var _type = this.FOREIGN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:291:29: ( 'foreign' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:291:31: 'foreign'\n            this.match(\"foreign\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"FOREIGN\",\n\n    // $ANTLR start INDEX\n    mINDEX: function()  {\n        try {\n            var _type = this.INDEX;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:292:29: ( 'index' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:292:31: 'index'\n            this.match(\"index\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INDEX\",\n\n    // $ANTLR start INTEGRITY\n    mINTEGRITY: function()  {\n        try {\n            var _type = this.INTEGRITY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:293:29: ( 'integrity' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:293:31: 'integrity'\n            this.match(\"integrity\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"INTEGRITY\",\n\n    // $ANTLR start KEY\n    mKEY: function()  {\n        try {\n            var _type = this.KEY;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:294:29: ( 'key' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:294:31: 'key'\n            this.match(\"key\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"KEY\",\n\n    // $ANTLR start ON\n    mON: function()  {\n        try {\n            var _type = this.ON;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:295:29: ( 'on' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:295:31: 'on'\n            this.match(\"on\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ON\",\n\n    // $ANTLR start UNIQUE\n    mUNIQUE: function()  {\n        try {\n            var _type = this.UNIQUE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:296:29: ( 'unique' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:296:31: 'unique'\n            this.match(\"unique\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"UNIQUE\",\n\n    // $ANTLR start AMP_ER\n    mAMP_ER: function()  {\n        try {\n            var _type = this.AMP_ER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:299:9: ( 'amp' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:299:11: 'amp'\n            this.match(\"amp\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"AMP_ER\",\n\n    // $ANTLR start APOS_ER\n    mAPOS_ER: function()  {\n        try {\n            var _type = this.APOS_ER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:300:9: ( 'apos' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:300:11: 'apos'\n            this.match(\"apos\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"APOS_ER\",\n\n    // $ANTLR start QUOT_ER\n    mQUOT_ER: function()  {\n        try {\n            var _type = this.QUOT_ER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:301:9: ( 'quot' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:301:11: 'quot'\n            this.match(\"quot\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"QUOT_ER\",\n\n    // $ANTLR start CONCAT\n    mCONCAT: function()  {\n        try {\n            var _type = this.CONCAT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:308:25: ( '||' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:308:27: '||'\n            this.match(\"||\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CONCAT\",\n\n    // $ANTLR start LPAREN\n    mLPAREN: function()  {\n        try {\n            var _type = this.LPAREN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:309:25: ( '(' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:309:27: '('\n            this.match('('); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LPAREN\",\n\n    // $ANTLR start RPAREN\n    mRPAREN: function()  {\n        try {\n            var _type = this.RPAREN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:310:25: ( ')' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:310:27: ')'\n            this.match(')'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RPAREN\",\n\n    // $ANTLR start DOLLAR\n    mDOLLAR: function()  {\n        try {\n            var _type = this.DOLLAR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:311:25: ( '$' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:311:27: '$'\n            this.match('$'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DOLLAR\",\n\n    // $ANTLR start L_UNION_BRACKET\n    mL_UNION_BRACKET: function()  {\n        try {\n            var _type = this.L_UNION_BRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:312:25: ( '{|' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:312:27: '{|'\n            this.match(\"{|\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_UNION_BRACKET\",\n\n    // $ANTLR start R_UNION_BRACKET\n    mR_UNION_BRACKET: function()  {\n        try {\n            var _type = this.R_UNION_BRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:313:25: ( '|}' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:313:27: '|}'\n            this.match(\"|}\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"R_UNION_BRACKET\",\n\n    // $ANTLR start LBRACKET\n    mLBRACKET: function()  {\n        try {\n            var _type = this.LBRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:316:25: ( '{' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:316:27: '{'\n            this.match('{'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LBRACKET\",\n\n    // $ANTLR start RBRACKET\n    mRBRACKET: function()  {\n        try {\n            var _type = this.RBRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:317:25: ( '}' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:317:27: '}'\n            this.match('}'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RBRACKET\",\n\n    // $ANTLR start LSQUARE\n    mLSQUARE: function()  {\n        try {\n            var _type = this.LSQUARE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:318:25: ( '[' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:318:27: '['\n            this.match('['); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LSQUARE\",\n\n    // $ANTLR start RSQUARE\n    mRSQUARE: function()  {\n        try {\n            var _type = this.RSQUARE;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:319:25: ( ']' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:319:27: ']'\n            this.match(']'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RSQUARE\",\n\n    // $ANTLR start EQUAL\n    mEQUAL: function()  {\n        try {\n            var _type = this.EQUAL;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:320:25: ( '=' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:320:27: '='\n            this.match('='); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EQUAL\",\n\n    // $ANTLR start BIND\n    mBIND: function()  {\n        try {\n            var _type = this.BIND;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:321:25: ( ':=' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:321:27: ':='\n            this.match(\":=\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"BIND\",\n\n    // $ANTLR start NOTEQUAL\n    mNOTEQUAL: function()  {\n        try {\n            var _type = this.NOTEQUAL;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:322:25: ( '!=' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:322:27: '!='\n            this.match(\"!=\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NOTEQUAL\",\n\n    // $ANTLR start ANN_PERCENT\n    mANN_PERCENT: function()  {\n        try {\n            var _type = this.ANN_PERCENT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:323:25: ( '%' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:323:27: '%'\n            this.match('%'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ANN_PERCENT\",\n\n    // $ANTLR start HASH\n    mHASH: function()  {\n        try {\n            var _type = this.HASH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:324:25: ( '#' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:324:27: '#'\n            this.match('#'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"HASH\",\n\n    // $ANTLR start AMP\n    mAMP: function()  {\n        try {\n            var _type = this.AMP;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:325:25: ( '&' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:325:27: '&'\n            this.match('&'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"AMP\",\n\n    // $ANTLR start COMMA\n    mCOMMA: function()  {\n        try {\n            var _type = this.COMMA;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:326:25: ( ',' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:326:27: ','\n            this.match(','); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COMMA\",\n\n    // $ANTLR start QUESTION\n    mQUESTION: function()  {\n        try {\n            var _type = this.QUESTION;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:327:25: ( '?' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:327:27: '?'\n            this.match('?'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"QUESTION\",\n\n    // $ANTLR start STAR\n    mSTAR: function()  {\n        try {\n            var _type = this.STAR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:328:25: ( '*' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:328:27: '*'\n            this.match('*'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"STAR\",\n\n    // $ANTLR start PLUS\n    mPLUS: function()  {\n        try {\n            var _type = this.PLUS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:329:25: ( '+' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:329:27: '+'\n            this.match('+'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PLUS\",\n\n    // $ANTLR start MINUS\n    mMINUS: function()  {\n        try {\n            var _type = this.MINUS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:330:25: ( '-' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:330:27: '-'\n            this.match('-'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"MINUS\",\n\n    // $ANTLR start SMALLER\n    mSMALLER: function()  {\n        try {\n            var _type = this.SMALLER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:331:25: ( '<' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:331:27: '<'\n            this.match('<'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SMALLER\",\n\n    // $ANTLR start GREATER\n    mGREATER: function()  {\n        try {\n            var _type = this.GREATER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:332:25: ( '>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:332:27: '>'\n            this.match('>'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GREATER\",\n\n    // $ANTLR start SMALLEREQ\n    mSMALLEREQ: function()  {\n        try {\n            var _type = this.SMALLEREQ;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:333:25: ( '<=' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:333:27: '<='\n            this.match(\"<=\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SMALLEREQ\",\n\n    // $ANTLR start GREATEREQ\n    mGREATEREQ: function()  {\n        try {\n            var _type = this.GREATEREQ;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:334:25: ( '>=' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:334:27: '>='\n            this.match(\">=\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GREATEREQ\",\n\n    // $ANTLR start SMALLER_SMALLER\n    mSMALLER_SMALLER: function()  {\n        try {\n            var _type = this.SMALLER_SMALLER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:335:25: ( '<<' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:335:27: '<<'\n            this.match(\"<<\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SMALLER_SMALLER\",\n\n    // $ANTLR start GREATER_GREATER\n    mGREATER_GREATER: function()  {\n        try {\n            var _type = this.GREATER_GREATER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:336:25: ( '>>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:336:27: '>>'\n            this.match(\">>\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GREATER_GREATER\",\n\n    // $ANTLR start SLASH\n    mSLASH: function()  {\n        try {\n            var _type = this.SLASH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:337:25: ( '/' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:337:27: '/'\n            this.match('/'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SLASH\",\n\n    // $ANTLR start SLASH_SLASH\n    mSLASH_SLASH: function()  {\n        try {\n            var _type = this.SLASH_SLASH;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:338:25: ( '//' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:338:27: '//'\n            this.match(\"//\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SLASH_SLASH\",\n\n    // $ANTLR start BANG\n    mBANG: function()  {\n        try {\n            var _type = this.BANG;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:339:25: ( '!' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:339:27: '!'\n            this.match('!'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"BANG\",\n\n    // $ANTLR start DOT\n    mDOT: function()  {\n        try {\n            var _type = this.DOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:340:25: ( '.' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:340:27: '.'\n            this.match('.'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DOT\",\n\n    // $ANTLR start DOT_DOT\n    mDOT_DOT: function()  {\n        try {\n            var _type = this.DOT_DOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:341:25: ( '..' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:341:27: '..'\n            this.match(\"..\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"DOT_DOT\",\n\n    // $ANTLR start COLON\n    mCOLON: function()  {\n        try {\n            var _type = this.COLON;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:342:25: ( ':' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:342:27: ':'\n            this.match(':'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COLON\",\n\n    // $ANTLR start COLON_COLON\n    mCOLON_COLON: function()  {\n        try {\n            var _type = this.COLON_COLON;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:343:25: ( '::' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:343:27: '::'\n            this.match(\"::\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COLON_COLON\",\n\n    // $ANTLR start EMPTY_CLOSE_TAG\n    mEMPTY_CLOSE_TAG: function()  {\n        try {\n            var _type = this.EMPTY_CLOSE_TAG;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:344:25: ( '/>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:344:27: '/>'\n            this.match(\"/>\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EMPTY_CLOSE_TAG\",\n\n    // $ANTLR start CLOSE_TAG\n    mCLOSE_TAG: function()  {\n        try {\n            var _type = this.CLOSE_TAG;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:345:25: ( '</' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:345:27: '</'\n            this.match(\"</\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CLOSE_TAG\",\n\n    // $ANTLR start SEMICOLON\n    mSEMICOLON: function()  {\n        try {\n            var _type = this.SEMICOLON;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:346:25: ( ';' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:346:27: ';'\n            this.match(';'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SEMICOLON\",\n\n    // $ANTLR start VBAR\n    mVBAR: function()  {\n        try {\n            var _type = this.VBAR;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:347:25: ( '|' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:347:27: '|'\n            this.match('|'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"VBAR\",\n\n    // $ANTLR start PRAGMA_START\n    mPRAGMA_START: function()  {\n        try {\n            var _type = this.PRAGMA_START;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:348:25: ( '(#' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:348:27: '(#'\n            this.match(\"(#\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PRAGMA_START\",\n\n    // $ANTLR start PRAGMA_END\n    mPRAGMA_END: function()  {\n        try {\n            var _type = this.PRAGMA_END;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:349:25: ( '#)' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:349:27: '#)'\n            this.match(\"#)\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PRAGMA_END\",\n\n    // $ANTLR start XML_COMMENT_START\n    mXML_COMMENT_START: function()  {\n        try {\n            var _type = this.XML_COMMENT_START;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:350:25: ( '<!--' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:350:27: '<!--'\n            this.match(\"<!--\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"XML_COMMENT_START\",\n\n    // $ANTLR start XML_COMMENT_END\n    mXML_COMMENT_END: function()  {\n        try {\n            var _type = this.XML_COMMENT_END;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:351:25: ( '-->' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:351:27: '-->'\n            this.match(\"-->\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"XML_COMMENT_END\",\n\n    // $ANTLR start PI_START\n    mPI_START: function()  {\n        try {\n            var _type = this.PI_START;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:352:25: ( '<?' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:352:27: '<?'\n            this.match(\"<?\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PI_START\",\n\n    // $ANTLR start PI_END\n    mPI_END: function()  {\n        try {\n            var _type = this.PI_END;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:353:25: ( '?>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:353:27: '?>'\n            this.match(\"?>\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"PI_END\",\n\n    // $ANTLR start ATTR_SIGN\n    mATTR_SIGN: function()  {\n        try {\n            var _type = this.ATTR_SIGN;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:354:25: ( '@' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:354:27: '@'\n            this.match('@'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ATTR_SIGN\",\n\n    // $ANTLR start Q\n    mQ: function()  {\n        try {\n            var _type = this.Q;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:355:25: ( 'Q' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:355:27: 'Q'\n            this.match('Q'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"Q\",\n\n    // $ANTLR start CHARREF_DEC\n    mCHARREF_DEC: function()  {\n        try {\n            var _type = this.CHARREF_DEC;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:356:25: ( '&#' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:356:27: '&#'\n            this.match(\"&#\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CHARREF_DEC\",\n\n    // $ANTLR start CHARREF_HEX\n    mCHARREF_HEX: function()  {\n        try {\n            var _type = this.CHARREF_HEX;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:357:25: ( '&#x' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:357:27: '&#x'\n            this.match(\"&#x\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CHARREF_HEX\",\n\n    // $ANTLR start APOS\n    mAPOS: function()  {\n        try {\n            var _type = this.APOS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:358:25: ( '\\\\'' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:358:27: '\\\\''\n            this.match('\\''); \n             if (!this.inStr) this.inStr = true; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"APOS\",\n\n    // $ANTLR start QUOT\n    mQUOT: function()  {\n        try {\n            var _type = this.QUOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:359:25: ( '\\\"' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:359:27: '\\\"'\n            this.match('\\\"'); \n             if (!this.inStr) this.inStr = true; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"QUOT\",\n\n    // $ANTLR start L_NCName\n    mL_NCName: function()  {\n        try {\n            var _type = this.L_NCName;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:363:9: ( NCNameStartChar ( NCNameChar )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:363:13: NCNameStartChar ( NCNameChar )*\n            this.mNCNameStartChar(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:363:29: ( NCNameChar )*\n            loop1:\n            do {\n                var alt1=2;\n                var LA1_0 = this.input.LA(1);\n\n                if ( ((LA1_0>='-' && LA1_0<='.')||(LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||LA1_0=='_'||(LA1_0>='a' && LA1_0<='z')) ) {\n                    alt1=1;\n                }\n\n\n                switch (alt1) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:363:29: NCNameChar\n                    this.mNCNameChar(); \n\n\n                    break;\n\n                default :\n                    break loop1;\n                }\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_NCName\",\n\n    // $ANTLR start Letter\n    mLetter: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:366:29: ( 'a' .. 'z' | 'A' .. 'Z' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:\n            if ( (this.input.LA(1)>='A' && this.input.LA(1)<='Z')||(this.input.LA(1)>='a' && this.input.LA(1)<='z') ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"Letter\",\n\n    // $ANTLR start HexLetter\n    mHexLetter: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:367:29: ( 'a' .. 'f' | 'A' .. 'F' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:\n            if ( (this.input.LA(1)>='A' && this.input.LA(1)<='F')||(this.input.LA(1)>='a' && this.input.LA(1)<='f') ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"HexLetter\",\n\n    // $ANTLR start Digit\n    mDigit: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:368:29: ( '0' .. '9' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:368:31: '0' .. '9'\n            this.matchRange('0','9'); \n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"Digit\",\n\n    // $ANTLR start Digits\n    mDigits: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:369:29: ( ( Digit )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:369:31: ( Digit )+\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:369:31: ( Digit )+\n            var cnt2=0;\n            loop2:\n            do {\n                var alt2=2;\n                var LA2_0 = this.input.LA(1);\n\n                if ( ((LA2_0>='0' && LA2_0<='9')) ) {\n                    alt2=1;\n                }\n\n\n                switch (alt2) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:369:31: Digit\n                    this.mDigit(); \n\n\n                    break;\n\n                default :\n                    if ( cnt2 >= 1 ) {\n                        break loop2;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(2, this.input);\n                        throw eee;\n                }\n                cnt2++;\n            } while (true);\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"Digits\",\n\n    // $ANTLR start NCNameStartChar\n    mNCNameStartChar: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:371:29: ( Letter | '_' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:\n            if ( (this.input.LA(1)>='A' && this.input.LA(1)<='Z')||this.input.LA(1)=='_'||(this.input.LA(1)>='a' && this.input.LA(1)<='z') ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NCNameStartChar\",\n\n    // $ANTLR start NCNameChar\n    mNCNameChar: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:372:29: ( Letter | Digit | '.' | '-' | '_' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:\n            if ( (this.input.LA(1)>='-' && this.input.LA(1)<='.')||(this.input.LA(1)>='0' && this.input.LA(1)<='9')||(this.input.LA(1)>='A' && this.input.LA(1)<='Z')||this.input.LA(1)=='_'||(this.input.LA(1)>='a' && this.input.LA(1)<='z') ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NCNameChar\",\n\n    // $ANTLR start S\n    mS: function()  {\n        try {\n            var _type = this.S;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:375:9: ( ( '\\\\t' | ' ' | '\\\\n' | '\\\\r' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:375:11: ( '\\\\t' | ' ' | '\\\\n' | '\\\\r' )+\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:375:11: ( '\\\\t' | ' ' | '\\\\n' | '\\\\r' )+\n            var cnt3=0;\n            loop3:\n            do {\n                var alt3=2;\n                var LA3_0 = this.input.LA(1);\n\n                if ( ((LA3_0>='\\t' && LA3_0<='\\n')||LA3_0=='\\r'||LA3_0==' ') ) {\n                    alt3=1;\n                }\n\n\n                switch (alt3) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||this.input.LA(1)==' ' ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt3 >= 1 ) {\n                        break loop3;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(3, this.input);\n                        throw eee;\n                }\n                cnt3++;\n            } while (true);\n\n             _channel = HIDDEN; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"S\",\n\n    // $ANTLR start SU\n    mSU: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:378:9: ( ( '\\\\t' | ' ' | '\\\\n' | '\\\\r' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:378:11: ( '\\\\t' | ' ' | '\\\\n' | '\\\\r' )+\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:378:11: ( '\\\\t' | ' ' | '\\\\n' | '\\\\r' )+\n            var cnt4=0;\n            loop4:\n            do {\n                var alt4=2;\n                var LA4_0 = this.input.LA(1);\n\n                if ( ((LA4_0>='\\t' && LA4_0<='\\n')||LA4_0=='\\r'||LA4_0==' ') ) {\n                    alt4=1;\n                }\n\n\n                switch (alt4) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||this.input.LA(1)==' ' ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt4 >= 1 ) {\n                        break loop4;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(4, this.input);\n                        throw eee;\n                }\n                cnt4++;\n            } while (true);\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SU\",\n\n    // $ANTLR start L_Pragma\n    mL_Pragma: function()  {\n        try {\n            var _type = this.L_Pragma;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:9: ( PRAGMA_START ( SU )? L_NCName COLON L_NCName ( SU ( options {greedy=false; } : . )* )? PRAGMA_END )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:11: PRAGMA_START ( SU )? L_NCName COLON L_NCName ( SU ( options {greedy=false; } : . )* )? PRAGMA_END\n            this.mPRAGMA_START(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:24: ( SU )?\n            var alt5=2;\n            var LA5_0 = this.input.LA(1);\n\n            if ( ((LA5_0>='\\t' && LA5_0<='\\n')||LA5_0=='\\r'||LA5_0==' ') ) {\n                alt5=1;\n            }\n            switch (alt5) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:24: SU\n                    this.mSU(); \n\n\n                    break;\n\n            }\n\n            this.mL_NCName(); \n            this.mCOLON(); \n            this.mL_NCName(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:52: ( SU ( options {greedy=false; } : . )* )?\n            var alt7=2;\n            var LA7_0 = this.input.LA(1);\n\n            if ( ((LA7_0>='\\t' && LA7_0<='\\n')||LA7_0=='\\r'||LA7_0==' ') ) {\n                alt7=1;\n            }\n            switch (alt7) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:53: SU ( options {greedy=false; } : . )*\n                    this.mSU(); \n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:56: ( options {greedy=false; } : . )*\n                    loop6:\n                    do {\n                        var alt6=2;\n                        var LA6_0 = this.input.LA(1);\n\n                        if ( (LA6_0=='#') ) {\n                            var LA6_1 = this.input.LA(2);\n\n                            if ( (LA6_1==')') ) {\n                                alt6=2;\n                            }\n                            else if ( ((LA6_1>='\\u0000' && LA6_1<='(')||(LA6_1>='*' && LA6_1<='\\uFFFF')) ) {\n                                alt6=1;\n                            }\n\n\n                        }\n                        else if ( ((LA6_0>='\\u0000' && LA6_0<='\\\"')||(LA6_0>='$' && LA6_0<='\\uFFFF')) ) {\n                            alt6=1;\n                        }\n\n\n                        switch (alt6) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:389:83: .\n                            this.matchAny(); \n\n\n                            break;\n\n                        default :\n                            break loop6;\n                        }\n                    } while (true);\n\n\n\n                    break;\n\n            }\n\n            this.mPRAGMA_END(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_Pragma\",\n\n    // $ANTLR start L_DirCommentConstructor\n    mL_DirCommentConstructor: function()  {\n        try {\n            var _type = this.L_DirCommentConstructor;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:399:9: ( XML_COMMENT_START ( options {greedy=false; } : ( . )* ) XML_COMMENT_END )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:399:11: XML_COMMENT_START ( options {greedy=false; } : ( . )* ) XML_COMMENT_END\n            this.mXML_COMMENT_START(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:399:29: ( options {greedy=false; } : ( . )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:399:56: ( . )*\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:399:56: ( . )*\n            loop8:\n            do {\n                var alt8=2;\n                var LA8_0 = this.input.LA(1);\n\n                if ( (LA8_0=='-') ) {\n                    var LA8_1 = this.input.LA(2);\n\n                    if ( (LA8_1=='-') ) {\n                        var LA8_3 = this.input.LA(3);\n\n                        if ( (LA8_3=='>') ) {\n                            alt8=2;\n                        }\n                        else if ( ((LA8_3>='\\u0000' && LA8_3<='=')||(LA8_3>='?' && LA8_3<='\\uFFFF')) ) {\n                            alt8=1;\n                        }\n\n\n                    }\n                    else if ( ((LA8_1>='\\u0000' && LA8_1<=',')||(LA8_1>='.' && LA8_1<='\\uFFFF')) ) {\n                        alt8=1;\n                    }\n\n\n                }\n                else if ( ((LA8_0>='\\u0000' && LA8_0<=',')||(LA8_0>='.' && LA8_0<='\\uFFFF')) ) {\n                    alt8=1;\n                }\n\n\n                switch (alt8) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:399:56: .\n                    this.matchAny(); \n\n\n                    break;\n\n                default :\n                    break loop8;\n                }\n            } while (true);\n\n\n\n\n            this.mXML_COMMENT_END(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_DirCommentConstructor\",\n\n    // $ANTLR start L_DirPIConstructor\n    mL_DirPIConstructor: function()  {\n        try {\n            var _type = this.L_DirPIConstructor;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:9: ( PI_START ( SU )? L_NCName ( SU ( options {greedy=false; } : ( . )* ) )? PI_END )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:11: PI_START ( SU )? L_NCName ( SU ( options {greedy=false; } : ( . )* ) )? PI_END\n            this.mPI_START(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:20: ( SU )?\n            var alt9=2;\n            var LA9_0 = this.input.LA(1);\n\n            if ( ((LA9_0>='\\t' && LA9_0<='\\n')||LA9_0=='\\r'||LA9_0==' ') ) {\n                alt9=1;\n            }\n            switch (alt9) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:20: SU\n                    this.mSU(); \n\n\n                    break;\n\n            }\n\n            this.mL_NCName(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:33: ( SU ( options {greedy=false; } : ( . )* ) )?\n            var alt11=2;\n            var LA11_0 = this.input.LA(1);\n\n            if ( ((LA11_0>='\\t' && LA11_0<='\\n')||LA11_0=='\\r'||LA11_0==' ') ) {\n                alt11=1;\n            }\n            switch (alt11) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:34: SU ( options {greedy=false; } : ( . )* )\n                    this.mSU(); \n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:36: ( options {greedy=false; } : ( . )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:63: ( . )*\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:63: ( . )*\n                    loop10:\n                    do {\n                        var alt10=2;\n                        var LA10_0 = this.input.LA(1);\n\n                        if ( (LA10_0=='?') ) {\n                            var LA10_1 = this.input.LA(2);\n\n                            if ( (LA10_1=='>') ) {\n                                alt10=2;\n                            }\n                            else if ( ((LA10_1>='\\u0000' && LA10_1<='=')||(LA10_1>='?' && LA10_1<='\\uFFFF')) ) {\n                                alt10=1;\n                            }\n\n\n                        }\n                        else if ( ((LA10_0>='\\u0000' && LA10_0<='>')||(LA10_0>='@' && LA10_0<='\\uFFFF')) ) {\n                            alt10=1;\n                        }\n\n\n                        switch (alt10) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:408:63: .\n                            this.matchAny(); \n\n\n                            break;\n\n                        default :\n                            break loop10;\n                        }\n                    } while (true);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            this.mPI_END(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_DirPIConstructor\",\n\n    // $ANTLR start L_IntegerLiteral\n    mL_IntegerLiteral: function()  {\n        try {\n            var _type = this.L_IntegerLiteral;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:416:9: ( Digits )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:416:13: Digits\n            this.mDigits(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_IntegerLiteral\",\n\n    // $ANTLR start L_DecimalLiteral\n    mL_DecimalLiteral: function()  {\n        try {\n            var _type = this.L_DecimalLiteral;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:9: ( ( '.' Digits ) | ( Digits '.' ( Digit )* ) )\n            var alt13=2;\n            var LA13_0 = this.input.LA(1);\n\n            if ( (LA13_0=='.') ) {\n                alt13=1;\n            }\n            else if ( ((LA13_0>='0' && LA13_0<='9')) ) {\n                alt13=2;\n            }\n            else {\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 13, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt13) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:11: ( '.' Digits )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:11: ( '.' Digits )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:12: '.' Digits\n                    this.match('.'); \n                    this.mDigits(); \n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:26: ( Digits '.' ( Digit )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:26: ( Digits '.' ( Digit )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:27: Digits '.' ( Digit )*\n                    this.mDigits(); \n                    this.match('.'); \n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:38: ( Digit )*\n                    loop12:\n                    do {\n                        var alt12=2;\n                        var LA12_0 = this.input.LA(1);\n\n                        if ( ((LA12_0>='0' && LA12_0<='9')) ) {\n                            alt12=1;\n                        }\n\n\n                        switch (alt12) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:421:38: Digit\n                            this.mDigit(); \n\n\n                            break;\n\n                        default :\n                            break loop12;\n                        }\n                    } while (true);\n\n\n\n\n\n\n                    break;\n\n            }\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_DecimalLiteral\",\n\n    // $ANTLR start L_DoubleLiteral\n    mL_DoubleLiteral: function()  {\n        try {\n            var _type = this.L_DoubleLiteral;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:9: ( ( ( '.' Digits ) | ( Digits ( '.' ( Digit )* )? ) ) ( 'e' | 'E' ) ( '+' | '-' )? Digits )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:11: ( ( '.' Digits ) | ( Digits ( '.' ( Digit )* )? ) ) ( 'e' | 'E' ) ( '+' | '-' )? Digits\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:11: ( ( '.' Digits ) | ( Digits ( '.' ( Digit )* )? ) )\n            var alt16=2;\n            var LA16_0 = this.input.LA(1);\n\n            if ( (LA16_0=='.') ) {\n                alt16=1;\n            }\n            else if ( ((LA16_0>='0' && LA16_0<='9')) ) {\n                alt16=2;\n            }\n            else {\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 16, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt16) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:12: ( '.' Digits )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:12: ( '.' Digits )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:13: '.' Digits\n                    this.match('.'); \n                    this.mDigits(); \n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:27: ( Digits ( '.' ( Digit )* )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:27: ( Digits ( '.' ( Digit )* )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:28: Digits ( '.' ( Digit )* )?\n                    this.mDigits(); \n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:35: ( '.' ( Digit )* )?\n                    var alt15=2;\n                    var LA15_0 = this.input.LA(1);\n\n                    if ( (LA15_0=='.') ) {\n                        alt15=1;\n                    }\n                    switch (alt15) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:36: '.' ( Digit )*\n                            this.match('.'); \n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:40: ( Digit )*\n                            loop14:\n                            do {\n                                var alt14=2;\n                                var LA14_0 = this.input.LA(1);\n\n                                if ( ((LA14_0>='0' && LA14_0<='9')) ) {\n                                    alt14=1;\n                                }\n\n\n                                switch (alt14) {\n                                case 1 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:40: Digit\n                                    this.mDigit(); \n\n\n                                    break;\n\n                                default :\n                                    break loop14;\n                                }\n                            } while (true);\n\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.input.LA(1)=='E'||this.input.LA(1)=='e' ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:426:63: ( '+' | '-' )?\n            var alt17=2;\n            var LA17_0 = this.input.LA(1);\n\n            if ( (LA17_0=='+'||LA17_0=='-') ) {\n                alt17=1;\n            }\n            switch (alt17) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:\n                    if ( this.input.LA(1)=='+'||this.input.LA(1)=='-' ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n            }\n\n            this.mDigits(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_DoubleLiteral\",\n\n    // $ANTLR start L_Comment\n    mL_Comment: function()  {\n        try {\n            var _type = this.L_Comment;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:431:9: ({...}? => '(:' ( options {greedy=false; } : L_Comment | . )* ':)' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:431:11: {...}? => '(:' ( options {greedy=false; } : L_Comment | . )* ':)'\n            if ( !((!this.inStr)) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_Comment\", \"!this.inStr\");\n            }\n            this.match(\"(:\"); \n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:431:33: ( options {greedy=false; } : L_Comment | . )*\n            loop18:\n            do {\n                var alt18=3;\n                var LA18_0 = this.input.LA(1);\n\n                if ( (LA18_0==':') ) {\n                    var LA18_1 = this.input.LA(2);\n\n                    if ( (LA18_1==')') ) {\n                        alt18=3;\n                    }\n                    else if ( ((LA18_1>='\\u0000' && LA18_1<='(')||(LA18_1>='*' && LA18_1<='\\uFFFF')) ) {\n                        alt18=2;\n                    }\n\n\n                }\n                else if ( (LA18_0=='(') ) {\n                    var LA18_2 = this.input.LA(2);\n\n                    if ( (LA18_2==':') ) {\n                        var LA18_5 = this.input.LA(3);\n\n                        if ( ((!this.inStr)) ) {\n                            alt18=1;\n                        }\n                        else if ( (true) ) {\n                            alt18=2;\n                        }\n\n\n                    }\n                    else if ( ((LA18_2>='\\u0000' && LA18_2<='9')||(LA18_2>=';' && LA18_2<='\\uFFFF')) ) {\n                        alt18=2;\n                    }\n\n\n                }\n                else if ( ((LA18_0>='\\u0000' && LA18_0<='\\'')||(LA18_0>=')' && LA18_0<='9')||(LA18_0>=';' && LA18_0<='\\uFFFF')) ) {\n                    alt18=2;\n                }\n\n\n                switch (alt18) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:431:59: L_Comment\n                    this.mL_Comment(); \n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:431:71: .\n                    this.matchAny(); \n\n\n                    break;\n\n                default :\n                    break loop18;\n                }\n            } while (true);\n\n            this.match(\":)\"); \n\n             _channel = HIDDEN; this.addComment(this.state.tokenStartCharIndex, (this.getCharIndex()-1)); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_Comment\",\n\n    // $ANTLR start L_AnyChar\n    mL_AnyChar: function()  {\n        try {\n            var _type = this.L_AnyChar;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:434:11: ( . )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:434:13: .\n            this.matchAny(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_AnyChar\",\n\n    mTokens: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:8: ( ANCESTOR | ANCESTOR_OR_SELF | AND | AS | ASCENDING | AT | ATTRIBUTE | BASE_URI | BOUNDARY_SPACE | BY | CASE | CAST | CASTABLE | CHILD | COLLATION | COMMENT | CONSTRUCTION | COPY_NAMESPACES | DECLARE | DEFAULT | DESCENDANT | DESCENDANT_OR_SELF | DESCENDING | DIV | DOCUMENT | DOCUMENT_NODE | ELEMENT | ELSE | EMPTY | EMPTY_SEQUENCE | ENCODING | EQ | EVERY | EXCEPT | EXTERNAL | FOLLOWING | FOLLOWING_SIBLING | FOR | FUNCTION | GE | GREATEST | GT | IDIV | IF | IMPORT | IN | INHERIT | INSTANCE | INTERSECT | IS | ITEM | LAX | LE | LEAST | LET | LT | MOD | MODULE | NAMESPACE | NE | NO_INHERIT | NO_PRESERVE | NODE | JSON | OF | OPTION | OR | ORDER | ORDERED | ORDERING | PARENT | PRECEDING | PRECEDING_SIBLING | PRESERVE | PROCESSING_INSTRUCTION | STRUCTURED_ITEM | JSON_ITEM | OBJECT | ARRAY | RETURN | SATISFIES | SCHEMA | SCHEMA_ATTRIBUTE | SCHEMA_ELEMENT | SELF | SOME | STABLE | STRICT | STRIP | TEXT | THEN | TO | TREAT | TYPESWITCH | UNION | UNORDERED | VALIDATE | VARIABLE | VERSION | WHERE | XQUERY | ALLOWING | CATCH | CONTEXT | COUNT | DECIMAL_FORMAT | DECIMAL_SEPARATOR | DIGIT | END | GROUP | GROUPING_SEPARATOR | INFINITY | MINUS_SIGN | NAMESPACE_NODE | NAN | NEXT | ONLY | PATTERN_SEPARATOR | PERCENT | PER_MILLE | PREVIOUS | SLIDING | START | SWITCH | TRY | TUMBLING | TYPE | WHEN | WINDOW | ZERO_DIGIT | AFTER | BEFORE | COPY | DELETE | FIRST | INSERT | INTO | POSITION | APPEND | LAST | MODIFY | NODES | RENAME | REPLACE | REVALIDATION | SKIP | UPDATING | VALUE | WITH | ALL | ANY | CONTAINS | CONTENT | DIACRITICS | DIFFERENT | DISTANCE | ENTIRE | EXACTLY | FROM | FT_OPTION | FTAND | FTNOT | FTOR | INSENSITIVE | LANGUAGE | LEVELS | LOWERCASE | MOST | NO | NOT | OCCURS | PARAGRAPH | PARAGRAPHS | PHRASE | RELATIONSHIP | SAME | SCORE | SENSITIVE | SENTENCE | SENTENCES | STEMMING | STOP | THESAURUS | TIMES | UPPERCASE | USING | WEIGHT | WILDCARDS | WITHOUT | WORD | WORDS | BREAK | CONTINUE | EXIT | LOOP | RETURNING | WHILE | CHECK | COLLECTION | CONSTRAINT | FOREACH | FOREIGN | INDEX | INTEGRITY | KEY | ON | UNIQUE | AMP_ER | APOS_ER | QUOT_ER | CONCAT | LPAREN | RPAREN | DOLLAR | L_UNION_BRACKET | R_UNION_BRACKET | LBRACKET | RBRACKET | LSQUARE | RSQUARE | EQUAL | BIND | NOTEQUAL | ANN_PERCENT | HASH | AMP | COMMA | QUESTION | STAR | PLUS | MINUS | SMALLER | GREATER | SMALLEREQ | GREATEREQ | SMALLER_SMALLER | GREATER_GREATER | SLASH | SLASH_SLASH | BANG | DOT | DOT_DOT | COLON | COLON_COLON | EMPTY_CLOSE_TAG | CLOSE_TAG | SEMICOLON | VBAR | PRAGMA_START | PRAGMA_END | XML_COMMENT_START | XML_COMMENT_END | PI_START | PI_END | ATTR_SIGN | Q | CHARREF_DEC | CHARREF_HEX | APOS | QUOT | L_NCName | S | L_Pragma | L_DirCommentConstructor | L_DirPIConstructor | L_IntegerLiteral | L_DecimalLiteral | L_DoubleLiteral | L_Comment | L_AnyChar )\n        var alt19=270;\n        alt19 = this.dfa19.predict(this.input);\n        switch (alt19) {\n            case 1 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:10: ANCESTOR\n                this.mANCESTOR(); \n\n\n                break;\n            case 2 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:19: ANCESTOR_OR_SELF\n                this.mANCESTOR_OR_SELF(); \n\n\n                break;\n            case 3 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:36: AND\n                this.mAND(); \n\n\n                break;\n            case 4 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:40: AS\n                this.mAS(); \n\n\n                break;\n            case 5 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:43: ASCENDING\n                this.mASCENDING(); \n\n\n                break;\n            case 6 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:53: AT\n                this.mAT(); \n\n\n                break;\n            case 7 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:56: ATTRIBUTE\n                this.mATTRIBUTE(); \n\n\n                break;\n            case 8 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:66: BASE_URI\n                this.mBASE_URI(); \n\n\n                break;\n            case 9 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:75: BOUNDARY_SPACE\n                this.mBOUNDARY_SPACE(); \n\n\n                break;\n            case 10 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:90: BY\n                this.mBY(); \n\n\n                break;\n            case 11 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:93: CASE\n                this.mCASE(); \n\n\n                break;\n            case 12 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:98: CAST\n                this.mCAST(); \n\n\n                break;\n            case 13 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:103: CASTABLE\n                this.mCASTABLE(); \n\n\n                break;\n            case 14 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:112: CHILD\n                this.mCHILD(); \n\n\n                break;\n            case 15 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:118: COLLATION\n                this.mCOLLATION(); \n\n\n                break;\n            case 16 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:128: COMMENT\n                this.mCOMMENT(); \n\n\n                break;\n            case 17 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:136: CONSTRUCTION\n                this.mCONSTRUCTION(); \n\n\n                break;\n            case 18 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:149: COPY_NAMESPACES\n                this.mCOPY_NAMESPACES(); \n\n\n                break;\n            case 19 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:165: DECLARE\n                this.mDECLARE(); \n\n\n                break;\n            case 20 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:173: DEFAULT\n                this.mDEFAULT(); \n\n\n                break;\n            case 21 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:181: DESCENDANT\n                this.mDESCENDANT(); \n\n\n                break;\n            case 22 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:192: DESCENDANT_OR_SELF\n                this.mDESCENDANT_OR_SELF(); \n\n\n                break;\n            case 23 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:211: DESCENDING\n                this.mDESCENDING(); \n\n\n                break;\n            case 24 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:222: DIV\n                this.mDIV(); \n\n\n                break;\n            case 25 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:226: DOCUMENT\n                this.mDOCUMENT(); \n\n\n                break;\n            case 26 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:235: DOCUMENT_NODE\n                this.mDOCUMENT_NODE(); \n\n\n                break;\n            case 27 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:249: ELEMENT\n                this.mELEMENT(); \n\n\n                break;\n            case 28 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:257: ELSE\n                this.mELSE(); \n\n\n                break;\n            case 29 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:262: EMPTY\n                this.mEMPTY(); \n\n\n                break;\n            case 30 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:268: EMPTY_SEQUENCE\n                this.mEMPTY_SEQUENCE(); \n\n\n                break;\n            case 31 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:283: ENCODING\n                this.mENCODING(); \n\n\n                break;\n            case 32 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:292: EQ\n                this.mEQ(); \n\n\n                break;\n            case 33 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:295: EVERY\n                this.mEVERY(); \n\n\n                break;\n            case 34 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:301: EXCEPT\n                this.mEXCEPT(); \n\n\n                break;\n            case 35 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:308: EXTERNAL\n                this.mEXTERNAL(); \n\n\n                break;\n            case 36 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:317: FOLLOWING\n                this.mFOLLOWING(); \n\n\n                break;\n            case 37 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:327: FOLLOWING_SIBLING\n                this.mFOLLOWING_SIBLING(); \n\n\n                break;\n            case 38 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:345: FOR\n                this.mFOR(); \n\n\n                break;\n            case 39 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:349: FUNCTION\n                this.mFUNCTION(); \n\n\n                break;\n            case 40 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:358: GE\n                this.mGE(); \n\n\n                break;\n            case 41 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:361: GREATEST\n                this.mGREATEST(); \n\n\n                break;\n            case 42 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:370: GT\n                this.mGT(); \n\n\n                break;\n            case 43 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:373: IDIV\n                this.mIDIV(); \n\n\n                break;\n            case 44 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:378: IF\n                this.mIF(); \n\n\n                break;\n            case 45 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:381: IMPORT\n                this.mIMPORT(); \n\n\n                break;\n            case 46 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:388: IN\n                this.mIN(); \n\n\n                break;\n            case 47 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:391: INHERIT\n                this.mINHERIT(); \n\n\n                break;\n            case 48 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:399: INSTANCE\n                this.mINSTANCE(); \n\n\n                break;\n            case 49 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:408: INTERSECT\n                this.mINTERSECT(); \n\n\n                break;\n            case 50 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:418: IS\n                this.mIS(); \n\n\n                break;\n            case 51 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:421: ITEM\n                this.mITEM(); \n\n\n                break;\n            case 52 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:426: LAX\n                this.mLAX(); \n\n\n                break;\n            case 53 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:430: LE\n                this.mLE(); \n\n\n                break;\n            case 54 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:433: LEAST\n                this.mLEAST(); \n\n\n                break;\n            case 55 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:439: LET\n                this.mLET(); \n\n\n                break;\n            case 56 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:443: LT\n                this.mLT(); \n\n\n                break;\n            case 57 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:446: MOD\n                this.mMOD(); \n\n\n                break;\n            case 58 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:450: MODULE\n                this.mMODULE(); \n\n\n                break;\n            case 59 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:457: NAMESPACE\n                this.mNAMESPACE(); \n\n\n                break;\n            case 60 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:467: NE\n                this.mNE(); \n\n\n                break;\n            case 61 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:470: NO_INHERIT\n                this.mNO_INHERIT(); \n\n\n                break;\n            case 62 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:481: NO_PRESERVE\n                this.mNO_PRESERVE(); \n\n\n                break;\n            case 63 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:493: NODE\n                this.mNODE(); \n\n\n                break;\n            case 64 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:498: JSON\n                this.mJSON(); \n\n\n                break;\n            case 65 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:503: OF\n                this.mOF(); \n\n\n                break;\n            case 66 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:506: OPTION\n                this.mOPTION(); \n\n\n                break;\n            case 67 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:513: OR\n                this.mOR(); \n\n\n                break;\n            case 68 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:516: ORDER\n                this.mORDER(); \n\n\n                break;\n            case 69 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:522: ORDERED\n                this.mORDERED(); \n\n\n                break;\n            case 70 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:530: ORDERING\n                this.mORDERING(); \n\n\n                break;\n            case 71 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:539: PARENT\n                this.mPARENT(); \n\n\n                break;\n            case 72 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:546: PRECEDING\n                this.mPRECEDING(); \n\n\n                break;\n            case 73 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:556: PRECEDING_SIBLING\n                this.mPRECEDING_SIBLING(); \n\n\n                break;\n            case 74 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:574: PRESERVE\n                this.mPRESERVE(); \n\n\n                break;\n            case 75 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:583: PROCESSING_INSTRUCTION\n                this.mPROCESSING_INSTRUCTION(); \n\n\n                break;\n            case 76 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:606: STRUCTURED_ITEM\n                this.mSTRUCTURED_ITEM(); \n\n\n                break;\n            case 77 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:622: JSON_ITEM\n                this.mJSON_ITEM(); \n\n\n                break;\n            case 78 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:632: OBJECT\n                this.mOBJECT(); \n\n\n                break;\n            case 79 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:639: ARRAY\n                this.mARRAY(); \n\n\n                break;\n            case 80 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:645: RETURN\n                this.mRETURN(); \n\n\n                break;\n            case 81 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:652: SATISFIES\n                this.mSATISFIES(); \n\n\n                break;\n            case 82 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:662: SCHEMA\n                this.mSCHEMA(); \n\n\n                break;\n            case 83 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:669: SCHEMA_ATTRIBUTE\n                this.mSCHEMA_ATTRIBUTE(); \n\n\n                break;\n            case 84 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:686: SCHEMA_ELEMENT\n                this.mSCHEMA_ELEMENT(); \n\n\n                break;\n            case 85 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:701: SELF\n                this.mSELF(); \n\n\n                break;\n            case 86 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:706: SOME\n                this.mSOME(); \n\n\n                break;\n            case 87 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:711: STABLE\n                this.mSTABLE(); \n\n\n                break;\n            case 88 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:718: STRICT\n                this.mSTRICT(); \n\n\n                break;\n            case 89 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:725: STRIP\n                this.mSTRIP(); \n\n\n                break;\n            case 90 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:731: TEXT\n                this.mTEXT(); \n\n\n                break;\n            case 91 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:736: THEN\n                this.mTHEN(); \n\n\n                break;\n            case 92 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:741: TO\n                this.mTO(); \n\n\n                break;\n            case 93 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:744: TREAT\n                this.mTREAT(); \n\n\n                break;\n            case 94 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:750: TYPESWITCH\n                this.mTYPESWITCH(); \n\n\n                break;\n            case 95 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:761: UNION\n                this.mUNION(); \n\n\n                break;\n            case 96 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:767: UNORDERED\n                this.mUNORDERED(); \n\n\n                break;\n            case 97 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:777: VALIDATE\n                this.mVALIDATE(); \n\n\n                break;\n            case 98 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:786: VARIABLE\n                this.mVARIABLE(); \n\n\n                break;\n            case 99 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:795: VERSION\n                this.mVERSION(); \n\n\n                break;\n            case 100 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:803: WHERE\n                this.mWHERE(); \n\n\n                break;\n            case 101 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:809: XQUERY\n                this.mXQUERY(); \n\n\n                break;\n            case 102 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:816: ALLOWING\n                this.mALLOWING(); \n\n\n                break;\n            case 103 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:825: CATCH\n                this.mCATCH(); \n\n\n                break;\n            case 104 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:831: CONTEXT\n                this.mCONTEXT(); \n\n\n                break;\n            case 105 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:839: COUNT\n                this.mCOUNT(); \n\n\n                break;\n            case 106 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:845: DECIMAL_FORMAT\n                this.mDECIMAL_FORMAT(); \n\n\n                break;\n            case 107 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:860: DECIMAL_SEPARATOR\n                this.mDECIMAL_SEPARATOR(); \n\n\n                break;\n            case 108 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:878: DIGIT\n                this.mDIGIT(); \n\n\n                break;\n            case 109 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:884: END\n                this.mEND(); \n\n\n                break;\n            case 110 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:888: GROUP\n                this.mGROUP(); \n\n\n                break;\n            case 111 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:894: GROUPING_SEPARATOR\n                this.mGROUPING_SEPARATOR(); \n\n\n                break;\n            case 112 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:913: INFINITY\n                this.mINFINITY(); \n\n\n                break;\n            case 113 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:922: MINUS_SIGN\n                this.mMINUS_SIGN(); \n\n\n                break;\n            case 114 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:933: NAMESPACE_NODE\n                this.mNAMESPACE_NODE(); \n\n\n                break;\n            case 115 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:948: NAN\n                this.mNAN(); \n\n\n                break;\n            case 116 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:952: NEXT\n                this.mNEXT(); \n\n\n                break;\n            case 117 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:957: ONLY\n                this.mONLY(); \n\n\n                break;\n            case 118 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:962: PATTERN_SEPARATOR\n                this.mPATTERN_SEPARATOR(); \n\n\n                break;\n            case 119 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:980: PERCENT\n                this.mPERCENT(); \n\n\n                break;\n            case 120 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:988: PER_MILLE\n                this.mPER_MILLE(); \n\n\n                break;\n            case 121 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:998: PREVIOUS\n                this.mPREVIOUS(); \n\n\n                break;\n            case 122 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1007: SLIDING\n                this.mSLIDING(); \n\n\n                break;\n            case 123 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1015: START\n                this.mSTART(); \n\n\n                break;\n            case 124 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1021: SWITCH\n                this.mSWITCH(); \n\n\n                break;\n            case 125 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1028: TRY\n                this.mTRY(); \n\n\n                break;\n            case 126 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1032: TUMBLING\n                this.mTUMBLING(); \n\n\n                break;\n            case 127 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1041: TYPE\n                this.mTYPE(); \n\n\n                break;\n            case 128 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1046: WHEN\n                this.mWHEN(); \n\n\n                break;\n            case 129 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1051: WINDOW\n                this.mWINDOW(); \n\n\n                break;\n            case 130 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1058: ZERO_DIGIT\n                this.mZERO_DIGIT(); \n\n\n                break;\n            case 131 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1069: AFTER\n                this.mAFTER(); \n\n\n                break;\n            case 132 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1075: BEFORE\n                this.mBEFORE(); \n\n\n                break;\n            case 133 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1082: COPY\n                this.mCOPY(); \n\n\n                break;\n            case 134 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1087: DELETE\n                this.mDELETE(); \n\n\n                break;\n            case 135 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1094: FIRST\n                this.mFIRST(); \n\n\n                break;\n            case 136 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1100: INSERT\n                this.mINSERT(); \n\n\n                break;\n            case 137 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1107: INTO\n                this.mINTO(); \n\n\n                break;\n            case 138 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1112: POSITION\n                this.mPOSITION(); \n\n\n                break;\n            case 139 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1121: APPEND\n                this.mAPPEND(); \n\n\n                break;\n            case 140 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1128: LAST\n                this.mLAST(); \n\n\n                break;\n            case 141 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1133: MODIFY\n                this.mMODIFY(); \n\n\n                break;\n            case 142 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1140: NODES\n                this.mNODES(); \n\n\n                break;\n            case 143 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1146: RENAME\n                this.mRENAME(); \n\n\n                break;\n            case 144 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1153: REPLACE\n                this.mREPLACE(); \n\n\n                break;\n            case 145 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1161: REVALIDATION\n                this.mREVALIDATION(); \n\n\n                break;\n            case 146 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1174: SKIP\n                this.mSKIP(); \n\n\n                break;\n            case 147 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1179: UPDATING\n                this.mUPDATING(); \n\n\n                break;\n            case 148 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1188: VALUE\n                this.mVALUE(); \n\n\n                break;\n            case 149 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1194: WITH\n                this.mWITH(); \n\n\n                break;\n            case 150 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1199: ALL\n                this.mALL(); \n\n\n                break;\n            case 151 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1203: ANY\n                this.mANY(); \n\n\n                break;\n            case 152 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1207: CONTAINS\n                this.mCONTAINS(); \n\n\n                break;\n            case 153 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1216: CONTENT\n                this.mCONTENT(); \n\n\n                break;\n            case 154 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1224: DIACRITICS\n                this.mDIACRITICS(); \n\n\n                break;\n            case 155 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1235: DIFFERENT\n                this.mDIFFERENT(); \n\n\n                break;\n            case 156 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1245: DISTANCE\n                this.mDISTANCE(); \n\n\n                break;\n            case 157 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1254: ENTIRE\n                this.mENTIRE(); \n\n\n                break;\n            case 158 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1261: EXACTLY\n                this.mEXACTLY(); \n\n\n                break;\n            case 159 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1269: FROM\n                this.mFROM(); \n\n\n                break;\n            case 160 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1274: FT_OPTION\n                this.mFT_OPTION(); \n\n\n                break;\n            case 161 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1284: FTAND\n                this.mFTAND(); \n\n\n                break;\n            case 162 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1290: FTNOT\n                this.mFTNOT(); \n\n\n                break;\n            case 163 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1296: FTOR\n                this.mFTOR(); \n\n\n                break;\n            case 164 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1301: INSENSITIVE\n                this.mINSENSITIVE(); \n\n\n                break;\n            case 165 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1313: LANGUAGE\n                this.mLANGUAGE(); \n\n\n                break;\n            case 166 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1322: LEVELS\n                this.mLEVELS(); \n\n\n                break;\n            case 167 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1329: LOWERCASE\n                this.mLOWERCASE(); \n\n\n                break;\n            case 168 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1339: MOST\n                this.mMOST(); \n\n\n                break;\n            case 169 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1344: NO\n                this.mNO(); \n\n\n                break;\n            case 170 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1347: NOT\n                this.mNOT(); \n\n\n                break;\n            case 171 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1351: OCCURS\n                this.mOCCURS(); \n\n\n                break;\n            case 172 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1358: PARAGRAPH\n                this.mPARAGRAPH(); \n\n\n                break;\n            case 173 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1368: PARAGRAPHS\n                this.mPARAGRAPHS(); \n\n\n                break;\n            case 174 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1379: PHRASE\n                this.mPHRASE(); \n\n\n                break;\n            case 175 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1386: RELATIONSHIP\n                this.mRELATIONSHIP(); \n\n\n                break;\n            case 176 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1399: SAME\n                this.mSAME(); \n\n\n                break;\n            case 177 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1404: SCORE\n                this.mSCORE(); \n\n\n                break;\n            case 178 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1410: SENSITIVE\n                this.mSENSITIVE(); \n\n\n                break;\n            case 179 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1420: SENTENCE\n                this.mSENTENCE(); \n\n\n                break;\n            case 180 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1429: SENTENCES\n                this.mSENTENCES(); \n\n\n                break;\n            case 181 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1439: STEMMING\n                this.mSTEMMING(); \n\n\n                break;\n            case 182 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1448: STOP\n                this.mSTOP(); \n\n\n                break;\n            case 183 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1453: THESAURUS\n                this.mTHESAURUS(); \n\n\n                break;\n            case 184 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1463: TIMES\n                this.mTIMES(); \n\n\n                break;\n            case 185 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1469: UPPERCASE\n                this.mUPPERCASE(); \n\n\n                break;\n            case 186 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1479: USING\n                this.mUSING(); \n\n\n                break;\n            case 187 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1485: WEIGHT\n                this.mWEIGHT(); \n\n\n                break;\n            case 188 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1492: WILDCARDS\n                this.mWILDCARDS(); \n\n\n                break;\n            case 189 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1502: WITHOUT\n                this.mWITHOUT(); \n\n\n                break;\n            case 190 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1510: WORD\n                this.mWORD(); \n\n\n                break;\n            case 191 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1515: WORDS\n                this.mWORDS(); \n\n\n                break;\n            case 192 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1521: BREAK\n                this.mBREAK(); \n\n\n                break;\n            case 193 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1527: CONTINUE\n                this.mCONTINUE(); \n\n\n                break;\n            case 194 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1536: EXIT\n                this.mEXIT(); \n\n\n                break;\n            case 195 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1541: LOOP\n                this.mLOOP(); \n\n\n                break;\n            case 196 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1546: RETURNING\n                this.mRETURNING(); \n\n\n                break;\n            case 197 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1556: WHILE\n                this.mWHILE(); \n\n\n                break;\n            case 198 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1562: CHECK\n                this.mCHECK(); \n\n\n                break;\n            case 199 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1568: COLLECTION\n                this.mCOLLECTION(); \n\n\n                break;\n            case 200 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1579: CONSTRAINT\n                this.mCONSTRAINT(); \n\n\n                break;\n            case 201 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1590: FOREACH\n                this.mFOREACH(); \n\n\n                break;\n            case 202 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1598: FOREIGN\n                this.mFOREIGN(); \n\n\n                break;\n            case 203 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1606: INDEX\n                this.mINDEX(); \n\n\n                break;\n            case 204 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1612: INTEGRITY\n                this.mINTEGRITY(); \n\n\n                break;\n            case 205 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1622: KEY\n                this.mKEY(); \n\n\n                break;\n            case 206 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1626: ON\n                this.mON(); \n\n\n                break;\n            case 207 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1629: UNIQUE\n                this.mUNIQUE(); \n\n\n                break;\n            case 208 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1636: AMP_ER\n                this.mAMP_ER(); \n\n\n                break;\n            case 209 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1643: APOS_ER\n                this.mAPOS_ER(); \n\n\n                break;\n            case 210 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1651: QUOT_ER\n                this.mQUOT_ER(); \n\n\n                break;\n            case 211 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1659: CONCAT\n                this.mCONCAT(); \n\n\n                break;\n            case 212 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1666: LPAREN\n                this.mLPAREN(); \n\n\n                break;\n            case 213 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1673: RPAREN\n                this.mRPAREN(); \n\n\n                break;\n            case 214 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1680: DOLLAR\n                this.mDOLLAR(); \n\n\n                break;\n            case 215 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1687: L_UNION_BRACKET\n                this.mL_UNION_BRACKET(); \n\n\n                break;\n            case 216 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1703: R_UNION_BRACKET\n                this.mR_UNION_BRACKET(); \n\n\n                break;\n            case 217 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1719: LBRACKET\n                this.mLBRACKET(); \n\n\n                break;\n            case 218 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1728: RBRACKET\n                this.mRBRACKET(); \n\n\n                break;\n            case 219 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1737: LSQUARE\n                this.mLSQUARE(); \n\n\n                break;\n            case 220 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1745: RSQUARE\n                this.mRSQUARE(); \n\n\n                break;\n            case 221 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1753: EQUAL\n                this.mEQUAL(); \n\n\n                break;\n            case 222 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1759: BIND\n                this.mBIND(); \n\n\n                break;\n            case 223 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1764: NOTEQUAL\n                this.mNOTEQUAL(); \n\n\n                break;\n            case 224 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1773: ANN_PERCENT\n                this.mANN_PERCENT(); \n\n\n                break;\n            case 225 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1785: HASH\n                this.mHASH(); \n\n\n                break;\n            case 226 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1790: AMP\n                this.mAMP(); \n\n\n                break;\n            case 227 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1794: COMMA\n                this.mCOMMA(); \n\n\n                break;\n            case 228 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1800: QUESTION\n                this.mQUESTION(); \n\n\n                break;\n            case 229 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1809: STAR\n                this.mSTAR(); \n\n\n                break;\n            case 230 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1814: PLUS\n                this.mPLUS(); \n\n\n                break;\n            case 231 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1819: MINUS\n                this.mMINUS(); \n\n\n                break;\n            case 232 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1825: SMALLER\n                this.mSMALLER(); \n\n\n                break;\n            case 233 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1833: GREATER\n                this.mGREATER(); \n\n\n                break;\n            case 234 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1841: SMALLEREQ\n                this.mSMALLEREQ(); \n\n\n                break;\n            case 235 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1851: GREATEREQ\n                this.mGREATEREQ(); \n\n\n                break;\n            case 236 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1861: SMALLER_SMALLER\n                this.mSMALLER_SMALLER(); \n\n\n                break;\n            case 237 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1877: GREATER_GREATER\n                this.mGREATER_GREATER(); \n\n\n                break;\n            case 238 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1893: SLASH\n                this.mSLASH(); \n\n\n                break;\n            case 239 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1899: SLASH_SLASH\n                this.mSLASH_SLASH(); \n\n\n                break;\n            case 240 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1911: BANG\n                this.mBANG(); \n\n\n                break;\n            case 241 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1916: DOT\n                this.mDOT(); \n\n\n                break;\n            case 242 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1920: DOT_DOT\n                this.mDOT_DOT(); \n\n\n                break;\n            case 243 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1928: COLON\n                this.mCOLON(); \n\n\n                break;\n            case 244 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1934: COLON_COLON\n                this.mCOLON_COLON(); \n\n\n                break;\n            case 245 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1946: EMPTY_CLOSE_TAG\n                this.mEMPTY_CLOSE_TAG(); \n\n\n                break;\n            case 246 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1962: CLOSE_TAG\n                this.mCLOSE_TAG(); \n\n\n                break;\n            case 247 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1972: SEMICOLON\n                this.mSEMICOLON(); \n\n\n                break;\n            case 248 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1982: VBAR\n                this.mVBAR(); \n\n\n                break;\n            case 249 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:1987: PRAGMA_START\n                this.mPRAGMA_START(); \n\n\n                break;\n            case 250 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2000: PRAGMA_END\n                this.mPRAGMA_END(); \n\n\n                break;\n            case 251 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2011: XML_COMMENT_START\n                this.mXML_COMMENT_START(); \n\n\n                break;\n            case 252 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2029: XML_COMMENT_END\n                this.mXML_COMMENT_END(); \n\n\n                break;\n            case 253 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2045: PI_START\n                this.mPI_START(); \n\n\n                break;\n            case 254 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2054: PI_END\n                this.mPI_END(); \n\n\n                break;\n            case 255 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2061: ATTR_SIGN\n                this.mATTR_SIGN(); \n\n\n                break;\n            case 256 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2071: Q\n                this.mQ(); \n\n\n                break;\n            case 257 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2073: CHARREF_DEC\n                this.mCHARREF_DEC(); \n\n\n                break;\n            case 258 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2085: CHARREF_HEX\n                this.mCHARREF_HEX(); \n\n\n                break;\n            case 259 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2097: APOS\n                this.mAPOS(); \n\n\n                break;\n            case 260 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2102: QUOT\n                this.mQUOT(); \n\n\n                break;\n            case 261 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2107: L_NCName\n                this.mL_NCName(); \n\n\n                break;\n            case 262 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2116: S\n                this.mS(); \n\n\n                break;\n            case 263 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2118: L_Pragma\n                this.mL_Pragma(); \n\n\n                break;\n            case 264 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2127: L_DirCommentConstructor\n                this.mL_DirCommentConstructor(); \n\n\n                break;\n            case 265 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2151: L_DirPIConstructor\n                this.mL_DirPIConstructor(); \n\n\n                break;\n            case 266 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2170: L_IntegerLiteral\n                this.mL_IntegerLiteral(); \n\n\n                break;\n            case 267 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2187: L_DecimalLiteral\n                this.mL_DecimalLiteral(); \n\n\n                break;\n            case 268 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2204: L_DoubleLiteral\n                this.mL_DoubleLiteral(); \n\n\n                break;\n            case 269 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2220: L_Comment\n                this.mL_Comment(); \n\n\n                break;\n            case 270 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryLexer.g:1:2230: L_AnyChar\n                this.mL_AnyChar(); \n\n\n                break;\n\n        }\n\n    }\n\n}, true); // important to pass true to overwrite default implementations\n\norg.antlr.lang.augmentObject(XQueryLexer, {\n    DFA19_eotS:\n        \"\\u0001\\uffff\\u0019\\u0042\\u0001\\u0097\\u0001\\u009a\\u0002\\uffff\\u0001\"+\n    \"\\u009e\\u0004\\uffff\\u0001\\u00a5\\u0001\\u00a7\\u0001\\uffff\\u0001\\u00aa\\u0001\"+\n    \"\\u00ac\\u0001\\uffff\\u0001\\u00af\\u0002\\uffff\\u0001\\u00b3\\u0001\\u00b9\\u0001\"+\n    \"\\u00bc\\u0001\\u00bf\\u0001\\u00c1\\u0002\\uffff\\u0001\\u00c5\\u0004\\uffff\\u0001\"+\n    \"\\u00c9\\u0001\\uffff\\u0001\\u0042\\u0001\\u00d1\\u0001\\u00d3\\u0005\\u0042\\u0001\"+\n    \"\\uffff\\u0002\\u0042\\u0001\\u00dc\\u000b\\u0042\\u0001\\u00f8\\u0007\\u0042\\u0001\"+\n    \"\\u0107\\u0001\\u0042\\u0001\\u010a\\u0001\\u0042\\u0001\\u010c\\u0001\\u0042\\u0001\"+\n    \"\\u0113\\u0001\\u0114\\u0002\\u0042\\u0001\\u011c\\u0001\\u011d\\u0004\\u0042\\u0001\"+\n    \"\\u0125\\u0001\\u0129\\u0001\\u0042\\u0001\\u012b\\u0001\\u0042\\u0001\\u012e\\u0001\"+\n    \"\\u0042\\u0001\\u0131\\u0011\\u0042\\u0001\\u014f\\u0012\\u0042\\u0003\\uffff\\u0001\"+\n    \"\\u0169\\u0012\\uffff\\u0001\\u016c\\u000c\\uffff\\u0001\\u016e\\u0009\\uffff\\u0001\"+\n    \"\\u0170\\u0007\\uffff\\u0001\\u00c9\\u0001\\u0170\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\u0173\\u0001\\u0174\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\u0179\\u0003\\u0042\\u0001\\u017d\\u0002\\u0042\\u0001\\uffff\\u000f\"+\n    \"\\u0042\\u0001\\u0192\\u0009\\u0042\\u0001\\u019c\\u0001\\u0042\\u0001\\uffff\\u0006\"+\n    \"\\u0042\\u0001\\u01a5\\u0007\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0006\\u0042\\u0002\\uffff\\u0001\\u0042\\u0001\\u01b9\\u0003\"+\n    \"\\u0042\\u0001\\u01bd\\u0001\\u0042\\u0002\\uffff\\u0002\\u0042\\u0001\\u01c3\\u0004\"+\n    \"\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\u01cb\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u0002\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\uffff\\u001d\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u0042\\u0001\\u01f7\\u0013\\u0042\\u0001\\u020e\\u0001\\u0042\\u0001\"+\n    \"\\u0210\\u0001\\u0042\\u0008\\uffff\\u0001\\u0170\\u0001\\u0042\\u0002\\uffff\\u0004\"+\n    \"\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\u021a\\u0001\\uffff\\u0004\\u0042\\u0001\"+\n    \"\\u021f\\u0001\\u0221\\u0007\\u0042\\u0001\\u022d\\u0006\\u0042\\u0001\\uffff\\u0006\"+\n    \"\\u0042\\u0001\\u023a\\u0002\\u0042\\u0001\\uffff\\u0005\\u0042\\u0001\\u0242\\u0002\"+\n    \"\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\u0248\\u0003\\u0042\\u0001\\u024c\\u0002\"+\n    \"\\u0042\\u0001\\u024f\\u0005\\u0042\\u0001\\u0257\\u0002\\u0042\\u0001\\u025a\\u0001\"+\n    \"\\uffff\\u0001\\u025b\\u0002\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\u0260\\u0002\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u0263\\u0002\\u0042\\u0001\\u0266\\u0002\\u0042\\u0001\"+\n    \"\\u026a\\u0001\\uffff\\u0001\\u026c\\u0003\\u0042\\u0001\\u0270\\u0011\\u0042\\u0001\"+\n    \"\\u0283\\u0001\\u0042\\u0001\\u0285\\u0002\\u0042\\u0001\\u0288\\u0002\\u0042\\u0001\"+\n    \"\\u028b\\u0002\\u0042\\u0001\\u028e\\u0005\\u0042\\u0001\\u0294\\u0001\\u0295\\u0002\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u0299\\u000d\\u0042\\u0001\\u02a7\\u0002\\u0042\\u0001\"+\n    \"\\u02ab\\u0002\\u0042\\u0001\\u02af\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u02b2\\u0001\\u02b3\\u0003\\u0042\\u0001\\u02b8\\u0001\\u0042\\u0001\"+\n    \"\\u02ba\\u0001\\u0042\\u0001\\uffff\\u0003\\u0042\\u0001\\u02bf\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u02c1\\u0001\\u02c2\\u0001\\u02c3\\u0008\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u02cd\\u0005\\u0042\\u0001\\u02d3\\u0005\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u02da\\u0002\\u0042\\u0001\\u02dd\\u0003\\u0042\\u0001\\uffff\\u0004\\u0042\\u0001\"+\n    \"\\u02e5\\u0001\\uffff\\u0001\\u0042\\u0001\\u02e7\\u0001\\u02e8\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\u02eb\\u0001\\uffff\\u0007\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\u02f4\\u0002\\uffff\\u0001\\u0042\\u0001\\u02f6\\u0002\\u0042\\u0001\\uffff\\u0002\"+\n    \"\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\u02ff\\u0001\"+\n    \"\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\u0304\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u000e\\u0042\\u0001\\u0314\\u0001\\u0042\\u0001\\u0316\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\u031a\\u0001\\uffff\\u0002\"+\n    \"\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\uffff\\u0005\\u0042\\u0002\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\u0325\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\u0328\\u0001\"+\n    \"\\u0329\\u0004\\u0042\\u0001\\u032e\\u0001\\u0042\\u0001\\u0330\\u0002\\u0042\\u0001\"+\n    \"\\u0333\\u0001\\uffff\\u0001\\u0334\\u0002\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\"+\n    \"\\u0339\\u0001\\uffff\\u0002\\u0042\\u0003\\uffff\\u0003\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u0340\\u0002\\u0042\\u0001\\u0343\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0003\\uffff\\u0009\\u0042\\u0001\\uffff\\u0004\\u0042\\u0001\\u0353\\u0001\"+\n    \"\\uffff\\u0006\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\u035b\\u0001\\uffff\\u0001\"+\n    \"\\u035c\\u0006\\u0042\\u0001\\uffff\\u0001\\u0042\\u0002\\uffff\\u0002\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u0366\\u0002\\u0042\\u0001\\u0369\\u0004\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u036f\\u0001\\u0042\\u0001\\u0371\\u0001\\u0372\\u0004\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\u0378\\u0002\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u037b\\u0001\\u037c\\u0001\\u037d\\u0009\\u0042\\u0001\\u0387\\u0001\\u0042\\u0001\"+\n    \"\\u0389\\u0001\\uffff\\u0001\\u038a\\u0001\\uffff\\u0002\\u0042\\u0001\\u038e\\u0001\"+\n    \"\\uffff\\u0003\\u0042\\u0001\\u0392\\u0001\\u0394\\u0001\\u0395\\u0004\\u0042\\u0001\"+\n    \"\\uffff\\u0002\\u0042\\u0002\\uffff\\u0001\\u039c\\u0003\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0002\\u0042\\u0002\\uffff\\u0001\\u03a3\\u0002\\u0042\\u0001\"+\n    \"\\u03a6\\u0001\\uffff\\u0001\\u03a7\\u0005\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\"+\n    \"\\uffff\\u0003\\u0042\\u0001\\u03b2\\u0002\\u0042\\u0001\\u03b5\\u0001\\u03b6\\u0003\"+\n    \"\\u0042\\u0001\\u03ba\\u0001\\u0042\\u0001\\u03bc\\u0001\\u0042\\u0001\\uffff\\u0004\"+\n    \"\\u0042\\u0001\\u03c3\\u0002\\u0042\\u0002\\uffff\\u0001\\u0042\\u0001\\u03c7\\u0001\"+\n    \"\\u0042\\u0001\\u03c9\\u0001\\u03ca\\u0004\\u0042\\u0001\\uffff\\u0001\\u03cf\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0005\\u0042\\u0001\\uffff\\u0001\\u0042\\u0002\\uffff\\u0005\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u03dc\\u0001\\u0042\\u0003\\uffff\\u0006\\u0042\\u0001\"+\n    \"\\u03e4\\u0002\\u0042\\u0001\\uffff\\u0001\\u0042\\u0002\\uffff\\u0003\\u0042\\u0001\"+\n    \"\\uffff\\u0002\\u0042\\u0001\\u03ee\\u0001\\uffff\\u0001\\u0042\\u0002\\uffff\\u0001\"+\n    \"\\u03f0\\u0005\\u0042\\u0001\\uffff\\u0005\\u0042\\u0001\\u03fb\\u0001\\uffff\\u0001\"+\n    \"\\u03fc\\u0001\\u0042\\u0002\\uffff\\u0001\\u0042\\u0001\\u0400\\u0002\\u0042\\u0001\"+\n    \"\\u0403\\u0001\\u0404\\u0001\\u0042\\u0001\\u0406\\u0002\\u0042\\u0001\\uffff\\u0002\"+\n    \"\\u0042\\u0002\\uffff\\u0001\\u040b\\u0001\\u040c\\u0001\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0004\\u0042\\u0001\\u0414\\u0001\\u0416\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\u0418\\u0001\\u0419\\u0001\\uffff\\u0001\\u0042\\u0002\\uffff\\u0001\"+\n    \"\\u041b\\u0001\\u0042\\u0001\\u041d\\u0001\\u0042\\u0001\\uffff\\u0001\\u041f\\u0003\"+\n    \"\\u0042\\u0001\\u0423\\u0001\\u0424\\u0006\\u0042\\u0001\\uffff\\u0001\\u042b\\u0003\"+\n    \"\\u0042\\u0001\\u042f\\u0001\\u0430\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\u0433\\u0001\\u0042\\u0001\\u0435\\u0004\\u0042\\u0001\\u043b\\u0001\\uffff\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0004\\u0042\\u0001\\u0441\\u0001\\u0042\\u0001\\u0443\\u0001\"+\n    \"\\u0042\\u0001\\u0445\\u0001\\u0446\\u0002\\uffff\\u0003\\u0042\\u0001\\uffff\\u0001\"+\n    \"\\u044a\\u0001\\u044b\\u0002\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u044d\\u0003\"+\n    \"\\u0042\\u0002\\uffff\\u0006\\u0042\\u0001\\u0457\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u0042\\u0002\\uffff\\u0001\\u045b\\u0001\\uffff\\u0001\\u045c\\u0001\"+\n    \"\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\u045f\\u0001\\u0460\\u0002\"+\n    \"\\uffff\\u0001\\u0461\\u0001\\u0042\\u0001\\u0464\\u0002\\u0042\\u0001\\u0467\\u0001\"+\n    \"\\uffff\\u0001\\u0469\\u0001\\u0042\\u0001\\u046c\\u0002\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\u046e\\u0001\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0470\\u0002\\u0042\\u0001\"+\n    \"\\u0473\\u0001\\u0474\\u0001\\uffff\\u0001\\u0475\\u0002\\u0042\\u0001\\u0478\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u047a\\u0001\\uffff\\u0001\\u047b\\u0002\\uffff\\u0001\"+\n    \"\\u047c\\u0002\\u0042\\u0002\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0480\\u0001\"+\n    \"\\u0042\\u0001\\u0482\\u0003\\u0042\\u0001\\u0487\\u0001\\u0488\\u0001\\u0489\\u0001\"+\n    \"\\uffff\\u0003\\u0042\\u0002\\uffff\\u0002\\u0042\\u0003\\uffff\\u0001\\u048f\\u0001\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u0491\\u0001\\u0042\\u0001\\uffff\\u0001\\u0493\\u0001\"+\n    \"\\uffff\\u0002\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u0002\\u0042\\u0003\\uffff\\u0002\\u0042\\u0001\\uffff\\u0001\\u049c\\u0003\"+\n    \"\\uffff\\u0001\\u049d\\u0002\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\uffff\\u0004\"+\n    \"\\u0042\\u0003\\uffff\\u0004\\u0042\\u0001\\u04a9\\u0001\\uffff\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u04ab\\u0001\\uffff\\u0008\\u0042\\u0002\\uffff\\u0002\\u0042\\u0001\"+\n    \"\\u04b6\\u0008\\u0042\\u0001\\uffff\\u0001\\u0042\\u0001\\uffff\\u0006\\u0042\\u0001\"+\n    \"\\u04c6\\u0001\\u04c7\\u0002\\u0042\\u0001\\uffff\\u0004\\u0042\\u0001\\u04ce\\u000a\"+\n    \"\\u0042\\u0002\\uffff\\u0001\\u0042\\u0001\\u04da\\u0001\\u0042\\u0001\\u04dc\\u0002\"+\n    \"\\u0042\\u0001\\uffff\\u0001\\u04df\\u0002\\u0042\\u0001\\u04e2\\u0005\\u0042\\u0001\"+\n    \"\\u04e8\\u0001\\u0042\\u0001\\uffff\\u0001\\u04ea\\u0001\\uffff\\u0002\\u0042\\u0001\"+\n    \"\\uffff\\u0002\\u0042\\u0001\\uffff\\u0003\\u0042\\u0001\\u04f2\\u0001\\u0042\\u0001\"+\n    \"\\uffff\\u0001\\u04f4\\u0001\\uffff\\u0007\\u0042\\u0001\\uffff\\u0001\\u04fc\\u0001\"+\n    \"\\uffff\\u0001\\u04fd\\u0001\\u0042\\u0001\\u04ff\\u0001\\u0042\\u0001\\u0501\\u0001\"+\n    \"\\u0502\\u0001\\u0042\\u0002\\uffff\\u0001\\u0504\\u0001\\uffff\\u0001\\u0505\\u0002\"+\n    \"\\uffff\\u0001\\u0042\\u0002\\uffff\\u0003\\u0042\\u0001\\u050a\\u0001\\uffff\",\n    DFA19_eofS:\n        \"\\u050b\\uffff\",\n    DFA19_minS:\n        \"\\u0001\\u0000\\u0001\\u0066\\u0002\\u0061\\u0001\\u0065\\u0001\\u006c\\u0001\"+\n    \"\\u0069\\u0001\\u0065\\u0001\\u0064\\u0001\\u0061\\u0001\\u0069\\u0001\\u0061\\u0001\"+\n    \"\\u0073\\u0001\\u0062\\u0002\\u0061\\u0002\\u0065\\u0001\\u006e\\u0001\\u0061\\u0001\"+\n    \"\\u0065\\u0001\\u0071\\u0001\\u0061\\u0002\\u0065\\u0001\\u0075\\u0001\\u007c\\u0001\"+\n    \"\\u0023\\u0002\\uffff\\u0001\\u007c\\u0004\\uffff\\u0001\\u003a\\u0001\\u003d\\u0001\"+\n    \"\\uffff\\u0001\\u0029\\u0001\\u0023\\u0001\\uffff\\u0001\\u003e\\u0002\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\u0021\\u0001\\u003d\\u0001\\u002f\\u0001\\u002e\\u0002\\uffff\\u0001\"+\n    \"\\u002d\\u0004\\uffff\\u0001\\u002e\\u0001\\uffff\\u0001\\u0063\\u0002\\u002d\\u0001\"+\n    \"\\u0072\\u0001\\u006c\\u0001\\u0074\\u0001\\u006f\\u0001\\u0070\\u0001\\uffff\\u0001\"+\n    \"\\u0073\\u0001\\u0075\\u0001\\u002d\\u0001\\u0066\\u0001\\u0065\\u0001\\u0073\\u0001\"+\n    \"\\u0065\\u0001\\u006c\\u0001\\u0063\\u0001\\u0061\\u0001\\u0063\\u0001\\u0065\\u0001\"+\n    \"\\u0070\\u0001\\u0063\\u0001\\u002d\\u0001\\u0065\\u0001\\u0061\\u0001\\u006c\\u0001\"+\n    \"\\u006e\\u0001\\u0072\\u0001\\u006f\\u0002\\u002d\\u0001\\u0065\\u0001\\u002d\\u0001\"+\n    \"\\u0069\\u0001\\u002d\\u0001\\u0070\\u0002\\u002d\\u0001\\u0065\\u0001\\u006e\\u0002\"+\n    \"\\u002d\\u0001\\u006f\\u0001\\u0064\\u0001\\u006e\\u0001\\u006d\\u0002\\u002d\\u0001\"+\n    \"\\u006f\\u0001\\u002d\\u0001\\u0074\\u0001\\u002d\\u0001\\u006a\\u0001\\u002d\\u0001\"+\n    \"\\u0063\\u0001\\u0072\\u0001\\u0065\\u0001\\u0072\\u0001\\u0073\\u0001\\u0072\\u0001\"+\n    \"\\u0061\\u0001\\u006d\\u0001\\u0068\\u0001\\u006c\\u0001\\u006d\\u0003\\u0069\\u0001\"+\n    \"\\u006c\\u0001\\u0078\\u0001\\u0065\\u0001\\u002d\\u0001\\u0065\\u0001\\u0070\\u0002\"+\n    \"\\u006d\\u0001\\u0069\\u0001\\u0064\\u0001\\u0069\\u0001\\u006c\\u0001\\u0072\\u0001\"+\n    \"\\u0065\\u0001\\u006c\\u0001\\u0069\\u0001\\u0072\\u0001\\u0075\\u0001\\u004e\\u0001\"+\n    \"\\u0072\\u0001\\u0079\\u0001\\u006f\\u0003\\uffff\\u0001\\u0009\\u0012\\uffff\\u0001\"+\n    \"\\u0078\\u000b\\uffff\\u0001\\u002d\\u0001\\u0009\\u0009\\uffff\\u0001\\u0030\\u0007\"+\n    \"\\uffff\\u0001\\u002e\\u0001\\u0030\\u0001\\uffff\\u0001\\u0065\\u0002\\u002d\\u0001\"+\n    \"\\u0065\\u0001\\uffff\\u0001\\u0072\\u0001\\uffff\\u0001\\u0061\\u0001\\u002d\\u0002\"+\n    \"\\u0065\\u0001\\u0073\\u0001\\u002d\\u0001\\u0065\\u0001\\u006e\\u0001\\uffff\\u0001\"+\n    \"\\u006f\\u0001\\u0061\\u0001\\u0065\\u0001\\u0063\\u0001\\u006c\\u0001\\u0063\\u0001\"+\n    \"\\u006c\\u0001\\u006d\\u0001\\u0073\\u0001\\u0079\\u0001\\u006e\\u0001\\u0069\\u0001\"+\n    \"\\u0061\\u0001\\u0063\\u0001\\u0065\\u0001\\u002d\\u0001\\u0069\\u0001\\u0063\\u0001\"+\n    \"\\u0066\\u0001\\u0074\\u0001\\u0075\\u0001\\u006d\\u0001\\u0065\\u0001\\u0074\\u0001\"+\n    \"\\u006f\\u0001\\u002d\\u0001\\u0069\\u0001\\uffff\\u0001\\u0072\\u0002\\u0065\\u0001\"+\n    \"\\u0063\\u0001\\u0074\\u0001\\u006c\\u0001\\u002d\\u0001\\u0063\\u0001\\u0073\\u0001\"+\n    \"\\u006d\\u0001\\u006f\\u0001\\u006e\\u0001\\u006f\\u0001\\u0072\\u0001\\uffff\\u0001\"+\n    \"\\u0061\\u0001\\u0075\\u0001\\uffff\\u0001\\u0076\\u0001\\uffff\\u0001\\u006f\\u0003\"+\n    \"\\u0065\\u0001\\u0069\\u0001\\u0065\\u0002\\uffff\\u0001\\u006d\\u0001\\u002d\\u0001\"+\n    \"\\u0074\\u0001\\u0067\\u0001\\u0073\\u0001\\u002d\\u0001\\u0065\\u0002\\uffff\\u0001\"+\n    \"\\u0065\\u0001\\u0070\\u0001\\u002d\\u0001\\u0074\\u0001\\u0075\\u0001\\u0065\\u0001\"+\n    \"\\u0074\\u0001\\uffff\\u0001\\u0069\\u0001\\u0065\\u0001\\u002d\\u0001\\uffff\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0001\\u0069\\u0001\\u0065\\u0001\\uffff\\u0001\\u0065\\u0001\"+\n    \"\\u0079\\u0001\\uffff\\u0001\\u0075\\u0001\\u0061\\u0001\\u0074\\u0002\\u0063\\u0001\"+\n    \"\\u002d\\u0001\\u0069\\u0001\\u0061\\u0001\\u0069\\u0001\\u0062\\u0001\\u006d\\u0001\"+\n    \"\\u0070\\u0001\\u0069\\u0002\\u0065\\u0001\\u0072\\u0001\\u0066\\u0001\\u0073\\u0001\"+\n    \"\\u0065\\u0001\\u0064\\u0001\\u0074\\u0001\\u0070\\u0001\\u0075\\u0001\\u0061\\u0001\"+\n    \"\\u006c\\u0002\\u0061\\u0001\\u0074\\u0001\\u006e\\u0001\\uffff\\u0001\\u0061\\u0001\"+\n    \"\\u002d\\u0001\\u0065\\u0001\\u0062\\u0001\\u0065\\u0001\\u006f\\u0001\\u0072\\u0001\"+\n    \"\\u0061\\u0001\\u0065\\u0001\\u006e\\u0002\\u0069\\u0001\\u0073\\u0001\\u006e\\u0001\"+\n    \"\\u006c\\u0001\\u0064\\u0001\\u0068\\u0001\\u0064\\u0001\\u0067\\u0001\\u0064\\u0001\"+\n    \"\\u0065\\u0001\\u002d\\u0001\\u006f\\u0001\\u002d\\u0001\\u0074\\u0004\\uffff\\u0001\"+\n    \"\\u002d\\u0003\\uffff\\u0001\\u0030\\u0001\\u0073\\u0002\\uffff\\u0001\\u006e\\u0001\"+\n    \"\\u0069\\u0001\\u0079\\u0001\\u0077\\u0001\\uffff\\u0001\\u0072\\u0001\\u006e\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\u0064\\u0001\\u0072\\u0001\\u006b\\u0002\"+\n    \"\\u002d\\u0001\\u0068\\u0001\\u0064\\u0001\\u006b\\u0001\\u0061\\u0001\\u0065\\u0001\"+\n    \"\\u0074\\u0001\\u0061\\u0001\\u002d\\u0001\\u0074\\u0001\\u0061\\u0001\\u006d\\u0001\"+\n    \"\\u0075\\u0001\\u0065\\u0001\\u0074\\u0001\\uffff\\u0001\\u0074\\u0001\\u0072\\u0001\"+\n    \"\\u0065\\u0001\\u0061\\u0001\\u006d\\u0001\\u0065\\u0001\\u002d\\u0001\\u0079\\u0001\"+\n    \"\\u0064\\u0001\\uffff\\u0001\\u0072\\u0001\\u0079\\u0001\\u0070\\u0001\\u0072\\u0001\"+\n    \"\\u0074\\u0001\\u002d\\u0001\\u006f\\u0001\\u0061\\u0001\\uffff\\u0002\\u0074\\u0001\"+\n    \"\\u002d\\u0001\\u0070\\u0001\\u0064\\u0001\\u0074\\u0001\\u002d\\u0001\\u0074\\u0001\"+\n    \"\\u0070\\u0001\\u002d\\u0002\\u0072\\u0001\\u0061\\u0001\\u006e\\u0001\\u0067\\u0001\"+\n    \"\\u002d\\u0001\\u006e\\u0001\\u0078\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\"+\n    \"\\u0075\\u0001\\u0074\\u0001\\uffff\\u0001\\u006c\\u0001\\u0072\\u0001\\u002d\\u0001\"+\n    \"\\u006c\\u0001\\u0066\\u0001\\uffff\\u0001\\u002d\\u0002\\u0073\\u0001\\u002d\\u0001\"+\n    \"\\u006e\\u0001\\u0072\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\u006f\\u0001\"+\n    \"\\u0072\\u0001\\u0063\\u0001\\u002d\\u0001\\u0072\\u0001\\u006e\\u0001\\u0067\\u0003\"+\n    \"\\u0065\\u0001\\u0069\\u0002\\u0065\\u0001\\u006d\\u0001\\u0074\\u0001\\u0073\\u0002\"+\n    \"\\u0063\\u0001\\u006c\\u0001\\u0074\\u0001\\u006d\\u0001\\u002d\\u0001\\u0073\\u0001\"+\n    \"\\u002d\\u0001\\u006d\\u0001\\u0065\\u0001\\u002d\\u0001\\u0069\\u0001\\u0065\\u0001\"+\n    \"\\u002d\\u0001\\u0069\\u0001\\u0063\\u0001\\u002d\\u0001\\u0072\\u0001\\u006d\\u0001\"+\n    \"\\u0061\\u0001\\u006c\\u0001\\u0074\\u0002\\u002d\\u0001\\u0061\\u0001\\u0074\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u006c\\u0001\\u0073\\u0001\\u006e\\u0001\\u0075\\u0001\"+\n    \"\\u0064\\u0001\\u0074\\u0001\\u0072\\u0001\\u0067\\u0001\\u0064\\u0001\\u0065\\u0001\"+\n    \"\\u0061\\u0001\\u0069\\u0001\\u0065\\u0001\\u002d\\u0001\\u0065\\u0001\\u006f\\u0001\"+\n    \"\\u002d\\u0001\\u0063\\u0001\\u0068\\u0001\\u002d\\u0001\\u0072\\u0001\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\u0000\\u0001\\u0074\\u0001\\u0064\\u0001\"+\n    \"\\u0062\\u0001\\u002d\\u0001\\u0069\\u0001\\u002d\\u0001\\u0064\\u0001\\uffff\\u0001\"+\n    \"\\u0075\\u0001\\u0061\\u0001\\u0065\\u0001\\u002d\\u0001\\uffff\\u0001\\u0062\\u0001\"+\n    \"\\uffff\\u0003\\u002d\\u0001\\u0074\\u0001\\u0063\\u0001\\u006e\\u0001\\u0072\\u0001\"+\n    \"\\u006e\\u0001\\u0069\\u0002\\u006e\\u0001\\uffff\\u0001\\u002d\\u0001\\u0072\\u0001\"+\n    \"\\u0061\\u0001\\u006c\\u0001\\u006e\\u0001\\u0065\\u0001\\u002d\\u0001\\u0069\\u0001\"+\n    \"\\u0072\\u0001\\u006e\\u0001\\u0065\\u0001\\u006e\\u0001\\uffff\\u0001\\u002d\\u0001\"+\n    \"\\u0069\\u0001\\u0065\\u0001\\u002d\\u0001\\u0074\\u0001\\u006e\\u0001\\u006c\\u0001\"+\n    \"\\uffff\\u0001\\u0077\\u0001\\u0063\\u0001\\u0067\\u0001\\u0069\\u0001\\u002d\\u0001\"+\n    \"\\uffff\\u0001\\u0074\\u0002\\u002d\\u0001\\uffff\\u0001\\u0065\\u0001\\u002d\\u0001\"+\n    \"\\uffff\\u0001\\u0074\\u0001\\u0069\\u0001\\u006e\\u0001\\u0074\\u0002\\u0073\\u0001\"+\n    \"\\u0072\\u0001\\uffff\\u0001\\u0069\\u0001\\u002d\\u0002\\uffff\\u0001\\u0061\\u0001\"+\n    \"\\u002d\\u0001\\u0073\\u0001\\u0063\\u0001\\uffff\\u0001\\u0065\\u0001\\u0079\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u0070\\u0001\\uffff\\u0001\\u0068\\u0001\\u0065\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u0069\\u0001\\uffff\\u0001\\u006e\\u0001\\u002d\\u0001\"+\n    \"\\u0074\\u0001\\uffff\\u0001\\u0073\\u0001\\u0074\\u0002\\u0072\\u0001\\u0064\\u0001\"+\n    \"\\u0072\\u0001\\u006f\\u0001\\u0073\\u0001\\u006e\\u0002\\u0069\\u0001\\u0065\\u0002\"+\n    \"\\u0074\\u0001\\u002d\\u0001\\u0065\\u0001\\u002d\\u0001\\u0069\\u0001\\uffff\\u0001\"+\n    \"\\u0066\\u0001\\uffff\\u0001\\u0061\\u0001\\u002d\\u0001\\uffff\\u0001\\u0074\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0001\\u006e\\u0001\\u0068\\u0001\\uffff\\u0001\\u006e\\u0001\"+\n    \"\\u0065\\u0001\\u0063\\u0002\\u0069\\u0002\\uffff\\u0001\\u0075\\u0001\\u002d\\u0001\"+\n    \"\\u0077\\u0001\\uffff\\u0001\\u0069\\u0002\\u002d\\u0002\\u0065\\u0001\\u0069\\u0001\"+\n    \"\\u0063\\u0001\\u002d\\u0001\\u0061\\u0001\\u002d\\u0001\\u0062\\u0001\\u006f\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\u0077\\u0001\\u0075\\u0001\\uffff\\u0001\"+\n    \"\\u0061\\u0001\\u0074\\u0001\\u002d\\u0001\\uffff\\u0001\\u0079\\u0001\\u0064\\u0003\"+\n    \"\\uffff\\u0001\\u006f\\u0001\\u0069\\u0001\\u0075\\u0001\\uffff\\u0001\\u006e\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0002\\u0072\\u0001\\u002d\\u0001\\uffff\\u0001\\u006c\\u0003\"+\n    \"\\uffff\\u0001\\u0069\\u0002\\u0074\\u0001\\u0061\\u0002\\u0074\\u0001\\u006e\\u0001\"+\n    \"\\u0075\\u0001\\u0061\\u0001\\uffff\\u0001\\u0065\\u0001\\u006c\\u0001\\u0074\\u0001\"+\n    \"\\u0064\\u0001\\u002d\\u0001\\uffff\\u0001\\u0074\\u0001\\u0065\\u0001\\u0063\\u0001\"+\n    \"\\u006e\\u0001\\u0074\\u0001\\u0073\\u0001\\uffff\\u0001\\u006e\\u0001\\u002d\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u0061\\u0001\\u0079\\u0001\\u0069\\u0001\\u0068\\u0001\"+\n    \"\\u006e\\u0001\\u006f\\u0001\\uffff\\u0001\\u0069\\u0002\\uffff\\u0001\\u0073\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0001\\u002d\\u0001\\u0074\\u0001\\u0063\\u0001\\u002d\\u0001\"+\n    \"\\u0069\\u0001\\u0065\\u0001\\u0069\\u0001\\u0074\\u0001\\uffff\\u0001\\u0067\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u0061\\u0002\\u002d\\u0001\\u0073\\u0001\\u0061\\u0001\"+\n    \"\\u0065\\u0001\\u0073\\u0001\\uffff\\u0001\\u0074\\u0001\\u002d\\u0001\\u0064\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0003\\u002d\\u0001\\u0061\\u0001\\u006e\\u0001\\u0069\\u0001\"+\n    \"\\u0076\\u0001\\u0075\\u0001\\u0073\\u0001\\u0074\\u0001\\u006c\\u0001\\u006f\\u0001\"+\n    \"\\u002d\\u0001\\u0075\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\"+\n    \"\\u006e\\u0001\\u0069\\u0001\\u002d\\u0001\\uffff\\u0001\\u0069\\u0001\\u0063\\u0001\"+\n    \"\\u0067\\u0003\\u002d\\u0001\\u0065\\u0001\\u0064\\u0001\\u006f\\u0001\\u0072\\u0001\"+\n    \"\\uffff\\u0001\\u0069\\u0001\\u006e\\u0002\\uffff\\u0001\\u002d\\u0001\\u0072\\u0001\"+\n    \"\\u006e\\u0001\\u0061\\u0001\\uffff\\u0001\\u0074\\u0001\\uffff\\u0001\\u006c\\u0001\"+\n    \"\\u006e\\u0002\\uffff\\u0001\\u002d\\u0001\\u0074\\u0001\\u0072\\u0001\\u002d\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u0069\\u0001\\u0072\\u0001\\u006e\\u0001\\u0074\\u0001\"+\n    \"\\u0067\\u0001\\uffff\\u0001\\u0069\\u0001\\u0079\\u0001\\uffff\\u0001\\u0065\\u0001\"+\n    \"\\u006f\\u0001\\u0069\\u0001\\u002d\\u0001\\u0063\\u0001\\u0069\\u0002\\u002d\\u0001\"+\n    \"\\u0073\\u0001\\u0065\\u0001\\u006d\\u0003\\u002d\\u0001\\u0061\\u0001\\uffff\\u0001\"+\n    \"\\u0069\\u0001\\u006e\\u0001\\u0065\\u0001\\u0074\\u0001\\u002d\\u0001\\u0065\\u0001\"+\n    \"\\u0067\\u0002\\uffff\\u0001\\u006c\\u0001\\u002d\\u0001\\u006e\\u0002\\u002d\\u0001\"+\n    \"\\u006e\\u0001\\u006f\\u0001\\u0074\\u0001\\u0067\\u0001\\uffff\\u0001\\u002d\\u0001\"+\n    \"\\u0065\\u0001\\uffff\\u0001\\u0074\\u0001\\u0063\\u0001\\u0074\\u0001\\u0079\\u0001\"+\n    \"\\u0065\\u0001\\uffff\\u0001\\u0073\\u0002\\uffff\\u0001\\u0069\\u0001\\u0063\\u0001\"+\n    \"\\u0072\\u0002\\u0065\\u0001\\uffff\\u0001\\u002d\\u0001\\u0067\\u0003\\uffff\\u0001\"+\n    \"\\u0070\\u0001\\u002d\\u0001\\u006e\\u0001\\u0065\\u0001\\u0073\\u0001\\u0069\\u0001\"+\n    \"\\u002d\\u0001\\u006c\\u0001\\u006e\\u0001\\uffff\\u0001\\u0072\\u0002\\uffff\\u0001\"+\n    \"\\u0067\\u0001\\u0065\\u0001\\u0061\\u0001\\uffff\\u0001\\u0076\\u0001\\u0065\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u006e\\u0002\\uffff\\u0001\\u002d\\u0001\\u0061\\u0001\"+\n    \"\\u006e\\u0001\\u0075\\u0001\\u0074\\u0001\\u0067\\u0001\\uffff\\u0001\\u0065\\u0001\"+\n    \"\\u0067\\u0001\\u0073\\u0002\\u0065\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\"+\n    \"\\u0064\\u0002\\uffff\\u0001\\u0067\\u0001\\u002d\\u0001\\u0067\\u0001\\u0065\\u0004\"+\n    \"\\u002d\\u0001\\u006e\\u0001\\u006f\\u0001\\uffff\\u0001\\u0074\\u0001\\u006e\\u0002\"+\n    \"\\uffff\\u0002\\u002d\\u0001\\u0065\\u0001\\uffff\\u0001\\u0066\\u0001\\uffff\\u0002\"+\n    \"\\u006e\\u0001\\u0063\\u0001\\u0074\\u0002\\u002d\\u0001\\uffff\\u0001\\u0071\\u0002\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u0067\\u0002\\uffff\\u0001\\u002d\\u0001\\u006e\\u0002\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\u0069\\u0001\\u0074\\u0001\\u0079\\u0002\"+\n    \"\\u002d\\u0001\\u0065\\u0001\\u0067\\u0001\\u0065\\u0001\\u0069\\u0001\\u0072\\u0001\"+\n    \"\\u006d\\u0001\\uffff\\u0001\\u002d\\u0001\\u0068\\u0001\\u0073\\u0001\\u0067\\u0002\"+\n    \"\\u002d\\u0001\\u006e\\u0001\\uffff\\u0001\\u0065\\u0001\\u002d\\u0001\\u0065\\u0001\"+\n    \"\\u002d\\u0001\\u0073\\u0001\\u0074\\u0001\\u006c\\u0001\\u0065\\u0001\\u002d\\u0001\"+\n    \"\\uffff\\u0001\\u0067\\u0001\\uffff\\u0001\\u0074\\u0002\\u0073\\u0001\\u0063\\u0001\"+\n    \"\\u002d\\u0001\\u0064\\u0001\\u002d\\u0001\\u0065\\u0002\\u002d\\u0002\\uffff\\u0001\"+\n    \"\\u0073\\u0001\\u0069\\u0001\\u006f\\u0001\\uffff\\u0002\\u002d\\u0002\\uffff\\u0001\"+\n    \"\\u0073\\u0001\\uffff\\u0001\\u002d\\u0001\\u006e\\u0001\\u0069\\u0001\\u0074\\u0002\"+\n    \"\\uffff\\u0001\\u0073\\u0001\\u006f\\u0001\\u0065\\u0001\\u0074\\u0001\\u0067\\u0001\"+\n    \"\\u0073\\u0001\\u002d\\u0001\\uffff\\u0001\\u006e\\u0001\\uffff\\u0001\\u0075\\u0002\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\\u0073\\u0001\"+\n    \"\\uffff\\u0001\\u0076\\u0002\\u002d\\u0002\\uffff\\u0001\\u002d\\u0001\\u006e\\u0001\"+\n    \"\\u002d\\u0001\\u0074\\u0001\\u0076\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\"+\n    \"\\u0065\\u0001\\u002d\\u0002\\uffff\\u0001\\u0067\\u0001\\u002d\\u0001\\uffff\\u0001\"+\n    \"\\u0064\\u0001\\uffff\\u0001\\u002d\\u0001\\u0074\\u0001\\u0065\\u0002\\u002d\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u0069\\u0001\\u0068\\u0001\\u002d\\u0001\\u0068\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0002\\uffff\\u0001\\u002d\\u0001\"+\n    \"\\u0074\\u0001\\u0072\\u0002\\uffff\\u0001\\u0070\\u0001\\uffff\\u0001\\u002d\\u0001\"+\n    \"\\u006f\\u0001\\u002d\\u0001\\u0070\\u0001\\u0072\\u0001\\u0070\\u0003\\u002d\\u0001\"+\n    \"\\uffff\\u0001\\u006f\\u0001\\u0065\\u0001\\u0073\\u0002\\uffff\\u0002\\u0065\\u0003\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u006e\\u0001\\uffff\\u0001\\u002d\\u0001\\u0065\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\\u0070\\u0001\\u0073\\u0001\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\\u0072\\u0001\\u006d\\u0003\"+\n    \"\\uffff\\u0001\\u006f\\u0001\\u0069\\u0001\\uffff\\u0001\\u002d\\u0003\\uffff\\u0002\"+\n    \"\\u002d\\u0001\\u0061\\u0001\\uffff\\u0001\\u006e\\u0001\\uffff\\u0001\\u0061\\u0001\"+\n    \"\\u006d\\u0001\\u0061\\u0001\\u006f\\u0003\\uffff\\u0001\\u0064\\u0001\\u006e\\u0001\"+\n    \"\\u0069\\u0001\\u0070\\u0001\\u002d\\u0001\\uffff\\u0001\\u006f\\u0001\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u0061\\u0004\\u0069\\u0001\\u0065\\u0001\\u006e\\u0001\"+\n    \"\\u0070\\u0002\\uffff\\u0001\\u0073\\u0001\\u0063\\u0001\\u002d\\u0001\\u0063\\u0001\"+\n    \"\\u0061\\u0002\\u0072\\u0001\\u0065\\u0001\\u0063\\u0001\\u0062\\u0001\\u0061\\u0001\"+\n    \"\\uffff\\u0001\\u0064\\u0001\\uffff\\u0001\\u0072\\u0001\\u0062\\u0001\\u006e\\u0001\"+\n    \"\\u0074\\u0001\\u0062\\u0001\\u006e\\u0002\\u002d\\u0002\\u0065\\u0001\\uffff\\u0001\"+\n    \"\\u0065\\u0001\\u0074\\u0001\\u0061\\u0002\\u002d\\u0001\\u0065\\u0001\\u006c\\u0001\"+\n    \"\\u0072\\u0001\\u0065\\u0001\\u0061\\u0001\\u006c\\u0001\\u0073\\u0001\\u0065\\u0001\"+\n    \"\\u0075\\u0001\\u0074\\u0002\\uffff\\u0001\\u006c\\u0001\\u002d\\u0001\\u0073\\u0001\"+\n    \"\\u002d\\u0001\\u0074\\u0001\\u0073\\u0001\\uffff\\u0001\\u002d\\u0001\\u0069\\u0001\"+\n    \"\\u0061\\u0001\\u002d\\u0001\\u0074\\u0001\\u0069\\u0001\\u0074\\u0001\\u006d\\u0001\"+\n    \"\\u0074\\u0001\\u002d\\u0001\\u0066\\u0001\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\"+\n    \"\\u006f\\u0001\\u0065\\u0001\\uffff\\u0001\\u006e\\u0001\\u0074\\u0001\\uffff\\u0001\"+\n    \"\\u006f\\u0001\\u006e\\u0001\\u0072\\u0001\\u002d\\u0001\\u0065\\u0001\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u0072\\u0001\\u006c\\u0001\\u0067\\u0001\\u006f\\u0001\"+\n    \"\\u0072\\u0001\\u0067\\u0001\\u0075\\u0001\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\u0066\\u0001\\u002d\\u0001\\u0072\\u0002\\u002d\\u0001\\u0063\\u0002\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\\u002d\\u0002\\uffff\\u0001\\u0074\\u0002\"+\n    \"\\uffff\\u0001\\u0069\\u0001\\u006f\\u0001\\u006e\\u0001\\u002d\\u0001\\uffff\",\n    DFA19_maxS:\n        \"\\u0001\\uffff\\u0001\\u0074\\u0001\\u0079\\u0002\\u006f\\u0001\\u0078\\u0001\"+\n    \"\\u0075\\u0003\\u0074\\u0002\\u006f\\u0001\\u0073\\u0002\\u0072\\u0001\\u0077\\u0001\"+\n    \"\\u0065\\u0001\\u0079\\u0001\\u0073\\u0001\\u0065\\u0001\\u006f\\u0001\\u0071\\u0001\"+\n    \"\\u0061\\u0002\\u0065\\u0001\\u0075\\u0001\\u007d\\u0001\\u003a\\u0002\\uffff\\u0001\"+\n    \"\\u007c\\u0004\\uffff\\u0002\\u003d\\u0001\\uffff\\u0001\\u0029\\u0001\\u0023\\u0001\"+\n    \"\\uffff\\u0001\\u003e\\u0002\\uffff\\u0001\\u002d\\u0001\\u003f\\u0002\\u003e\\u0001\"+\n    \"\\u0039\\u0002\\uffff\\u0001\\u007a\\u0004\\uffff\\u0001\\u0065\\u0001\\uffff\\u0001\"+\n    \"\\u0079\\u0002\\u007a\\u0001\\u0072\\u0001\\u006c\\u0001\\u0074\\u0002\\u0070\\u0001\"+\n    \"\\uffff\\u0001\\u0073\\u0001\\u0075\\u0001\\u007a\\u0001\\u0066\\u0001\\u0065\\u0001\"+\n    \"\\u0074\\u0001\\u0069\\u0001\\u0075\\u0001\\u0073\\u0001\\u0076\\u0001\\u0063\\u0001\"+\n    \"\\u0073\\u0001\\u0070\\u0001\\u0074\\u0001\\u007a\\u0001\\u0065\\u0001\\u0074\\u0001\"+\n    \"\\u0072\\u0001\\u006e\\u0001\\u0072\\u0002\\u006f\\u0001\\u007a\\u0001\\u006f\\u0001\"+\n    \"\\u007a\\u0001\\u0069\\u0001\\u007a\\u0001\\u0070\\u0002\\u007a\\u0001\\u0065\\u0001\"+\n    \"\\u0078\\u0002\\u007a\\u0001\\u0077\\u0001\\u0073\\u0001\\u006e\\u0001\\u006d\\u0002\"+\n    \"\\u007a\\u0001\\u006f\\u0001\\u007a\\u0001\\u0074\\u0001\\u007a\\u0001\\u006a\\u0001\"+\n    \"\\u007a\\u0001\\u0063\\u0001\\u0074\\u0001\\u006f\\u0001\\u0072\\u0001\\u0073\\u0002\"+\n    \"\\u0072\\u0001\\u0074\\u0001\\u006f\\u0001\\u006e\\u0001\\u006d\\u0003\\u0069\\u0001\"+\n    \"\\u0076\\u0001\\u0078\\u0001\\u0065\\u0001\\u007a\\u0001\\u0079\\u0001\\u0070\\u0002\"+\n    \"\\u006d\\u0001\\u006f\\u0001\\u0070\\u0001\\u0069\\u0002\\u0072\\u0001\\u0069\\u0001\"+\n    \"\\u0074\\u0001\\u0069\\u0001\\u0072\\u0001\\u0075\\u0001\\u004e\\u0001\\u0072\\u0001\"+\n    \"\\u0079\\u0001\\u006f\\u0003\\uffff\\u0001\\u007a\\u0012\\uffff\\u0001\\u0078\\u000b\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u007a\\u0009\\uffff\\u0001\\u0065\\u0007\\uffff\\u0002\"+\n    \"\\u0065\\u0001\\uffff\\u0001\\u0065\\u0002\\u007a\\u0001\\u0065\\u0001\\uffff\\u0001\"+\n    \"\\u0072\\u0001\\uffff\\u0001\\u0061\\u0001\\u007a\\u0002\\u0065\\u0001\\u0073\\u0001\"+\n    \"\\u007a\\u0001\\u0065\\u0001\\u006e\\u0001\\uffff\\u0001\\u006f\\u0001\\u0061\\u0001\"+\n    \"\\u0074\\u0001\\u0063\\u0001\\u006c\\u0001\\u0063\\u0001\\u006c\\u0001\\u006d\\u0001\"+\n    \"\\u0074\\u0001\\u0079\\u0001\\u006e\\u0001\\u006c\\u0001\\u0061\\u0001\\u0063\\u0001\"+\n    \"\\u0065\\u0001\\u007a\\u0001\\u0069\\u0001\\u0063\\u0001\\u0066\\u0001\\u0074\\u0001\"+\n    \"\\u0075\\u0001\\u006d\\u0001\\u0065\\u0001\\u0074\\u0001\\u006f\\u0001\\u007a\\u0001\"+\n    \"\\u0069\\u0001\\uffff\\u0001\\u0072\\u0002\\u0065\\u0001\\u0063\\u0001\\u0074\\u0001\"+\n    \"\\u006c\\u0001\\u007a\\u0001\\u0063\\u0001\\u0073\\u0001\\u006d\\u0001\\u006f\\u0001\"+\n    \"\\u006e\\u0001\\u006f\\u0001\\u0072\\u0001\\uffff\\u0001\\u0061\\u0001\\u0075\\u0001\"+\n    \"\\uffff\\u0001\\u0076\\u0001\\uffff\\u0001\\u006f\\u0001\\u0065\\u0001\\u0074\\u0001\"+\n    \"\\u006f\\u0001\\u0069\\u0001\\u0065\\u0002\\uffff\\u0001\\u006d\\u0001\\u007a\\u0001\"+\n    \"\\u0074\\u0001\\u0067\\u0001\\u0073\\u0001\\u007a\\u0001\\u0065\\u0002\\uffff\\u0001\"+\n    \"\\u0065\\u0001\\u0070\\u0001\\u007a\\u0001\\u0074\\u0001\\u0075\\u0001\\u0065\\u0001\"+\n    \"\\u0074\\u0001\\uffff\\u0001\\u0070\\u0001\\u0065\\u0001\\u007a\\u0001\\uffff\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0001\\u0069\\u0001\\u0065\\u0001\\uffff\\u0001\\u0065\\u0001\"+\n    \"\\u0079\\u0001\\uffff\\u0001\\u0075\\u0001\\u0065\\u0001\\u0074\\u0001\\u0076\\u0002\"+\n    \"\\u0063\\u0001\\u0069\\u0001\\u0061\\u0001\\u0075\\u0001\\u0072\\u0001\\u006d\\u0001\"+\n    \"\\u0070\\u0001\\u0069\\u0002\\u0065\\u0001\\u0072\\u0001\\u0066\\u0001\\u0074\\u0001\"+\n    \"\\u0065\\u0001\\u0064\\u0001\\u0074\\u0001\\u0070\\u0001\\u0075\\u0001\\u0061\\u0001\"+\n    \"\\u006c\\u0002\\u0061\\u0001\\u0074\\u0001\\u0073\\u0001\\uffff\\u0001\\u0061\\u0001\"+\n    \"\\u007a\\u0001\\u0065\\u0001\\u0062\\u0001\\u0065\\u0001\\u0071\\u0001\\u0072\\u0001\"+\n    \"\\u0061\\u0001\\u0065\\u0001\\u006e\\u0001\\u0075\\u0001\\u0069\\u0001\\u0073\\u0001\"+\n    \"\\u0072\\u0001\\u006c\\u0001\\u0064\\u0001\\u0068\\u0001\\u0064\\u0001\\u0067\\u0001\"+\n    \"\\u0064\\u0001\\u0065\\u0001\\u007a\\u0001\\u006f\\u0001\\u007a\\u0001\\u0074\\u0004\"+\n    \"\\uffff\\u0001\\u002d\\u0003\\uffff\\u0001\\u0065\\u0001\\u0073\\u0002\\uffff\\u0001\"+\n    \"\\u006e\\u0001\\u0069\\u0001\\u0079\\u0001\\u0077\\u0001\\uffff\\u0001\\u0072\\u0001\"+\n    \"\\u006e\\u0001\\u007a\\u0001\\uffff\\u0001\\u002d\\u0001\\u0064\\u0001\\u0072\\u0001\"+\n    \"\\u006b\\u0002\\u007a\\u0001\\u0068\\u0001\\u0064\\u0001\\u006b\\u0002\\u0065\\u0001\"+\n    \"\\u0074\\u0001\\u0069\\u0001\\u007a\\u0001\\u0074\\u0001\\u0061\\u0001\\u006d\\u0001\"+\n    \"\\u0075\\u0001\\u0065\\u0001\\u0074\\u0001\\uffff\\u0001\\u0074\\u0001\\u0072\\u0001\"+\n    \"\\u0065\\u0001\\u0061\\u0001\\u006d\\u0001\\u0065\\u0001\\u007a\\u0001\\u0079\\u0001\"+\n    \"\\u0064\\u0001\\uffff\\u0001\\u0072\\u0001\\u0079\\u0001\\u0070\\u0001\\u0072\\u0001\"+\n    \"\\u0074\\u0001\\u007a\\u0001\\u006f\\u0001\\u0069\\u0001\\uffff\\u0002\\u0074\\u0001\"+\n    \"\\u007a\\u0001\\u0070\\u0001\\u0064\\u0001\\u0074\\u0001\\u007a\\u0001\\u0074\\u0001\"+\n    \"\\u0070\\u0001\\u007a\\u0002\\u0072\\u0001\\u0061\\u0002\\u0072\\u0001\\u007a\\u0001\"+\n    \"\\u006e\\u0001\\u0078\\u0001\\u007a\\u0001\\uffff\\u0001\\u007a\\u0001\\u0075\\u0001\"+\n    \"\\u0074\\u0001\\uffff\\u0001\\u006c\\u0001\\u0072\\u0001\\u007a\\u0001\\u006c\\u0001\"+\n    \"\\u0066\\u0001\\uffff\\u0001\\u007a\\u0002\\u0073\\u0001\\u007a\\u0001\\u006e\\u0001\"+\n    \"\\u0072\\u0001\\u007a\\u0001\\uffff\\u0001\\u007a\\u0001\\u006f\\u0001\\u0072\\u0001\"+\n    \"\\u0063\\u0001\\u007a\\u0001\\u0072\\u0001\\u006e\\u0001\\u0067\\u0003\\u0065\\u0001\"+\n    \"\\u0069\\u0002\\u0065\\u0001\\u006d\\u0001\\u0074\\u0001\\u0073\\u0001\\u0063\\u0001\"+\n    \"\\u0070\\u0001\\u006c\\u0001\\u0074\\u0001\\u006d\\u0001\\u007a\\u0001\\u0073\\u0001\"+\n    \"\\u007a\\u0001\\u006d\\u0001\\u0065\\u0001\\u007a\\u0001\\u0069\\u0001\\u0065\\u0001\"+\n    \"\\u007a\\u0001\\u0069\\u0001\\u0063\\u0001\\u007a\\u0001\\u0072\\u0001\\u006d\\u0001\"+\n    \"\\u0061\\u0001\\u006c\\u0001\\u0074\\u0002\\u007a\\u0001\\u0061\\u0001\\u0074\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\u006c\\u0001\\u0073\\u0001\\u006e\\u0001\\u0075\\u0001\"+\n    \"\\u0064\\u0001\\u0074\\u0001\\u0072\\u0001\\u0067\\u0001\\u0064\\u0001\\u0065\\u0001\"+\n    \"\\u0061\\u0001\\u0069\\u0001\\u0065\\u0001\\u007a\\u0001\\u0065\\u0001\\u006f\\u0001\"+\n    \"\\u007a\\u0001\\u0063\\u0001\\u0068\\u0001\\u007a\\u0001\\u0072\\u0001\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u007a\\u0001\\uffff\\u0001\\u0074\\u0001\\u0064\\u0001\"+\n    \"\\u0062\\u0001\\u007a\\u0001\\u0069\\u0001\\u007a\\u0001\\u0064\\u0001\\uffff\\u0001\"+\n    \"\\u0075\\u0001\\u0061\\u0001\\u0065\\u0001\\u007a\\u0001\\uffff\\u0001\\u0062\\u0001\"+\n    \"\\uffff\\u0003\\u007a\\u0001\\u0074\\u0001\\u0063\\u0001\\u006e\\u0001\\u0072\\u0001\"+\n    \"\\u0078\\u0001\\u0069\\u0002\\u006e\\u0001\\uffff\\u0001\\u007a\\u0001\\u0072\\u0001\"+\n    \"\\u0061\\u0001\\u006c\\u0001\\u006e\\u0001\\u0065\\u0001\\u007a\\u0001\\u0069\\u0001\"+\n    \"\\u0072\\u0001\\u006e\\u0001\\u0065\\u0001\\u006e\\u0001\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\u0069\\u0001\\u0065\\u0001\\u007a\\u0001\\u0074\\u0001\\u006e\\u0001\\u006c\\u0001\"+\n    \"\\uffff\\u0001\\u0077\\u0001\\u0063\\u0001\\u0067\\u0001\\u0069\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u0074\\u0002\\u007a\\u0001\\uffff\\u0001\\u0065\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u0074\\u0001\\u0069\\u0001\\u006e\\u0001\\u0074\\u0002\\u0073\\u0001\"+\n    \"\\u0072\\u0001\\uffff\\u0001\\u0069\\u0001\\u007a\\u0002\\uffff\\u0001\\u0061\\u0001\"+\n    \"\\u007a\\u0001\\u0073\\u0001\\u0063\\u0001\\uffff\\u0001\\u0065\\u0001\\u0079\\u0001\"+\n    \"\\uffff\\u0001\\u002d\\u0001\\u0070\\u0001\\uffff\\u0001\\u0068\\u0001\\u0065\\u0001\"+\n    \"\\u007a\\u0001\\uffff\\u0001\\u0069\\u0001\\uffff\\u0001\\u006e\\u0001\\u007a\\u0001\"+\n    \"\\u0074\\u0001\\uffff\\u0001\\u0073\\u0001\\u0074\\u0002\\u0072\\u0001\\u0064\\u0001\"+\n    \"\\u0072\\u0001\\u006f\\u0001\\u0073\\u0001\\u006e\\u0002\\u0069\\u0001\\u0065\\u0002\"+\n    \"\\u0074\\u0001\\u007a\\u0001\\u0065\\u0001\\u007a\\u0001\\u0069\\u0001\\uffff\\u0001\"+\n    \"\\u0066\\u0001\\uffff\\u0001\\u0061\\u0001\\u007a\\u0001\\uffff\\u0001\\u0074\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0001\\u006e\\u0001\\u0068\\u0001\\uffff\\u0001\\u006e\\u0001\"+\n    \"\\u0065\\u0001\\u0063\\u0002\\u0069\\u0002\\uffff\\u0001\\u0075\\u0001\\u007a\\u0001\"+\n    \"\\u0077\\u0001\\uffff\\u0001\\u0069\\u0002\\u007a\\u0002\\u0065\\u0001\\u0069\\u0001\"+\n    \"\\u0063\\u0001\\u007a\\u0001\\u0061\\u0001\\u007a\\u0001\\u0062\\u0001\\u006f\\u0001\"+\n    \"\\u007a\\u0001\\uffff\\u0001\\u007a\\u0001\\u0077\\u0001\\u0075\\u0001\\uffff\\u0001\"+\n    \"\\u0061\\u0001\\u0074\\u0001\\u007a\\u0001\\uffff\\u0001\\u0079\\u0001\\u0064\\u0003\"+\n    \"\\uffff\\u0001\\u006f\\u0001\\u0069\\u0001\\u0075\\u0001\\uffff\\u0001\\u006e\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0002\\u0072\\u0001\\u007a\\u0001\\uffff\\u0001\\u006c\\u0003\"+\n    \"\\uffff\\u0001\\u0069\\u0002\\u0074\\u0001\\u0075\\u0002\\u0074\\u0001\\u006e\\u0001\"+\n    \"\\u0075\\u0001\\u0061\\u0001\\uffff\\u0001\\u0065\\u0001\\u006c\\u0001\\u0074\\u0001\"+\n    \"\\u0064\\u0001\\u007a\\u0001\\uffff\\u0001\\u0074\\u0001\\u0065\\u0001\\u0063\\u0001\"+\n    \"\\u006e\\u0001\\u0074\\u0001\\u0073\\u0001\\uffff\\u0001\\u006e\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\u0061\\u0001\\u0079\\u0001\\u0069\\u0001\\u0068\\u0001\"+\n    \"\\u006e\\u0001\\u006f\\u0001\\uffff\\u0001\\u0069\\u0002\\uffff\\u0001\\u0073\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0001\\u007a\\u0001\\u0074\\u0001\\u0063\\u0001\\u007a\\u0001\"+\n    \"\\u0069\\u0001\\u0065\\u0001\\u0069\\u0001\\u0074\\u0001\\uffff\\u0001\\u0067\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\u0061\\u0002\\u007a\\u0001\\u0073\\u0001\\u0061\\u0001\"+\n    \"\\u0065\\u0001\\u0073\\u0001\\uffff\\u0001\\u0074\\u0001\\u007a\\u0001\\u0064\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0003\\u007a\\u0001\\u0061\\u0001\\u006e\\u0001\\u0069\\u0001\"+\n    \"\\u0076\\u0001\\u0075\\u0001\\u0073\\u0001\\u0074\\u0001\\u006c\\u0001\\u006f\\u0001\"+\n    \"\\u007a\\u0001\\u0075\\u0001\\u007a\\u0001\\uffff\\u0001\\u007a\\u0001\\uffff\\u0001\"+\n    \"\\u006e\\u0001\\u0069\\u0001\\u007a\\u0001\\uffff\\u0001\\u0069\\u0001\\u0063\\u0001\"+\n    \"\\u0067\\u0003\\u007a\\u0001\\u0065\\u0001\\u0064\\u0001\\u006f\\u0001\\u0072\\u0001\"+\n    \"\\uffff\\u0001\\u0069\\u0001\\u006e\\u0002\\uffff\\u0001\\u007a\\u0001\\u0072\\u0001\"+\n    \"\\u006e\\u0001\\u0061\\u0001\\uffff\\u0001\\u0074\\u0001\\uffff\\u0001\\u006c\\u0001\"+\n    \"\\u006e\\u0002\\uffff\\u0001\\u007a\\u0001\\u0074\\u0001\\u0072\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\u0069\\u0001\\u0072\\u0001\\u006e\\u0001\\u0074\\u0001\"+\n    \"\\u0067\\u0001\\uffff\\u0001\\u0069\\u0001\\u0079\\u0001\\uffff\\u0001\\u0065\\u0001\"+\n    \"\\u006f\\u0001\\u0069\\u0001\\u007a\\u0001\\u0063\\u0001\\u0069\\u0002\\u007a\\u0001\"+\n    \"\\u0073\\u0001\\u0065\\u0001\\u006d\\u0001\\u007a\\u0001\\u002d\\u0001\\u007a\\u0001\"+\n    \"\\u0069\\u0001\\uffff\\u0001\\u0069\\u0001\\u006e\\u0001\\u0065\\u0001\\u0074\\u0001\"+\n    \"\\u007a\\u0001\\u0065\\u0001\\u0067\\u0002\\uffff\\u0001\\u006c\\u0001\\u007a\\u0001\"+\n    \"\\u006e\\u0002\\u007a\\u0001\\u006e\\u0001\\u006f\\u0001\\u0074\\u0001\\u0067\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\u0065\\u0001\\uffff\\u0001\\u0074\\u0001\\u0063\\u0001\"+\n    \"\\u0074\\u0001\\u0079\\u0001\\u0065\\u0001\\uffff\\u0001\\u0073\\u0002\\uffff\\u0001\"+\n    \"\\u0069\\u0001\\u0063\\u0001\\u0072\\u0002\\u0065\\u0001\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\u0067\\u0003\\uffff\\u0001\\u0070\\u0001\\u002d\\u0001\\u006e\\u0001\\u0065\\u0001\"+\n    \"\\u0073\\u0001\\u0069\\u0001\\u007a\\u0001\\u006c\\u0001\\u006e\\u0001\\uffff\\u0001\"+\n    \"\\u0072\\u0002\\uffff\\u0001\\u0067\\u0002\\u0065\\u0001\\uffff\\u0001\\u0076\\u0001\"+\n    \"\\u0065\\u0001\\u007a\\u0001\\uffff\\u0001\\u006e\\u0002\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\u0061\\u0001\\u006e\\u0001\\u0075\\u0001\\u0074\\u0001\\u0067\\u0001\\uffff\\u0001\"+\n    \"\\u0065\\u0001\\u0067\\u0001\\u0073\\u0002\\u0065\\u0001\\u007a\\u0001\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\u0064\\u0002\\uffff\\u0001\\u0067\\u0001\\u007a\\u0001\\u0067\\u0001\"+\n    \"\\u0065\\u0002\\u007a\\u0001\\u002d\\u0001\\u007a\\u0001\\u006e\\u0001\\u006f\\u0001\"+\n    \"\\uffff\\u0001\\u0074\\u0001\\u006e\\u0002\\uffff\\u0002\\u007a\\u0001\\u0065\\u0001\"+\n    \"\\uffff\\u0001\\u0073\\u0001\\uffff\\u0002\\u006e\\u0001\\u0063\\u0001\\u0074\\u0002\"+\n    \"\\u007a\\u0001\\uffff\\u0001\\u0071\\u0002\\u007a\\u0001\\uffff\\u0001\\u0067\\u0002\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\u006e\\u0001\\u007a\\u0001\\u002d\\u0001\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\u0069\\u0001\\u0074\\u0001\\u0079\\u0002\\u007a\\u0001\\u0065\\u0001\"+\n    \"\\u0067\\u0001\\u0065\\u0001\\u0069\\u0001\\u0072\\u0001\\u006d\\u0001\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\u0068\\u0001\\u0073\\u0001\\u0067\\u0002\\u007a\\u0001\\u006e\\u0001\"+\n    \"\\uffff\\u0001\\u0065\\u0001\\u007a\\u0001\\u0065\\u0001\\u007a\\u0001\\u0073\\u0001\"+\n    \"\\u0074\\u0001\\u006c\\u0001\\u0065\\u0001\\u007a\\u0001\\uffff\\u0001\\u0067\\u0001\"+\n    \"\\uffff\\u0001\\u0074\\u0002\\u0073\\u0001\\u0063\\u0001\\u007a\\u0001\\u0064\\u0001\"+\n    \"\\u007a\\u0001\\u0065\\u0002\\u007a\\u0002\\uffff\\u0001\\u0073\\u0001\\u0069\\u0001\"+\n    \"\\u006f\\u0001\\uffff\\u0002\\u007a\\u0002\\uffff\\u0001\\u0073\\u0001\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\u006e\\u0001\\u0069\\u0001\\u0074\\u0002\\uffff\\u0001\\u0073\\u0001\"+\n    \"\\u006f\\u0001\\u0065\\u0001\\u0074\\u0001\\u0067\\u0001\\u0073\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u006e\\u0001\\uffff\\u0001\\u0075\\u0002\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\uffff\\u0001\\u0073\\u0001\\uffff\\u0001\\u0076\\u0002\"+\n    \"\\u007a\\u0002\\uffff\\u0001\\u007a\\u0001\\u006e\\u0001\\u007a\\u0001\\u0074\\u0001\"+\n    \"\\u0076\\u0001\\u007a\\u0001\\uffff\\u0001\\u007a\\u0001\\u0065\\u0001\\u007a\\u0002\"+\n    \"\\uffff\\u0001\\u0067\\u0001\\u007a\\u0001\\uffff\\u0001\\u0064\\u0001\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\u0074\\u0001\\u0065\\u0002\\u007a\\u0001\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\u0069\\u0001\\u0068\\u0001\\u007a\\u0001\\u0068\\u0001\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u007a\\u0002\\uffff\\u0001\\u007a\\u0001\\u0074\\u0001\\u0072\\u0002\"+\n    \"\\uffff\\u0001\\u0070\\u0001\\uffff\\u0001\\u007a\\u0001\\u006f\\u0001\\u007a\\u0001\"+\n    \"\\u0070\\u0001\\u0072\\u0001\\u0070\\u0003\\u007a\\u0001\\uffff\\u0001\\u006f\\u0001\"+\n    \"\\u0065\\u0001\\u0073\\u0002\\uffff\\u0002\\u0065\\u0003\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\u006e\\u0001\\uffff\\u0001\\u007a\\u0001\\u0065\\u0001\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u0070\\u0001\\u0073\\u0001\\uffff\\u0001\\u002d\\u0001\\uffff\\u0001\"+\n    \"\\u002d\\u0001\\uffff\\u0001\\u0072\\u0001\\u006d\\u0003\\uffff\\u0001\\u006f\\u0001\"+\n    \"\\u0069\\u0001\\uffff\\u0001\\u007a\\u0003\\uffff\\u0001\\u007a\\u0001\\u002d\\u0001\"+\n    \"\\u0061\\u0001\\uffff\\u0001\\u006e\\u0001\\uffff\\u0001\\u0061\\u0001\\u006d\\u0001\"+\n    \"\\u0061\\u0001\\u006f\\u0003\\uffff\\u0001\\u0064\\u0001\\u006e\\u0001\\u0069\\u0001\"+\n    \"\\u0070\\u0001\\u007a\\u0001\\uffff\\u0001\\u006f\\u0001\\uffff\\u0001\\u007a\\u0001\"+\n    \"\\uffff\\u0001\\u0061\\u0004\\u0069\\u0001\\u0065\\u0001\\u006e\\u0001\\u0070\\u0002\"+\n    \"\\uffff\\u0001\\u0073\\u0001\\u0063\\u0001\\u007a\\u0001\\u0063\\u0001\\u0061\\u0002\"+\n    \"\\u0072\\u0001\\u0065\\u0001\\u0063\\u0001\\u0062\\u0001\\u0061\\u0001\\uffff\\u0001\"+\n    \"\\u0064\\u0001\\uffff\\u0001\\u0072\\u0001\\u0062\\u0001\\u006e\\u0001\\u0074\\u0001\"+\n    \"\\u0062\\u0001\\u006e\\u0002\\u007a\\u0002\\u0065\\u0001\\uffff\\u0001\\u0065\\u0001\"+\n    \"\\u0074\\u0001\\u0061\\u0001\\u002d\\u0001\\u007a\\u0001\\u0065\\u0001\\u006c\\u0001\"+\n    \"\\u0072\\u0001\\u0065\\u0001\\u0061\\u0001\\u006c\\u0001\\u0073\\u0001\\u0065\\u0001\"+\n    \"\\u0075\\u0001\\u0074\\u0002\\uffff\\u0001\\u006c\\u0001\\u007a\\u0001\\u0073\\u0001\"+\n    \"\\u007a\\u0001\\u0074\\u0001\\u0073\\u0001\\uffff\\u0001\\u007a\\u0001\\u0069\\u0001\"+\n    \"\\u0061\\u0001\\u007a\\u0001\\u0074\\u0001\\u0069\\u0001\\u0074\\u0001\\u006d\\u0001\"+\n    \"\\u0074\\u0001\\u007a\\u0001\\u0066\\u0001\\uffff\\u0001\\u007a\\u0001\\uffff\\u0001\"+\n    \"\\u006f\\u0001\\u0065\\u0001\\uffff\\u0001\\u006e\\u0001\\u0074\\u0001\\uffff\\u0001\"+\n    \"\\u006f\\u0001\\u006e\\u0001\\u0072\\u0001\\u007a\\u0001\\u0065\\u0001\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\uffff\\u0001\\u0072\\u0001\\u006c\\u0001\\u0067\\u0001\\u006f\\u0001\"+\n    \"\\u0072\\u0001\\u0067\\u0001\\u0075\\u0001\\uffff\\u0001\\u007a\\u0001\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\u0066\\u0001\\u007a\\u0001\\u0072\\u0002\\u007a\\u0001\\u0063\\u0002\"+\n    \"\\uffff\\u0001\\u007a\\u0001\\uffff\\u0001\\u007a\\u0002\\uffff\\u0001\\u0074\\u0002\"+\n    \"\\uffff\\u0001\\u0069\\u0001\\u006f\\u0001\\u006e\\u0001\\u007a\\u0001\\uffff\",\n    DFA19_acceptS:\n        \"\\u001c\\uffff\\u0001\\u00d5\\u0001\\u00d6\\u0001\\uffff\\u0001\\u00da\\u0001\"+\n    \"\\u00db\\u0001\\u00dc\\u0001\\u00dd\\u0002\\uffff\\u0001\\u00e0\\u0002\\uffff\\u0001\"+\n    \"\\u00e3\\u0001\\uffff\\u0001\\u00e5\\u0001\\u00e6\\u0005\\uffff\\u0001\\u00f7\\u0001\"+\n    \"\\u00ff\\u0001\\uffff\\u0001\\u0103\\u0001\\u0104\\u0001\\u0105\\u0001\\u0106\\u0001\"+\n    \"\\uffff\\u0001\\u010e\\u0008\\uffff\\u0001\\u0105\\u0052\\uffff\\u0001\\u00d3\\u0001\"+\n    \"\\u00d8\\u0001\\u00f8\\u0001\\uffff\\u0001\\u010d\\u0001\\u00d4\\u0001\\u00d5\\u0001\"+\n    \"\\u00d6\\u0001\\u00d7\\u0001\\u00d9\\u0001\\u00da\\u0001\\u00db\\u0001\\u00dc\\u0001\"+\n    \"\\u00dd\\u0001\\u00de\\u0001\\u00f4\\u0001\\u00f3\\u0001\\u00df\\u0001\\u00f0\\u0001\"+\n    \"\\u00e0\\u0001\\u00fa\\u0001\\u00e1\\u0001\\uffff\\u0001\\u00e2\\u0001\\u00e3\\u0001\"+\n    \"\\u00fe\\u0001\\u00e4\\u0001\\u00e5\\u0001\\u00e6\\u0001\\u00fc\\u0001\\u00e7\\u0001\"+\n    \"\\u00ea\\u0001\\u00ec\\u0001\\u00f6\\u0002\\uffff\\u0001\\u00e8\\u0001\\u00eb\\u0001\"+\n    \"\\u00ed\\u0001\\u00e9\\u0001\\u00ef\\u0001\\u00f5\\u0001\\u00ee\\u0001\\u00f2\\u0001\"+\n    \"\\u00f1\\u0001\\uffff\\u0001\\u00f7\\u0001\\u00ff\\u0001\\u0100\\u0001\\u0103\\u0001\"+\n    \"\\u0104\\u0001\\u0106\\u0001\\u010a\\u0002\\uffff\\u0001\\u010c\\u0004\\uffff\\u0001\"+\n    \"\\u0004\\u0001\\uffff\\u0001\\u0006\\u0008\\uffff\\u0001\\u000a\\u001b\\uffff\\u0001\"+\n    \"\\u0020\\u000e\\uffff\\u0001\\u0028\\u0002\\uffff\\u0001\\u002a\\u0001\\uffff\\u0001\"+\n    \"\\u002c\\u0006\\uffff\\u0001\\u002e\\u0001\\u0032\\u0007\\uffff\\u0001\\u0035\\u0001\"+\n    \"\\u0038\\u0007\\uffff\\u0001\\u003c\\u0003\\uffff\\u0001\\u00a9\\u0001\\uffff\\u0001\"+\n    \"\\u0041\\u0002\\uffff\\u0001\\u0043\\u0002\\uffff\\u0001\\u00ce\\u001d\\uffff\\u0001\"+\n    \"\\u005c\\u0019\\uffff\\u0001\\u00f9\\u0001\\u0107\\u0001\\u0102\\u0001\\u0101\\u0001\"+\n    \"\\uffff\\u0001\\u00fd\\u0001\\u0109\\u0001\\u010b\\u0002\\uffff\\u0001\\u0003\\u0001\"+\n    \"\\u0097\\u0004\\uffff\\u0001\\u0096\\u0003\\uffff\\u0001\\u00d0\\u0014\\uffff\\u0001\"+\n    \"\\u0018\\u0009\\uffff\\u0001\\u006d\\u0008\\uffff\\u0001\\u0026\\u0013\\uffff\\u0001\"+\n    \"\\u0034\\u0003\\uffff\\u0001\\u0037\\u0005\\uffff\\u0001\\u0039\\u0007\\uffff\\u0001\"+\n    \"\\u00aa\\u002b\\uffff\\u0001\\u007d\\u0016\\uffff\\u0001\\u0073\\u0001\\uffff\\u0001\"+\n    \"\\u00cd\\u0009\\uffff\\u0001\\u00d1\\u0004\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\"+\n    \"\\u000c\\u000b\\uffff\\u0001\\u0085\\u000c\\uffff\\u0001\\u001c\\u0007\\uffff\\u0001\"+\n    \"\\u00c2\\u0005\\uffff\\u0001\\u009f\\u0003\\uffff\\u0001\\u00a3\\u0002\\uffff\\u0001\"+\n    \"\\u002b\\u0007\\uffff\\u0001\\u0089\\u0002\\uffff\\u0001\\u0033\\u0001\\u008c\\u0004\"+\n    \"\\uffff\\u0001\\u00c3\\u0002\\uffff\\u0001\\u00a8\\u0002\\uffff\\u0001\\u0074\\u0003\"+\n    \"\\uffff\\u0001\\u003f\\u0001\\uffff\\u0001\\u0040\\u0003\\uffff\\u0001\\u0075\\u0012\"+\n    \"\\uffff\\u0001\\u00b6\\u0001\\uffff\\u0001\\u00b0\\u0002\\uffff\\u0001\\u0055\\u0002\"+\n    \"\\uffff\\u0001\\u0056\\u0002\\uffff\\u0001\\u0092\\u0005\\uffff\\u0001\\u005a\\u0001\"+\n    \"\\u005b\\u0003\\uffff\\u0001\\u007f\\u000d\\uffff\\u0001\\u0080\\u0003\\uffff\\u0001\"+\n    \"\\u0095\\u0003\\uffff\\u0001\\u00be\\u0002\\uffff\\u0001\\u00d2\\u0001\\u00fb\\u0001\"+\n    \"\\u0108\\u0003\\uffff\\u0001\\u004f\\u0001\\uffff\\u0001\\u0083\\u0004\\uffff\\u0001\"+\n    \"\\u00c0\\u0001\\uffff\\u0001\\u0067\\u0001\\u000e\\u0001\\u00c6\\u0009\\uffff\\u0001\"+\n    \"\\u0069\\u0005\\uffff\\u0001\\u006c\\u0006\\uffff\\u0001\\u001d\\u0002\\uffff\\u0001\"+\n    \"\\u0021\\u0007\\uffff\\u0001\\u0087\\u0001\\uffff\\u0001\\u00a1\\u0001\\u00a2\\u0002\"+\n    \"\\uffff\\u0001\\u006e\\u0008\\uffff\\u0001\\u00cb\\u0001\\uffff\\u0001\\u0036\\u0008\"+\n    \"\\uffff\\u0001\\u008e\\u0004\\uffff\\u0001\\u0044\\u000f\\uffff\\u0001\\u0059\\u0001\"+\n    \"\\uffff\\u0001\\u007b\\u0003\\uffff\\u0001\\u00b1\\u000a\\uffff\\u0001\\u005d\\u0002\"+\n    \"\\uffff\\u0001\\u00b8\\u0001\\u005f\\u0004\\uffff\\u0001\\u00ba\\u0001\\uffff\\u0001\"+\n    \"\\u0094\\u0002\\uffff\\u0001\\u0064\\u0001\\u00c5\\u0004\\uffff\\u0001\\u00bf\\u0006\"+\n    \"\\uffff\\u0001\\u008b\\u0002\\uffff\\u0001\\u0084\\u000f\\uffff\\u0001\\u0086\\u0007\"+\n    \"\\uffff\\u0001\\u009d\\u0001\\u0022\\u0009\\uffff\\u0001\\u002d\\u0002\\uffff\\u0001\"+\n    \"\\u0088\\u0005\\uffff\\u0001\\u00a6\\u0001\\uffff\\u0001\\u003a\\u0001\\u008d\\u0005\"+\n    \"\\uffff\\u0001\\u0042\\u0002\\uffff\\u0001\\u004e\\u0001\\u00ab\\u0001\\u0047\\u0009\"+\n    \"\\uffff\\u0001\\u00ae\\u0001\\uffff\\u0001\\u0058\\u0001\\u0057\\u0003\\uffff\\u0001\"+\n    \"\\u0052\\u0003\\uffff\\u0001\\u007c\\u0001\\uffff\\u0001\\u0050\\u0001\\u008f\\u0006\"+\n    \"\\uffff\\u0001\\u00cf\\u0006\\uffff\\u0001\\u0081\\u0002\\uffff\\u0001\\u00bb\\u0001\"+\n    \"\\u0065\\u000a\\uffff\\u0001\\u0010\\u0002\\uffff\\u0001\\u0068\\u0001\\u0099\\u0003\"+\n    \"\\uffff\\u0001\\u0013\\u0001\\uffff\\u0001\\u0014\\u0006\\uffff\\u0001\\u001b\\u0003\"+\n    \"\\uffff\\u0001\\u009e\\u0001\\uffff\\u0001\\u00c9\\u0001\\u00ca\\u0004\\uffff\\u0001\"+\n    \"\\u002f\\u000c\\uffff\\u0001\\u0045\\u0007\\uffff\\u0001\\u0077\\u0009\\uffff\\u0001\"+\n    \"\\u007a\\u0001\\uffff\\u0001\\u0090\\u000a\\uffff\\u0001\\u0063\\u0001\\u00bd\\u0003\"+\n    \"\\uffff\\u0001\\u0001\\u0002\\uffff\\u0001\\u0066\\u0001\\u0008\\u0001\\uffff\\u0001\"+\n    \"\\u000d\\u0004\\uffff\\u0001\\u0098\\u0001\\u00c1\\u0007\\uffff\\u0001\\u009c\\u0001\"+\n    \"\\uffff\\u0001\\u0019\\u0001\\uffff\\u0001\\u001f\\u0001\\u0023\\u0001\\uffff\\u0001\"+\n    \"\\u0027\\u0001\\uffff\\u0001\\u0029\\u0001\\uffff\\u0001\\u0030\\u0003\\uffff\\u0001\"+\n    \"\\u0070\\u0001\\u00a5\\u0006\\uffff\\u0001\\u0046\\u0003\\uffff\\u0001\\u004a\\u0001\"+\n    \"\\u0079\\u0002\\uffff\\u0001\\u008a\\u0001\\uffff\\u0001\\u00b5\\u0005\\uffff\\u0001\"+\n    \"\\u00b3\\u0005\\uffff\\u0001\\u007e\\u0001\\uffff\\u0001\\u0093\\u0001\\uffff\\u0001\"+\n    \"\\u0061\\u0001\\u0062\\u0003\\uffff\\u0001\\u0005\\u0001\\u0007\\u0001\\uffff\\u0001\"+\n    \"\\u000f\\u0009\\uffff\\u0001\\u009b\\u0003\\uffff\\u0001\\u0024\\u0001\\u00a0\\u0002\"+\n    \"\\uffff\\u0001\\u0031\\u0001\\u00cc\\u0001\\u00a7\\u0002\\uffff\\u0001\\u003b\\u0002\"+\n    \"\\uffff\\u0001\\u004d\\u0001\\uffff\\u0001\\u00ac\\u0002\\uffff\\u0001\\u0048\\u0001\"+\n    \"\\uffff\\u0001\\u0078\\u0001\\uffff\\u0001\\u0051\\u0002\\uffff\\u0001\\u00b2\\u0001\"+\n    \"\\u00b4\\u0001\\u00c4\\u0002\\uffff\\u0001\\u00b7\\u0001\\uffff\\u0001\\u0060\\u0001\"+\n    \"\\u00b9\\u0001\\u00bc\\u0003\\uffff\\u0001\\u00c7\\u0001\\uffff\\u0001\\u00c8\\u0004\"+\n    \"\\uffff\\u0001\\u0015\\u0001\\u0017\\u0001\\u009a\\u0005\\uffff\\u0001\\u0071\\u0001\"+\n    \"\\uffff\\u0001\\u003d\\u0001\\uffff\\u0001\\u00ad\\u0008\\uffff\\u0001\\u005e\\u0001\"+\n    \"\\u0082\\u000b\\uffff\\u0001\\u00a4\\u0001\\uffff\\u0001\\u003e\\u000a\\uffff\\u0001\"+\n    \"\\u0011\\u000f\\uffff\\u0001\\u0091\\u0001\\u00af\\u0006\\uffff\\u0001\\u001a\\u000b\"+\n    \"\\uffff\\u0001\\u0009\\u0001\\uffff\\u0001\\u006a\\u0002\\uffff\\u0001\\u001e\\u0002\"+\n    \"\\uffff\\u0001\\u0072\\u0005\\uffff\\u0001\\u0054\\u0001\\uffff\\u0001\\u0012\\u0007\"+\n    \"\\uffff\\u0001\\u004c\\u0001\\uffff\\u0001\\u0002\\u0007\\uffff\\u0001\\u0053\\u0001\"+\n    \"\\u006b\\u0001\\uffff\\u0001\\u0025\\u0001\\uffff\\u0001\\u0076\\u0001\\u0049\\u0001\"+\n    \"\\uffff\\u0001\\u0016\\u0001\\u006f\\u0004\\uffff\\u0001\\u004b\",\n    DFA19_specialS:\n        \"\\u0001\\u0001\\u001a\\uffff\\u0001\\u0002\\u01f6\\uffff\\u0001\\u0000\\u02f8\"+\n    \"\\uffff}>\",\n    DFA19_transitionS: [\n            \"\\u0009\\u0039\\u0002\\u0037\\u0002\\u0039\\u0001\\u0037\\u0012\\u0039\"+\n            \"\\u0001\\u0037\\u0001\\u0024\\u0001\\u0035\\u0001\\u0026\\u0001\\u001d\"+\n            \"\\u0001\\u0025\\u0001\\u0027\\u0001\\u0034\\u0001\\u001b\\u0001\\u001c\"+\n            \"\\u0001\\u002a\\u0001\\u002b\\u0001\\u0028\\u0001\\u002c\\u0001\\u0030\"+\n            \"\\u0001\\u002f\\u000a\\u0038\\u0001\\u0023\\u0001\\u0031\\u0001\\u002d\"+\n            \"\\u0001\\u0022\\u0001\\u002e\\u0001\\u0029\\u0001\\u0032\\u000d\\u0036\"+\n            \"\\u0001\\u0016\\u0002\\u0036\\u0001\\u0033\\u0009\\u0036\\u0001\\u0020\"+\n            \"\\u0001\\u0039\\u0001\\u0021\\u0001\\u0039\\u0001\\u0036\\u0001\\u0039\"+\n            \"\\u0001\\u0001\\u0001\\u0002\\u0001\\u0003\\u0001\\u0004\\u0001\\u0005\"+\n            \"\\u0001\\u0006\\u0001\\u0007\\u0001\\u0036\\u0001\\u0008\\u0001\\u000c\"+\n            \"\\u0001\\u0018\\u0001\\u0009\\u0001\\u000a\\u0001\\u000b\\u0001\\u000d\"+\n            \"\\u0001\\u000e\\u0001\\u0019\\u0001\\u0010\\u0001\\u000f\\u0001\\u0011\"+\n            \"\\u0001\\u0012\\u0001\\u0013\\u0001\\u0014\\u0001\\u0015\\u0001\\u0036\"+\n            \"\\u0001\\u0017\\u0001\\u001e\\u0001\\u001a\\u0001\\u001f\\uff82\\u0039\",\n            \"\\u0001\\u003f\\u0005\\uffff\\u0001\\u003e\\u0001\\u0041\\u0001\\u003a\"+\n            \"\\u0001\\uffff\\u0001\\u0040\\u0001\\uffff\\u0001\\u003d\\u0001\\u003b\"+\n            \"\\u0001\\u003c\",\n            \"\\u0001\\u0043\\u0003\\uffff\\u0001\\u0046\\u0009\\uffff\\u0001\\u0044\"+\n            \"\\u0002\\uffff\\u0001\\u0047\\u0006\\uffff\\u0001\\u0045\",\n            \"\\u0001\\u0048\\u0006\\uffff\\u0001\\u0049\\u0006\\uffff\\u0001\\u004a\",\n            \"\\u0001\\u004b\\u0003\\uffff\\u0001\\u004c\\u0005\\uffff\\u0001\\u004d\",\n            \"\\u0001\\u004e\\u0001\\u004f\\u0001\\u0050\\u0002\\uffff\\u0001\\u0051\"+\n            \"\\u0004\\uffff\\u0001\\u0052\\u0001\\uffff\\u0001\\u0053\",\n            \"\\u0001\\u0056\\u0005\\uffff\\u0001\\u0054\\u0002\\uffff\\u0001\\u0057\"+\n            \"\\u0001\\uffff\\u0001\\u0058\\u0001\\u0055\",\n            \"\\u0001\\u0059\\u000c\\uffff\\u0001\\u005a\\u0001\\uffff\\u0001\\u005b\",\n            \"\\u0001\\u005c\\u0001\\uffff\\u0001\\u005d\\u0006\\uffff\\u0001\\u005e\"+\n            \"\\u0001\\u005f\\u0004\\uffff\\u0001\\u0060\\u0001\\u0061\",\n            \"\\u0001\\u0062\\u0003\\uffff\\u0001\\u0063\\u0009\\uffff\\u0001\\u0065\"+\n            \"\\u0004\\uffff\\u0001\\u0064\",\n            \"\\u0001\\u0067\\u0005\\uffff\\u0001\\u0066\",\n            \"\\u0001\\u0068\\u0003\\uffff\\u0001\\u0069\\u0009\\uffff\\u0001\\u006a\",\n            \"\\u0001\\u006b\",\n            \"\\u0001\\u006f\\u0001\\u0071\\u0002\\uffff\\u0001\\u006c\\u0007\\uffff\"+\n            \"\\u0001\\u0070\\u0001\\uffff\\u0001\\u006d\\u0001\\uffff\\u0001\\u006e\",\n            \"\\u0001\\u0072\\u0003\\uffff\\u0001\\u0074\\u0002\\uffff\\u0001\\u0076\"+\n            \"\\u0006\\uffff\\u0001\\u0075\\u0002\\uffff\\u0001\\u0073\",\n            \"\\u0001\\u0078\\u0001\\uffff\\u0001\\u0079\\u0001\\uffff\\u0001\\u007a\"+\n            \"\\u0005\\uffff\\u0001\\u007e\\u0001\\u007c\\u0002\\uffff\\u0001\\u007b\"+\n            \"\\u0004\\uffff\\u0001\\u0077\\u0002\\uffff\\u0001\\u007d\",\n            \"\\u0001\\u007f\",\n            \"\\u0001\\u0080\\u0002\\uffff\\u0001\\u0081\\u0001\\u0086\\u0005\\uffff\"+\n            \"\\u0001\\u0082\\u0002\\uffff\\u0001\\u0083\\u0002\\uffff\\u0001\\u0085\"+\n            \"\\u0003\\uffff\\u0001\\u0084\",\n            \"\\u0001\\u0087\\u0001\\uffff\\u0001\\u0088\\u0002\\uffff\\u0001\\u0089\",\n            \"\\u0001\\u008a\\u0003\\uffff\\u0001\\u008b\",\n            \"\\u0001\\u008e\\u0002\\uffff\\u0001\\u008c\\u0001\\u008d\\u0005\\uffff\"+\n            \"\\u0001\\u008f\",\n            \"\\u0001\\u0090\",\n            \"\\u0001\\u0091\",\n            \"\\u0001\\u0092\",\n            \"\\u0001\\u0093\",\n            \"\\u0001\\u0094\",\n            \"\\u0001\\u0095\\u0001\\u0096\",\n            \"\\u0001\\u0098\\u0016\\uffff\\u0001\\u0099\",\n            \"\",\n            \"\",\n            \"\\u0001\\u009d\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u00a4\\u0002\\uffff\\u0001\\u00a3\",\n            \"\\u0001\\u00a6\",\n            \"\",\n            \"\\u0001\\u00a9\",\n            \"\\u0001\\u00ab\",\n            \"\",\n            \"\\u0001\\u00ae\",\n            \"\",\n            \"\",\n            \"\\u0001\\u00b2\",\n            \"\\u0001\\u00b7\\u000d\\uffff\\u0001\\u00b6\\u000c\\uffff\\u0001\\u00b5\"+\n            \"\\u0001\\u00b4\\u0001\\uffff\\u0001\\u00b8\",\n            \"\\u0001\\u00ba\\u0001\\u00bb\",\n            \"\\u0001\\u00bd\\u000e\\uffff\\u0001\\u00be\",\n            \"\\u0001\\u00c0\\u0001\\uffff\\u000a\\u00c2\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u00cb\\u0001\\uffff\\u000a\\u00ca\\u000b\\uffff\\u0001\\u00cc\"+\n            \"\\u001f\\uffff\\u0001\\u00cc\",\n            \"\",\n            \"\\u0001\\u00cd\\u0001\\u00ce\\u0014\\uffff\\u0001\\u00cf\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0002\\u0042\\u0001\\u00d0\"+\n            \"\\u0017\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0013\\u0042\\u0001\\u00d2\"+\n            \"\\u0006\\u0042\",\n            \"\\u0001\\u00d4\",\n            \"\\u0001\\u00d5\",\n            \"\\u0001\\u00d6\",\n            \"\\u0001\\u00d8\\u0001\\u00d7\",\n            \"\\u0001\\u00d9\",\n            \"\",\n            \"\\u0001\\u00da\",\n            \"\\u0001\\u00db\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u00dd\",\n            \"\\u0001\\u00de\",\n            \"\\u0001\\u00df\\u0001\\u00e0\",\n            \"\\u0001\\u00e2\\u0003\\uffff\\u0001\\u00e1\",\n            \"\\u0001\\u00e3\\u0001\\u00e4\\u0001\\u00e5\\u0001\\uffff\\u0001\\u00e6\"+\n            \"\\u0004\\uffff\\u0001\\u00e7\",\n            \"\\u0001\\u00e8\\u0002\\uffff\\u0001\\u00e9\\u0005\\uffff\\u0001\\u00eb\"+\n            \"\\u0006\\uffff\\u0001\\u00ea\",\n            \"\\u0001\\u00ee\\u0004\\uffff\\u0001\\u00ef\\u0001\\u00ed\\u000b\\uffff\"+\n            \"\\u0001\\u00f0\\u0002\\uffff\\u0001\\u00ec\",\n            \"\\u0001\\u00f1\",\n            \"\\u0001\\u00f2\\u000d\\uffff\\u0001\\u00f3\",\n            \"\\u0001\\u00f4\",\n            \"\\u0001\\u00f5\\u0001\\u00f6\\u000f\\uffff\\u0001\\u00f7\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u00f9\",\n            \"\\u0001\\u00fc\\u0001\\uffff\\u0001\\u00fa\\u0005\\uffff\\u0001\\u00fd\"+\n            \"\\u000a\\uffff\\u0001\\u00fb\",\n            \"\\u0001\\u00fe\\u0005\\uffff\\u0001\\u00ff\",\n            \"\\u0001\\u0100\",\n            \"\\u0001\\u0101\",\n            \"\\u0001\\u0102\",\n            \"\\u0001\\u0103\\u0033\\uffff\\u0001\\u0104\\u000c\\uffff\\u0001\\u0105\"+\n            \"\\u0001\\u0106\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0108\\u0009\\uffff\\u0001\\u0109\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u010b\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u010d\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0003\\u0042\\u0001\\u0112\"+\n            \"\\u0001\\u0042\\u0001\\u0111\\u0001\\u0042\\u0001\\u010e\\u000a\\u0042\"+\n            \"\\u0001\\u010f\\u0001\\u0110\\u0006\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0115\",\n            \"\\u0001\\u0118\\u0004\\uffff\\u0001\\u0117\\u0004\\uffff\\u0001\\u0116\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0119\\u0012\\u0042\"+\n            \"\\u0001\\u011a\\u0001\\u0042\\u0001\\u011b\\u0004\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u011f\\u0007\\uffff\\u0001\\u011e\",\n            \"\\u0001\\u0120\\u000e\\uffff\\u0001\\u0121\",\n            \"\\u0001\\u0122\",\n            \"\\u0001\\u0123\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0017\\u0042\\u0001\\u0124\"+\n            \"\\u0002\\u0042\",\n            \"\\u0001\\u0126\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0003\\u0042\"+\n            \"\\u0001\\u0127\\u000f\\u0042\\u0001\\u0128\\u0006\\u0042\",\n            \"\\u0001\\u012a\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u012c\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0003\\u0042\\u0001\\u012d\"+\n            \"\\u0016\\u0042\",\n            \"\\u0001\\u012f\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u000b\\u0042\\u0001\\u0130\"+\n            \"\\u000e\\u0042\",\n            \"\\u0001\\u0132\",\n            \"\\u0001\\u0133\\u0001\\uffff\\u0001\\u0134\",\n            \"\\u0001\\u0135\\u0009\\uffff\\u0001\\u0136\",\n            \"\\u0001\\u0137\",\n            \"\\u0001\\u0138\",\n            \"\\u0001\\u0139\",\n            \"\\u0001\\u013b\\u0003\\uffff\\u0001\\u013c\\u0009\\uffff\\u0001\\u013d\"+\n            \"\\u0002\\uffff\\u0001\\u013a\",\n            \"\\u0001\\u013f\\u0006\\uffff\\u0001\\u013e\",\n            \"\\u0001\\u0140\\u0006\\uffff\\u0001\\u0141\",\n            \"\\u0001\\u0142\\u0001\\uffff\\u0001\\u0143\",\n            \"\\u0001\\u0144\",\n            \"\\u0001\\u0145\",\n            \"\\u0001\\u0146\",\n            \"\\u0001\\u0147\",\n            \"\\u0001\\u014c\\u0001\\uffff\\u0001\\u0149\\u0001\\uffff\\u0001\\u014a\"+\n            \"\\u0003\\uffff\\u0001\\u0148\\u0001\\uffff\\u0001\\u014b\",\n            \"\\u0001\\u014d\",\n            \"\\u0001\\u014e\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0150\\u0013\\uffff\\u0001\\u0151\",\n            \"\\u0001\\u0152\",\n            \"\\u0001\\u0153\",\n            \"\\u0001\\u0154\",\n            \"\\u0001\\u0155\\u0005\\uffff\\u0001\\u0156\",\n            \"\\u0001\\u0157\\u000b\\uffff\\u0001\\u0158\",\n            \"\\u0001\\u0159\",\n            \"\\u0001\\u015a\\u0005\\uffff\\u0001\\u015b\",\n            \"\\u0001\\u015c\",\n            \"\\u0001\\u015d\\u0003\\uffff\\u0001\\u015e\",\n            \"\\u0001\\u0161\\u0001\\uffff\\u0001\\u015f\\u0005\\uffff\\u0001\\u0160\",\n            \"\\u0001\\u0162\",\n            \"\\u0001\\u0163\",\n            \"\\u0001\\u0164\",\n            \"\\u0001\\u0165\",\n            \"\\u0001\\u0166\",\n            \"\\u0001\\u0167\",\n            \"\\u0001\\u0168\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0002\\u016a\\u0002\\uffff\\u0001\\u016a\\u0012\\uffff\\u0001\\u016a\"+\n            \"\\u0020\\uffff\\u001a\\u016a\\u0004\\uffff\\u0001\\u016a\\u0001\\uffff\"+\n            \"\\u001a\\u016a\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u016b\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u016d\",\n            \"\\u0002\\u016f\\u0002\\uffff\\u0001\\u016f\\u0012\\uffff\\u0001\\u016f\"+\n            \"\\u0020\\uffff\\u001a\\u016f\\u0004\\uffff\\u0001\\u016f\\u0001\\uffff\"+\n            \"\\u001a\\u016f\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u000a\\u00c2\\u000b\\uffff\\u0001\\u00cc\\u001f\\uffff\\u0001\\u00cc\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u00cb\\u0001\\uffff\\u000a\\u00ca\\u000b\\uffff\\u0001\\u00cc\"+\n            \"\\u001f\\uffff\\u0001\\u00cc\",\n            \"\\u000a\\u0171\\u000b\\uffff\\u0001\\u00cc\\u001f\\uffff\\u0001\\u00cc\",\n            \"\",\n            \"\\u0001\\u0172\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0175\",\n            \"\",\n            \"\\u0001\\u0176\",\n            \"\",\n            \"\\u0001\\u0177\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u000e\\u0042\\u0001\\u0178\"+\n            \"\\u000b\\u0042\",\n            \"\\u0001\\u017a\",\n            \"\\u0001\\u017b\",\n            \"\\u0001\\u017c\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u017e\",\n            \"\\u0001\\u017f\",\n            \"\",\n            \"\\u0001\\u0180\",\n            \"\\u0001\\u0181\",\n            \"\\u0001\\u0182\\u000e\\uffff\\u0001\\u0183\",\n            \"\\u0001\\u0184\",\n            \"\\u0001\\u0185\",\n            \"\\u0001\\u0186\",\n            \"\\u0001\\u0187\",\n            \"\\u0001\\u0188\",\n            \"\\u0001\\u0189\\u0001\\u018a\",\n            \"\\u0001\\u018b\",\n            \"\\u0001\\u018c\",\n            \"\\u0001\\u018e\\u0002\\uffff\\u0001\\u018d\",\n            \"\\u0001\\u018f\",\n            \"\\u0001\\u0190\",\n            \"\\u0001\\u0191\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0193\",\n            \"\\u0001\\u0194\",\n            \"\\u0001\\u0195\",\n            \"\\u0001\\u0196\",\n            \"\\u0001\\u0197\",\n            \"\\u0001\\u0198\",\n            \"\\u0001\\u0199\",\n            \"\\u0001\\u019a\",\n            \"\\u0001\\u019b\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u019d\",\n            \"\",\n            \"\\u0001\\u019e\",\n            \"\\u0001\\u019f\",\n            \"\\u0001\\u01a0\",\n            \"\\u0001\\u01a1\",\n            \"\\u0001\\u01a2\",\n            \"\\u0001\\u01a3\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0004\\u0042\\u0001\\u01a4\"+\n            \"\\u0015\\u0042\",\n            \"\\u0001\\u01a6\",\n            \"\\u0001\\u01a7\",\n            \"\\u0001\\u01a8\",\n            \"\\u0001\\u01a9\",\n            \"\\u0001\\u01aa\",\n            \"\\u0001\\u01ab\",\n            \"\\u0001\\u01ac\",\n            \"\",\n            \"\\u0001\\u01ad\",\n            \"\\u0001\\u01ae\",\n            \"\",\n            \"\\u0001\\u01af\",\n            \"\",\n            \"\\u0001\\u01b0\",\n            \"\\u0001\\u01b1\",\n            \"\\u0001\\u01b3\\u000e\\uffff\\u0001\\u01b2\",\n            \"\\u0001\\u01b4\\u0009\\uffff\\u0001\\u01b5\",\n            \"\\u0001\\u01b6\",\n            \"\\u0001\\u01b7\",\n            \"\",\n            \"\",\n            \"\\u0001\\u01b8\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u01ba\",\n            \"\\u0001\\u01bb\",\n            \"\\u0001\\u01bc\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u01be\",\n            \"\",\n            \"\",\n            \"\\u0001\\u01bf\",\n            \"\\u0001\\u01c0\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0008\\u0042\\u0001\\u01c2\"+\n            \"\\u000b\\u0042\\u0001\\u01c1\\u0005\\u0042\",\n            \"\\u0001\\u01c4\",\n            \"\\u0001\\u01c5\",\n            \"\\u0001\\u01c6\",\n            \"\\u0001\\u01c7\",\n            \"\",\n            \"\\u0001\\u01c8\\u0006\\uffff\\u0001\\u01c9\",\n            \"\\u0001\\u01ca\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u01cc\",\n            \"\",\n            \"\\u0001\\u01cd\",\n            \"\\u0001\\u01ce\",\n            \"\",\n            \"\\u0001\\u01cf\",\n            \"\\u0001\\u01d0\",\n            \"\",\n            \"\\u0001\\u01d1\",\n            \"\\u0001\\u01d3\\u0003\\uffff\\u0001\\u01d2\",\n            \"\\u0001\\u01d4\",\n            \"\\u0001\\u01d5\\u000f\\uffff\\u0001\\u01d6\\u0002\\uffff\\u0001\\u01d7\",\n            \"\\u0001\\u01d8\",\n            \"\\u0001\\u01da\\u0035\\uffff\\u0001\\u01d9\",\n            \"\\u0001\\u01db\",\n            \"\\u0001\\u01dc\",\n            \"\\u0001\\u01de\\u000b\\uffff\\u0001\\u01dd\",\n            \"\\u0001\\u01df\\u000f\\uffff\\u0001\\u01e0\",\n            \"\\u0001\\u01e1\",\n            \"\\u0001\\u01e2\",\n            \"\\u0001\\u01e3\",\n            \"\\u0001\\u01e4\",\n            \"\\u0001\\u01e5\",\n            \"\\u0001\\u01e6\",\n            \"\\u0001\\u01e7\",\n            \"\\u0001\\u01e8\\u0001\\u01e9\",\n            \"\\u0001\\u01ea\",\n            \"\\u0001\\u01eb\",\n            \"\\u0001\\u01ec\",\n            \"\\u0001\\u01ed\",\n            \"\\u0001\\u01ee\",\n            \"\\u0001\\u01ef\",\n            \"\\u0001\\u01f0\",\n            \"\\u0001\\u01f1\",\n            \"\\u0001\\u01f2\",\n            \"\\u0001\\u01f3\",\n            \"\\u0001\\u01f4\\u0004\\uffff\\u0001\\u01f5\",\n            \"\",\n            \"\\u0001\\u01f6\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u01f8\",\n            \"\\u0001\\u01f9\",\n            \"\\u0001\\u01fa\",\n            \"\\u0001\\u01fb\\u0001\\uffff\\u0001\\u01fc\",\n            \"\\u0001\\u01fd\",\n            \"\\u0001\\u01fe\",\n            \"\\u0001\\u01ff\",\n            \"\\u0001\\u0200\",\n            \"\\u0001\\u0201\\u000b\\uffff\\u0001\\u0202\",\n            \"\\u0001\\u0203\",\n            \"\\u0001\\u0204\",\n            \"\\u0001\\u0206\\u0003\\uffff\\u0001\\u0205\",\n            \"\\u0001\\u0207\",\n            \"\\u0001\\u0208\",\n            \"\\u0001\\u0209\",\n            \"\\u0001\\u020a\",\n            \"\\u0001\\u020b\",\n            \"\\u0001\\u020c\",\n            \"\\u0001\\u020d\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u020f\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0211\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0212\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u000a\\u0171\\u000b\\uffff\\u0001\\u00cc\\u001f\\uffff\\u0001\\u00cc\",\n            \"\\u0001\\u0213\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0214\",\n            \"\\u0001\\u0215\",\n            \"\\u0001\\u0216\",\n            \"\\u0001\\u0217\",\n            \"\",\n            \"\\u0001\\u0218\",\n            \"\\u0001\\u0219\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u021b\",\n            \"\\u0001\\u021c\",\n            \"\\u0001\\u021d\",\n            \"\\u0001\\u021e\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0001\\u0220\\u0019\\u0042\",\n            \"\\u0001\\u0222\",\n            \"\\u0001\\u0223\",\n            \"\\u0001\\u0224\",\n            \"\\u0001\\u0225\\u0003\\uffff\\u0001\\u0226\",\n            \"\\u0001\\u0227\",\n            \"\\u0001\\u0228\",\n            \"\\u0001\\u022a\\u0003\\uffff\\u0001\\u0229\\u0003\\uffff\\u0001\\u022b\",\n            \"\\u0001\\u022c\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u022e\",\n            \"\\u0001\\u022f\",\n            \"\\u0001\\u0230\",\n            \"\\u0001\\u0231\",\n            \"\\u0001\\u0232\",\n            \"\\u0001\\u0233\",\n            \"\",\n            \"\\u0001\\u0234\",\n            \"\\u0001\\u0235\",\n            \"\\u0001\\u0236\",\n            \"\\u0001\\u0237\",\n            \"\\u0001\\u0238\",\n            \"\\u0001\\u0239\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u023b\",\n            \"\\u0001\\u023c\",\n            \"\",\n            \"\\u0001\\u023d\",\n            \"\\u0001\\u023e\",\n            \"\\u0001\\u023f\",\n            \"\\u0001\\u0240\",\n            \"\\u0001\\u0241\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0243\",\n            \"\\u0001\\u0244\\u0007\\uffff\\u0001\\u0245\",\n            \"\",\n            \"\\u0001\\u0246\",\n            \"\\u0001\\u0247\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0249\",\n            \"\\u0001\\u024a\",\n            \"\\u0001\\u024b\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u024d\",\n            \"\\u0001\\u024e\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0250\",\n            \"\\u0001\\u0251\",\n            \"\\u0001\\u0252\",\n            \"\\u0001\\u0254\\u0003\\uffff\\u0001\\u0253\",\n            \"\\u0001\\u0256\\u000a\\uffff\\u0001\\u0255\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0258\",\n            \"\\u0001\\u0259\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u025c\",\n            \"\\u0001\\u025d\",\n            \"\",\n            \"\\u0001\\u025e\",\n            \"\\u0001\\u025f\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0261\",\n            \"\\u0001\\u0262\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0264\",\n            \"\\u0001\\u0265\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0267\",\n            \"\\u0001\\u0268\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0012\\u0042\\u0001\\u0269\"+\n            \"\\u0007\\u0042\",\n            \"\",\n            \"\\u0001\\u026b\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u026d\",\n            \"\\u0001\\u026e\",\n            \"\\u0001\\u026f\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0271\",\n            \"\\u0001\\u0272\",\n            \"\\u0001\\u0273\",\n            \"\\u0001\\u0274\",\n            \"\\u0001\\u0275\",\n            \"\\u0001\\u0276\",\n            \"\\u0001\\u0277\",\n            \"\\u0001\\u0278\",\n            \"\\u0001\\u0279\",\n            \"\\u0001\\u027a\",\n            \"\\u0001\\u027b\",\n            \"\\u0001\\u027c\",\n            \"\\u0001\\u027d\",\n            \"\\u0001\\u027e\\u000c\\uffff\\u0001\\u027f\",\n            \"\\u0001\\u0280\",\n            \"\\u0001\\u0281\",\n            \"\\u0001\\u0282\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0284\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0286\",\n            \"\\u0001\\u0287\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0289\",\n            \"\\u0001\\u028a\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u028c\",\n            \"\\u0001\\u028d\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u028f\",\n            \"\\u0001\\u0290\",\n            \"\\u0001\\u0291\",\n            \"\\u0001\\u0292\",\n            \"\\u0001\\u0293\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0296\",\n            \"\\u0001\\u0297\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0012\\u0042\\u0001\\u0298\"+\n            \"\\u0007\\u0042\",\n            \"\\u0001\\u029a\",\n            \"\\u0001\\u029b\",\n            \"\\u0001\\u029c\",\n            \"\\u0001\\u029d\",\n            \"\\u0001\\u029e\",\n            \"\\u0001\\u029f\",\n            \"\\u0001\\u02a0\",\n            \"\\u0001\\u02a1\",\n            \"\\u0001\\u02a2\",\n            \"\\u0001\\u02a3\",\n            \"\\u0001\\u02a4\",\n            \"\\u0001\\u02a5\",\n            \"\\u0001\\u02a6\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02a8\",\n            \"\\u0001\\u02a9\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u000e\\u0042\\u0001\\u02aa\"+\n            \"\\u000b\\u0042\",\n            \"\\u0001\\u02ac\",\n            \"\\u0001\\u02ad\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0012\\u0042\\u0001\\u02ae\"+\n            \"\\u0007\\u0042\",\n            \"\\u0001\\u02b0\",\n            \"\",\n            \"\\u0001\\u02b1\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0000\\u02b4\",\n            \"\\u0001\\u02b5\",\n            \"\\u0001\\u02b6\",\n            \"\\u0001\\u02b7\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02b9\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02bb\",\n            \"\",\n            \"\\u0001\\u02bc\",\n            \"\\u0001\\u02bd\",\n            \"\\u0001\\u02be\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u02c0\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02c4\",\n            \"\\u0001\\u02c5\",\n            \"\\u0001\\u02c6\",\n            \"\\u0001\\u02c7\",\n            \"\\u0001\\u02c9\\u0009\\uffff\\u0001\\u02c8\",\n            \"\\u0001\\u02ca\",\n            \"\\u0001\\u02cb\",\n            \"\\u0001\\u02cc\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02ce\",\n            \"\\u0001\\u02cf\",\n            \"\\u0001\\u02d0\",\n            \"\\u0001\\u02d1\",\n            \"\\u0001\\u02d2\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02d4\",\n            \"\\u0001\\u02d5\",\n            \"\\u0001\\u02d6\",\n            \"\\u0001\\u02d7\",\n            \"\\u0001\\u02d8\",\n            \"\",\n            \"\\u0001\\u02d9\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02db\",\n            \"\\u0001\\u02dc\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02de\",\n            \"\\u0001\\u02df\",\n            \"\\u0001\\u02e0\",\n            \"\",\n            \"\\u0001\\u02e1\",\n            \"\\u0001\\u02e2\",\n            \"\\u0001\\u02e3\",\n            \"\\u0001\\u02e4\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u02e6\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u02e9\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0008\\u0042\\u0001\\u02ea\"+\n            \"\\u0011\\u0042\",\n            \"\",\n            \"\\u0001\\u02ec\",\n            \"\\u0001\\u02ed\",\n            \"\\u0001\\u02ee\",\n            \"\\u0001\\u02ef\",\n            \"\\u0001\\u02f0\",\n            \"\\u0001\\u02f1\",\n            \"\\u0001\\u02f2\",\n            \"\",\n            \"\\u0001\\u02f3\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\\u0001\\u02f5\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u02f7\",\n            \"\\u0001\\u02f8\",\n            \"\",\n            \"\\u0001\\u02f9\",\n            \"\\u0001\\u02fa\",\n            \"\",\n            \"\\u0001\\u02fb\",\n            \"\\u0001\\u02fc\",\n            \"\",\n            \"\\u0001\\u02fd\",\n            \"\\u0001\\u02fe\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u0300\",\n            \"\",\n            \"\\u0001\\u0301\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0004\\u0042\\u0001\\u0302\"+\n            \"\\u0003\\u0042\\u0001\\u0303\\u0011\\u0042\",\n            \"\\u0001\\u0305\",\n            \"\",\n            \"\\u0001\\u0306\",\n            \"\\u0001\\u0307\",\n            \"\\u0001\\u0308\",\n            \"\\u0001\\u0309\",\n            \"\\u0001\\u030a\",\n            \"\\u0001\\u030b\",\n            \"\\u0001\\u030c\",\n            \"\\u0001\\u030d\",\n            \"\\u0001\\u030e\",\n            \"\\u0001\\u030f\",\n            \"\\u0001\\u0310\",\n            \"\\u0001\\u0311\",\n            \"\\u0001\\u0312\",\n            \"\\u0001\\u0313\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0315\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0317\",\n            \"\",\n            \"\\u0001\\u0318\",\n            \"\",\n            \"\\u0001\\u0319\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u031b\",\n            \"\\u0001\\u031c\",\n            \"\",\n            \"\\u0001\\u031d\",\n            \"\\u0001\\u031e\",\n            \"\",\n            \"\\u0001\\u031f\",\n            \"\\u0001\\u0320\",\n            \"\\u0001\\u0321\",\n            \"\\u0001\\u0322\",\n            \"\\u0001\\u0323\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0324\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0326\",\n            \"\",\n            \"\\u0001\\u0327\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u032a\",\n            \"\\u0001\\u032b\",\n            \"\\u0001\\u032c\",\n            \"\\u0001\\u032d\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u032f\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0331\",\n            \"\\u0001\\u0332\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0335\",\n            \"\\u0001\\u0336\",\n            \"\",\n            \"\\u0001\\u0337\",\n            \"\\u0001\\u0338\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u033a\",\n            \"\\u0001\\u033b\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u033c\",\n            \"\\u0001\\u033d\",\n            \"\\u0001\\u033e\",\n            \"\",\n            \"\\u0001\\u033f\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0341\",\n            \"\\u0001\\u0342\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u0344\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0345\",\n            \"\\u0001\\u0346\",\n            \"\\u0001\\u0347\",\n            \"\\u0001\\u0349\\u0013\\uffff\\u0001\\u0348\",\n            \"\\u0001\\u034a\",\n            \"\\u0001\\u034b\",\n            \"\\u0001\\u034c\",\n            \"\\u0001\\u034d\",\n            \"\\u0001\\u034e\",\n            \"\",\n            \"\\u0001\\u034f\",\n            \"\\u0001\\u0350\",\n            \"\\u0001\\u0351\",\n            \"\\u0001\\u0352\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u0354\",\n            \"\\u0001\\u0355\",\n            \"\\u0001\\u0356\",\n            \"\\u0001\\u0357\",\n            \"\\u0001\\u0358\",\n            \"\\u0001\\u0359\",\n            \"\",\n            \"\\u0001\\u035a\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u035d\",\n            \"\\u0001\\u035e\",\n            \"\\u0001\\u035f\",\n            \"\\u0001\\u0360\",\n            \"\\u0001\\u0361\",\n            \"\\u0001\\u0362\",\n            \"\",\n            \"\\u0001\\u0363\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0364\",\n            \"\\u0001\\u0365\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0367\",\n            \"\\u0001\\u0368\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u036a\",\n            \"\\u0001\\u036b\",\n            \"\\u0001\\u036c\",\n            \"\\u0001\\u036d\",\n            \"\",\n            \"\\u0001\\u036e\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0370\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0373\",\n            \"\\u0001\\u0374\",\n            \"\\u0001\\u0375\",\n            \"\\u0001\\u0376\",\n            \"\",\n            \"\\u0001\\u0377\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0379\",\n            \"\\u0001\\u037a\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u037e\",\n            \"\\u0001\\u037f\",\n            \"\\u0001\\u0380\",\n            \"\\u0001\\u0381\",\n            \"\\u0001\\u0382\",\n            \"\\u0001\\u0383\",\n            \"\\u0001\\u0384\",\n            \"\\u0001\\u0385\",\n            \"\\u0001\\u0386\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0388\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u038b\",\n            \"\\u0001\\u038c\",\n            \"\\u0001\\u038d\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u038f\",\n            \"\\u0001\\u0390\",\n            \"\\u0001\\u0391\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0008\\u0042\\u0001\\u0393\"+\n            \"\\u0011\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0396\",\n            \"\\u0001\\u0397\",\n            \"\\u0001\\u0398\",\n            \"\\u0001\\u0399\",\n            \"\",\n            \"\\u0001\\u039a\",\n            \"\\u0001\\u039b\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u039d\",\n            \"\\u0001\\u039e\",\n            \"\\u0001\\u039f\",\n            \"\",\n            \"\\u0001\\u03a0\",\n            \"\",\n            \"\\u0001\\u03a1\",\n            \"\\u0001\\u03a2\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03a4\",\n            \"\\u0001\\u03a5\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03a8\",\n            \"\\u0001\\u03a9\",\n            \"\\u0001\\u03aa\",\n            \"\\u0001\\u03ab\",\n            \"\\u0001\\u03ac\",\n            \"\",\n            \"\\u0001\\u03ad\",\n            \"\\u0001\\u03ae\",\n            \"\",\n            \"\\u0001\\u03af\",\n            \"\\u0001\\u03b0\",\n            \"\\u0001\\u03b1\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03b3\",\n            \"\\u0001\\u03b4\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03b7\",\n            \"\\u0001\\u03b8\",\n            \"\\u0001\\u03b9\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03bb\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03bd\\u0007\\uffff\\u0001\\u03be\",\n            \"\",\n            \"\\u0001\\u03bf\",\n            \"\\u0001\\u03c0\",\n            \"\\u0001\\u03c1\",\n            \"\\u0001\\u03c2\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03c4\",\n            \"\\u0001\\u03c5\",\n            \"\",\n            \"\",\n            \"\\u0001\\u03c6\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03c8\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03cb\",\n            \"\\u0001\\u03cc\",\n            \"\\u0001\\u03cd\",\n            \"\\u0001\\u03ce\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03d0\",\n            \"\",\n            \"\\u0001\\u03d1\",\n            \"\\u0001\\u03d2\",\n            \"\\u0001\\u03d3\",\n            \"\\u0001\\u03d4\",\n            \"\\u0001\\u03d5\",\n            \"\",\n            \"\\u0001\\u03d6\",\n            \"\",\n            \"\",\n            \"\\u0001\\u03d7\",\n            \"\\u0001\\u03d8\",\n            \"\\u0001\\u03d9\",\n            \"\\u0001\\u03da\",\n            \"\\u0001\\u03db\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03dd\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u03de\",\n            \"\\u0001\\u03df\",\n            \"\\u0001\\u03e0\",\n            \"\\u0001\\u03e1\",\n            \"\\u0001\\u03e2\",\n            \"\\u0001\\u03e3\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03e5\",\n            \"\\u0001\\u03e6\",\n            \"\",\n            \"\\u0001\\u03e7\",\n            \"\",\n            \"\",\n            \"\\u0001\\u03e8\",\n            \"\\u0001\\u03e9\",\n            \"\\u0001\\u03ea\\u0003\\uffff\\u0001\\u03eb\",\n            \"\",\n            \"\\u0001\\u03ec\",\n            \"\\u0001\\u03ed\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u03ef\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03f1\",\n            \"\\u0001\\u03f2\",\n            \"\\u0001\\u03f3\",\n            \"\\u0001\\u03f4\",\n            \"\\u0001\\u03f5\",\n            \"\",\n            \"\\u0001\\u03f6\",\n            \"\\u0001\\u03f7\",\n            \"\\u0001\\u03f8\",\n            \"\\u0001\\u03f9\",\n            \"\\u0001\\u03fa\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u03fd\",\n            \"\",\n            \"\",\n            \"\\u0001\\u03fe\",\n            \"\\u0001\\u03ff\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0401\",\n            \"\\u0001\\u0402\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0405\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0407\",\n            \"\\u0001\\u0408\",\n            \"\",\n            \"\\u0001\\u0409\",\n            \"\\u0001\\u040a\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u040d\",\n            \"\",\n            \"\\u0001\\u040e\\u000c\\uffff\\u0001\\u040f\",\n            \"\",\n            \"\\u0001\\u0410\",\n            \"\\u0001\\u0411\",\n            \"\\u0001\\u0412\",\n            \"\\u0001\\u0413\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0415\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u0417\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u041a\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u041c\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u041e\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0420\",\n            \"\\u0001\\u0421\",\n            \"\\u0001\\u0422\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0425\",\n            \"\\u0001\\u0426\",\n            \"\\u0001\\u0427\",\n            \"\\u0001\\u0428\",\n            \"\\u0001\\u0429\",\n            \"\\u0001\\u042a\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u042c\",\n            \"\\u0001\\u042d\",\n            \"\\u0001\\u042e\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0431\",\n            \"\",\n            \"\\u0001\\u0432\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0434\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0436\",\n            \"\\u0001\\u0437\",\n            \"\\u0001\\u0438\",\n            \"\\u0001\\u0439\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0012\\u0042\\u0001\\u043a\"+\n            \"\\u0007\\u0042\",\n            \"\",\n            \"\\u0001\\u043c\",\n            \"\",\n            \"\\u0001\\u043d\",\n            \"\\u0001\\u043e\",\n            \"\\u0001\\u043f\",\n            \"\\u0001\\u0440\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0442\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0444\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0447\",\n            \"\\u0001\\u0448\",\n            \"\\u0001\\u0449\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\\u0001\\u044c\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u044e\",\n            \"\\u0001\\u044f\",\n            \"\\u0001\\u0450\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0451\",\n            \"\\u0001\\u0452\",\n            \"\\u0001\\u0453\",\n            \"\\u0001\\u0454\",\n            \"\\u0001\\u0455\",\n            \"\\u0001\\u0456\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u0458\",\n            \"\",\n            \"\\u0001\\u0459\",\n            \"\",\n            \"\",\n            \"\\u0001\\u045a\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u045d\",\n            \"\",\n            \"\\u0001\\u045e\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0462\",\n            \"\\u0001\\u0463\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0465\",\n            \"\\u0001\\u0466\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u0012\\u0042\\u0001\\u0468\"+\n            \"\\u0007\\u0042\",\n            \"\\u0001\\u046a\",\n            \"\\u0001\\u046b\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\\u0001\\u046d\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u046f\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0471\",\n            \"\\u0001\\u0472\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0476\",\n            \"\\u0001\\u0477\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0479\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u047d\",\n            \"\\u0001\\u047e\",\n            \"\",\n            \"\",\n            \"\\u0001\\u047f\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0481\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0483\",\n            \"\\u0001\\u0484\",\n            \"\\u0001\\u0485\",\n            \"\\u0001\\u0486\\u0001\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\"+\n            \"\\u001a\\u0042\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u048a\",\n            \"\\u0001\\u048b\",\n            \"\\u0001\\u048c\",\n            \"\",\n            \"\",\n            \"\\u0001\\u048d\",\n            \"\\u0001\\u048e\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0490\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0492\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u0494\",\n            \"\\u0001\\u0495\",\n            \"\",\n            \"\\u0001\\u0496\",\n            \"\",\n            \"\\u0001\\u0497\",\n            \"\",\n            \"\\u0001\\u0498\",\n            \"\\u0001\\u0499\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u049a\",\n            \"\\u0001\\u049b\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u049e\",\n            \"\\u0001\\u049f\",\n            \"\",\n            \"\\u0001\\u04a0\",\n            \"\",\n            \"\\u0001\\u04a1\",\n            \"\\u0001\\u04a2\",\n            \"\\u0001\\u04a3\",\n            \"\\u0001\\u04a4\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u04a5\",\n            \"\\u0001\\u04a6\",\n            \"\\u0001\\u04a7\",\n            \"\\u0001\\u04a8\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u04aa\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u04ac\",\n            \"\\u0001\\u04ad\",\n            \"\\u0001\\u04ae\",\n            \"\\u0001\\u04af\",\n            \"\\u0001\\u04b0\",\n            \"\\u0001\\u04b1\",\n            \"\\u0001\\u04b2\",\n            \"\\u0001\\u04b3\",\n            \"\",\n            \"\",\n            \"\\u0001\\u04b4\",\n            \"\\u0001\\u04b5\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04b7\",\n            \"\\u0001\\u04b8\",\n            \"\\u0001\\u04b9\",\n            \"\\u0001\\u04ba\",\n            \"\\u0001\\u04bb\",\n            \"\\u0001\\u04bc\",\n            \"\\u0001\\u04bd\",\n            \"\\u0001\\u04be\",\n            \"\",\n            \"\\u0001\\u04bf\",\n            \"\",\n            \"\\u0001\\u04c0\",\n            \"\\u0001\\u04c1\",\n            \"\\u0001\\u04c2\",\n            \"\\u0001\\u04c3\",\n            \"\\u0001\\u04c4\",\n            \"\\u0001\\u04c5\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04c8\",\n            \"\\u0001\\u04c9\",\n            \"\",\n            \"\\u0001\\u04ca\",\n            \"\\u0001\\u04cb\",\n            \"\\u0001\\u04cc\",\n            \"\\u0001\\u04cd\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04cf\",\n            \"\\u0001\\u04d0\",\n            \"\\u0001\\u04d1\",\n            \"\\u0001\\u04d2\",\n            \"\\u0001\\u04d3\",\n            \"\\u0001\\u04d4\",\n            \"\\u0001\\u04d5\",\n            \"\\u0001\\u04d6\",\n            \"\\u0001\\u04d7\",\n            \"\\u0001\\u04d8\",\n            \"\",\n            \"\",\n            \"\\u0001\\u04d9\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04db\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04dd\",\n            \"\\u0001\\u04de\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04e0\",\n            \"\\u0001\\u04e1\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04e3\",\n            \"\\u0001\\u04e4\",\n            \"\\u0001\\u04e5\",\n            \"\\u0001\\u04e6\",\n            \"\\u0001\\u04e7\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04e9\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u04eb\",\n            \"\\u0001\\u04ec\",\n            \"\",\n            \"\\u0001\\u04ed\",\n            \"\\u0001\\u04ee\",\n            \"\",\n            \"\\u0001\\u04ef\",\n            \"\\u0001\\u04f0\",\n            \"\\u0001\\u04f1\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04f3\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0001\\u04f5\",\n            \"\\u0001\\u04f6\",\n            \"\\u0001\\u04f7\",\n            \"\\u0001\\u04f8\",\n            \"\\u0001\\u04f9\",\n            \"\\u0001\\u04fa\",\n            \"\\u0001\\u04fb\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u04fe\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0500\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\\u0001\\u0503\",\n            \"\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0506\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0507\",\n            \"\\u0001\\u0508\",\n            \"\\u0001\\u0509\",\n            \"\\u0002\\u0042\\u0001\\uffff\\u000a\\u0042\\u0007\\uffff\\u001a\\u0042\"+\n            \"\\u0004\\uffff\\u0001\\u0042\\u0001\\uffff\\u001a\\u0042\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryLexer, {\n    DFA19_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryLexer.DFA19_eotS),\n    DFA19_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryLexer.DFA19_eofS),\n    DFA19_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryLexer.DFA19_minS),\n    DFA19_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryLexer.DFA19_maxS),\n    DFA19_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryLexer.DFA19_acceptS),\n    DFA19_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryLexer.DFA19_specialS),\n    DFA19_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryLexer.DFA19_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryLexer.DFA19_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryLexer.DFA19 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 19;\n    this.eot = XQueryLexer.DFA19_eot;\n    this.eof = XQueryLexer.DFA19_eof;\n    this.min = XQueryLexer.DFA19_min;\n    this.max = XQueryLexer.DFA19_max;\n    this.accept = XQueryLexer.DFA19_accept;\n    this.special = XQueryLexer.DFA19_special;\n    this.transition = XQueryLexer.DFA19_transition;\n};\n\norg.antlr.lang.extend(XQueryLexer.DFA19, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"1:1: Tokens : ( ANCESTOR | ANCESTOR_OR_SELF | AND | AS | ASCENDING | AT | ATTRIBUTE | BASE_URI | BOUNDARY_SPACE | BY | CASE | CAST | CASTABLE | CHILD | COLLATION | COMMENT | CONSTRUCTION | COPY_NAMESPACES | DECLARE | DEFAULT | DESCENDANT | DESCENDANT_OR_SELF | DESCENDING | DIV | DOCUMENT | DOCUMENT_NODE | ELEMENT | ELSE | EMPTY | EMPTY_SEQUENCE | ENCODING | EQ | EVERY | EXCEPT | EXTERNAL | FOLLOWING | FOLLOWING_SIBLING | FOR | FUNCTION | GE | GREATEST | GT | IDIV | IF | IMPORT | IN | INHERIT | INSTANCE | INTERSECT | IS | ITEM | LAX | LE | LEAST | LET | LT | MOD | MODULE | NAMESPACE | NE | NO_INHERIT | NO_PRESERVE | NODE | JSON | OF | OPTION | OR | ORDER | ORDERED | ORDERING | PARENT | PRECEDING | PRECEDING_SIBLING | PRESERVE | PROCESSING_INSTRUCTION | STRUCTURED_ITEM | JSON_ITEM | OBJECT | ARRAY | RETURN | SATISFIES | SCHEMA | SCHEMA_ATTRIBUTE | SCHEMA_ELEMENT | SELF | SOME | STABLE | STRICT | STRIP | TEXT | THEN | TO | TREAT | TYPESWITCH | UNION | UNORDERED | VALIDATE | VARIABLE | VERSION | WHERE | XQUERY | ALLOWING | CATCH | CONTEXT | COUNT | DECIMAL_FORMAT | DECIMAL_SEPARATOR | DIGIT | END | GROUP | GROUPING_SEPARATOR | INFINITY | MINUS_SIGN | NAMESPACE_NODE | NAN | NEXT | ONLY | PATTERN_SEPARATOR | PERCENT | PER_MILLE | PREVIOUS | SLIDING | START | SWITCH | TRY | TUMBLING | TYPE | WHEN | WINDOW | ZERO_DIGIT | AFTER | BEFORE | COPY | DELETE | FIRST | INSERT | INTO | POSITION | APPEND | LAST | MODIFY | NODES | RENAME | REPLACE | REVALIDATION | SKIP | UPDATING | VALUE | WITH | ALL | ANY | CONTAINS | CONTENT | DIACRITICS | DIFFERENT | DISTANCE | ENTIRE | EXACTLY | FROM | FT_OPTION | FTAND | FTNOT | FTOR | INSENSITIVE | LANGUAGE | LEVELS | LOWERCASE | MOST | NO | NOT | OCCURS | PARAGRAPH | PARAGRAPHS | PHRASE | RELATIONSHIP | SAME | SCORE | SENSITIVE | SENTENCE | SENTENCES | STEMMING | STOP | THESAURUS | TIMES | UPPERCASE | USING | WEIGHT | WILDCARDS | WITHOUT | WORD | WORDS | BREAK | CONTINUE | EXIT | LOOP | RETURNING | WHILE | CHECK | COLLECTION | CONSTRAINT | FOREACH | FOREIGN | INDEX | INTEGRITY | KEY | ON | UNIQUE | AMP_ER | APOS_ER | QUOT_ER | CONCAT | LPAREN | RPAREN | DOLLAR | L_UNION_BRACKET | R_UNION_BRACKET | LBRACKET | RBRACKET | LSQUARE | RSQUARE | EQUAL | BIND | NOTEQUAL | ANN_PERCENT | HASH | AMP | COMMA | QUESTION | STAR | PLUS | MINUS | SMALLER | GREATER | SMALLEREQ | GREATEREQ | SMALLER_SMALLER | GREATER_GREATER | SLASH | SLASH_SLASH | BANG | DOT | DOT_DOT | COLON | COLON_COLON | EMPTY_CLOSE_TAG | CLOSE_TAG | SEMICOLON | VBAR | PRAGMA_START | PRAGMA_END | XML_COMMENT_START | XML_COMMENT_END | PI_START | PI_END | ATTR_SIGN | Q | CHARREF_DEC | CHARREF_HEX | APOS | QUOT | L_NCName | S | L_Pragma | L_DirCommentConstructor | L_DirPIConstructor | L_IntegerLiteral | L_DecimalLiteral | L_DoubleLiteral | L_Comment | L_AnyChar );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA19_530 = input.LA(1);\n\n                            s = -1;\n                            if ( ((LA19_530>='\\u0000' && LA19_530<='\\uFFFF')) ) {s = 692;}\n\n                            else s = 691;\n\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA19_0 = input.LA(1);\n\n                            s = -1;\n                            if ( (LA19_0=='a') ) {s = 1;}\n\n                            else if ( (LA19_0=='b') ) {s = 2;}\n\n                            else if ( (LA19_0=='c') ) {s = 3;}\n\n                            else if ( (LA19_0=='d') ) {s = 4;}\n\n                            else if ( (LA19_0=='e') ) {s = 5;}\n\n                            else if ( (LA19_0=='f') ) {s = 6;}\n\n                            else if ( (LA19_0=='g') ) {s = 7;}\n\n                            else if ( (LA19_0=='i') ) {s = 8;}\n\n                            else if ( (LA19_0=='l') ) {s = 9;}\n\n                            else if ( (LA19_0=='m') ) {s = 10;}\n\n                            else if ( (LA19_0=='n') ) {s = 11;}\n\n                            else if ( (LA19_0=='j') ) {s = 12;}\n\n                            else if ( (LA19_0=='o') ) {s = 13;}\n\n                            else if ( (LA19_0=='p') ) {s = 14;}\n\n                            else if ( (LA19_0=='s') ) {s = 15;}\n\n                            else if ( (LA19_0=='r') ) {s = 16;}\n\n                            else if ( (LA19_0=='t') ) {s = 17;}\n\n                            else if ( (LA19_0=='u') ) {s = 18;}\n\n                            else if ( (LA19_0=='v') ) {s = 19;}\n\n                            else if ( (LA19_0=='w') ) {s = 20;}\n\n                            else if ( (LA19_0=='x') ) {s = 21;}\n\n                            else if ( (LA19_0=='N') ) {s = 22;}\n\n                            else if ( (LA19_0=='z') ) {s = 23;}\n\n                            else if ( (LA19_0=='k') ) {s = 24;}\n\n                            else if ( (LA19_0=='q') ) {s = 25;}\n\n                            else if ( (LA19_0=='|') ) {s = 26;}\n\n                            else if ( (LA19_0=='(') ) {s = 27;}\n\n                            else if ( (LA19_0==')') ) {s = 28;}\n\n                            else if ( (LA19_0=='$') ) {s = 29;}\n\n                            else if ( (LA19_0=='{') ) {s = 30;}\n\n                            else if ( (LA19_0=='}') ) {s = 31;}\n\n                            else if ( (LA19_0=='[') ) {s = 32;}\n\n                            else if ( (LA19_0==']') ) {s = 33;}\n\n                            else if ( (LA19_0=='=') ) {s = 34;}\n\n                            else if ( (LA19_0==':') ) {s = 35;}\n\n                            else if ( (LA19_0=='!') ) {s = 36;}\n\n                            else if ( (LA19_0=='%') ) {s = 37;}\n\n                            else if ( (LA19_0=='#') ) {s = 38;}\n\n                            else if ( (LA19_0=='&') ) {s = 39;}\n\n                            else if ( (LA19_0==',') ) {s = 40;}\n\n                            else if ( (LA19_0=='?') ) {s = 41;}\n\n                            else if ( (LA19_0=='*') ) {s = 42;}\n\n                            else if ( (LA19_0=='+') ) {s = 43;}\n\n                            else if ( (LA19_0=='-') ) {s = 44;}\n\n                            else if ( (LA19_0=='<') ) {s = 45;}\n\n                            else if ( (LA19_0=='>') ) {s = 46;}\n\n                            else if ( (LA19_0=='/') ) {s = 47;}\n\n                            else if ( (LA19_0=='.') ) {s = 48;}\n\n                            else if ( (LA19_0==';') ) {s = 49;}\n\n                            else if ( (LA19_0=='@') ) {s = 50;}\n\n                            else if ( (LA19_0=='Q') ) {s = 51;}\n\n                            else if ( (LA19_0=='\\'') ) {s = 52;}\n\n                            else if ( (LA19_0=='\\\"') ) {s = 53;}\n\n                            else if ( ((LA19_0>='A' && LA19_0<='M')||(LA19_0>='O' && LA19_0<='P')||(LA19_0>='R' && LA19_0<='Z')||LA19_0=='_'||LA19_0=='h'||LA19_0=='y') ) {s = 54;}\n\n                            else if ( ((LA19_0>='\\t' && LA19_0<='\\n')||LA19_0=='\\r'||LA19_0==' ') ) {s = 55;}\n\n                            else if ( ((LA19_0>='0' && LA19_0<='9')) ) {s = 56;}\n\n                            else if ( ((LA19_0>='\\u0000' && LA19_0<='\\b')||(LA19_0>='\\u000B' && LA19_0<='\\f')||(LA19_0>='\\u000E' && LA19_0<='\\u001F')||LA19_0=='\\\\'||LA19_0=='^'||LA19_0=='`'||(LA19_0>='~' && LA19_0<='\\uFFFF')) ) {s = 57;}\n\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA19_27 = input.LA(1);\n\n                             \n                            var index19_27 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA19_27=='#') ) {s = 152;}\n\n                            else if ( (LA19_27==':') && ((!this.inStr))) {s = 153;}\n\n                            else s = 154;\n\n                             \n                            input.seek(index19_27);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 19, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\n \n})();\nexports.XQueryLexer = XQueryLexer; });\ndefine('ace/mode/xquery/XQDTLexer', ['require', 'exports', 'module' , 'ace/mode/xquery/antlr3-all'], function(require, exports, module) {\n\nvar org =  require(\"./antlr3-all\").org;\n\nvar XQDTLexer = exports.XQDTLexer = function(input, state)\n{\n  XQDTLexer.superclass.constructor.call(this, input, state);\n};\n\norg.antlr.lang.extend(XQDTLexer, org.antlr.runtime.Lexer, {\n\n  comments: [],\n\n  addComment: function(start, stop){ this.comments.push({ start: start, stop: stop }); },\n\n  isWsExplicit: false,\n\n  setIsWsExplicit: function (wsExplicit) {\n    //console.log(\"A WS: \" + wsExplicit);\n    this.isWsExplicit = wsExplicit;\n    //console.log(\"B WS: \" + wsExplicit);\n  },\n\n  addToStack: function (stack) {\n    stack.push(this);\n  },\n\n  rewindToIndex: function(index) {\n    var stream = this.input;\n    stream.seek(index);\n  }\n});\n\n});\ndefine('ace/mode/xquery/XQueryParser', ['require', 'exports', 'module' , 'ace/mode/xquery/antlr3-all', 'ace/mode/xquery/StringLexer', 'ace/mode/xquery/XMLLexer', 'ace/mode/xquery/XQueryLexer', 'ace/mode/xquery/XQDTParser', 'ace/mode/xquery/Position'], function(require, exports, module) {// $ANTLR 3.3 Nov 30, 2010 12:50:56 /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g 2012-09-05 10:41:46\n\n/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\nvar org =  require(\"./antlr3-all\").org;\nvar StringLexer   = require(\"./StringLexer\").StringLexer;\nvar XMLLexer   = require(\"./XMLLexer\").XMLLexer;\nvar XQueryLexer   = require(\"./XQueryLexer\").XQueryLexer;\nvar XQDTParser = require(\"./XQDTParser\").XQDTParser;\nvar Position = require(\"./Position\").Position;\nvar Exception = function(){};\n\nvar XQS = true;\nvar XQU = true;\nvar ZORBA = true;\n\n\n\nvar XQueryParser = function(input, state) {\n    if (!state) {\n        state = new org.antlr.runtime.RecognizerSharedState();\n    }\n\n    (function(){\n\n\n        this.isInAttr = false;\n\n        this.errors = [];\n\n        this.hasErrors = function(){\n          return this.errors.length > 0;\n        };\n\n        this.addError = function(error){\n          this.errors.push(error);\n        };\n\n        this.getErrors = function(){\n          return this.errors;\n        };\n\n        this.source = null;\n        this.setSource = function(s){\n          this.source = s;\n          this.highlighter.setSource(s);\n        };\n\n        this.lexerStack = new Array();\n\n        this.lc = function(b){ return b; };\n        this.popLexer = function (){\n          //console.log(\"popLexer\");\n          if(this.lexerStack.length == 0) return;\n          this.getTokenStream().mark();\n          var oldLexer = this.getTokenStream().getTokenSource();\n          var newLexer = this.lexerStack.pop();\n          if(oldLexer instanceof StringLexer && newLexer instanceof XQueryLexer) {\n            newLexer.inStr = false;\n          }\n          this.getTokenStream().setTokenSource(newLexer);\n        };\n\n        this.pushXQueryLexer = function() {\n          xqueryLexer = new XQueryLexer(this.source);\n          this.pushLexer(xqueryLexer);\n        };\n\n        this.pushStringLexer = function(isAposStr){\n          //console.log(\"pushStringLexer\");\n          var stringLexer = new StringLexer(this.source);\n          stringLexer.inAposStr = isAposStr;\n          stringLexer.inQuotStr = !isAposStr;\n          stringLexer.setIsWsExplicit(true);\n          this.pushLexer(stringLexer);\n        };\n\n        this.pushXMLLexer = function(){\n          //console.log(\"pushXMLLexer\");\n          var xmlLexer = new XMLLexer(this.source);\n          xmlLexer.setIsWsExplicit(true);\n          this.pushLexer(xmlLexer);\n        };\n\n        this.pushLexer = function(lexer){\n          var oldLexer = this.getTokenStream().getTokenSource();\n          oldLexer.addToStack(this.lexerStack);\n          this.getTokenStream().setTokenSource(lexer);\n        };\n\n        this.setWsExplicit = function(isExplicit){\n          this.getTokenStream().setWsExplicit(isExplicit);\n        };\n\n        this.ap = function(token)\n        {\n          this.addToken(token, \"xml_pe\");\n        };\n\n        this.ax = function(start, stop)\n        {\n          this.highlighter.addToken(start.getStartIndex(), stop.getStopIndex(), \"xml_pe\");\n        };\n\n        this.at = function(start, stop)\n        {\n          this.highlighter.addToken(start.getStartIndex(), stop.getStopIndex(), \"meta.tag\");\n        };\n\n        this.av = function(start, stop)\n        {\n          this.highlighter.addToken(start.getStartIndex(), stop.getStopIndex(), \"variable\");\n        };\n\n        this.af = function(start, stop)\n        {\n          this.highlighter.addToken(start.getStartIndex(), stop.getStopIndex(), \"support.function\");\n        };\n\n        this.ao = function(t)\n        {\n          this.addToken(t, \"keyword.operator\");\n        };\n\n        this.ak = function(t)\n        {\n          this.addToken(t, \"keyword\");\n        };\n\n        this.ad = function(t)\n        {\n          this.addToken(t, \"constant\");\n        };\n\n        this.addString = function(start, stop)\n        {\n         if(stop == undefined) {\n           this.addToken(start, \"string\");\n         } else {\n           this.highlighter.addToken(start.getStartIndex(), stop.getStopIndex(), \"string\");\n         }\n        };\n\n        this.ac = function(t)\n        {\n          this.addToken(t, \"comment\");\n        };\n\n        this.addToken = function(k, type){\n          if(org.antlr.lang.isArray(k)){\n            for(i in k)\n            {\n              this.highlighter.addToken(k[i].getStartIndex(), k[i].getStopIndex(), type);\n            }\n          } else if(k != null ) {\n            this.highlighter.addToken(k.getStartIndex(), k.getStopIndex(), type); \n          }\n        };\n\n\n    }).call(this);\n\n    XQueryParser.superclass.constructor.call(this, input, state);\n\n    this.dfa1 = new XQueryParser.DFA1(this);\n    this.dfa2 = new XQueryParser.DFA2(this);\n    this.dfa6 = new XQueryParser.DFA6(this);\n    this.dfa9 = new XQueryParser.DFA9(this);\n    this.dfa44 = new XQueryParser.DFA44(this);\n    this.dfa46 = new XQueryParser.DFA46(this);\n    this.dfa119 = new XQueryParser.DFA119(this);\n    this.dfa121 = new XQueryParser.DFA121(this);\n    this.dfa123 = new XQueryParser.DFA123(this);\n    this.dfa128 = new XQueryParser.DFA128(this);\n    this.dfa129 = new XQueryParser.DFA129(this);\n    this.dfa136 = new XQueryParser.DFA136(this);\n    this.dfa172 = new XQueryParser.DFA172(this);\n    this.dfa195 = new XQueryParser.DFA195(this);\n    this.dfa230 = new XQueryParser.DFA230(this);\n    this.dfa249 = new XQueryParser.DFA249(this);\n    this.dfa265 = new XQueryParser.DFA265(this);\n    this.adaptor = new org.antlr.runtime.tree.CommonTreeAdaptor();\n\n};\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    EOF: -1,\n    L_QuotAttrContentChar: 4,\n    L_AposAttrContentChar: 5,\n    L_ElementContentChar: 6,\n    L_CDataSection: 7,\n    L_PredefinedEntityRef: 8,\n    L_CharRef: 9,\n    ESCAPE_LBRACKET: 10,\n    ESCAPE_RBRACKET: 11,\n    ESCAPE_APOS: 12,\n    ESCAPE_QUOT: 13,\n    CDATA_START: 14,\n    CDATA_END: 15,\n    ANCESTOR: 16,\n    ANCESTOR_OR_SELF: 17,\n    AND: 18,\n    AS: 19,\n    ASCENDING: 20,\n    AT: 21,\n    ATTRIBUTE: 22,\n    BASE_URI: 23,\n    BOUNDARY_SPACE: 24,\n    BY: 25,\n    CASE: 26,\n    CAST: 27,\n    CASTABLE: 28,\n    CHILD: 29,\n    COLLATION: 30,\n    COMMENT: 31,\n    CONSTRUCTION: 32,\n    COPY_NAMESPACES: 33,\n    DECLARE: 34,\n    DEFAULT: 35,\n    DESCENDANT: 36,\n    DESCENDANT_OR_SELF: 37,\n    DESCENDING: 38,\n    DIV: 39,\n    DOCUMENT: 40,\n    DOCUMENT_NODE: 41,\n    ELEMENT: 42,\n    ELSE: 43,\n    EMPTY: 44,\n    EMPTY_SEQUENCE: 45,\n    ENCODING: 46,\n    EQ: 47,\n    EVERY: 48,\n    EXCEPT: 49,\n    EXTERNAL: 50,\n    FOLLOWING: 51,\n    FOLLOWING_SIBLING: 52,\n    FOR: 53,\n    FUNCTION: 54,\n    GE: 55,\n    GREATEST: 56,\n    GT: 57,\n    IDIV: 58,\n    IF: 59,\n    IMPORT: 60,\n    IN: 61,\n    INHERIT: 62,\n    INSTANCE: 63,\n    INTERSECT: 64,\n    IS: 65,\n    ITEM: 66,\n    LAX: 67,\n    LE: 68,\n    LEAST: 69,\n    LET: 70,\n    LT: 71,\n    MOD: 72,\n    MODULE: 73,\n    NAMESPACE: 74,\n    NE: 75,\n    NO_INHERIT: 76,\n    NO_PRESERVE: 77,\n    NODE: 78,\n    JSON: 79,\n    OF: 80,\n    OPTION: 81,\n    OR: 82,\n    ORDER: 83,\n    ORDERED: 84,\n    ORDERING: 85,\n    PARENT: 86,\n    PRECEDING: 87,\n    PRECEDING_SIBLING: 88,\n    PRESERVE: 89,\n    PROCESSING_INSTRUCTION: 90,\n    STRUCTURED_ITEM: 91,\n    JSON_ITEM: 92,\n    OBJECT: 93,\n    ARRAY: 94,\n    RETURN: 95,\n    SATISFIES: 96,\n    SCHEMA: 97,\n    SCHEMA_ATTRIBUTE: 98,\n    SCHEMA_ELEMENT: 99,\n    SELF: 100,\n    SOME: 101,\n    STABLE: 102,\n    STRICT: 103,\n    STRIP: 104,\n    TEXT: 105,\n    THEN: 106,\n    TO: 107,\n    TREAT: 108,\n    TYPESWITCH: 109,\n    UNION: 110,\n    UNORDERED: 111,\n    VALIDATE: 112,\n    VARIABLE: 113,\n    VERSION: 114,\n    WHERE: 115,\n    XQUERY: 116,\n    ALLOWING: 117,\n    CATCH: 118,\n    CONTEXT: 119,\n    COUNT: 120,\n    DECIMAL_FORMAT: 121,\n    DECIMAL_SEPARATOR: 122,\n    DIGIT: 123,\n    END: 124,\n    GROUP: 125,\n    GROUPING_SEPARATOR: 126,\n    INFINITY: 127,\n    MINUS_SIGN: 128,\n    NAMESPACE_NODE: 129,\n    NAN: 130,\n    NEXT: 131,\n    ONLY: 132,\n    PATTERN_SEPARATOR: 133,\n    PERCENT: 134,\n    PER_MILLE: 135,\n    PREVIOUS: 136,\n    SLIDING: 137,\n    START: 138,\n    SWITCH: 139,\n    TRY: 140,\n    TUMBLING: 141,\n    TYPE: 142,\n    WHEN: 143,\n    WINDOW: 144,\n    ZERO_DIGIT: 145,\n    AFTER: 146,\n    BEFORE: 147,\n    COPY: 148,\n    DELETE: 149,\n    FIRST: 150,\n    INSERT: 151,\n    INTO: 152,\n    POSITION: 153,\n    APPEND: 154,\n    LAST: 155,\n    MODIFY: 156,\n    NODES: 157,\n    RENAME: 158,\n    REPLACE: 159,\n    REVALIDATION: 160,\n    SKIP: 161,\n    UPDATING: 162,\n    VALUE: 163,\n    WITH: 164,\n    ALL: 165,\n    ANY: 166,\n    CONTAINS: 167,\n    CONTENT: 168,\n    DIACRITICS: 169,\n    DIFFERENT: 170,\n    DISTANCE: 171,\n    ENTIRE: 172,\n    EXACTLY: 173,\n    FROM: 174,\n    FT_OPTION: 175,\n    FTAND: 176,\n    FTNOT: 177,\n    FTOR: 178,\n    INSENSITIVE: 179,\n    LANGUAGE: 180,\n    LEVELS: 181,\n    LOWERCASE: 182,\n    MOST: 183,\n    NO: 184,\n    NOT: 185,\n    OCCURS: 186,\n    PARAGRAPH: 187,\n    PARAGRAPHS: 188,\n    PHRASE: 189,\n    RELATIONSHIP: 190,\n    SAME: 191,\n    SCORE: 192,\n    SENSITIVE: 193,\n    SENTENCE: 194,\n    SENTENCES: 195,\n    STEMMING: 196,\n    STOP: 197,\n    THESAURUS: 198,\n    TIMES: 199,\n    UPPERCASE: 200,\n    USING: 201,\n    WEIGHT: 202,\n    WILDCARDS: 203,\n    WITHOUT: 204,\n    WORD: 205,\n    WORDS: 206,\n    BREAK: 207,\n    CONTINUE: 208,\n    EXIT: 209,\n    LOOP: 210,\n    RETURNING: 211,\n    WHILE: 212,\n    CHECK: 213,\n    COLLECTION: 214,\n    CONSTRAINT: 215,\n    FOREACH: 216,\n    FOREIGN: 217,\n    INDEX: 218,\n    INTEGRITY: 219,\n    KEY: 220,\n    ON: 221,\n    UNIQUE: 222,\n    AMP_ER: 223,\n    APOS_ER: 224,\n    QUOT_ER: 225,\n    CONCAT: 226,\n    LPAREN: 227,\n    RPAREN: 228,\n    DOLLAR: 229,\n    L_UNION_BRACKET: 230,\n    R_UNION_BRACKET: 231,\n    LBRACKET: 232,\n    RBRACKET: 233,\n    LSQUARE: 234,\n    RSQUARE: 235,\n    EQUAL: 236,\n    BIND: 237,\n    NOTEQUAL: 238,\n    ANN_PERCENT: 239,\n    HASH: 240,\n    AMP: 241,\n    COMMA: 242,\n    QUESTION: 243,\n    STAR: 244,\n    PLUS: 245,\n    MINUS: 246,\n    SMALLER: 247,\n    GREATER: 248,\n    SMALLEREQ: 249,\n    GREATEREQ: 250,\n    SMALLER_SMALLER: 251,\n    GREATER_GREATER: 252,\n    SLASH: 253,\n    SLASH_SLASH: 254,\n    BANG: 255,\n    DOT: 256,\n    DOT_DOT: 257,\n    COLON: 258,\n    COLON_COLON: 259,\n    EMPTY_CLOSE_TAG: 260,\n    CLOSE_TAG: 261,\n    SEMICOLON: 262,\n    VBAR: 263,\n    PRAGMA_START: 264,\n    PRAGMA_END: 265,\n    XML_COMMENT_START: 266,\n    XML_COMMENT_END: 267,\n    PI_START: 268,\n    PI_END: 269,\n    ATTR_SIGN: 270,\n    Q: 271,\n    CHARREF_DEC: 272,\n    CHARREF_HEX: 273,\n    APOS: 274,\n    QUOT: 275,\n    NCNameStartChar: 276,\n    NCNameChar: 277,\n    L_NCName: 278,\n    Letter: 279,\n    HexLetter: 280,\n    Digit: 281,\n    Digits: 282,\n    S: 283,\n    SU: 284,\n    L_Pragma: 285,\n    L_DirCommentConstructor: 286,\n    L_DirPIConstructor: 287,\n    L_IntegerLiteral: 288,\n    L_DecimalLiteral: 289,\n    L_DoubleLiteral: 290,\n    L_Comment: 291,\n    L_AnyChar: 292,\n    L_QuotStringLiteralChar: 293,\n    L_AposStringLiteralChar: 294,\n    LibraryModule: 295,\n    MainModule: 296,\n    VersionDecl: 297,\n    VersionDeclEncoding: 298,\n    VersionDeclVersion: 299,\n    ModuleDecl: 300,\n    Prolog: 301,\n    DefaultNamespaceDecls: 302,\n    DefaultNamespaceDecl: 303,\n    Setters: 304,\n    Setter: 305,\n    NamespaceDecls: 306,\n    NamespaceDecl: 307,\n    Imports: 308,\n    FTOptionDecls: 309,\n    SchemaImport: 310,\n    SchemaPrefix: 311,\n    NamespaceName: 312,\n    DefaultElementNamespace: 313,\n    AtHints: 314,\n    ModuleImport: 315,\n    BaseURIDecl: 316,\n    OrderedDecls: 317,\n    VarDecl: 318,\n    VarType: 319,\n    VarValue: 320,\n    VarDefaultValue: 321,\n    VarVariableDecl: 322,\n    FunctionDecl: 323,\n    ParamList: 324,\n    ReturnType: 325,\n    OptionDecl: 326,\n    TypeDeclaration: 327,\n    Param: 328,\n    EnclosedExpr: 329,\n    QueryBody: 330,\n    UnaryExpr: 331,\n    DirElemConstructor: 332,\n    DirAttributeList: 333,\n    DirAttributeValue: 334,\n    DirElemContent: 335,\n    CommonContent: 336,\n    SequenceType: 337,\n    EmptySequenceTest: 338,\n    KindTest: 339,\n    ItemTest: 340,\n    FunctionTest: 341,\n    AtomicType: 342,\n    AtomicOrUnionType: 343,\n    StringLiteral: 344,\n    ElementContentChar: 345,\n    AttributeValueChar: 346,\n    QName: 347,\n    BlockExpr: 348\n});\n\n(function(){\n// public class variables\nvar EOF= -1,\n    L_QuotAttrContentChar= 4,\n    L_AposAttrContentChar= 5,\n    L_ElementContentChar= 6,\n    L_CDataSection= 7,\n    L_PredefinedEntityRef= 8,\n    L_CharRef= 9,\n    ESCAPE_LBRACKET= 10,\n    ESCAPE_RBRACKET= 11,\n    ESCAPE_APOS= 12,\n    ESCAPE_QUOT= 13,\n    CDATA_START= 14,\n    CDATA_END= 15,\n    ANCESTOR= 16,\n    ANCESTOR_OR_SELF= 17,\n    AND= 18,\n    AS= 19,\n    ASCENDING= 20,\n    AT= 21,\n    ATTRIBUTE= 22,\n    BASE_URI= 23,\n    BOUNDARY_SPACE= 24,\n    BY= 25,\n    CASE= 26,\n    CAST= 27,\n    CASTABLE= 28,\n    CHILD= 29,\n    COLLATION= 30,\n    COMMENT= 31,\n    CONSTRUCTION= 32,\n    COPY_NAMESPACES= 33,\n    DECLARE= 34,\n    DEFAULT= 35,\n    DESCENDANT= 36,\n    DESCENDANT_OR_SELF= 37,\n    DESCENDING= 38,\n    DIV= 39,\n    DOCUMENT= 40,\n    DOCUMENT_NODE= 41,\n    ELEMENT= 42,\n    ELSE= 43,\n    EMPTY= 44,\n    EMPTY_SEQUENCE= 45,\n    ENCODING= 46,\n    EQ= 47,\n    EVERY= 48,\n    EXCEPT= 49,\n    EXTERNAL= 50,\n    FOLLOWING= 51,\n    FOLLOWING_SIBLING= 52,\n    FOR= 53,\n    FUNCTION= 54,\n    GE= 55,\n    GREATEST= 56,\n    GT= 57,\n    IDIV= 58,\n    IF= 59,\n    IMPORT= 60,\n    IN= 61,\n    INHERIT= 62,\n    INSTANCE= 63,\n    INTERSECT= 64,\n    IS= 65,\n    ITEM= 66,\n    LAX= 67,\n    LE= 68,\n    LEAST= 69,\n    LET= 70,\n    LT= 71,\n    MOD= 72,\n    MODULE= 73,\n    NAMESPACE= 74,\n    NE= 75,\n    NO_INHERIT= 76,\n    NO_PRESERVE= 77,\n    NODE= 78,\n    JSON= 79,\n    OF= 80,\n    OPTION= 81,\n    OR= 82,\n    ORDER= 83,\n    ORDERED= 84,\n    ORDERING= 85,\n    PARENT= 86,\n    PRECEDING= 87,\n    PRECEDING_SIBLING= 88,\n    PRESERVE= 89,\n    PROCESSING_INSTRUCTION= 90,\n    STRUCTURED_ITEM= 91,\n    JSON_ITEM= 92,\n    OBJECT= 93,\n    ARRAY= 94,\n    RETURN= 95,\n    SATISFIES= 96,\n    SCHEMA= 97,\n    SCHEMA_ATTRIBUTE= 98,\n    SCHEMA_ELEMENT= 99,\n    SELF= 100,\n    SOME= 101,\n    STABLE= 102,\n    STRICT= 103,\n    STRIP= 104,\n    TEXT= 105,\n    THEN= 106,\n    TO= 107,\n    TREAT= 108,\n    TYPESWITCH= 109,\n    UNION= 110,\n    UNORDERED= 111,\n    VALIDATE= 112,\n    VARIABLE= 113,\n    VERSION= 114,\n    WHERE= 115,\n    XQUERY= 116,\n    ALLOWING= 117,\n    CATCH= 118,\n    CONTEXT= 119,\n    COUNT= 120,\n    DECIMAL_FORMAT= 121,\n    DECIMAL_SEPARATOR= 122,\n    DIGIT= 123,\n    END= 124,\n    GROUP= 125,\n    GROUPING_SEPARATOR= 126,\n    INFINITY= 127,\n    MINUS_SIGN= 128,\n    NAMESPACE_NODE= 129,\n    NAN= 130,\n    NEXT= 131,\n    ONLY= 132,\n    PATTERN_SEPARATOR= 133,\n    PERCENT= 134,\n    PER_MILLE= 135,\n    PREVIOUS= 136,\n    SLIDING= 137,\n    START= 138,\n    SWITCH= 139,\n    TRY= 140,\n    TUMBLING= 141,\n    TYPE= 142,\n    WHEN= 143,\n    WINDOW= 144,\n    ZERO_DIGIT= 145,\n    AFTER= 146,\n    BEFORE= 147,\n    COPY= 148,\n    DELETE= 149,\n    FIRST= 150,\n    INSERT= 151,\n    INTO= 152,\n    POSITION= 153,\n    APPEND= 154,\n    LAST= 155,\n    MODIFY= 156,\n    NODES= 157,\n    RENAME= 158,\n    REPLACE= 159,\n    REVALIDATION= 160,\n    SKIP= 161,\n    UPDATING= 162,\n    VALUE= 163,\n    WITH= 164,\n    ALL= 165,\n    ANY= 166,\n    CONTAINS= 167,\n    CONTENT= 168,\n    DIACRITICS= 169,\n    DIFFERENT= 170,\n    DISTANCE= 171,\n    ENTIRE= 172,\n    EXACTLY= 173,\n    FROM= 174,\n    FT_OPTION= 175,\n    FTAND= 176,\n    FTNOT= 177,\n    FTOR= 178,\n    INSENSITIVE= 179,\n    LANGUAGE= 180,\n    LEVELS= 181,\n    LOWERCASE= 182,\n    MOST= 183,\n    NO= 184,\n    NOT= 185,\n    OCCURS= 186,\n    PARAGRAPH= 187,\n    PARAGRAPHS= 188,\n    PHRASE= 189,\n    RELATIONSHIP= 190,\n    SAME= 191,\n    SCORE= 192,\n    SENSITIVE= 193,\n    SENTENCE= 194,\n    SENTENCES= 195,\n    STEMMING= 196,\n    STOP= 197,\n    THESAURUS= 198,\n    TIMES= 199,\n    UPPERCASE= 200,\n    USING= 201,\n    WEIGHT= 202,\n    WILDCARDS= 203,\n    WITHOUT= 204,\n    WORD= 205,\n    WORDS= 206,\n    BREAK= 207,\n    CONTINUE= 208,\n    EXIT= 209,\n    LOOP= 210,\n    RETURNING= 211,\n    WHILE= 212,\n    CHECK= 213,\n    COLLECTION= 214,\n    CONSTRAINT= 215,\n    FOREACH= 216,\n    FOREIGN= 217,\n    INDEX= 218,\n    INTEGRITY= 219,\n    KEY= 220,\n    ON= 221,\n    UNIQUE= 222,\n    AMP_ER= 223,\n    APOS_ER= 224,\n    QUOT_ER= 225,\n    CONCAT= 226,\n    LPAREN= 227,\n    RPAREN= 228,\n    DOLLAR= 229,\n    L_UNION_BRACKET= 230,\n    R_UNION_BRACKET= 231,\n    LBRACKET= 232,\n    RBRACKET= 233,\n    LSQUARE= 234,\n    RSQUARE= 235,\n    EQUAL= 236,\n    BIND= 237,\n    NOTEQUAL= 238,\n    ANN_PERCENT= 239,\n    HASH= 240,\n    AMP= 241,\n    COMMA= 242,\n    QUESTION= 243,\n    STAR= 244,\n    PLUS= 245,\n    MINUS= 246,\n    SMALLER= 247,\n    GREATER= 248,\n    SMALLEREQ= 249,\n    GREATEREQ= 250,\n    SMALLER_SMALLER= 251,\n    GREATER_GREATER= 252,\n    SLASH= 253,\n    SLASH_SLASH= 254,\n    BANG= 255,\n    DOT= 256,\n    DOT_DOT= 257,\n    COLON= 258,\n    COLON_COLON= 259,\n    EMPTY_CLOSE_TAG= 260,\n    CLOSE_TAG= 261,\n    SEMICOLON= 262,\n    VBAR= 263,\n    PRAGMA_START= 264,\n    PRAGMA_END= 265,\n    XML_COMMENT_START= 266,\n    XML_COMMENT_END= 267,\n    PI_START= 268,\n    PI_END= 269,\n    ATTR_SIGN= 270,\n    Q= 271,\n    CHARREF_DEC= 272,\n    CHARREF_HEX= 273,\n    APOS= 274,\n    QUOT= 275,\n    NCNameStartChar= 276,\n    NCNameChar= 277,\n    L_NCName= 278,\n    Letter= 279,\n    HexLetter= 280,\n    Digit= 281,\n    Digits= 282,\n    S= 283,\n    SU= 284,\n    L_Pragma= 285,\n    L_DirCommentConstructor= 286,\n    L_DirPIConstructor= 287,\n    L_IntegerLiteral= 288,\n    L_DecimalLiteral= 289,\n    L_DoubleLiteral= 290,\n    L_Comment= 291,\n    L_AnyChar= 292,\n    L_QuotStringLiteralChar= 293,\n    L_AposStringLiteralChar= 294,\n    LibraryModule= 295,\n    MainModule= 296,\n    VersionDecl= 297,\n    VersionDeclEncoding= 298,\n    VersionDeclVersion= 299,\n    ModuleDecl= 300,\n    Prolog= 301,\n    DefaultNamespaceDecls= 302,\n    DefaultNamespaceDecl= 303,\n    Setters= 304,\n    Setter= 305,\n    NamespaceDecls= 306,\n    NamespaceDecl= 307,\n    Imports= 308,\n    FTOptionDecls= 309,\n    SchemaImport= 310,\n    SchemaPrefix= 311,\n    NamespaceName= 312,\n    DefaultElementNamespace= 313,\n    AtHints= 314,\n    ModuleImport= 315,\n    BaseURIDecl= 316,\n    OrderedDecls= 317,\n    VarDecl= 318,\n    VarType= 319,\n    VarValue= 320,\n    VarDefaultValue= 321,\n    VarVariableDecl= 322,\n    FunctionDecl= 323,\n    ParamList= 324,\n    ReturnType= 325,\n    OptionDecl= 326,\n    TypeDeclaration= 327,\n    Param= 328,\n    EnclosedExpr= 329,\n    QueryBody= 330,\n    UnaryExpr= 331,\n    DirElemConstructor= 332,\n    DirAttributeList= 333,\n    DirAttributeValue= 334,\n    DirElemContent= 335,\n    CommonContent= 336,\n    SequenceType= 337,\n    EmptySequenceTest= 338,\n    KindTest= 339,\n    ItemTest= 340,\n    FunctionTest= 341,\n    AtomicType= 342,\n    AtomicOrUnionType= 343,\n    StringLiteral= 344,\n    ElementContentChar= 345,\n    AttributeValueChar= 346,\n    QName= 347,\n    BlockExpr= 348;\n\n// public instance methods/vars\norg.antlr.lang.extend(XQueryParser, XQDTParser, {\n        \n    setTreeAdaptor: function(adaptor) {\n        this.adaptor = adaptor;\n    },\n    getTreeAdaptor: function() {\n        return this.adaptor;\n    },\n\n    getTokenNames: function() { return XQueryParser.tokenNames; },\n    getGrammarFileName: function() { return \"/Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g\"; }\n});\norg.antlr.lang.augmentObject(XQueryParser.prototype, {\n\n    // inline static return class\n    p_Module_return: (function() {\n        XQueryParser.p_Module_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Module_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:292:1: p_Module : (vd= p_VersionDecl )? (lm= p_LibraryModule[$vd.tree] -> | mm= p_MainModule[$vd.tree] ->) EOF ;\n    // $ANTLR start \"p_Module\"\n    p_Module: function() {\n        var retval = new XQueryParser.p_Module_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var EOF1 = null;\n         var vd = null;\n         var lm = null;\n         var mm = null;\n\n        var EOF1_tree=null;\n        var stream_EOF=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EOF\");\n        var stream_p_VersionDecl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_VersionDecl\");\n        var stream_p_LibraryModule=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_LibraryModule\");\n        var stream_p_MainModule=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_MainModule\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:293:9: ( (vd= p_VersionDecl )? (lm= p_LibraryModule[$vd.tree] -> | mm= p_MainModule[$vd.tree] ->) EOF )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:293:11: (vd= p_VersionDecl )? (lm= p_LibraryModule[$vd.tree] -> | mm= p_MainModule[$vd.tree] ->) EOF\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:293:13: (vd= p_VersionDecl )?\n            var alt1=2;\n            alt1 = this.dfa1.predict(this.input);\n            switch (alt1) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:293:13: vd= p_VersionDecl\n                    this.pushFollow(XQueryParser.FOLLOW_p_VersionDecl_in_p_Module503);\n                    vd=this.p_VersionDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_VersionDecl.add(vd.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:294:13: (lm= p_LibraryModule[$vd.tree] -> | mm= p_MainModule[$vd.tree] ->)\n            var alt2=2;\n            alt2 = this.dfa2.predict(this.input);\n            switch (alt2) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:295:15: lm= p_LibraryModule[$vd.tree]\n                    this.pushFollow(XQueryParser.FOLLOW_p_LibraryModule_in_p_Module536);\n                    lm=this.p_LibraryModule((vd?vd.tree:null));\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_LibraryModule.add(lm.getTree());\n\n\n                    // AST REWRITE\n                    // elements: \n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 295:44: ->\n                    {\n                        this.adaptor.addChild(root_0, (lm?lm.tree:null));\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:296:15: mm= p_MainModule[$vd.tree]\n                    this.pushFollow(XQueryParser.FOLLOW_p_MainModule_in_p_Module559);\n                    mm=this.p_MainModule((vd?vd.tree:null));\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_MainModule.add(mm.getTree());\n\n\n                    // AST REWRITE\n                    // elements: \n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 296:44: ->\n                    {\n                        this.adaptor.addChild(root_0, (mm?mm.tree:null));\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n\n            }\n\n            EOF1=this.match(this.input,EOF,XQueryParser.FOLLOW_EOF_in_p_Module583); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_EOF.add(EOF1);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_VersionDecl_return: (function() {\n        XQueryParser.p_VersionDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_VersionDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:301:1: p_VersionDecl : k= XQUERY ( (k= ENCODING enc= p_StringLiteral ) | (k= VERSION ver= p_StringLiteral (k= ENCODING enc= p_StringLiteral )? ) ) SEMICOLON -> ^( VersionDecl ^( VersionDeclVersion ( $ver)? ) ^( VersionDeclEncoding ( $enc)? ) ) ;\n    // $ANTLR start \"p_VersionDecl\"\n    p_VersionDecl: function() {\n        var retval = new XQueryParser.p_VersionDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON2 = null;\n         var enc = null;\n         var ver = null;\n\n        var k_tree=null;\n        var SEMICOLON2_tree=null;\n        var stream_ENCODING=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token ENCODING\");\n        var stream_VERSION=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token VERSION\");\n        var stream_SEMICOLON=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SEMICOLON\");\n        var stream_XQUERY=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token XQUERY\");\n        var stream_p_StringLiteral=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_StringLiteral\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:302:9: (k= XQUERY ( (k= ENCODING enc= p_StringLiteral ) | (k= VERSION ver= p_StringLiteral (k= ENCODING enc= p_StringLiteral )? ) ) SEMICOLON -> ^( VersionDecl ^( VersionDeclVersion ( $ver)? ) ^( VersionDeclEncoding ( $enc)? ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:302:11: k= XQUERY ( (k= ENCODING enc= p_StringLiteral ) | (k= VERSION ver= p_StringLiteral (k= ENCODING enc= p_StringLiteral )? ) ) SEMICOLON\n            k=this.match(this.input,XQUERY,XQueryParser.FOLLOW_XQUERY_in_p_VersionDecl611); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_XQUERY.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:302:35: ( (k= ENCODING enc= p_StringLiteral ) | (k= VERSION ver= p_StringLiteral (k= ENCODING enc= p_StringLiteral )? ) )\n            var alt4=2;\n            var LA4_0 = this.input.LA(1);\n\n            if ( (LA4_0==ENCODING) ) {\n                alt4=1;\n            }\n            else if ( (LA4_0==VERSION) ) {\n                alt4=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 4, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt4) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:302:36: (k= ENCODING enc= p_StringLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:302:36: (k= ENCODING enc= p_StringLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:302:37: k= ENCODING enc= p_StringLiteral\n                    k=this.match(this.input,ENCODING,XQueryParser.FOLLOW_ENCODING_in_p_VersionDecl619); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_ENCODING.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_VersionDecl625);\n                    enc=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(enc.getTree());\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:303:13: (k= VERSION ver= p_StringLiteral (k= ENCODING enc= p_StringLiteral )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:303:13: (k= VERSION ver= p_StringLiteral (k= ENCODING enc= p_StringLiteral )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:303:14: k= VERSION ver= p_StringLiteral (k= ENCODING enc= p_StringLiteral )?\n                    k=this.match(this.input,VERSION,XQueryParser.FOLLOW_VERSION_in_p_VersionDecl646); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_VERSION.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_VersionDecl652);\n                    ver=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(ver.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:303:59: (k= ENCODING enc= p_StringLiteral )?\n                    var alt3=2;\n                    var LA3_0 = this.input.LA(1);\n\n                    if ( (LA3_0==ENCODING) ) {\n                        alt3=1;\n                    }\n                    switch (alt3) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:303:60: k= ENCODING enc= p_StringLiteral\n                            k=this.match(this.input,ENCODING,XQueryParser.FOLLOW_ENCODING_in_p_VersionDecl657); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_ENCODING.add(k);\n\n                            if ( this.state.backtracking===0 ) {\n                              this.ak(k);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_VersionDecl663);\n                            enc=this.p_StringLiteral();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(enc.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n\n            }\n\n            SEMICOLON2=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_VersionDecl669); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SEMICOLON.add(SEMICOLON2);\n\n\n\n            // AST REWRITE\n            // elements: ver, enc\n            // token labels: \n            // rule labels: retval, ver, enc\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_ver=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token ver\",ver!=null?ver.tree:null);\n            var stream_enc=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token enc\",enc!=null?enc.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 304:17: -> ^( VersionDecl ^( VersionDeclVersion ( $ver)? ) ^( VersionDeclEncoding ( $enc)? ) )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:304:20: ^( VersionDecl ^( VersionDeclVersion ( $ver)? ) ^( VersionDeclEncoding ( $enc)? ) )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(VersionDecl, \"VersionDecl\"), root_1);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:304:34: ^( VersionDeclVersion ( $ver)? )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(VersionDeclVersion, \"VersionDeclVersion\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:304:55: ( $ver)?\n                if ( stream_ver.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_ver.nextTree());\n\n                }\n                stream_ver.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:304:62: ^( VersionDeclEncoding ( $enc)? )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(VersionDeclEncoding, \"VersionDeclEncoding\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:304:84: ( $enc)?\n                if ( stream_enc.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_enc.nextTree());\n\n                }\n                stream_enc.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_MainModule_return: (function() {\n        XQueryParser.p_MainModule_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_MainModule_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:308:1: p_MainModule[vd] : pm_Prolog pm_QueryBody -> ^( MainModule pm_Prolog ) ;\n    // $ANTLR start \"p_MainModule\"\n    p_MainModule: function(vd) {\n        var retval = new XQueryParser.p_MainModule_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var pm_Prolog3 = null;\n         var pm_QueryBody4 = null;\n\n        var stream_pm_QueryBody=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pm_QueryBody\");\n        var stream_pm_Prolog=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pm_Prolog\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:309:9: ( pm_Prolog pm_QueryBody -> ^( MainModule pm_Prolog ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:309:11: pm_Prolog pm_QueryBody\n            this.pushFollow(XQueryParser.FOLLOW_pm_Prolog_in_p_MainModule735);\n            pm_Prolog3=this.pm_Prolog();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_pm_Prolog.add(pm_Prolog3.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_pm_QueryBody_in_p_MainModule737);\n            pm_QueryBody4=this.pm_QueryBody();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_pm_QueryBody.add(pm_QueryBody4.getTree());\n\n\n            // AST REWRITE\n            // elements: pm_Prolog\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 310:17: -> ^( MainModule pm_Prolog )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:310:20: ^( MainModule pm_Prolog )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(MainModule, \"MainModule\"), root_1);\n\n                this.adaptor.addChild(root_1, vd);\n                this.adaptor.addChild(root_1, stream_pm_Prolog.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_LibraryModule_return: (function() {\n        XQueryParser.p_LibraryModule_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_LibraryModule_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:314:1: p_LibraryModule[vd] : p_ModuleDecl pm_Prolog -> ^( LibraryModule p_ModuleDecl pm_Prolog ) ;\n    // $ANTLR start \"p_LibraryModule\"\n    p_LibraryModule: function(vd) {\n        var retval = new XQueryParser.p_LibraryModule_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ModuleDecl5 = null;\n         var pm_Prolog6 = null;\n\n        var stream_pm_Prolog=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pm_Prolog\");\n        var stream_p_ModuleDecl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_ModuleDecl\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:315:9: ( p_ModuleDecl pm_Prolog -> ^( LibraryModule p_ModuleDecl pm_Prolog ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:315:11: p_ModuleDecl pm_Prolog\n            this.pushFollow(XQueryParser.FOLLOW_p_ModuleDecl_in_p_LibraryModule793);\n            p_ModuleDecl5=this.p_ModuleDecl();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_ModuleDecl.add(p_ModuleDecl5.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_pm_Prolog_in_p_LibraryModule795);\n            pm_Prolog6=this.pm_Prolog();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_pm_Prolog.add(pm_Prolog6.getTree());\n\n\n            // AST REWRITE\n            // elements: pm_Prolog, p_ModuleDecl\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 316:17: -> ^( LibraryModule p_ModuleDecl pm_Prolog )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:316:20: ^( LibraryModule p_ModuleDecl pm_Prolog )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(LibraryModule, \"LibraryModule\"), root_1);\n\n                this.adaptor.addChild(root_1, vd);\n                this.adaptor.addChild(root_1, stream_p_ModuleDecl.nextTree());\n                this.adaptor.addChild(root_1, stream_pm_Prolog.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ModuleDecl_return: (function() {\n        XQueryParser.p_ModuleDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ModuleDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:320:1: p_ModuleDecl : k+= MODULE k+= NAMESPACE p_NCName EQUAL p_StringLiteral SEMICOLON -> ^( ModuleDecl p_NCName p_StringLiteral ) ;\n    // $ANTLR start \"p_ModuleDecl\"\n    p_ModuleDecl: function() {\n        var retval = new XQueryParser.p_ModuleDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var EQUAL8 = null;\n        var SEMICOLON10 = null;\n        var k = null;\n        var list_k=null;\n         var p_NCName7 = null;\n         var p_StringLiteral9 = null;\n\n        var EQUAL8_tree=null;\n        var SEMICOLON10_tree=null;\n        var k_tree=null;\n        var stream_SEMICOLON=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SEMICOLON\");\n        var stream_MODULE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token MODULE\");\n        var stream_NAMESPACE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token NAMESPACE\");\n        var stream_EQUAL=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EQUAL\");\n        var stream_p_NCName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_NCName\");\n        var stream_p_StringLiteral=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_StringLiteral\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:321:9: (k+= MODULE k+= NAMESPACE p_NCName EQUAL p_StringLiteral SEMICOLON -> ^( ModuleDecl p_NCName p_StringLiteral ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:321:11: k+= MODULE k+= NAMESPACE p_NCName EQUAL p_StringLiteral SEMICOLON\n            k=this.match(this.input,MODULE,XQueryParser.FOLLOW_MODULE_in_p_ModuleDecl851); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_MODULE.add(k);\n\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,NAMESPACE,XQueryParser.FOLLOW_NAMESPACE_in_p_ModuleDecl855); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_NAMESPACE.add(k);\n\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_ModuleDecl859);\n            p_NCName7=this.p_NCName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_NCName.add(p_NCName7.getTree());\n            EQUAL8=this.match(this.input,EQUAL,XQueryParser.FOLLOW_EQUAL_in_p_ModuleDecl861); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_EQUAL.add(EQUAL8);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_ModuleDecl863);\n            p_StringLiteral9=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(p_StringLiteral9.getTree());\n            SEMICOLON10=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_ModuleDecl865); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SEMICOLON.add(SEMICOLON10);\n\n\n\n            // AST REWRITE\n            // elements: p_NCName, p_StringLiteral\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 322:17: -> ^( ModuleDecl p_NCName p_StringLiteral )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:322:21: ^( ModuleDecl p_NCName p_StringLiteral )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(ModuleDecl, \"ModuleDecl\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_p_NCName.nextTree());\n                this.adaptor.addChild(root_1, stream_p_StringLiteral.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_Prolog_return: (function() {\n        XQueryParser.pm_Prolog_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_Prolog_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:328:1: pm_Prolog : ( (dnd+= pm_DefaultNamespaceDecl | s+= p_Setter | nd+= pm_NamespaceDecl | i+= p_Import | fto+= pm_FTOptionDecl ) )* (od+= pg_OrderedDecl )* -> ^( Prolog ^( DefaultNamespaceDecls ( $dnd)* ) ^( Setters ( $s)* ) ^( NamespaceDecls ( $nd)* ) ^( Imports ( $i)* ) ^( FTOptionDecls ( $fto)* ) ^( OrderedDecls ( $od)* ) ) ;\n    // $ANTLR start \"pm_Prolog\"\n    pm_Prolog: function() {\n        var retval = new XQueryParser.pm_Prolog_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var list_dnd=null;\n        var list_s=null;\n        var list_nd=null;\n        var list_i=null;\n        var list_fto=null;\n        var list_od=null;\n        var dnd = null;\n        var s = null;\n        var nd = null;\n        var i = null;\n        var fto = null;\n        var od = null;\n        var stream_pm_NamespaceDecl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pm_NamespaceDecl\");\n        var stream_p_Import=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_Import\");\n        var stream_p_Setter=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_Setter\");\n        var stream_pm_DefaultNamespaceDecl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pm_DefaultNamespaceDecl\");\n        var stream_pg_OrderedDecl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pg_OrderedDecl\");\n        var stream_pm_FTOptionDecl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pm_FTOptionDecl\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:9: ( ( (dnd+= pm_DefaultNamespaceDecl | s+= p_Setter | nd+= pm_NamespaceDecl | i+= p_Import | fto+= pm_FTOptionDecl ) )* (od+= pg_OrderedDecl )* -> ^( Prolog ^( DefaultNamespaceDecls ( $dnd)* ) ^( Setters ( $s)* ) ^( NamespaceDecls ( $nd)* ) ^( Imports ( $i)* ) ^( FTOptionDecls ( $fto)* ) ^( OrderedDecls ( $od)* ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:11: ( (dnd+= pm_DefaultNamespaceDecl | s+= p_Setter | nd+= pm_NamespaceDecl | i+= p_Import | fto+= pm_FTOptionDecl ) )* (od+= pg_OrderedDecl )*\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:11: ( (dnd+= pm_DefaultNamespaceDecl | s+= p_Setter | nd+= pm_NamespaceDecl | i+= p_Import | fto+= pm_FTOptionDecl ) )*\n            loop6:\n            do {\n                var alt6=2;\n                alt6 = this.dfa6.predict(this.input);\n                switch (alt6) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:12: (dnd+= pm_DefaultNamespaceDecl | s+= p_Setter | nd+= pm_NamespaceDecl | i+= p_Import | fto+= pm_FTOptionDecl )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:12: (dnd+= pm_DefaultNamespaceDecl | s+= p_Setter | nd+= pm_NamespaceDecl | i+= p_Import | fto+= pm_FTOptionDecl )\n                    var alt5=5;\n                    var LA5_0 = this.input.LA(1);\n\n                    if ( (LA5_0==DECLARE) ) {\n                        var LA5_1 = this.input.LA(2);\n\n                        if ( (LA5_1==REVALIDATION) && ((this.lc(XQU)))) {\n                            alt5=2;\n                        }\n                        else if ( (LA5_1==FT_OPTION) ) {\n                            alt5=5;\n                        }\n                        else if ( (LA5_1==DEFAULT) ) {\n                            var LA5_5 = this.input.LA(3);\n\n                            if ( (LA5_5==ELEMENT||LA5_5==FUNCTION) ) {\n                                alt5=1;\n                            }\n                            else if ( (LA5_5==COLLATION||LA5_5==ORDER||LA5_5==DECIMAL_FORMAT) ) {\n                                alt5=2;\n                            }\n                            else {\n                                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                                var nvae =\n                                    new org.antlr.runtime.NoViableAltException(\"\", 5, 5, this.input);\n\n                                throw nvae;\n                            }\n                        }\n                        else if ( ((LA5_1>=BASE_URI && LA5_1<=BOUNDARY_SPACE)||(LA5_1>=CONSTRUCTION && LA5_1<=COPY_NAMESPACES)||LA5_1==ORDERING||LA5_1==DECIMAL_FORMAT) ) {\n                            alt5=2;\n                        }\n                        else if ( (LA5_1==NAMESPACE) ) {\n                            alt5=3;\n                        }\n                        else {\n                            if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                            var nvae =\n                                new org.antlr.runtime.NoViableAltException(\"\", 5, 1, this.input);\n\n                            throw nvae;\n                        }\n                    }\n                    else if ( (LA5_0==IMPORT) ) {\n                        alt5=4;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 5, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt5) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:13: dnd+= pm_DefaultNamespaceDecl\n                            this.pushFollow(XQueryParser.FOLLOW_pm_DefaultNamespaceDecl_in_pm_Prolog924);\n                            dnd=this.pm_DefaultNamespaceDecl();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_pm_DefaultNamespaceDecl.add(dnd.getTree());\n                            if (org.antlr.lang.isNull(list_dnd)) list_dnd = [];\n                            list_dnd.push(dnd.getTree());\n\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:44: s+= p_Setter\n                            this.pushFollow(XQueryParser.FOLLOW_p_Setter_in_pm_Prolog930);\n                            s=this.p_Setter();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_Setter.add(s.getTree());\n                            if (org.antlr.lang.isNull(list_s)) list_s = [];\n                            list_s.push(s.getTree());\n\n\n\n                            break;\n                        case 3 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:58: nd+= pm_NamespaceDecl\n                            this.pushFollow(XQueryParser.FOLLOW_pm_NamespaceDecl_in_pm_Prolog936);\n                            nd=this.pm_NamespaceDecl();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_pm_NamespaceDecl.add(nd.getTree());\n                            if (org.antlr.lang.isNull(list_nd)) list_nd = [];\n                            list_nd.push(nd.getTree());\n\n\n\n                            break;\n                        case 4 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:81: i+= p_Import\n                            this.pushFollow(XQueryParser.FOLLOW_p_Import_in_pm_Prolog942);\n                            i=this.p_Import();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_Import.add(i.getTree());\n                            if (org.antlr.lang.isNull(list_i)) list_i = [];\n                            list_i.push(i.getTree());\n\n\n\n                            break;\n                        case 5 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:95: fto+= pm_FTOptionDecl\n                            this.pushFollow(XQueryParser.FOLLOW_pm_FTOptionDecl_in_pm_Prolog948);\n                            fto=this.pm_FTOptionDecl();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_pm_FTOptionDecl.add(fto.getTree());\n                            if (org.antlr.lang.isNull(list_fto)) list_fto = [];\n                            list_fto.push(fto.getTree());\n\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n\n                default :\n                    break loop6;\n                }\n            } while (true);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:121: (od+= pg_OrderedDecl )*\n            loop7:\n            do {\n                var alt7=2;\n                var LA7_0 = this.input.LA(1);\n\n                if ( (LA7_0==DECLARE) ) {\n                    var LA7_3 = this.input.LA(2);\n\n                    if ( (LA7_3==FUNCTION||LA7_3==OPTION||LA7_3==VARIABLE||LA7_3==CONTEXT||LA7_3==UPDATING||LA7_3==COLLECTION||(LA7_3>=INDEX && LA7_3<=INTEGRITY)||LA7_3==ANN_PERCENT) ) {\n                        alt7=1;\n                    }\n\n\n                }\n\n\n                switch (alt7) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:329:121: od+= pg_OrderedDecl\n                    this.pushFollow(XQueryParser.FOLLOW_pg_OrderedDecl_in_pm_Prolog955);\n                    od=this.pg_OrderedDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_pg_OrderedDecl.add(od.getTree());\n                    if (org.antlr.lang.isNull(list_od)) list_od = [];\n                    list_od.push(od.getTree());\n\n\n\n                    break;\n\n                default :\n                    break loop7;\n                }\n            } while (true);\n\n\n\n            // AST REWRITE\n            // elements: fto, od, dnd, nd, i, s\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: od, s, fto, nd, dnd, i\n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_od=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token od\",list_od);\n            var stream_s=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token s\",list_s);\n            var stream_fto=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token fto\",list_fto);\n            var stream_nd=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token nd\",list_nd);\n            var stream_dnd=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token dnd\",list_dnd);\n            var stream_i=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token i\",list_i);\n            root_0 = this.adaptor.nil();\n            // 330:17: -> ^( Prolog ^( DefaultNamespaceDecls ( $dnd)* ) ^( Setters ( $s)* ) ^( NamespaceDecls ( $nd)* ) ^( Imports ( $i)* ) ^( FTOptionDecls ( $fto)* ) ^( OrderedDecls ( $od)* ) )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:330:21: ^( Prolog ^( DefaultNamespaceDecls ( $dnd)* ) ^( Setters ( $s)* ) ^( NamespaceDecls ( $nd)* ) ^( Imports ( $i)* ) ^( FTOptionDecls ( $fto)* ) ^( OrderedDecls ( $od)* ) )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(Prolog, \"Prolog\"), root_1);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:331:33: ^( DefaultNamespaceDecls ( $dnd)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(DefaultNamespaceDecls, \"DefaultNamespaceDecls\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:331:57: ( $dnd)*\n                while ( stream_dnd.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_dnd.nextTree());\n\n                }\n                stream_dnd.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:332:33: ^( Setters ( $s)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(Setters, \"Setters\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:332:43: ( $s)*\n                while ( stream_s.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_s.nextTree());\n\n                }\n                stream_s.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:333:33: ^( NamespaceDecls ( $nd)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(NamespaceDecls, \"NamespaceDecls\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:333:50: ( $nd)*\n                while ( stream_nd.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_nd.nextTree());\n\n                }\n                stream_nd.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:334:33: ^( Imports ( $i)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(Imports, \"Imports\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:334:43: ( $i)*\n                while ( stream_i.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_i.nextTree());\n\n                }\n                stream_i.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:335:33: ^( FTOptionDecls ( $fto)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(FTOptionDecls, \"FTOptionDecls\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:335:49: ( $fto)*\n                while ( stream_fto.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_fto.nextTree());\n\n                }\n                stream_fto.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:336:33: ^( OrderedDecls ( $od)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(OrderedDecls, \"OrderedDecls\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:336:48: ( $od)*\n                while ( stream_od.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_od.nextTree());\n\n                }\n                stream_od.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_OrderedDecl_return: (function() {\n        XQueryParser.pg_OrderedDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_OrderedDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:344:1: pg_OrderedDecl : ( pm_ContextItemDecl | pm_AnnotatedDecl | pm_OptionDecl );\n    // $ANTLR start \"pg_OrderedDecl\"\n    pg_OrderedDecl: function() {\n        var retval = new XQueryParser.pg_OrderedDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var pm_ContextItemDecl11 = null;\n         var pm_AnnotatedDecl12 = null;\n         var pm_OptionDecl13 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:345:9: ( pm_ContextItemDecl | pm_AnnotatedDecl | pm_OptionDecl )\n            var alt8=3;\n            var LA8_0 = this.input.LA(1);\n\n            if ( (LA8_0==DECLARE) ) {\n                switch ( this.input.LA(2) ) {\n                case CONTEXT:\n                    alt8=1;\n                    break;\n                case FUNCTION:\n                case VARIABLE:\n                case UPDATING:\n                case COLLECTION:\n                case INDEX:\n                case INTEGRITY:\n                case ANN_PERCENT:\n                    alt8=2;\n                    break;\n                case OPTION:\n                    alt8=3;\n                    break;\n                default:\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 8, 1, this.input);\n\n                    throw nvae;\n                }\n\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 8, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt8) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:345:11: pm_ContextItemDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_ContextItemDecl_in_pg_OrderedDecl1270);\n                    pm_ContextItemDecl11=this.pm_ContextItemDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_ContextItemDecl11.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:346:11: pm_AnnotatedDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_AnnotatedDecl_in_pg_OrderedDecl1282);\n                    pm_AnnotatedDecl12=this.pm_AnnotatedDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_AnnotatedDecl12.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:347:11: pm_OptionDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_OptionDecl_in_pg_OrderedDecl1294);\n                    pm_OptionDecl13=this.pm_OptionDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_OptionDecl13.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Setter_return: (function() {\n        XQueryParser.p_Setter_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Setter_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:355:1: p_Setter : ( pm_BoundarySpaceDecl | pm_DefaultCollationDecl | pm_BaseURIDecl | pm_ConstructionDecl | pm_OrderingModeDecl | pm_EmptyOrderDecl | {...}? => pm_RevalidationDecl | pm_CopyNamespacesDecl | pm_DecimalFormatDecl );\n    // $ANTLR start \"p_Setter\"\n    p_Setter: function() {\n        var retval = new XQueryParser.p_Setter_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var pm_BoundarySpaceDecl14 = null;\n         var pm_DefaultCollationDecl15 = null;\n         var pm_BaseURIDecl16 = null;\n         var pm_ConstructionDecl17 = null;\n         var pm_OrderingModeDecl18 = null;\n         var pm_EmptyOrderDecl19 = null;\n         var pm_RevalidationDecl20 = null;\n         var pm_CopyNamespacesDecl21 = null;\n         var pm_DecimalFormatDecl22 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:356:9: ( pm_BoundarySpaceDecl | pm_DefaultCollationDecl | pm_BaseURIDecl | pm_ConstructionDecl | pm_OrderingModeDecl | pm_EmptyOrderDecl | {...}? => pm_RevalidationDecl | pm_CopyNamespacesDecl | pm_DecimalFormatDecl )\n            var alt9=9;\n            alt9 = this.dfa9.predict(this.input);\n            switch (alt9) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:356:11: pm_BoundarySpaceDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_BoundarySpaceDecl_in_p_Setter1324);\n                    pm_BoundarySpaceDecl14=this.pm_BoundarySpaceDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_BoundarySpaceDecl14.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:357:11: pm_DefaultCollationDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_DefaultCollationDecl_in_p_Setter1336);\n                    pm_DefaultCollationDecl15=this.pm_DefaultCollationDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_DefaultCollationDecl15.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:358:11: pm_BaseURIDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_BaseURIDecl_in_p_Setter1348);\n                    pm_BaseURIDecl16=this.pm_BaseURIDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_BaseURIDecl16.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:359:11: pm_ConstructionDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_ConstructionDecl_in_p_Setter1360);\n                    pm_ConstructionDecl17=this.pm_ConstructionDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_ConstructionDecl17.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:360:11: pm_OrderingModeDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_OrderingModeDecl_in_p_Setter1372);\n                    pm_OrderingModeDecl18=this.pm_OrderingModeDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_OrderingModeDecl18.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:361:11: pm_EmptyOrderDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_EmptyOrderDecl_in_p_Setter1384);\n                    pm_EmptyOrderDecl19=this.pm_EmptyOrderDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_EmptyOrderDecl19.getTree());\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:362:11: {...}? => pm_RevalidationDecl\n                    root_0 = this.adaptor.nil();\n\n                    if ( !((this.lc(XQU))) ) {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"p_Setter\", \"this.lc(XQU)\");\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_pm_RevalidationDecl_in_p_Setter1399);\n                    pm_RevalidationDecl20=this.pm_RevalidationDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_RevalidationDecl20.getTree());\n\n\n                    break;\n                case 8 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:363:11: pm_CopyNamespacesDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CopyNamespacesDecl_in_p_Setter1411);\n                    pm_CopyNamespacesDecl21=this.pm_CopyNamespacesDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CopyNamespacesDecl21.getTree());\n\n\n                    break;\n                case 9 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:364:11: pm_DecimalFormatDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_DecimalFormatDecl_in_p_Setter1423);\n                    pm_DecimalFormatDecl22=this.pm_DecimalFormatDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_DecimalFormatDecl22.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_BoundarySpaceDecl_return: (function() {\n        XQueryParser.pm_BoundarySpaceDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_BoundarySpaceDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:368:1: pm_BoundarySpaceDecl : k= DECLARE k= BOUNDARY_SPACE ( (k= PRESERVE ) | (k= STRIP ) ) SEMICOLON ;\n    // $ANTLR start \"pm_BoundarySpaceDecl\"\n    pm_BoundarySpaceDecl: function() {\n        var retval = new XQueryParser.pm_BoundarySpaceDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON23 = null;\n\n        var k_tree=null;\n        var SEMICOLON23_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:9: (k= DECLARE k= BOUNDARY_SPACE ( (k= PRESERVE ) | (k= STRIP ) ) SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:11: k= DECLARE k= BOUNDARY_SPACE ( (k= PRESERVE ) | (k= STRIP ) ) SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_BoundarySpaceDecl1455); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,BOUNDARY_SPACE,XQueryParser.FOLLOW_BOUNDARY_SPACE_in_pm_BoundarySpaceDecl1461); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:68: ( (k= PRESERVE ) | (k= STRIP ) )\n            var alt10=2;\n            var LA10_0 = this.input.LA(1);\n\n            if ( (LA10_0==PRESERVE) ) {\n                alt10=1;\n            }\n            else if ( (LA10_0==STRIP) ) {\n                alt10=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 10, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt10) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:70: (k= PRESERVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:70: (k= PRESERVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:71: k= PRESERVE\n                    k=this.match(this.input,PRESERVE,XQueryParser.FOLLOW_PRESERVE_in_pm_BoundarySpaceDecl1470); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:100: (k= STRIP )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:100: (k= STRIP )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:369:101: k= STRIP\n                    k=this.match(this.input,STRIP,XQueryParser.FOLLOW_STRIP_in_pm_BoundarySpaceDecl1480); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n\n            SEMICOLON23=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_BoundarySpaceDecl1487); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON23_tree = this.adaptor.create(SEMICOLON23);\n            this.adaptor.addChild(root_0, SEMICOLON23_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_DefaultCollationDecl_return: (function() {\n        XQueryParser.pm_DefaultCollationDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_DefaultCollationDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:373:1: pm_DefaultCollationDecl : k= DECLARE k= DEFAULT k= COLLATION p_StringLiteral SEMICOLON ;\n    // $ANTLR start \"pm_DefaultCollationDecl\"\n    pm_DefaultCollationDecl: function() {\n        var retval = new XQueryParser.pm_DefaultCollationDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON25 = null;\n         var p_StringLiteral24 = null;\n\n        var k_tree=null;\n        var SEMICOLON25_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:374:9: (k= DECLARE k= DEFAULT k= COLLATION p_StringLiteral SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:374:11: k= DECLARE k= DEFAULT k= COLLATION p_StringLiteral SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_DefaultCollationDecl1515); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_pm_DefaultCollationDecl1521); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,COLLATION,XQueryParser.FOLLOW_COLLATION_in_pm_DefaultCollationDecl1527); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_DefaultCollationDecl1531);\n            p_StringLiteral24=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral24.getTree());\n            SEMICOLON25=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_DefaultCollationDecl1533); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON25_tree = this.adaptor.create(SEMICOLON25);\n            this.adaptor.addChild(root_0, SEMICOLON25_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_BaseURIDecl_return: (function() {\n        XQueryParser.pm_BaseURIDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_BaseURIDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:378:1: pm_BaseURIDecl : k= DECLARE k= BASE_URI sl= p_StringLiteral SEMICOLON -> ^( BaseURIDecl $sl) ;\n    // $ANTLR start \"pm_BaseURIDecl\"\n    pm_BaseURIDecl: function() {\n        var retval = new XQueryParser.pm_BaseURIDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON26 = null;\n         var sl = null;\n\n        var k_tree=null;\n        var SEMICOLON26_tree=null;\n        var stream_DECLARE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token DECLARE\");\n        var stream_SEMICOLON=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SEMICOLON\");\n        var stream_BASE_URI=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token BASE_URI\");\n        var stream_p_StringLiteral=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_StringLiteral\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:379:9: (k= DECLARE k= BASE_URI sl= p_StringLiteral SEMICOLON -> ^( BaseURIDecl $sl) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:379:11: k= DECLARE k= BASE_URI sl= p_StringLiteral SEMICOLON\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_BaseURIDecl1569); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_DECLARE.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,BASE_URI,XQueryParser.FOLLOW_BASE_URI_in_pm_BaseURIDecl1575); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_BASE_URI.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_BaseURIDecl1581);\n            sl=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(sl.getTree());\n            SEMICOLON26=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_BaseURIDecl1583); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SEMICOLON.add(SEMICOLON26);\n\n\n\n            // AST REWRITE\n            // elements: sl\n            // token labels: \n            // rule labels: sl, retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_sl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token sl\",sl!=null?sl.tree:null);\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 380:17: -> ^( BaseURIDecl $sl)\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:380:20: ^( BaseURIDecl $sl)\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(BaseURIDecl, \"BaseURIDecl\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_sl.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_ConstructionDecl_return: (function() {\n        XQueryParser.pm_ConstructionDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_ConstructionDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:384:1: pm_ConstructionDecl : k= DECLARE k= CONSTRUCTION ( (k= STRIP | k= PRESERVE ) ) SEMICOLON ;\n    // $ANTLR start \"pm_ConstructionDecl\"\n    pm_ConstructionDecl: function() {\n        var retval = new XQueryParser.pm_ConstructionDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON27 = null;\n\n        var k_tree=null;\n        var SEMICOLON27_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:385:9: (k= DECLARE k= CONSTRUCTION ( (k= STRIP | k= PRESERVE ) ) SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:385:11: k= DECLARE k= CONSTRUCTION ( (k= STRIP | k= PRESERVE ) ) SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_ConstructionDecl1636); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,CONSTRUCTION,XQueryParser.FOLLOW_CONSTRUCTION_in_pm_ConstructionDecl1642); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:385:66: ( (k= STRIP | k= PRESERVE ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:385:68: (k= STRIP | k= PRESERVE )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:385:68: (k= STRIP | k= PRESERVE )\n            var alt11=2;\n            var LA11_0 = this.input.LA(1);\n\n            if ( (LA11_0==STRIP) ) {\n                alt11=1;\n            }\n            else if ( (LA11_0==PRESERVE) ) {\n                alt11=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 11, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt11) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:385:69: k= STRIP\n                    k=this.match(this.input,STRIP,XQueryParser.FOLLOW_STRIP_in_pm_ConstructionDecl1651); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:385:79: k= PRESERVE\n                    k=this.match(this.input,PRESERVE,XQueryParser.FOLLOW_PRESERVE_in_pm_ConstructionDecl1657); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            SEMICOLON27=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_ConstructionDecl1664); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON27_tree = this.adaptor.create(SEMICOLON27);\n            this.adaptor.addChild(root_0, SEMICOLON27_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_OrderingModeDecl_return: (function() {\n        XQueryParser.pm_OrderingModeDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_OrderingModeDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:389:1: pm_OrderingModeDecl : k= DECLARE k= ORDERING ( (k= ORDERED | k= UNORDERED ) ) SEMICOLON ;\n    // $ANTLR start \"pm_OrderingModeDecl\"\n    pm_OrderingModeDecl: function() {\n        var retval = new XQueryParser.pm_OrderingModeDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON28 = null;\n\n        var k_tree=null;\n        var SEMICOLON28_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:390:9: (k= DECLARE k= ORDERING ( (k= ORDERED | k= UNORDERED ) ) SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:390:11: k= DECLARE k= ORDERING ( (k= ORDERED | k= UNORDERED ) ) SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_OrderingModeDecl1692); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,ORDERING,XQueryParser.FOLLOW_ORDERING_in_pm_OrderingModeDecl1698); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:390:62: ( (k= ORDERED | k= UNORDERED ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:390:64: (k= ORDERED | k= UNORDERED )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:390:64: (k= ORDERED | k= UNORDERED )\n            var alt12=2;\n            var LA12_0 = this.input.LA(1);\n\n            if ( (LA12_0==ORDERED) ) {\n                alt12=1;\n            }\n            else if ( (LA12_0==UNORDERED) ) {\n                alt12=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 12, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt12) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:390:65: k= ORDERED\n                    k=this.match(this.input,ORDERED,XQueryParser.FOLLOW_ORDERED_in_pm_OrderingModeDecl1707); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:390:77: k= UNORDERED\n                    k=this.match(this.input,UNORDERED,XQueryParser.FOLLOW_UNORDERED_in_pm_OrderingModeDecl1713); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            SEMICOLON28=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_OrderingModeDecl1720); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON28_tree = this.adaptor.create(SEMICOLON28);\n            this.adaptor.addChild(root_0, SEMICOLON28_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_EmptyOrderDecl_return: (function() {\n        XQueryParser.pm_EmptyOrderDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_EmptyOrderDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:394:1: pm_EmptyOrderDecl : k= DECLARE k= DEFAULT k= ORDER k= EMPTY ( (k= GREATEST | k= LEAST ) ) SEMICOLON ;\n    // $ANTLR start \"pm_EmptyOrderDecl\"\n    pm_EmptyOrderDecl: function() {\n        var retval = new XQueryParser.pm_EmptyOrderDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON29 = null;\n\n        var k_tree=null;\n        var SEMICOLON29_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:395:9: (k= DECLARE k= DEFAULT k= ORDER k= EMPTY ( (k= GREATEST | k= LEAST ) ) SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:395:11: k= DECLARE k= DEFAULT k= ORDER k= EMPTY ( (k= GREATEST | k= LEAST ) ) SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_EmptyOrderDecl1748); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_pm_EmptyOrderDecl1754); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,ORDER,XQueryParser.FOLLOW_ORDER_in_pm_EmptyOrderDecl1760); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,EMPTY,XQueryParser.FOLLOW_EMPTY_in_pm_EmptyOrderDecl1766); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:395:107: ( (k= GREATEST | k= LEAST ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:395:109: (k= GREATEST | k= LEAST )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:395:109: (k= GREATEST | k= LEAST )\n            var alt13=2;\n            var LA13_0 = this.input.LA(1);\n\n            if ( (LA13_0==GREATEST) ) {\n                alt13=1;\n            }\n            else if ( (LA13_0==LEAST) ) {\n                alt13=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 13, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt13) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:395:110: k= GREATEST\n                    k=this.match(this.input,GREATEST,XQueryParser.FOLLOW_GREATEST_in_pm_EmptyOrderDecl1775); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:395:123: k= LEAST\n                    k=this.match(this.input,LEAST,XQueryParser.FOLLOW_LEAST_in_pm_EmptyOrderDecl1781); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            SEMICOLON29=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_EmptyOrderDecl1788); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON29_tree = this.adaptor.create(SEMICOLON29);\n            this.adaptor.addChild(root_0, SEMICOLON29_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_CopyNamespacesDecl_return: (function() {\n        XQueryParser.pm_CopyNamespacesDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_CopyNamespacesDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:399:1: pm_CopyNamespacesDecl : k= DECLARE k= COPY_NAMESPACES p_PreserveMode COMMA p_InheritMode SEMICOLON ;\n    // $ANTLR start \"pm_CopyNamespacesDecl\"\n    pm_CopyNamespacesDecl: function() {\n        var retval = new XQueryParser.pm_CopyNamespacesDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var COMMA31 = null;\n        var SEMICOLON33 = null;\n         var p_PreserveMode30 = null;\n         var p_InheritMode32 = null;\n\n        var k_tree=null;\n        var COMMA31_tree=null;\n        var SEMICOLON33_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:400:9: (k= DECLARE k= COPY_NAMESPACES p_PreserveMode COMMA p_InheritMode SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:400:11: k= DECLARE k= COPY_NAMESPACES p_PreserveMode COMMA p_InheritMode SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_CopyNamespacesDecl1816); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,COPY_NAMESPACES,XQueryParser.FOLLOW_COPY_NAMESPACES_in_pm_CopyNamespacesDecl1822); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_PreserveMode_in_pm_CopyNamespacesDecl1826);\n            p_PreserveMode30=this.p_PreserveMode();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PreserveMode30.getTree());\n            COMMA31=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_pm_CopyNamespacesDecl1828); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            COMMA31_tree = this.adaptor.create(COMMA31);\n            this.adaptor.addChild(root_0, COMMA31_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_InheritMode_in_pm_CopyNamespacesDecl1830);\n            p_InheritMode32=this.p_InheritMode();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InheritMode32.getTree());\n            SEMICOLON33=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_CopyNamespacesDecl1832); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON33_tree = this.adaptor.create(SEMICOLON33);\n            this.adaptor.addChild(root_0, SEMICOLON33_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PreserveMode_return: (function() {\n        XQueryParser.p_PreserveMode_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PreserveMode_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:404:1: p_PreserveMode : (k+= PRESERVE | k+= NO_PRESERVE ) ;\n    // $ANTLR start \"p_PreserveMode\"\n    p_PreserveMode: function() {\n        var retval = new XQueryParser.p_PreserveMode_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:405:9: ( (k+= PRESERVE | k+= NO_PRESERVE ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:405:11: (k+= PRESERVE | k+= NO_PRESERVE )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:405:11: (k+= PRESERVE | k+= NO_PRESERVE )\n            var alt14=2;\n            var LA14_0 = this.input.LA(1);\n\n            if ( (LA14_0==PRESERVE) ) {\n                alt14=1;\n            }\n            else if ( (LA14_0==NO_PRESERVE) ) {\n                alt14=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 14, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt14) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:405:12: k+= PRESERVE\n                    k=this.match(this.input,PRESERVE,XQueryParser.FOLLOW_PRESERVE_in_p_PreserveMode1861); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:405:26: k+= NO_PRESERVE\n                    k=this.match(this.input,NO_PRESERVE,XQueryParser.FOLLOW_NO_PRESERVE_in_p_PreserveMode1867); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_InheritMode_return: (function() {\n        XQueryParser.p_InheritMode_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_InheritMode_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:409:1: p_InheritMode : (k+= INHERIT | k+= NO_INHERIT ) ;\n    // $ANTLR start \"p_InheritMode\"\n    p_InheritMode: function() {\n        var retval = new XQueryParser.p_InheritMode_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:410:9: ( (k+= INHERIT | k+= NO_INHERIT ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:410:11: (k+= INHERIT | k+= NO_INHERIT )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:410:11: (k+= INHERIT | k+= NO_INHERIT )\n            var alt15=2;\n            var LA15_0 = this.input.LA(1);\n\n            if ( (LA15_0==INHERIT) ) {\n                alt15=1;\n            }\n            else if ( (LA15_0==NO_INHERIT) ) {\n                alt15=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 15, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt15) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:410:12: k+= INHERIT\n                    k=this.match(this.input,INHERIT,XQueryParser.FOLLOW_INHERIT_in_p_InheritMode1899); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:410:25: k+= NO_INHERIT\n                    k=this.match(this.input,NO_INHERIT,XQueryParser.FOLLOW_NO_INHERIT_in_p_InheritMode1905); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_DecimalFormatDecl_return: (function() {\n        XQueryParser.pm_DecimalFormatDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_DecimalFormatDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:414:1: pm_DecimalFormatDecl : k= DECLARE ( (k= DECIMAL_FORMAT p_EQName ) | (k= DEFAULT k= DECIMAL_FORMAT ) ) ( p_DFPropertyName EQUAL p_StringLiteral )* SEMICOLON ;\n    // $ANTLR start \"pm_DecimalFormatDecl\"\n    pm_DecimalFormatDecl: function() {\n        var retval = new XQueryParser.pm_DecimalFormatDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var EQUAL36 = null;\n        var SEMICOLON38 = null;\n         var p_EQName34 = null;\n         var p_DFPropertyName35 = null;\n         var p_StringLiteral37 = null;\n\n        var k_tree=null;\n        var EQUAL36_tree=null;\n        var SEMICOLON38_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:9: (k= DECLARE ( (k= DECIMAL_FORMAT p_EQName ) | (k= DEFAULT k= DECIMAL_FORMAT ) ) ( p_DFPropertyName EQUAL p_StringLiteral )* SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:11: k= DECLARE ( (k= DECIMAL_FORMAT p_EQName ) | (k= DEFAULT k= DECIMAL_FORMAT ) ) ( p_DFPropertyName EQUAL p_StringLiteral )* SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_DecimalFormatDecl1944); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:36: ( (k= DECIMAL_FORMAT p_EQName ) | (k= DEFAULT k= DECIMAL_FORMAT ) )\n            var alt16=2;\n            var LA16_0 = this.input.LA(1);\n\n            if ( (LA16_0==DECIMAL_FORMAT) ) {\n                alt16=1;\n            }\n            else if ( (LA16_0==DEFAULT) ) {\n                alt16=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 16, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt16) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:37: (k= DECIMAL_FORMAT p_EQName )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:37: (k= DECIMAL_FORMAT p_EQName )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:38: k= DECIMAL_FORMAT p_EQName\n                    k=this.match(this.input,DECIMAL_FORMAT,XQueryParser.FOLLOW_DECIMAL_FORMAT_in_pm_DecimalFormatDecl1952); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_pm_DecimalFormatDecl1956);\n                    p_EQName34=this.p_EQName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName34.getTree());\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:82: (k= DEFAULT k= DECIMAL_FORMAT )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:82: (k= DEFAULT k= DECIMAL_FORMAT )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:83: k= DEFAULT k= DECIMAL_FORMAT\n                    k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_pm_DecimalFormatDecl1964); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    k=this.match(this.input,DECIMAL_FORMAT,XQueryParser.FOLLOW_DECIMAL_FORMAT_in_pm_DecimalFormatDecl1970); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:142: ( p_DFPropertyName EQUAL p_StringLiteral )*\n            loop17:\n            do {\n                var alt17=2;\n                var LA17_0 = this.input.LA(1);\n\n                if ( ((LA17_0>=DECIMAL_SEPARATOR && LA17_0<=DIGIT)||(LA17_0>=GROUPING_SEPARATOR && LA17_0<=MINUS_SIGN)||LA17_0==NAN||(LA17_0>=PATTERN_SEPARATOR && LA17_0<=PER_MILLE)||LA17_0==ZERO_DIGIT) ) {\n                    alt17=1;\n                }\n\n\n                switch (alt17) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:415:143: p_DFPropertyName EQUAL p_StringLiteral\n                    this.pushFollow(XQueryParser.FOLLOW_p_DFPropertyName_in_pm_DecimalFormatDecl1977);\n                    p_DFPropertyName35=this.p_DFPropertyName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DFPropertyName35.getTree());\n                    EQUAL36=this.match(this.input,EQUAL,XQueryParser.FOLLOW_EQUAL_in_pm_DecimalFormatDecl1979); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    EQUAL36_tree = this.adaptor.create(EQUAL36);\n                    this.adaptor.addChild(root_0, EQUAL36_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_DecimalFormatDecl1981);\n                    p_StringLiteral37=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral37.getTree());\n\n\n                    break;\n\n                default :\n                    break loop17;\n                }\n            } while (true);\n\n            SEMICOLON38=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_DecimalFormatDecl1985); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON38_tree = this.adaptor.create(SEMICOLON38);\n            this.adaptor.addChild(root_0, SEMICOLON38_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DFPropertyName_return: (function() {\n        XQueryParser.p_DFPropertyName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DFPropertyName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:419:1: p_DFPropertyName : (k= DECIMAL_SEPARATOR | k= GROUPING_SEPARATOR | k= INFINITY | k= MINUS_SIGN | k= NAN | k= PERCENT | k= PER_MILLE | k= ZERO_DIGIT | k= DIGIT | k= PATTERN_SEPARATOR ) ;\n    // $ANTLR start \"p_DFPropertyName\"\n    p_DFPropertyName: function() {\n        var retval = new XQueryParser.p_DFPropertyName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:9: ( (k= DECIMAL_SEPARATOR | k= GROUPING_SEPARATOR | k= INFINITY | k= MINUS_SIGN | k= NAN | k= PERCENT | k= PER_MILLE | k= ZERO_DIGIT | k= DIGIT | k= PATTERN_SEPARATOR ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:11: (k= DECIMAL_SEPARATOR | k= GROUPING_SEPARATOR | k= INFINITY | k= MINUS_SIGN | k= NAN | k= PERCENT | k= PER_MILLE | k= ZERO_DIGIT | k= DIGIT | k= PATTERN_SEPARATOR )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:11: (k= DECIMAL_SEPARATOR | k= GROUPING_SEPARATOR | k= INFINITY | k= MINUS_SIGN | k= NAN | k= PERCENT | k= PER_MILLE | k= ZERO_DIGIT | k= DIGIT | k= PATTERN_SEPARATOR )\n            var alt18=10;\n            switch ( this.input.LA(1) ) {\n            case DECIMAL_SEPARATOR:\n                alt18=1;\n                break;\n            case GROUPING_SEPARATOR:\n                alt18=2;\n                break;\n            case INFINITY:\n                alt18=3;\n                break;\n            case MINUS_SIGN:\n                alt18=4;\n                break;\n            case NAN:\n                alt18=5;\n                break;\n            case PERCENT:\n                alt18=6;\n                break;\n            case PER_MILLE:\n                alt18=7;\n                break;\n            case ZERO_DIGIT:\n                alt18=8;\n                break;\n            case DIGIT:\n                alt18=9;\n                break;\n            case PATTERN_SEPARATOR:\n                alt18=10;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 18, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt18) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:12: k= DECIMAL_SEPARATOR\n                    k=this.match(this.input,DECIMAL_SEPARATOR,XQueryParser.FOLLOW_DECIMAL_SEPARATOR_in_p_DFPropertyName2014); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:34: k= GROUPING_SEPARATOR\n                    k=this.match(this.input,GROUPING_SEPARATOR,XQueryParser.FOLLOW_GROUPING_SEPARATOR_in_p_DFPropertyName2020); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:57: k= INFINITY\n                    k=this.match(this.input,INFINITY,XQueryParser.FOLLOW_INFINITY_in_p_DFPropertyName2026); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:70: k= MINUS_SIGN\n                    k=this.match(this.input,MINUS_SIGN,XQueryParser.FOLLOW_MINUS_SIGN_in_p_DFPropertyName2032); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:85: k= NAN\n                    k=this.match(this.input,NAN,XQueryParser.FOLLOW_NAN_in_p_DFPropertyName2038); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:93: k= PERCENT\n                    k=this.match(this.input,PERCENT,XQueryParser.FOLLOW_PERCENT_in_p_DFPropertyName2044); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:105: k= PER_MILLE\n                    k=this.match(this.input,PER_MILLE,XQueryParser.FOLLOW_PER_MILLE_in_p_DFPropertyName2050); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 8 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:119: k= ZERO_DIGIT\n                    k=this.match(this.input,ZERO_DIGIT,XQueryParser.FOLLOW_ZERO_DIGIT_in_p_DFPropertyName2056); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 9 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:134: k= DIGIT\n                    k=this.match(this.input,DIGIT,XQueryParser.FOLLOW_DIGIT_in_p_DFPropertyName2062); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 10 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:420:144: k= PATTERN_SEPARATOR\n                    k=this.match(this.input,PATTERN_SEPARATOR,XQueryParser.FOLLOW_PATTERN_SEPARATOR_in_p_DFPropertyName2068); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Import_return: (function() {\n        XQueryParser.p_Import_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Import_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:424:1: p_Import : ( pm_SchemaImport | pm_ModuleImport );\n    // $ANTLR start \"p_Import\"\n    p_Import: function() {\n        var retval = new XQueryParser.p_Import_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var pm_SchemaImport39 = null;\n         var pm_ModuleImport40 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:425:9: ( pm_SchemaImport | pm_ModuleImport )\n            var alt19=2;\n            var LA19_0 = this.input.LA(1);\n\n            if ( (LA19_0==IMPORT) ) {\n                var LA19_1 = this.input.LA(2);\n\n                if ( (LA19_1==SCHEMA) ) {\n                    alt19=1;\n                }\n                else if ( (LA19_1==MODULE) ) {\n                    alt19=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 19, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 19, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt19) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:425:11: pm_SchemaImport\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_SchemaImport_in_p_Import2097);\n                    pm_SchemaImport39=this.pm_SchemaImport();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_SchemaImport39.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:425:29: pm_ModuleImport\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_ModuleImport_in_p_Import2101);\n                    pm_ModuleImport40=this.pm_ModuleImport();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_ModuleImport40.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_SchemaImport_return: (function() {\n        XQueryParser.pm_SchemaImport_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_SchemaImport_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:429:1: pm_SchemaImport : k= IMPORT k= SCHEMA (sp= p_SchemaPrefix )? us= p_StringLiteral (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )? SEMICOLON -> ^( SchemaImport ^( SchemaPrefix ( $sp)? ) $us ^( AtHints ( $ah)* ) ) ;\n    // $ANTLR start \"pm_SchemaImport\"\n    pm_SchemaImport: function() {\n        var retval = new XQueryParser.pm_SchemaImport_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var COMMA41 = null;\n        var SEMICOLON42 = null;\n        var list_ah=null;\n         var sp = null;\n         var us = null;\n        var ah = null;\n        var k_tree=null;\n        var COMMA41_tree=null;\n        var SEMICOLON42_tree=null;\n        var stream_AT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token AT\");\n        var stream_IMPORT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token IMPORT\");\n        var stream_SCHEMA=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SCHEMA\");\n        var stream_SEMICOLON=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SEMICOLON\");\n        var stream_COMMA=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token COMMA\");\n        var stream_p_SchemaPrefix=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_SchemaPrefix\");\n        var stream_p_StringLiteral=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_StringLiteral\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:9: (k= IMPORT k= SCHEMA (sp= p_SchemaPrefix )? us= p_StringLiteral (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )? SEMICOLON -> ^( SchemaImport ^( SchemaPrefix ( $sp)? ) $us ^( AtHints ( $ah)* ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:11: k= IMPORT k= SCHEMA (sp= p_SchemaPrefix )? us= p_StringLiteral (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )? SEMICOLON\n            k=this.match(this.input,IMPORT,XQueryParser.FOLLOW_IMPORT_in_pm_SchemaImport2137); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_IMPORT.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,SCHEMA,XQueryParser.FOLLOW_SCHEMA_in_pm_SchemaImport2143); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SCHEMA.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:61: (sp= p_SchemaPrefix )?\n            var alt20=2;\n            var LA20_0 = this.input.LA(1);\n\n            if ( (LA20_0==DEFAULT||LA20_0==NAMESPACE) ) {\n                alt20=1;\n            }\n            switch (alt20) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:61: sp= p_SchemaPrefix\n                    this.pushFollow(XQueryParser.FOLLOW_p_SchemaPrefix_in_pm_SchemaImport2149);\n                    sp=this.p_SchemaPrefix();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_SchemaPrefix.add(sp.getTree());\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_SchemaImport2154);\n            us=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(us.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:97: (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )?\n            var alt22=2;\n            var LA22_0 = this.input.LA(1);\n\n            if ( (LA22_0==AT) ) {\n                alt22=1;\n            }\n            switch (alt22) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:98: k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )*\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_pm_SchemaImport2159); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_AT.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_SchemaImport2165);\n                    ah=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(ah.getTree());\n                    if (org.antlr.lang.isNull(list_ah)) list_ah = [];\n                    list_ah.push(ah.getTree());\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:138: ( COMMA ah+= p_StringLiteral )*\n                    loop21:\n                    do {\n                        var alt21=2;\n                        var LA21_0 = this.input.LA(1);\n\n                        if ( (LA21_0==COMMA) ) {\n                            alt21=1;\n                        }\n\n\n                        switch (alt21) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:430:139: COMMA ah+= p_StringLiteral\n                            COMMA41=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_pm_SchemaImport2168); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_COMMA.add(COMMA41);\n\n                            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_SchemaImport2172);\n                            ah=this.p_StringLiteral();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(ah.getTree());\n                            if (org.antlr.lang.isNull(list_ah)) list_ah = [];\n                            list_ah.push(ah.getTree());\n\n\n\n                            break;\n\n                        default :\n                            break loop21;\n                        }\n                    } while (true);\n\n\n\n                    break;\n\n            }\n\n            SEMICOLON42=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_SchemaImport2178); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SEMICOLON.add(SEMICOLON42);\n\n\n\n            // AST REWRITE\n            // elements: us, ah, sp\n            // token labels: \n            // rule labels: retval, sp, us\n            // token list labels: \n            // rule list labels: ah\n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_sp=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token sp\",sp!=null?sp.tree:null);\n            var stream_us=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token us\",us!=null?us.tree:null);\n            var stream_ah=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token ah\",list_ah);\n            root_0 = this.adaptor.nil();\n            // 431:17: -> ^( SchemaImport ^( SchemaPrefix ( $sp)? ) $us ^( AtHints ( $ah)* ) )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:431:20: ^( SchemaImport ^( SchemaPrefix ( $sp)? ) $us ^( AtHints ( $ah)* ) )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(SchemaImport, \"SchemaImport\"), root_1);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:431:35: ^( SchemaPrefix ( $sp)? )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(SchemaPrefix, \"SchemaPrefix\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:431:50: ( $sp)?\n                if ( stream_sp.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_sp.nextTree());\n\n                }\n                stream_sp.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                this.adaptor.addChild(root_1, stream_us.nextTree());\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:431:60: ^( AtHints ( $ah)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(AtHints, \"AtHints\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:431:70: ( $ah)*\n                while ( stream_ah.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_ah.nextTree());\n\n                }\n                stream_ah.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SchemaPrefix_return: (function() {\n        XQueryParser.p_SchemaPrefix_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SchemaPrefix_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:435:1: p_SchemaPrefix : (k= NAMESPACE nn= p_NCName EQUAL -> ^( NamespaceName $nn) | k= DEFAULT k= ELEMENT k= NAMESPACE -> DefaultElementNamespace );\n    // $ANTLR start \"p_SchemaPrefix\"\n    p_SchemaPrefix: function() {\n        var retval = new XQueryParser.p_SchemaPrefix_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var EQUAL43 = null;\n         var nn = null;\n\n        var k_tree=null;\n        var EQUAL43_tree=null;\n        var stream_ELEMENT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token ELEMENT\");\n        var stream_NAMESPACE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token NAMESPACE\");\n        var stream_EQUAL=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EQUAL\");\n        var stream_DEFAULT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token DEFAULT\");\n        var stream_p_NCName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_NCName\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:436:9: (k= NAMESPACE nn= p_NCName EQUAL -> ^( NamespaceName $nn) | k= DEFAULT k= ELEMENT k= NAMESPACE -> DefaultElementNamespace )\n            var alt23=2;\n            var LA23_0 = this.input.LA(1);\n\n            if ( (LA23_0==NAMESPACE) ) {\n                alt23=1;\n            }\n            else if ( (LA23_0==DEFAULT) ) {\n                alt23=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 23, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt23) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:436:11: k= NAMESPACE nn= p_NCName EQUAL\n                    k=this.match(this.input,NAMESPACE,XQueryParser.FOLLOW_NAMESPACE_in_p_SchemaPrefix2248); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_NAMESPACE.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_SchemaPrefix2254);\n                    nn=this.p_NCName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_NCName.add(nn.getTree());\n                    EQUAL43=this.match(this.input,EQUAL,XQueryParser.FOLLOW_EQUAL_in_p_SchemaPrefix2256); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_EQUAL.add(EQUAL43);\n\n\n\n                    // AST REWRITE\n                    // elements: nn\n                    // token labels: \n                    // rule labels: retval, nn\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n                    var stream_nn=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token nn\",nn!=null?nn.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 437:17: -> ^( NamespaceName $nn)\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:437:20: ^( NamespaceName $nn)\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(NamespaceName, \"NamespaceName\"), root_1);\n\n                        this.adaptor.addChild(root_1, stream_nn.nextTree());\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:438:11: k= DEFAULT k= ELEMENT k= NAMESPACE\n                    k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_SchemaPrefix2295); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_DEFAULT.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    k=this.match(this.input,ELEMENT,XQueryParser.FOLLOW_ELEMENT_in_p_SchemaPrefix2301); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_ELEMENT.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    k=this.match(this.input,NAMESPACE,XQueryParser.FOLLOW_NAMESPACE_in_p_SchemaPrefix2307); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_NAMESPACE.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n                    // AST REWRITE\n                    // elements: \n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 439:17: -> DefaultElementNamespace\n                    {\n                        this.adaptor.addChild(root_0, this.adaptor.create(DefaultElementNamespace, \"DefaultElementNamespace\"));\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_ModuleImport_return: (function() {\n        XQueryParser.pm_ModuleImport_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_ModuleImport_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:443:1: pm_ModuleImport : k= IMPORT k= MODULE (k= NAMESPACE nn= p_NCName EQUAL )? us= p_StringLiteral (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )? SEMICOLON -> ^( ModuleImport ^( NamespaceName ( $nn)? ) $us ^( AtHints ( $ah)* ) ) ;\n    // $ANTLR start \"pm_ModuleImport\"\n    pm_ModuleImport: function() {\n        var retval = new XQueryParser.pm_ModuleImport_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var EQUAL44 = null;\n        var COMMA45 = null;\n        var SEMICOLON46 = null;\n        var list_ah=null;\n         var nn = null;\n         var us = null;\n        var ah = null;\n        var k_tree=null;\n        var EQUAL44_tree=null;\n        var COMMA45_tree=null;\n        var SEMICOLON46_tree=null;\n        var stream_AT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token AT\");\n        var stream_IMPORT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token IMPORT\");\n        var stream_SEMICOLON=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SEMICOLON\");\n        var stream_MODULE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token MODULE\");\n        var stream_COMMA=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token COMMA\");\n        var stream_NAMESPACE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token NAMESPACE\");\n        var stream_EQUAL=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EQUAL\");\n        var stream_p_NCName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_NCName\");\n        var stream_p_StringLiteral=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_StringLiteral\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:9: (k= IMPORT k= MODULE (k= NAMESPACE nn= p_NCName EQUAL )? us= p_StringLiteral (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )? SEMICOLON -> ^( ModuleImport ^( NamespaceName ( $nn)? ) $us ^( AtHints ( $ah)* ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:11: k= IMPORT k= MODULE (k= NAMESPACE nn= p_NCName EQUAL )? us= p_StringLiteral (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )? SEMICOLON\n            k=this.match(this.input,IMPORT,XQueryParser.FOLLOW_IMPORT_in_pm_ModuleImport2357); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_IMPORT.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,MODULE,XQueryParser.FOLLOW_MODULE_in_pm_ModuleImport2363); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_MODULE.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:59: (k= NAMESPACE nn= p_NCName EQUAL )?\n            var alt24=2;\n            var LA24_0 = this.input.LA(1);\n\n            if ( (LA24_0==NAMESPACE) ) {\n                alt24=1;\n            }\n            switch (alt24) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:60: k= NAMESPACE nn= p_NCName EQUAL\n                    k=this.match(this.input,NAMESPACE,XQueryParser.FOLLOW_NAMESPACE_in_pm_ModuleImport2370); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_NAMESPACE.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_pm_ModuleImport2376);\n                    nn=this.p_NCName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_NCName.add(nn.getTree());\n                    EQUAL44=this.match(this.input,EQUAL,XQueryParser.FOLLOW_EQUAL_in_pm_ModuleImport2378); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_EQUAL.add(EQUAL44);\n\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_ModuleImport2384);\n            us=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(us.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:126: (k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )* )?\n            var alt26=2;\n            var LA26_0 = this.input.LA(1);\n\n            if ( (LA26_0==AT) ) {\n                alt26=1;\n            }\n            switch (alt26) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:127: k= AT ah+= p_StringLiteral ( COMMA ah+= p_StringLiteral )*\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_pm_ModuleImport2389); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_AT.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_ModuleImport2395);\n                    ah=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(ah.getTree());\n                    if (org.antlr.lang.isNull(list_ah)) list_ah = [];\n                    list_ah.push(ah.getTree());\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:167: ( COMMA ah+= p_StringLiteral )*\n                    loop25:\n                    do {\n                        var alt25=2;\n                        var LA25_0 = this.input.LA(1);\n\n                        if ( (LA25_0==COMMA) ) {\n                            alt25=1;\n                        }\n\n\n                        switch (alt25) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:444:168: COMMA ah+= p_StringLiteral\n                            COMMA45=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_pm_ModuleImport2398); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_COMMA.add(COMMA45);\n\n                            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_ModuleImport2402);\n                            ah=this.p_StringLiteral();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(ah.getTree());\n                            if (org.antlr.lang.isNull(list_ah)) list_ah = [];\n                            list_ah.push(ah.getTree());\n\n\n\n                            break;\n\n                        default :\n                            break loop25;\n                        }\n                    } while (true);\n\n\n\n                    break;\n\n            }\n\n            SEMICOLON46=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_ModuleImport2408); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SEMICOLON.add(SEMICOLON46);\n\n\n\n            // AST REWRITE\n            // elements: nn, us, ah\n            // token labels: \n            // rule labels: retval, nn, us\n            // token list labels: \n            // rule list labels: ah\n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_nn=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token nn\",nn!=null?nn.tree:null);\n            var stream_us=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token us\",us!=null?us.tree:null);\n            var stream_ah=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token ah\",list_ah);\n            root_0 = this.adaptor.nil();\n            // 445:17: -> ^( ModuleImport ^( NamespaceName ( $nn)? ) $us ^( AtHints ( $ah)* ) )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:445:20: ^( ModuleImport ^( NamespaceName ( $nn)? ) $us ^( AtHints ( $ah)* ) )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(ModuleImport, \"ModuleImport\"), root_1);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:445:35: ^( NamespaceName ( $nn)? )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(NamespaceName, \"NamespaceName\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:445:51: ( $nn)?\n                if ( stream_nn.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_nn.nextTree());\n\n                }\n                stream_nn.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                this.adaptor.addChild(root_1, stream_us.nextTree());\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:445:61: ^( AtHints ( $ah)* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(AtHints, \"AtHints\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:445:71: ( $ah)*\n                while ( stream_ah.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_ah.nextTree());\n\n                }\n                stream_ah.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_NamespaceDecl_return: (function() {\n        XQueryParser.pm_NamespaceDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_NamespaceDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:449:1: pm_NamespaceDecl : k= DECLARE k= NAMESPACE nn= p_NCName EQUAL us= p_StringLiteral SEMICOLON -> ^( NamespaceDecl $nn $us) ;\n    // $ANTLR start \"pm_NamespaceDecl\"\n    pm_NamespaceDecl: function() {\n        var retval = new XQueryParser.pm_NamespaceDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var EQUAL47 = null;\n        var SEMICOLON48 = null;\n         var nn = null;\n         var us = null;\n\n        var k_tree=null;\n        var EQUAL47_tree=null;\n        var SEMICOLON48_tree=null;\n        var stream_DECLARE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token DECLARE\");\n        var stream_SEMICOLON=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SEMICOLON\");\n        var stream_NAMESPACE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token NAMESPACE\");\n        var stream_EQUAL=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EQUAL\");\n        var stream_p_NCName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_NCName\");\n        var stream_p_StringLiteral=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_StringLiteral\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:450:9: (k= DECLARE k= NAMESPACE nn= p_NCName EQUAL us= p_StringLiteral SEMICOLON -> ^( NamespaceDecl $nn $us) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:450:11: k= DECLARE k= NAMESPACE nn= p_NCName EQUAL us= p_StringLiteral SEMICOLON\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_NamespaceDecl2477); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_DECLARE.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,NAMESPACE,XQueryParser.FOLLOW_NAMESPACE_in_pm_NamespaceDecl2483); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_NAMESPACE.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_pm_NamespaceDecl2489);\n            nn=this.p_NCName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_NCName.add(nn.getTree());\n            EQUAL47=this.match(this.input,EQUAL,XQueryParser.FOLLOW_EQUAL_in_pm_NamespaceDecl2491); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_EQUAL.add(EQUAL47);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_NamespaceDecl2495);\n            us=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_StringLiteral.add(us.getTree());\n            SEMICOLON48=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_NamespaceDecl2497); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SEMICOLON.add(SEMICOLON48);\n\n\n\n            // AST REWRITE\n            // elements: nn, us\n            // token labels: \n            // rule labels: retval, nn, us\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_nn=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token nn\",nn!=null?nn.tree:null);\n            var stream_us=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token us\",us!=null?us.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 451:17: -> ^( NamespaceDecl $nn $us)\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:451:20: ^( NamespaceDecl $nn $us)\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(NamespaceDecl, \"NamespaceDecl\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_nn.nextTree());\n                this.adaptor.addChild(root_1, stream_us.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_DefaultNamespaceDecl_return: (function() {\n        XQueryParser.pm_DefaultNamespaceDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_DefaultNamespaceDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:455:1: pm_DefaultNamespaceDecl : k= DECLARE k= DEFAULT (k= ELEMENT | k= FUNCTION ) k= NAMESPACE p_StringLiteral SEMICOLON ;\n    // $ANTLR start \"pm_DefaultNamespaceDecl\"\n    pm_DefaultNamespaceDecl: function() {\n        var retval = new XQueryParser.pm_DefaultNamespaceDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON50 = null;\n         var p_StringLiteral49 = null;\n\n        var k_tree=null;\n        var SEMICOLON50_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:456:9: (k= DECLARE k= DEFAULT (k= ELEMENT | k= FUNCTION ) k= NAMESPACE p_StringLiteral SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:456:11: k= DECLARE k= DEFAULT (k= ELEMENT | k= FUNCTION ) k= NAMESPACE p_StringLiteral SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_DefaultNamespaceDecl2554); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_pm_DefaultNamespaceDecl2560); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:456:61: (k= ELEMENT | k= FUNCTION )\n            var alt27=2;\n            var LA27_0 = this.input.LA(1);\n\n            if ( (LA27_0==ELEMENT) ) {\n                alt27=1;\n            }\n            else if ( (LA27_0==FUNCTION) ) {\n                alt27=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 27, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt27) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:456:62: k= ELEMENT\n                    k=this.match(this.input,ELEMENT,XQueryParser.FOLLOW_ELEMENT_in_pm_DefaultNamespaceDecl2567); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:456:74: k= FUNCTION\n                    k=this.match(this.input,FUNCTION,XQueryParser.FOLLOW_FUNCTION_in_pm_DefaultNamespaceDecl2573); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,NAMESPACE,XQueryParser.FOLLOW_NAMESPACE_in_pm_DefaultNamespaceDecl2580); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_DefaultNamespaceDecl2584);\n            p_StringLiteral49=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral49.getTree());\n            SEMICOLON50=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_DefaultNamespaceDecl2586); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON50_tree = this.adaptor.create(SEMICOLON50);\n            this.adaptor.addChild(root_0, SEMICOLON50_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_AnnotatedDecl_return: (function() {\n        XQueryParser.pm_AnnotatedDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_AnnotatedDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:460:1: pm_AnnotatedDecl : k= DECLARE ( p_Annotation )* pg_AnnotatedDecl SEMICOLON ;\n    // $ANTLR start \"pm_AnnotatedDecl\"\n    pm_AnnotatedDecl: function() {\n        var retval = new XQueryParser.pm_AnnotatedDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON53 = null;\n         var p_Annotation51 = null;\n         var pg_AnnotatedDecl52 = null;\n\n        var k_tree=null;\n        var SEMICOLON53_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:461:9: (k= DECLARE ( p_Annotation )* pg_AnnotatedDecl SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:461:11: k= DECLARE ( p_Annotation )* pg_AnnotatedDecl SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_AnnotatedDecl2614); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:461:36: ( p_Annotation )*\n            loop28:\n            do {\n                var alt28=2;\n                var LA28_0 = this.input.LA(1);\n\n                if ( (LA28_0==ANN_PERCENT) ) {\n                    alt28=1;\n                }\n\n\n                switch (alt28) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:461:36: p_Annotation\n                    this.pushFollow(XQueryParser.FOLLOW_p_Annotation_in_pm_AnnotatedDecl2618);\n                    p_Annotation51=this.p_Annotation();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Annotation51.getTree());\n\n\n                    break;\n\n                default :\n                    break loop28;\n                }\n            } while (true);\n\n            this.pushFollow(XQueryParser.FOLLOW_pg_AnnotatedDecl_in_pm_AnnotatedDecl2621);\n            pg_AnnotatedDecl52=this.pg_AnnotatedDecl();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pg_AnnotatedDecl52.getTree());\n            SEMICOLON53=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_AnnotatedDecl2623); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON53_tree = this.adaptor.create(SEMICOLON53);\n            this.adaptor.addChild(root_0, SEMICOLON53_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_AnnotatedDecl_return: (function() {\n        XQueryParser.pg_AnnotatedDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_AnnotatedDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:463:1: pg_AnnotatedDecl : ( p_VarDecl | pm_FunctionDecl | {...}? => p_CollectionDecl | {...}? => p_IndexDecl | {...}? => p_ICDecl );\n    // $ANTLR start \"pg_AnnotatedDecl\"\n    pg_AnnotatedDecl: function() {\n        var retval = new XQueryParser.pg_AnnotatedDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_VarDecl54 = null;\n         var pm_FunctionDecl55 = null;\n         var p_CollectionDecl56 = null;\n         var p_IndexDecl57 = null;\n         var p_ICDecl58 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:464:9: ( p_VarDecl | pm_FunctionDecl | {...}? => p_CollectionDecl | {...}? => p_IndexDecl | {...}? => p_ICDecl )\n            var alt29=5;\n            var LA29_0 = this.input.LA(1);\n\n            if ( (LA29_0==VARIABLE) ) {\n                alt29=1;\n            }\n            else if ( (LA29_0==UPDATING) && ((this.lc(XQU)))) {\n                alt29=2;\n            }\n            else if ( (LA29_0==FUNCTION) ) {\n                alt29=2;\n            }\n            else if ( (LA29_0==COLLECTION) && ((this.lc(ZORBA)))) {\n                alt29=3;\n            }\n            else if ( (LA29_0==INDEX) && ((this.lc(ZORBA)))) {\n                alt29=4;\n            }\n            else if ( (LA29_0==INTEGRITY) && ((this.lc(ZORBA)))) {\n                alt29=5;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 29, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt29) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:464:11: p_VarDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarDecl_in_pg_AnnotatedDecl2647);\n                    p_VarDecl54=this.p_VarDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_VarDecl54.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:465:11: pm_FunctionDecl\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_FunctionDecl_in_pg_AnnotatedDecl2659);\n                    pm_FunctionDecl55=this.pm_FunctionDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_FunctionDecl55.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:466:11: {...}? => p_CollectionDecl\n                    root_0 = this.adaptor.nil();\n\n                    if ( !((this.lc(ZORBA))) ) {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"pg_AnnotatedDecl\", \"this.lc(ZORBA)\");\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_CollectionDecl_in_pg_AnnotatedDecl2674);\n                    p_CollectionDecl56=this.p_CollectionDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CollectionDecl56.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:467:11: {...}? => p_IndexDecl\n                    root_0 = this.adaptor.nil();\n\n                    if ( !((this.lc(ZORBA))) ) {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"pg_AnnotatedDecl\", \"this.lc(ZORBA)\");\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_IndexDecl_in_pg_AnnotatedDecl2689);\n                    p_IndexDecl57=this.p_IndexDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexDecl57.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:468:11: {...}? => p_ICDecl\n                    root_0 = this.adaptor.nil();\n\n                    if ( !((this.lc(ZORBA))) ) {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"pg_AnnotatedDecl\", \"this.lc(ZORBA)\");\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ICDecl_in_pg_AnnotatedDecl2704);\n                    p_ICDecl58=this.p_ICDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICDecl58.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Annotation_return: (function() {\n        XQueryParser.p_Annotation_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Annotation_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:472:1: p_Annotation : ANN_PERCENT p_EQName ( LPAREN p_Literal ( COMMA p_Literal )* RPAREN )? ;\n    // $ANTLR start \"p_Annotation\"\n    p_Annotation: function() {\n        var retval = new XQueryParser.p_Annotation_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ANN_PERCENT59 = null;\n        var LPAREN61 = null;\n        var COMMA63 = null;\n        var RPAREN65 = null;\n         var p_EQName60 = null;\n         var p_Literal62 = null;\n         var p_Literal64 = null;\n\n        var ANN_PERCENT59_tree=null;\n        var LPAREN61_tree=null;\n        var COMMA63_tree=null;\n        var RPAREN65_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:473:9: ( ANN_PERCENT p_EQName ( LPAREN p_Literal ( COMMA p_Literal )* RPAREN )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:473:11: ANN_PERCENT p_EQName ( LPAREN p_Literal ( COMMA p_Literal )* RPAREN )?\n            root_0 = this.adaptor.nil();\n\n            ANN_PERCENT59=this.match(this.input,ANN_PERCENT,XQueryParser.FOLLOW_ANN_PERCENT_in_p_Annotation2730); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            ANN_PERCENT59_tree = this.adaptor.create(ANN_PERCENT59);\n            this.adaptor.addChild(root_0, ANN_PERCENT59_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_Annotation2732);\n            p_EQName60=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName60.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:473:32: ( LPAREN p_Literal ( COMMA p_Literal )* RPAREN )?\n            var alt31=2;\n            var LA31_0 = this.input.LA(1);\n\n            if ( (LA31_0==LPAREN) ) {\n                alt31=1;\n            }\n            switch (alt31) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:473:33: LPAREN p_Literal ( COMMA p_Literal )* RPAREN\n                    LPAREN61=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_Annotation2735); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LPAREN61_tree = this.adaptor.create(LPAREN61);\n                    this.adaptor.addChild(root_0, LPAREN61_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_Literal_in_p_Annotation2737);\n                    p_Literal62=this.p_Literal();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Literal62.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:473:50: ( COMMA p_Literal )*\n                    loop30:\n                    do {\n                        var alt30=2;\n                        var LA30_0 = this.input.LA(1);\n\n                        if ( (LA30_0==COMMA) ) {\n                            alt30=1;\n                        }\n\n\n                        switch (alt30) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:473:51: COMMA p_Literal\n                            COMMA63=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_Annotation2740); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COMMA63_tree = this.adaptor.create(COMMA63);\n                            this.adaptor.addChild(root_0, COMMA63_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_Literal_in_p_Annotation2742);\n                            p_Literal64=this.p_Literal();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Literal64.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop30;\n                        }\n                    } while (true);\n\n                    RPAREN65=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_Annotation2746); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RPAREN65_tree = this.adaptor.create(RPAREN65);\n                    this.adaptor.addChild(root_0, RPAREN65_tree);\n                    }\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_VarDecl_return: (function() {\n        XQueryParser.p_VarDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_VarDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:477:1: p_VarDecl : k= VARIABLE d= DOLLAR qn= p_EQName (td= p_TypeDeclaration )? ( ( BIND vv= p_VarValue ) | (k= EXTERNAL ( BIND vdv= p_VarDefaultValue )? ) ) -> ^( VarDecl $qn ^( VarType ( $td)? ) ^( VarValue ( $vv)? ^( VarDefaultValue ( $vdv)? ) ) ) ;\n    // $ANTLR start \"p_VarDecl\"\n    p_VarDecl: function() {\n        var retval = new XQueryParser.p_VarDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n        var BIND66 = null;\n        var BIND67 = null;\n         var qn = null;\n         var td = null;\n         var vv = null;\n         var vdv = null;\n\n        var k_tree=null;\n        var d_tree=null;\n        var BIND66_tree=null;\n        var BIND67_tree=null;\n        var stream_DOLLAR=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token DOLLAR\");\n        var stream_EXTERNAL=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EXTERNAL\");\n        var stream_VARIABLE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token VARIABLE\");\n        var stream_BIND=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token BIND\");\n        var stream_p_TypeDeclaration=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_TypeDeclaration\");\n        var stream_p_VarDefaultValue=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_VarDefaultValue\");\n        var stream_p_VarValue=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_VarValue\");\n        var stream_p_EQName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_EQName\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:9: (k= VARIABLE d= DOLLAR qn= p_EQName (td= p_TypeDeclaration )? ( ( BIND vv= p_VarValue ) | (k= EXTERNAL ( BIND vdv= p_VarDefaultValue )? ) ) -> ^( VarDecl $qn ^( VarType ( $td)? ) ^( VarValue ( $vv)? ^( VarDefaultValue ( $vdv)? ) ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:11: k= VARIABLE d= DOLLAR qn= p_EQName (td= p_TypeDeclaration )? ( ( BIND vv= p_VarValue ) | (k= EXTERNAL ( BIND vdv= p_VarDefaultValue )? ) )\n            k=this.match(this.input,VARIABLE,XQueryParser.FOLLOW_VARIABLE_in_p_VarDecl2776); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_VARIABLE.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_VarDecl2782); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_DOLLAR.add(d);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_VarDecl2786);\n            qn=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_EQName.add(qn.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (qn?qn.stop:null)); \n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:87: (td= p_TypeDeclaration )?\n            var alt32=2;\n            var LA32_0 = this.input.LA(1);\n\n            if ( (LA32_0==AS) ) {\n                alt32=1;\n            }\n            switch (alt32) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:87: td= p_TypeDeclaration\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_VarDecl2792);\n                    td=this.p_TypeDeclaration();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_TypeDeclaration.add(td.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:107: ( ( BIND vv= p_VarValue ) | (k= EXTERNAL ( BIND vdv= p_VarDefaultValue )? ) )\n            var alt34=2;\n            var LA34_0 = this.input.LA(1);\n\n            if ( (LA34_0==BIND) ) {\n                alt34=1;\n            }\n            else if ( (LA34_0==EXTERNAL) ) {\n                alt34=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 34, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt34) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:108: ( BIND vv= p_VarValue )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:108: ( BIND vv= p_VarValue )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:109: BIND vv= p_VarValue\n                    BIND66=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_VarDecl2797); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_BIND.add(BIND66);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarValue_in_p_VarDecl2801);\n                    vv=this.p_VarValue();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_VarValue.add(vv.getTree());\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:131: (k= EXTERNAL ( BIND vdv= p_VarDefaultValue )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:131: (k= EXTERNAL ( BIND vdv= p_VarDefaultValue )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:132: k= EXTERNAL ( BIND vdv= p_VarDefaultValue )?\n                    k=this.match(this.input,EXTERNAL,XQueryParser.FOLLOW_EXTERNAL_in_p_VarDecl2809); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_EXTERNAL.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:158: ( BIND vdv= p_VarDefaultValue )?\n                    var alt33=2;\n                    var LA33_0 = this.input.LA(1);\n\n                    if ( (LA33_0==BIND) ) {\n                        alt33=1;\n                    }\n                    switch (alt33) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:478:159: BIND vdv= p_VarDefaultValue\n                            BIND67=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_VarDecl2814); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_BIND.add(BIND67);\n\n                            this.pushFollow(XQueryParser.FOLLOW_p_VarDefaultValue_in_p_VarDecl2818);\n                            vdv=this.p_VarDefaultValue();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_VarDefaultValue.add(vdv.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n\n            }\n\n\n\n            // AST REWRITE\n            // elements: vv, qn, td, vdv\n            // token labels: \n            // rule labels: qn, vv, retval, vdv, td\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_qn=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token qn\",qn!=null?qn.tree:null);\n            var stream_vv=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token vv\",vv!=null?vv.tree:null);\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_vdv=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token vdv\",vdv!=null?vdv.tree:null);\n            var stream_td=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token td\",td!=null?td.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 479:17: -> ^( VarDecl $qn ^( VarType ( $td)? ) ^( VarValue ( $vv)? ^( VarDefaultValue ( $vdv)? ) ) )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:479:20: ^( VarDecl $qn ^( VarType ( $td)? ) ^( VarValue ( $vv)? ^( VarDefaultValue ( $vdv)? ) ) )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(VarDecl, \"VarDecl\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_qn.nextTree());\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:479:34: ^( VarType ( $td)? )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(VarType, \"VarType\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:479:44: ( $td)?\n                if ( stream_td.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_td.nextTree());\n\n                }\n                stream_td.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:479:50: ^( VarValue ( $vv)? ^( VarDefaultValue ( $vdv)? ) )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(VarValue, \"VarValue\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:479:61: ( $vv)?\n                if ( stream_vv.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_vv.nextTree());\n\n                }\n                stream_vv.reset();\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:479:66: ^( VarDefaultValue ( $vdv)? )\n                {\n                var root_3 = this.adaptor.nil();\n                root_3 = this.adaptor.becomeRoot(this.adaptor.create(VarDefaultValue, \"VarDefaultValue\"), root_3);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:479:84: ( $vdv)?\n                if ( stream_vdv.hasNext() ) {\n                    this.adaptor.addChild(root_3, stream_vdv.nextTree());\n\n                }\n                stream_vdv.reset();\n\n                this.adaptor.addChild(root_2, root_3);\n                }\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_VarValue_return: (function() {\n        XQueryParser.p_VarValue_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_VarValue_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:483:1: p_VarValue : p_ExprSingle[true] ;\n    // $ANTLR start \"p_VarValue\"\n    p_VarValue: function() {\n        var retval = new XQueryParser.p_VarValue_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle68 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:484:9: ( p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:484:11: p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_VarValue2897);\n            p_ExprSingle68=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle68.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_VarDefaultValue_return: (function() {\n        XQueryParser.p_VarDefaultValue_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_VarDefaultValue_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:488:1: p_VarDefaultValue : p_ExprSingle[true] ;\n    // $ANTLR start \"p_VarDefaultValue\"\n    p_VarDefaultValue: function() {\n        var retval = new XQueryParser.p_VarDefaultValue_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle69 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:489:9: ( p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:489:11: p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_VarDefaultValue2924);\n            p_ExprSingle69=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle69.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_ContextItemDecl_return: (function() {\n        XQueryParser.pm_ContextItemDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_ContextItemDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:493:1: pm_ContextItemDecl : k= DECLARE k= CONTEXT k= ITEM (k= AS p_ItemType )? ( ( BIND p_VarValue ) | (k= EXTERNAL ( BIND p_VarDefaultValue )? ) ) SEMICOLON ;\n    // $ANTLR start \"pm_ContextItemDecl\"\n    pm_ContextItemDecl: function() {\n        var retval = new XQueryParser.pm_ContextItemDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var BIND71 = null;\n        var BIND73 = null;\n        var SEMICOLON75 = null;\n         var p_ItemType70 = null;\n         var p_VarValue72 = null;\n         var p_VarDefaultValue74 = null;\n\n        var k_tree=null;\n        var BIND71_tree=null;\n        var BIND73_tree=null;\n        var SEMICOLON75_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:9: (k= DECLARE k= CONTEXT k= ITEM (k= AS p_ItemType )? ( ( BIND p_VarValue ) | (k= EXTERNAL ( BIND p_VarDefaultValue )? ) ) SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:11: k= DECLARE k= CONTEXT k= ITEM (k= AS p_ItemType )? ( ( BIND p_VarValue ) | (k= EXTERNAL ( BIND p_VarDefaultValue )? ) ) SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_ContextItemDecl2953); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,CONTEXT,XQueryParser.FOLLOW_CONTEXT_in_pm_ContextItemDecl2959); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,ITEM,XQueryParser.FOLLOW_ITEM_in_pm_ContextItemDecl2965); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:83: (k= AS p_ItemType )?\n            var alt35=2;\n            var LA35_0 = this.input.LA(1);\n\n            if ( (LA35_0==AS) ) {\n                alt35=1;\n            }\n            switch (alt35) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:84: k= AS p_ItemType\n                    k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_pm_ContextItemDecl2972); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ItemType_in_pm_ContextItemDecl2976);\n                    p_ItemType70=this.p_ItemType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ItemType70.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:117: ( ( BIND p_VarValue ) | (k= EXTERNAL ( BIND p_VarDefaultValue )? ) )\n            var alt37=2;\n            var LA37_0 = this.input.LA(1);\n\n            if ( (LA37_0==BIND) ) {\n                alt37=1;\n            }\n            else if ( (LA37_0==EXTERNAL) ) {\n                alt37=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 37, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt37) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:118: ( BIND p_VarValue )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:118: ( BIND p_VarValue )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:119: BIND p_VarValue\n                    BIND71=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_pm_ContextItemDecl2982); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    BIND71_tree = this.adaptor.create(BIND71);\n                    this.adaptor.addChild(root_0, BIND71_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarValue_in_pm_ContextItemDecl2984);\n                    p_VarValue72=this.p_VarValue();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_VarValue72.getTree());\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:138: (k= EXTERNAL ( BIND p_VarDefaultValue )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:138: (k= EXTERNAL ( BIND p_VarDefaultValue )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:139: k= EXTERNAL ( BIND p_VarDefaultValue )?\n                    k=this.match(this.input,EXTERNAL,XQueryParser.FOLLOW_EXTERNAL_in_pm_ContextItemDecl2992); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:165: ( BIND p_VarDefaultValue )?\n                    var alt36=2;\n                    var LA36_0 = this.input.LA(1);\n\n                    if ( (LA36_0==BIND) ) {\n                        alt36=1;\n                    }\n                    switch (alt36) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:494:166: BIND p_VarDefaultValue\n                            BIND73=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_pm_ContextItemDecl2997); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            BIND73_tree = this.adaptor.create(BIND73);\n                            this.adaptor.addChild(root_0, BIND73_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_VarDefaultValue_in_pm_ContextItemDecl2999);\n                            p_VarDefaultValue74=this.p_VarDefaultValue();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_VarDefaultValue74.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n\n            }\n\n            SEMICOLON75=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_ContextItemDecl3005); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON75_tree = this.adaptor.create(SEMICOLON75);\n            this.adaptor.addChild(root_0, SEMICOLON75_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_FunctionDecl_return: (function() {\n        XQueryParser.pm_FunctionDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_FunctionDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:499:1: pm_FunctionDecl : ({...}? =>k= UPDATING )? k= FUNCTION qn= pg_FQName LPAREN (pl= p_ParamList )? RPAREN (k= AS st= p_SequenceType )? ( LBRACKET soe= p_StatementsAndOptionalExpr RBRACKET | k= EXTERNAL ) -> ^( FunctionDecl $qn ^( ParamList ( $pl)? ) ^( ReturnType ( $st)? ) ( $soe)? ) ;\n    // $ANTLR start \"pm_FunctionDecl\"\n    pm_FunctionDecl: function() {\n        var retval = new XQueryParser.pm_FunctionDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LPAREN76 = null;\n        var RPAREN77 = null;\n        var LBRACKET78 = null;\n        var RBRACKET79 = null;\n         var qn = null;\n         var pl = null;\n         var st = null;\n         var soe = null;\n\n        var k_tree=null;\n        var LPAREN76_tree=null;\n        var RPAREN77_tree=null;\n        var LBRACKET78_tree=null;\n        var RBRACKET79_tree=null;\n        var stream_FUNCTION=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token FUNCTION\");\n        var stream_LBRACKET=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token LBRACKET\");\n        var stream_AS=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token AS\");\n        var stream_RPAREN=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token RPAREN\");\n        var stream_EXTERNAL=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EXTERNAL\");\n        var stream_RBRACKET=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token RBRACKET\");\n        var stream_LPAREN=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token LPAREN\");\n        var stream_UPDATING=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token UPDATING\");\n        var stream_p_StatementsAndOptionalExpr=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_StatementsAndOptionalExpr\");\n        var stream_p_ParamList=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_ParamList\");\n        var stream_pg_FQName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pg_FQName\");\n        var stream_p_SequenceType=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_SequenceType\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:9: ( ({...}? =>k= UPDATING )? k= FUNCTION qn= pg_FQName LPAREN (pl= p_ParamList )? RPAREN (k= AS st= p_SequenceType )? ( LBRACKET soe= p_StatementsAndOptionalExpr RBRACKET | k= EXTERNAL ) -> ^( FunctionDecl $qn ^( ParamList ( $pl)? ) ^( ReturnType ( $st)? ) ( $soe)? ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:11: ({...}? =>k= UPDATING )? k= FUNCTION qn= pg_FQName LPAREN (pl= p_ParamList )? RPAREN (k= AS st= p_SequenceType )? ( LBRACKET soe= p_StatementsAndOptionalExpr RBRACKET | k= EXTERNAL )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:11: ({...}? =>k= UPDATING )?\n            var alt38=2;\n            var LA38_0 = this.input.LA(1);\n\n            if ( (LA38_0==UPDATING) && ((this.lc(XQU)))) {\n                alt38=1;\n            }\n            switch (alt38) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:12: {...}? =>k= UPDATING\n                    if ( !((this.lc(XQU))) ) {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"pm_FunctionDecl\", \"this.lc(XQU)\");\n                    }\n                    k=this.match(this.input,UPDATING,XQueryParser.FOLLOW_UPDATING_in_pm_FunctionDecl3038); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_UPDATING.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,FUNCTION,XQueryParser.FOLLOW_FUNCTION_in_pm_FunctionDecl3046); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_FUNCTION.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_pg_FQName_in_pm_FunctionDecl3052);\n            qn=this.pg_FQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_pg_FQName.add(qn.getTree());\n            LPAREN76=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_pm_FunctionDecl3054); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_LPAREN.add(LPAREN76);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:106: (pl= p_ParamList )?\n            var alt39=2;\n            var LA39_0 = this.input.LA(1);\n\n            if ( (LA39_0==DOLLAR) ) {\n                alt39=1;\n            }\n            switch (alt39) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:106: pl= p_ParamList\n                    this.pushFollow(XQueryParser.FOLLOW_p_ParamList_in_pm_FunctionDecl3058);\n                    pl=this.p_ParamList();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_ParamList.add(pl.getTree());\n\n\n                    break;\n\n            }\n\n            RPAREN77=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_pm_FunctionDecl3061); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_RPAREN.add(RPAREN77);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:127: (k= AS st= p_SequenceType )?\n            var alt40=2;\n            var LA40_0 = this.input.LA(1);\n\n            if ( (LA40_0==AS) ) {\n                alt40=1;\n            }\n            switch (alt40) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:128: k= AS st= p_SequenceType\n                    k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_pm_FunctionDecl3066); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_AS.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_pm_FunctionDecl3072);\n                    st=this.p_SequenceType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_SequenceType.add(st.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:168: ( LBRACKET soe= p_StatementsAndOptionalExpr RBRACKET | k= EXTERNAL )\n            var alt41=2;\n            var LA41_0 = this.input.LA(1);\n\n            if ( (LA41_0==LBRACKET) ) {\n                alt41=1;\n            }\n            else if ( (LA41_0==EXTERNAL) ) {\n                alt41=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 41, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt41) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:169: LBRACKET soe= p_StatementsAndOptionalExpr RBRACKET\n                    LBRACKET78=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_FunctionDecl3077); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_LBRACKET.add(LBRACKET78);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_pm_FunctionDecl3081);\n                    soe=this.p_StatementsAndOptionalExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_StatementsAndOptionalExpr.add(soe.getTree());\n                    RBRACKET79=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_FunctionDecl3083); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_RBRACKET.add(RBRACKET79);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:500:221: k= EXTERNAL\n                    k=this.match(this.input,EXTERNAL,XQueryParser.FOLLOW_EXTERNAL_in_pm_FunctionDecl3089); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_EXTERNAL.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n                    break;\n\n            }\n\n\n\n            // AST REWRITE\n            // elements: soe, pl, st, qn\n            // token labels: \n            // rule labels: qn, soe, retval, pl, st\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_qn=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token qn\",qn!=null?qn.tree:null);\n            var stream_soe=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token soe\",soe!=null?soe.tree:null);\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_pl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token pl\",pl!=null?pl.tree:null);\n            var stream_st=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token st\",st!=null?st.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 501:17: -> ^( FunctionDecl $qn ^( ParamList ( $pl)? ) ^( ReturnType ( $st)? ) ( $soe)? )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:501:20: ^( FunctionDecl $qn ^( ParamList ( $pl)? ) ^( ReturnType ( $st)? ) ( $soe)? )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(FunctionDecl, \"FunctionDecl\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_qn.nextTree());\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:501:39: ^( ParamList ( $pl)? )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(ParamList, \"ParamList\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:501:51: ( $pl)?\n                if ( stream_pl.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_pl.nextTree());\n\n                }\n                stream_pl.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:501:57: ^( ReturnType ( $st)? )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(ReturnType, \"ReturnType\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:501:70: ( $st)?\n                if ( stream_st.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_st.nextTree());\n\n                }\n                stream_st.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:501:76: ( $soe)?\n                if ( stream_soe.hasNext() ) {\n                    this.adaptor.addChild(root_1, stream_soe.nextTree());\n\n                }\n                stream_soe.reset();\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ParamList_return: (function() {\n        XQueryParser.p_ParamList_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ParamList_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:505:1: p_ParamList : p+= p_Param ( COMMA p+= p_Param )* -> ( $p)+ ;\n    // $ANTLR start \"p_ParamList\"\n    p_ParamList: function() {\n        var retval = new XQueryParser.p_ParamList_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var COMMA80 = null;\n        var list_p=null;\n        var p = null;\n        var COMMA80_tree=null;\n        var stream_COMMA=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token COMMA\");\n        var stream_p_Param=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_Param\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:506:9: (p+= p_Param ( COMMA p+= p_Param )* -> ( $p)+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:506:11: p+= p_Param ( COMMA p+= p_Param )*\n            this.pushFollow(XQueryParser.FOLLOW_p_Param_in_p_ParamList3166);\n            p=this.p_Param();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_Param.add(p.getTree());\n            if (org.antlr.lang.isNull(list_p)) list_p = [];\n            list_p.push(p.getTree());\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:506:22: ( COMMA p+= p_Param )*\n            loop42:\n            do {\n                var alt42=2;\n                var LA42_0 = this.input.LA(1);\n\n                if ( (LA42_0==COMMA) ) {\n                    alt42=1;\n                }\n\n\n                switch (alt42) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:506:23: COMMA p+= p_Param\n                    COMMA80=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_ParamList3169); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_COMMA.add(COMMA80);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_Param_in_p_ParamList3173);\n                    p=this.p_Param();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_Param.add(p.getTree());\n                    if (org.antlr.lang.isNull(list_p)) list_p = [];\n                    list_p.push(p.getTree());\n\n\n\n                    break;\n\n                default :\n                    break loop42;\n                }\n            } while (true);\n\n\n\n            // AST REWRITE\n            // elements: p\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: p\n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_p=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token p\",list_p);\n            root_0 = this.adaptor.nil();\n            // 507:17: -> ( $p)+\n            {\n                if ( !(stream_p.hasNext()) ) {\n                    throw new org.antlr.runtime.tree.RewriteEarlyExitException();\n                }\n                while ( stream_p.hasNext() ) {\n                    this.adaptor.addChild(root_0, stream_p.nextTree());\n\n                }\n                stream_p.reset();\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Param_return: (function() {\n        XQueryParser.p_Param_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Param_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:511:1: p_Param : d= DOLLAR qn= p_EQName (td= p_TypeDeclaration )? -> ^( Param $qn ( $td)? ) ;\n    // $ANTLR start \"p_Param\"\n    p_Param: function() {\n        var retval = new XQueryParser.p_Param_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n         var qn = null;\n         var td = null;\n\n        var d_tree=null;\n        var stream_DOLLAR=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token DOLLAR\");\n        var stream_p_TypeDeclaration=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_TypeDeclaration\");\n        var stream_p_EQName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_EQName\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:512:9: (d= DOLLAR qn= p_EQName (td= p_TypeDeclaration )? -> ^( Param $qn ( $td)? ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:512:11: d= DOLLAR qn= p_EQName (td= p_TypeDeclaration )?\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_Param3233); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_DOLLAR.add(d);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_Param3237);\n            qn=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_EQName.add(qn.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (qn?qn.stop:null)); \n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:512:61: (td= p_TypeDeclaration )?\n            var alt43=2;\n            var LA43_0 = this.input.LA(1);\n\n            if ( (LA43_0==AS) ) {\n                alt43=1;\n            }\n            switch (alt43) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:512:61: td= p_TypeDeclaration\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_Param3243);\n                    td=this.p_TypeDeclaration();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_TypeDeclaration.add(td.getTree());\n\n\n                    break;\n\n            }\n\n\n\n            // AST REWRITE\n            // elements: qn, td\n            // token labels: \n            // rule labels: qn, retval, td\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_qn=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token qn\",qn!=null?qn.tree:null);\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_td=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token td\",td!=null?td.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 513:17: -> ^( Param $qn ( $td)? )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:513:20: ^( Param $qn ( $td)? )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(Param, \"Param\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_qn.nextTree());\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:513:32: ( $td)?\n                if ( stream_td.hasNext() ) {\n                    this.adaptor.addChild(root_1, stream_td.nextTree());\n\n                }\n                stream_td.reset();\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_FunctionBody_return: (function() {\n        XQueryParser.pm_FunctionBody_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_FunctionBody_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:517:1: pm_FunctionBody : p_EnclosedExpr ;\n    // $ANTLR start \"pm_FunctionBody\"\n    pm_FunctionBody: function() {\n        var retval = new XQueryParser.pm_FunctionBody_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EnclosedExpr81 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:518:9: ( p_EnclosedExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:518:11: p_EnclosedExpr\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EnclosedExpr_in_pm_FunctionBody3299);\n            p_EnclosedExpr81=this.p_EnclosedExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EnclosedExpr81.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_EnclosedExpr_return: (function() {\n        XQueryParser.p_EnclosedExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_EnclosedExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:523:1: p_EnclosedExpr : LBRACKET p_Expr[true,true] RBRACKET -> ^( EnclosedExpr p_Expr ) ;\n    // $ANTLR start \"p_EnclosedExpr\"\n    p_EnclosedExpr: function() {\n        var retval = new XQueryParser.p_EnclosedExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LBRACKET82 = null;\n        var RBRACKET84 = null;\n         var p_Expr83 = null;\n\n        var LBRACKET82_tree=null;\n        var RBRACKET84_tree=null;\n        var stream_LBRACKET=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token LBRACKET\");\n        var stream_RBRACKET=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token RBRACKET\");\n        var stream_p_Expr=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_Expr\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:524:9: ( LBRACKET p_Expr[true,true] RBRACKET -> ^( EnclosedExpr p_Expr ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:524:11: LBRACKET p_Expr[true,true] RBRACKET\n            LBRACKET82=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_EnclosedExpr3326); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_LBRACKET.add(LBRACKET82);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_EnclosedExpr3328);\n            p_Expr83=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_Expr.add(p_Expr83.getTree());\n            RBRACKET84=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_EnclosedExpr3331); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_RBRACKET.add(RBRACKET84);\n\n\n\n            // AST REWRITE\n            // elements: p_Expr\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 525:17: -> ^( EnclosedExpr p_Expr )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:525:20: ^( EnclosedExpr p_Expr )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(EnclosedExpr, \"EnclosedExpr\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_p_Expr.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_OptionDecl_return: (function() {\n        XQueryParser.pm_OptionDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_OptionDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:529:1: pm_OptionDecl : k= DECLARE k= OPTION p_EQName p_StringLiteral SEMICOLON ;\n    // $ANTLR start \"pm_OptionDecl\"\n    pm_OptionDecl: function() {\n        var retval = new XQueryParser.pm_OptionDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON87 = null;\n         var p_EQName85 = null;\n         var p_StringLiteral86 = null;\n\n        var k_tree=null;\n        var SEMICOLON87_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:530:9: (k= DECLARE k= OPTION p_EQName p_StringLiteral SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:530:11: k= DECLARE k= OPTION p_EQName p_StringLiteral SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_OptionDecl3383); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,OPTION,XQueryParser.FOLLOW_OPTION_in_pm_OptionDecl3389); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_pm_OptionDecl3393);\n            p_EQName85=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName85.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_pm_OptionDecl3395);\n            p_StringLiteral86=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral86.getTree());\n            SEMICOLON87=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_OptionDecl3397); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON87_tree = this.adaptor.create(SEMICOLON87);\n            this.adaptor.addChild(root_0, SEMICOLON87_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_QueryBody_return: (function() {\n        XQueryParser.pm_QueryBody_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_QueryBody_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:534:1: pm_QueryBody : ({...}? => p_Program | p_Expr[true,true] );\n    // $ANTLR start \"pm_QueryBody\"\n    pm_QueryBody: function() {\n        var retval = new XQueryParser.pm_QueryBody_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Program88 = null;\n         var p_Expr89 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:535:9: ({...}? => p_Program | p_Expr[true,true] )\n            var alt44=2;\n            alt44 = this.dfa44.predict(this.input);\n            switch (alt44) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:535:11: {...}? => p_Program\n                    root_0 = this.adaptor.nil();\n\n                    if ( !((this.lc(XQS))) ) {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"pm_QueryBody\", \"this.lc(XQS)\");\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_Program_in_pm_QueryBody3426);\n                    p_Program88=this.p_Program();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Program88.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:536:11: p_Expr[true,true]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_pm_QueryBody3438);\n                    p_Expr89=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr89.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Expr_return: (function() {\n        XQueryParser.p_Expr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Expr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:546:1: p_Expr[strict, allowConcat] : es= p_ExprSingle[$strict] ( COMMA p_ExprSingle[$strict] )* ;\n    // $ANTLR start \"p_Expr\"\n    p_Expr: function(strict, allowConcat) {\n        var retval = new XQueryParser.p_Expr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var COMMA90 = null;\n         var es = null;\n         var p_ExprSingle91 = null;\n\n        var COMMA90_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:547:9: (es= p_ExprSingle[$strict] ( COMMA p_ExprSingle[$strict] )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:547:11: es= p_ExprSingle[$strict] ( COMMA p_ExprSingle[$strict] )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_Expr3474);\n            es=this.p_ExprSingle(strict);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, es.getTree());\n            if ( this.state.backtracking===0 ) {\n               if (!allowConcat) throw new Exception(); \n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:548:11: ( COMMA p_ExprSingle[$strict] )*\n            loop45:\n            do {\n                var alt45=2;\n                var LA45_0 = this.input.LA(1);\n\n                if ( (LA45_0==COMMA) ) {\n                    alt45=1;\n                }\n\n\n                switch (alt45) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:548:12: COMMA p_ExprSingle[$strict]\n                    COMMA90=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_Expr3490); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA90_tree = this.adaptor.create(COMMA90);\n                    this.adaptor.addChild(root_0, COMMA90_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_Expr3492);\n                    p_ExprSingle91=this.p_ExprSingle(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle91.getTree());\n\n\n                    break;\n\n                default :\n                    break loop45;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (e) {\n\n              if(e instanceof org.antlr.runtime.RecognitionException) {\n                //console.log(\"catch1\");\n                reportError(e);\n                recover(this.input, e);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), e);\n              } else if(e instanceof Exception) {\n                //console.log(\"catch2\");\n                root_0 = this.adaptor.nil();\n                this.adaptor.addChild(root_0, es.getTree());\n                retval.stop = this.input.LT(-1);\n                retval.tree = this.adaptor.rulePostProcessing(root_0);\n                this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n              } else {\n                throw e;\n              }\n\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ExprSingle_return: (function() {\n        XQueryParser.p_ExprSingle_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ExprSingle_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:570:1: p_ExprSingle[strict] : ( ( ( ( FOR | LET ) DOLLAR ) | ( FOR ( TUMBLING | SLIDING ) ) )=> p_FLWORHybrid[$strict] | ( IF LPAREN )=> p_IfHybrid[$strict] | ( SWITCH LPAREN )=> p_SwitchHybrid[$strict] | ( TYPESWITCH LPAREN )=> p_TypeswitchHybrid[$strict] | ( TRY LBRACKET )=> p_TryCatchHybrid[$strict] | p_ExprSimple );\n    // $ANTLR start \"p_ExprSingle\"\n    p_ExprSingle: function(strict) {\n        var retval = new XQueryParser.p_ExprSingle_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_FLWORHybrid92 = null;\n         var p_IfHybrid93 = null;\n         var p_SwitchHybrid94 = null;\n         var p_TypeswitchHybrid95 = null;\n         var p_TryCatchHybrid96 = null;\n         var p_ExprSimple97 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:9: ( ( ( ( FOR | LET ) DOLLAR ) | ( FOR ( TUMBLING | SLIDING ) ) )=> p_FLWORHybrid[$strict] | ( IF LPAREN )=> p_IfHybrid[$strict] | ( SWITCH LPAREN )=> p_SwitchHybrid[$strict] | ( TYPESWITCH LPAREN )=> p_TypeswitchHybrid[$strict] | ( TRY LBRACKET )=> p_TryCatchHybrid[$strict] | p_ExprSimple )\n            var alt46=6;\n            alt46 = this.dfa46.predict(this.input);\n            switch (alt46) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:11: ( ( ( FOR | LET ) DOLLAR ) | ( FOR ( TUMBLING | SLIDING ) ) )=> p_FLWORHybrid[$strict]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FLWORHybrid_in_p_ExprSingle3559);\n                    p_FLWORHybrid92=this.p_FLWORHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FLWORHybrid92.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:572:11: ( IF LPAREN )=> p_IfHybrid[$strict]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_IfHybrid_in_p_ExprSingle3589);\n                    p_IfHybrid93=this.p_IfHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IfHybrid93.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:573:11: ( SWITCH LPAREN )=> p_SwitchHybrid[$strict]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_SwitchHybrid_in_p_ExprSingle3615);\n                    p_SwitchHybrid94=this.p_SwitchHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SwitchHybrid94.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:574:11: ( TYPESWITCH LPAREN )=> p_TypeswitchHybrid[$strict]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeswitchHybrid_in_p_ExprSingle3637);\n                    p_TypeswitchHybrid95=this.p_TypeswitchHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeswitchHybrid95.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:575:11: ( TRY LBRACKET )=> p_TryCatchHybrid[$strict]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_TryCatchHybrid_in_p_ExprSingle3664);\n                    p_TryCatchHybrid96=this.p_TryCatchHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TryCatchHybrid96.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:576:11: p_ExprSimple\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSimple_in_p_ExprSingle3677);\n                    p_ExprSimple97=this.p_ExprSimple();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSimple97.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FLWORHybrid_return: (function() {\n        XQueryParser.p_FLWORHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FLWORHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:580:1: p_FLWORHybrid[strict] : p_InitialClause ( p_IntermediateClause )* p_ReturnHybrid[$strict] ;\n    // $ANTLR start \"p_FLWORHybrid\"\n    p_FLWORHybrid: function(strict) {\n        var retval = new XQueryParser.p_FLWORHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_InitialClause98 = null;\n         var p_IntermediateClause99 = null;\n         var p_ReturnHybrid100 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:581:9: ( p_InitialClause ( p_IntermediateClause )* p_ReturnHybrid[$strict] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:581:11: p_InitialClause ( p_IntermediateClause )* p_ReturnHybrid[$strict]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_InitialClause_in_p_FLWORHybrid3704);\n            p_InitialClause98=this.p_InitialClause();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InitialClause98.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:581:27: ( p_IntermediateClause )*\n            loop47:\n            do {\n                var alt47=2;\n                var LA47_0 = this.input.LA(1);\n\n                if ( (LA47_0==FOR||LA47_0==LET||LA47_0==ORDER||LA47_0==STABLE||LA47_0==WHERE||LA47_0==COUNT||LA47_0==GROUP) ) {\n                    alt47=1;\n                }\n\n\n                switch (alt47) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:581:27: p_IntermediateClause\n                    this.pushFollow(XQueryParser.FOLLOW_p_IntermediateClause_in_p_FLWORHybrid3706);\n                    p_IntermediateClause99=this.p_IntermediateClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IntermediateClause99.getTree());\n\n\n                    break;\n\n                default :\n                    break loop47;\n                }\n            } while (true);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ReturnHybrid_in_p_FLWORHybrid3709);\n            p_ReturnHybrid100=this.p_ReturnHybrid(strict);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ReturnHybrid100.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_InitialClause_return: (function() {\n        XQueryParser.p_InitialClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_InitialClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:585:1: p_InitialClause : ( p_ForClause | p_LetClause | p_WindowClause );\n    // $ANTLR start \"p_InitialClause\"\n    p_InitialClause: function() {\n        var retval = new XQueryParser.p_InitialClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ForClause101 = null;\n         var p_LetClause102 = null;\n         var p_WindowClause103 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:586:9: ( p_ForClause | p_LetClause | p_WindowClause )\n            var alt48=3;\n            var LA48_0 = this.input.LA(1);\n\n            if ( (LA48_0==FOR) ) {\n                var LA48_1 = this.input.LA(2);\n\n                if ( (LA48_1==DOLLAR) ) {\n                    alt48=1;\n                }\n                else if ( (LA48_1==SLIDING||LA48_1==TUMBLING) ) {\n                    alt48=3;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 48, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else if ( (LA48_0==LET) ) {\n                alt48=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 48, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt48) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:586:11: p_ForClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ForClause_in_p_InitialClause3736);\n                    p_ForClause101=this.p_ForClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ForClause101.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:586:25: p_LetClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_LetClause_in_p_InitialClause3740);\n                    p_LetClause102=this.p_LetClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_LetClause102.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:586:39: p_WindowClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_WindowClause_in_p_InitialClause3744);\n                    p_WindowClause103=this.p_WindowClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WindowClause103.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IntermediateClause_return: (function() {\n        XQueryParser.p_IntermediateClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IntermediateClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:590:1: p_IntermediateClause : ( p_InitialClause | p_WhereClause | p_GroupByClause | p_OrderByClause | p_CountClause );\n    // $ANTLR start \"p_IntermediateClause\"\n    p_IntermediateClause: function() {\n        var retval = new XQueryParser.p_IntermediateClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_InitialClause104 = null;\n         var p_WhereClause105 = null;\n         var p_GroupByClause106 = null;\n         var p_OrderByClause107 = null;\n         var p_CountClause108 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:591:9: ( p_InitialClause | p_WhereClause | p_GroupByClause | p_OrderByClause | p_CountClause )\n            var alt49=5;\n            switch ( this.input.LA(1) ) {\n            case FOR:\n            case LET:\n                alt49=1;\n                break;\n            case WHERE:\n                alt49=2;\n                break;\n            case GROUP:\n                alt49=3;\n                break;\n            case ORDER:\n            case STABLE:\n                alt49=4;\n                break;\n            case COUNT:\n                alt49=5;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 49, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt49) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:591:11: p_InitialClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_InitialClause_in_p_IntermediateClause3770);\n                    p_InitialClause104=this.p_InitialClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InitialClause104.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:591:29: p_WhereClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_WhereClause_in_p_IntermediateClause3774);\n                    p_WhereClause105=this.p_WhereClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WhereClause105.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:591:45: p_GroupByClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_GroupByClause_in_p_IntermediateClause3778);\n                    p_GroupByClause106=this.p_GroupByClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_GroupByClause106.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:591:63: p_OrderByClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_OrderByClause_in_p_IntermediateClause3782);\n                    p_OrderByClause107=this.p_OrderByClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OrderByClause107.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:591:81: p_CountClause\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_CountClause_in_p_IntermediateClause3786);\n                    p_CountClause108=this.p_CountClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CountClause108.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_StringConcatExpr_return: (function() {\n        XQueryParser.p_StringConcatExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_StringConcatExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:595:1: p_StringConcatExpr : p_RangeExpr (o= CONCAT p_RangeExpr )* ;\n    // $ANTLR start \"p_StringConcatExpr\"\n    p_StringConcatExpr: function() {\n        var retval = new XQueryParser.p_StringConcatExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var o = null;\n         var p_RangeExpr109 = null;\n         var p_RangeExpr110 = null;\n\n        var o_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:596:4: ( p_RangeExpr (o= CONCAT p_RangeExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:596:6: p_RangeExpr (o= CONCAT p_RangeExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_RangeExpr_in_p_StringConcatExpr3807);\n            p_RangeExpr109=this.p_RangeExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_RangeExpr109.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:596:18: (o= CONCAT p_RangeExpr )*\n            loop50:\n            do {\n                var alt50=2;\n                var LA50_0 = this.input.LA(1);\n\n                if ( (LA50_0==CONCAT) ) {\n                    alt50=1;\n                }\n\n\n                switch (alt50) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:596:20: o= CONCAT p_RangeExpr\n                    o=this.match(this.input,CONCAT,XQueryParser.FOLLOW_CONCAT_in_p_StringConcatExpr3813); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    o_tree = this.adaptor.create(o);\n                    this.adaptor.addChild(root_0, o_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                       this.ao(o); \n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_RangeExpr_in_p_StringConcatExpr3817);\n                    p_RangeExpr110=this.p_RangeExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_RangeExpr110.getTree());\n\n\n                    break;\n\n                default :\n                    break loop50;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ForClause_return: (function() {\n        XQueryParser.p_ForClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ForClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:601:1: p_ForClause : k= FOR p_ForBinding ( COMMA p_ForBinding )* ;\n    // $ANTLR start \"p_ForClause\"\n    p_ForClause: function() {\n        var retval = new XQueryParser.p_ForClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var COMMA112 = null;\n         var p_ForBinding111 = null;\n         var p_ForBinding113 = null;\n\n        var k_tree=null;\n        var COMMA112_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:602:9: (k= FOR p_ForBinding ( COMMA p_ForBinding )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:602:11: k= FOR p_ForBinding ( COMMA p_ForBinding )*\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,FOR,XQueryParser.FOLLOW_FOR_in_p_ForClause3844); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ForBinding_in_p_ForClause3848);\n            p_ForBinding111=this.p_ForBinding();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ForBinding111.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:602:45: ( COMMA p_ForBinding )*\n            loop51:\n            do {\n                var alt51=2;\n                var LA51_0 = this.input.LA(1);\n\n                if ( (LA51_0==COMMA) ) {\n                    alt51=1;\n                }\n\n\n                switch (alt51) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:602:46: COMMA p_ForBinding\n                    COMMA112=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_ForClause3851); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA112_tree = this.adaptor.create(COMMA112);\n                    this.adaptor.addChild(root_0, COMMA112_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ForBinding_in_p_ForClause3853);\n                    p_ForBinding113=this.p_ForBinding();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ForBinding113.getTree());\n\n\n                    break;\n\n                default :\n                    break loop51;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ForBinding_return: (function() {\n        XQueryParser.p_ForBinding_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ForBinding_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:606:1: p_ForBinding : s= DOLLAR v= p_VarName ( p_TypeDeclaration )? ( p_AllowingEmpty )? ( p_PositionalVar )? ( p_FTScoreVar )? k= IN p_ExprSingle[true] ;\n    // $ANTLR start \"p_ForBinding\"\n    p_ForBinding: function() {\n        var retval = new XQueryParser.p_ForBinding_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var s = null;\n        var k = null;\n         var v = null;\n         var p_TypeDeclaration114 = null;\n         var p_AllowingEmpty115 = null;\n         var p_PositionalVar116 = null;\n         var p_FTScoreVar117 = null;\n         var p_ExprSingle118 = null;\n\n        var s_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:9: (s= DOLLAR v= p_VarName ( p_TypeDeclaration )? ( p_AllowingEmpty )? ( p_PositionalVar )? ( p_FTScoreVar )? k= IN p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:11: s= DOLLAR v= p_VarName ( p_TypeDeclaration )? ( p_AllowingEmpty )? ( p_PositionalVar )? ( p_FTScoreVar )? k= IN p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            s=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_ForBinding3883); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            s_tree = this.adaptor.create(s);\n            this.adaptor.addChild(root_0, s_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_ForBinding3887);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(s, (v?v.stop:null)); \n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:58: ( p_TypeDeclaration )?\n            var alt52=2;\n            var LA52_0 = this.input.LA(1);\n\n            if ( (LA52_0==AS) ) {\n                alt52=1;\n            }\n            switch (alt52) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:58: p_TypeDeclaration\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_ForBinding3891);\n                    p_TypeDeclaration114=this.p_TypeDeclaration();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration114.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:77: ( p_AllowingEmpty )?\n            var alt53=2;\n            var LA53_0 = this.input.LA(1);\n\n            if ( (LA53_0==ALLOWING) ) {\n                alt53=1;\n            }\n            switch (alt53) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:77: p_AllowingEmpty\n                    this.pushFollow(XQueryParser.FOLLOW_p_AllowingEmpty_in_p_ForBinding3894);\n                    p_AllowingEmpty115=this.p_AllowingEmpty();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AllowingEmpty115.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:94: ( p_PositionalVar )?\n            var alt54=2;\n            var LA54_0 = this.input.LA(1);\n\n            if ( (LA54_0==AT) ) {\n                alt54=1;\n            }\n            switch (alt54) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:94: p_PositionalVar\n                    this.pushFollow(XQueryParser.FOLLOW_p_PositionalVar_in_p_ForBinding3897);\n                    p_PositionalVar116=this.p_PositionalVar();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PositionalVar116.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:111: ( p_FTScoreVar )?\n            var alt55=2;\n            var LA55_0 = this.input.LA(1);\n\n            if ( (LA55_0==SCORE) ) {\n                alt55=1;\n            }\n            switch (alt55) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:607:111: p_FTScoreVar\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTScoreVar_in_p_ForBinding3900);\n                    p_FTScoreVar117=this.p_FTScoreVar();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTScoreVar117.getTree());\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,IN,XQueryParser.FOLLOW_IN_in_p_ForBinding3905); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_ForBinding3909);\n            p_ExprSingle118=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle118.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AllowingEmpty_return: (function() {\n        XQueryParser.p_AllowingEmpty_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AllowingEmpty_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:611:1: p_AllowingEmpty : k= ALLOWING k= EMPTY ;\n    // $ANTLR start \"p_AllowingEmpty\"\n    p_AllowingEmpty: function() {\n        var retval = new XQueryParser.p_AllowingEmpty_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:612:9: (k= ALLOWING k= EMPTY )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:612:11: k= ALLOWING k= EMPTY\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,ALLOWING,XQueryParser.FOLLOW_ALLOWING_in_p_AllowingEmpty3938); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,EMPTY,XQueryParser.FOLLOW_EMPTY_in_p_AllowingEmpty3944); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PositionalVar_return: (function() {\n        XQueryParser.p_PositionalVar_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PositionalVar_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:616:1: p_PositionalVar : k= AT d= DOLLAR v= p_VarName ;\n    // $ANTLR start \"p_PositionalVar\"\n    p_PositionalVar: function() {\n        var retval = new XQueryParser.p_PositionalVar_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:617:9: (k= AT d= DOLLAR v= p_VarName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:617:11: k= AT d= DOLLAR v= p_VarName\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_PositionalVar3974); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_PositionalVar3980); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_PositionalVar3984);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_LetClause_return: (function() {\n        XQueryParser.p_LetClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_LetClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:621:1: p_LetClause : k= LET p_LetBinding ( COMMA p_LetBinding )* ;\n    // $ANTLR start \"p_LetClause\"\n    p_LetClause: function() {\n        var retval = new XQueryParser.p_LetClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var COMMA120 = null;\n         var p_LetBinding119 = null;\n         var p_LetBinding121 = null;\n\n        var k_tree=null;\n        var COMMA120_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:622:9: (k= LET p_LetBinding ( COMMA p_LetBinding )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:622:11: k= LET p_LetBinding ( COMMA p_LetBinding )*\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,LET,XQueryParser.FOLLOW_LET_in_p_LetClause4014); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_LetBinding_in_p_LetClause4018);\n            p_LetBinding119=this.p_LetBinding();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_LetBinding119.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:622:45: ( COMMA p_LetBinding )*\n            loop56:\n            do {\n                var alt56=2;\n                var LA56_0 = this.input.LA(1);\n\n                if ( (LA56_0==COMMA) ) {\n                    alt56=1;\n                }\n\n\n                switch (alt56) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:622:46: COMMA p_LetBinding\n                    COMMA120=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_LetClause4021); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA120_tree = this.adaptor.create(COMMA120);\n                    this.adaptor.addChild(root_0, COMMA120_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_LetBinding_in_p_LetClause4023);\n                    p_LetBinding121=this.p_LetBinding();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_LetBinding121.getTree());\n\n\n                    break;\n\n                default :\n                    break loop56;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_LetBinding_return: (function() {\n        XQueryParser.p_LetBinding_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_LetBinding_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:627:1: p_LetBinding : ( (d= DOLLAR v= p_VarName ( p_TypeDeclaration )? ) | p_FTScoreVar ) BIND p_ExprSingle[true] ;\n    // $ANTLR start \"p_LetBinding\"\n    p_LetBinding: function() {\n        var retval = new XQueryParser.p_LetBinding_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n        var BIND124 = null;\n         var v = null;\n         var p_TypeDeclaration122 = null;\n         var p_FTScoreVar123 = null;\n         var p_ExprSingle125 = null;\n\n        var d_tree=null;\n        var BIND124_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:9: ( ( (d= DOLLAR v= p_VarName ( p_TypeDeclaration )? ) | p_FTScoreVar ) BIND p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:11: ( (d= DOLLAR v= p_VarName ( p_TypeDeclaration )? ) | p_FTScoreVar ) BIND p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:11: ( (d= DOLLAR v= p_VarName ( p_TypeDeclaration )? ) | p_FTScoreVar )\n            var alt58=2;\n            var LA58_0 = this.input.LA(1);\n\n            if ( (LA58_0==DOLLAR) ) {\n                alt58=1;\n            }\n            else if ( (LA58_0==SCORE) ) {\n                alt58=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 58, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt58) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:13: (d= DOLLAR v= p_VarName ( p_TypeDeclaration )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:13: (d= DOLLAR v= p_VarName ( p_TypeDeclaration )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:14: d= DOLLAR v= p_VarName ( p_TypeDeclaration )?\n                    d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_LetBinding4057); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_LetBinding4061);\n                    v=this.p_VarName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n                    if ( this.state.backtracking===0 ) {\n                      this.av(d, (v?v.stop:null));\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:59: ( p_TypeDeclaration )?\n                    var alt57=2;\n                    var LA57_0 = this.input.LA(1);\n\n                    if ( (LA57_0==AS) ) {\n                        alt57=1;\n                    }\n                    switch (alt57) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:59: p_TypeDeclaration\n                            this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_LetBinding4065);\n                            p_TypeDeclaration122=this.p_TypeDeclaration();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration122.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:628:81: p_FTScoreVar\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTScoreVar_in_p_LetBinding4071);\n                    p_FTScoreVar123=this.p_FTScoreVar();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTScoreVar123.getTree());\n\n\n                    break;\n\n            }\n\n            BIND124=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_LetBinding4075); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            BIND124_tree = this.adaptor.create(BIND124);\n            this.adaptor.addChild(root_0, BIND124_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_LetBinding4077);\n            p_ExprSingle125=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle125.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_WindowClause_return: (function() {\n        XQueryParser.p_WindowClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_WindowClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:632:1: p_WindowClause : k= FOR ( p_TumblingWindowClause | p_SlidingWindowClause ) ;\n    // $ANTLR start \"p_WindowClause\"\n    p_WindowClause: function() {\n        var retval = new XQueryParser.p_WindowClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_TumblingWindowClause126 = null;\n         var p_SlidingWindowClause127 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:633:9: (k= FOR ( p_TumblingWindowClause | p_SlidingWindowClause ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:633:11: k= FOR ( p_TumblingWindowClause | p_SlidingWindowClause )\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,FOR,XQueryParser.FOLLOW_FOR_in_p_WindowClause4106); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:633:32: ( p_TumblingWindowClause | p_SlidingWindowClause )\n            var alt59=2;\n            var LA59_0 = this.input.LA(1);\n\n            if ( (LA59_0==TUMBLING) ) {\n                alt59=1;\n            }\n            else if ( (LA59_0==SLIDING) ) {\n                alt59=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 59, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt59) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:633:33: p_TumblingWindowClause\n                    this.pushFollow(XQueryParser.FOLLOW_p_TumblingWindowClause_in_p_WindowClause4111);\n                    p_TumblingWindowClause126=this.p_TumblingWindowClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TumblingWindowClause126.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:633:58: p_SlidingWindowClause\n                    this.pushFollow(XQueryParser.FOLLOW_p_SlidingWindowClause_in_p_WindowClause4115);\n                    p_SlidingWindowClause127=this.p_SlidingWindowClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SlidingWindowClause127.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TumblingWindowClause_return: (function() {\n        XQueryParser.p_TumblingWindowClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TumblingWindowClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:637:1: p_TumblingWindowClause : k= TUMBLING k= WINDOW d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] p_WindowStartCondition ( p_WindowEndCondition )? ;\n    // $ANTLR start \"p_TumblingWindowClause\"\n    p_TumblingWindowClause: function() {\n        var retval = new XQueryParser.p_TumblingWindowClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n         var p_TypeDeclaration128 = null;\n         var p_ExprSingle129 = null;\n         var p_WindowStartCondition130 = null;\n         var p_WindowEndCondition131 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:638:9: (k= TUMBLING k= WINDOW d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] p_WindowStartCondition ( p_WindowEndCondition )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:638:11: k= TUMBLING k= WINDOW d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] p_WindowStartCondition ( p_WindowEndCondition )?\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TUMBLING,XQueryParser.FOLLOW_TUMBLING_in_p_TumblingWindowClause4152); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,WINDOW,XQueryParser.FOLLOW_WINDOW_in_p_TumblingWindowClause4158); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_TumblingWindowClause4164); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_TumblingWindowClause4168);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.av(d, (v?v.stop:null));\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:638:106: ( p_TypeDeclaration )?\n            var alt60=2;\n            var LA60_0 = this.input.LA(1);\n\n            if ( (LA60_0==AS) ) {\n                alt60=1;\n            }\n            switch (alt60) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:638:106: p_TypeDeclaration\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_TumblingWindowClause4172);\n                    p_TypeDeclaration128=this.p_TypeDeclaration();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration128.getTree());\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,IN,XQueryParser.FOLLOW_IN_in_p_TumblingWindowClause4177); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_TumblingWindowClause4181);\n            p_ExprSingle129=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle129.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_WindowStartCondition_in_p_TumblingWindowClause4184);\n            p_WindowStartCondition130=this.p_WindowStartCondition();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WindowStartCondition130.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:638:187: ( p_WindowEndCondition )?\n            var alt61=2;\n            var LA61_0 = this.input.LA(1);\n\n            if ( (LA61_0==END||LA61_0==ONLY) ) {\n                alt61=1;\n            }\n            switch (alt61) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:638:187: p_WindowEndCondition\n                    this.pushFollow(XQueryParser.FOLLOW_p_WindowEndCondition_in_p_TumblingWindowClause4186);\n                    p_WindowEndCondition131=this.p_WindowEndCondition();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WindowEndCondition131.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SlidingWindowClause_return: (function() {\n        XQueryParser.p_SlidingWindowClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SlidingWindowClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:642:1: p_SlidingWindowClause : k= SLIDING k= WINDOW d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] p_WindowStartCondition ( p_WindowEndCondition )? ;\n    // $ANTLR start \"p_SlidingWindowClause\"\n    p_SlidingWindowClause: function() {\n        var retval = new XQueryParser.p_SlidingWindowClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n         var p_TypeDeclaration132 = null;\n         var p_ExprSingle133 = null;\n         var p_WindowStartCondition134 = null;\n         var p_WindowEndCondition135 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:643:9: (k= SLIDING k= WINDOW d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] p_WindowStartCondition ( p_WindowEndCondition )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:643:11: k= SLIDING k= WINDOW d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] p_WindowStartCondition ( p_WindowEndCondition )?\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,SLIDING,XQueryParser.FOLLOW_SLIDING_in_p_SlidingWindowClause4215); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,WINDOW,XQueryParser.FOLLOW_WINDOW_in_p_SlidingWindowClause4221); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_SlidingWindowClause4227); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_SlidingWindowClause4231);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:643:107: ( p_TypeDeclaration )?\n            var alt62=2;\n            var LA62_0 = this.input.LA(1);\n\n            if ( (LA62_0==AS) ) {\n                alt62=1;\n            }\n            switch (alt62) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:643:107: p_TypeDeclaration\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_SlidingWindowClause4235);\n                    p_TypeDeclaration132=this.p_TypeDeclaration();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration132.getTree());\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,IN,XQueryParser.FOLLOW_IN_in_p_SlidingWindowClause4240); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_SlidingWindowClause4244);\n            p_ExprSingle133=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle133.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_WindowStartCondition_in_p_SlidingWindowClause4247);\n            p_WindowStartCondition134=this.p_WindowStartCondition();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WindowStartCondition134.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:643:188: ( p_WindowEndCondition )?\n            var alt63=2;\n            var LA63_0 = this.input.LA(1);\n\n            if ( (LA63_0==END||LA63_0==ONLY) ) {\n                alt63=1;\n            }\n            switch (alt63) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:643:188: p_WindowEndCondition\n                    this.pushFollow(XQueryParser.FOLLOW_p_WindowEndCondition_in_p_SlidingWindowClause4249);\n                    p_WindowEndCondition135=this.p_WindowEndCondition();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WindowEndCondition135.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_WindowStartCondition_return: (function() {\n        XQueryParser.p_WindowStartCondition_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_WindowStartCondition_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:647:1: p_WindowStartCondition : k= START p_WindowVars k= WHEN p_ExprSingle[true] ;\n    // $ANTLR start \"p_WindowStartCondition\"\n    p_WindowStartCondition: function() {\n        var retval = new XQueryParser.p_WindowStartCondition_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_WindowVars136 = null;\n         var p_ExprSingle137 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:648:9: (k= START p_WindowVars k= WHEN p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:648:11: k= START p_WindowVars k= WHEN p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,START,XQueryParser.FOLLOW_START_in_p_WindowStartCondition4278); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_WindowVars_in_p_WindowStartCondition4282);\n            p_WindowVars136=this.p_WindowVars();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WindowVars136.getTree());\n            k=this.match(this.input,WHEN,XQueryParser.FOLLOW_WHEN_in_p_WindowStartCondition4286); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_WindowStartCondition4290);\n            p_ExprSingle137=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle137.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_WindowEndCondition_return: (function() {\n        XQueryParser.p_WindowEndCondition_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_WindowEndCondition_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:652:1: p_WindowEndCondition : (k= ONLY )? k= END p_WindowVars k= WHEN p_ExprSingle[true] ;\n    // $ANTLR start \"p_WindowEndCondition\"\n    p_WindowEndCondition: function() {\n        var retval = new XQueryParser.p_WindowEndCondition_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_WindowVars138 = null;\n         var p_ExprSingle139 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:653:9: ( (k= ONLY )? k= END p_WindowVars k= WHEN p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:653:11: (k= ONLY )? k= END p_WindowVars k= WHEN p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:653:11: (k= ONLY )?\n            var alt64=2;\n            var LA64_0 = this.input.LA(1);\n\n            if ( (LA64_0==ONLY) ) {\n                alt64=1;\n            }\n            switch (alt64) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:653:12: k= ONLY\n                    k=this.match(this.input,ONLY,XQueryParser.FOLLOW_ONLY_in_p_WindowEndCondition4320); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,END,XQueryParser.FOLLOW_END_in_p_WindowEndCondition4328); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_WindowVars_in_p_WindowEndCondition4332);\n            p_WindowVars138=this.p_WindowVars();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WindowVars138.getTree());\n            k=this.match(this.input,WHEN,XQueryParser.FOLLOW_WHEN_in_p_WindowEndCondition4336); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_WindowEndCondition4340);\n            p_ExprSingle139=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle139.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_WindowVars_return: (function() {\n        XQueryParser.p_WindowVars_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_WindowVars_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:657:1: p_WindowVars : (d= DOLLAR v= p_CurrentItem )? ( p_PositionalVar )? (k= PREVIOUS DOLLAR p_PreviousItem )? (k= NEXT DOLLAR p_NextItem )? ;\n    // $ANTLR start \"p_WindowVars\"\n    p_WindowVars: function() {\n        var retval = new XQueryParser.p_WindowVars_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n        var k = null;\n        var DOLLAR141 = null;\n        var DOLLAR143 = null;\n         var v = null;\n         var p_PositionalVar140 = null;\n         var p_PreviousItem142 = null;\n         var p_NextItem144 = null;\n\n        var d_tree=null;\n        var k_tree=null;\n        var DOLLAR141_tree=null;\n        var DOLLAR143_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:9: ( (d= DOLLAR v= p_CurrentItem )? ( p_PositionalVar )? (k= PREVIOUS DOLLAR p_PreviousItem )? (k= NEXT DOLLAR p_NextItem )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:11: (d= DOLLAR v= p_CurrentItem )? ( p_PositionalVar )? (k= PREVIOUS DOLLAR p_PreviousItem )? (k= NEXT DOLLAR p_NextItem )?\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:11: (d= DOLLAR v= p_CurrentItem )?\n            var alt65=2;\n            var LA65_0 = this.input.LA(1);\n\n            if ( (LA65_0==DOLLAR) ) {\n                alt65=1;\n            }\n            switch (alt65) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:12: d= DOLLAR v= p_CurrentItem\n                    d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_WindowVars4370); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_CurrentItem_in_p_WindowVars4374);\n                    v=this.p_CurrentItem();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.av(d, (v?v.stop:null)); \n                    }\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:65: ( p_PositionalVar )?\n            var alt66=2;\n            var LA66_0 = this.input.LA(1);\n\n            if ( (LA66_0==AT) ) {\n                alt66=1;\n            }\n            switch (alt66) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:65: p_PositionalVar\n                    this.pushFollow(XQueryParser.FOLLOW_p_PositionalVar_in_p_WindowVars4380);\n                    p_PositionalVar140=this.p_PositionalVar();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PositionalVar140.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:82: (k= PREVIOUS DOLLAR p_PreviousItem )?\n            var alt67=2;\n            var LA67_0 = this.input.LA(1);\n\n            if ( (LA67_0==PREVIOUS) ) {\n                alt67=1;\n            }\n            switch (alt67) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:83: k= PREVIOUS DOLLAR p_PreviousItem\n                    k=this.match(this.input,PREVIOUS,XQueryParser.FOLLOW_PREVIOUS_in_p_WindowVars4386); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    DOLLAR141=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_WindowVars4390); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    DOLLAR141_tree = this.adaptor.create(DOLLAR141);\n                    this.adaptor.addChild(root_0, DOLLAR141_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_PreviousItem_in_p_WindowVars4392);\n                    p_PreviousItem142=this.p_PreviousItem();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PreviousItem142.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:133: (k= NEXT DOLLAR p_NextItem )?\n            var alt68=2;\n            var LA68_0 = this.input.LA(1);\n\n            if ( (LA68_0==NEXT) ) {\n                alt68=1;\n            }\n            switch (alt68) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:658:134: k= NEXT DOLLAR p_NextItem\n                    k=this.match(this.input,NEXT,XQueryParser.FOLLOW_NEXT_in_p_WindowVars4399); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    DOLLAR143=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_WindowVars4403); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    DOLLAR143_tree = this.adaptor.create(DOLLAR143);\n                    this.adaptor.addChild(root_0, DOLLAR143_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_NextItem_in_p_WindowVars4405);\n                    p_NextItem144=this.p_NextItem();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NextItem144.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CurrentItem_return: (function() {\n        XQueryParser.p_CurrentItem_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CurrentItem_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:662:1: p_CurrentItem : p_EQName ;\n    // $ANTLR start \"p_CurrentItem\"\n    p_CurrentItem: function() {\n        var retval = new XQueryParser.p_CurrentItem_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName145 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:663:9: ( p_EQName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:663:11: p_EQName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_CurrentItem4433);\n            p_EQName145=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName145.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PreviousItem_return: (function() {\n        XQueryParser.p_PreviousItem_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PreviousItem_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:667:1: p_PreviousItem : p_EQName ;\n    // $ANTLR start \"p_PreviousItem\"\n    p_PreviousItem: function() {\n        var retval = new XQueryParser.p_PreviousItem_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName146 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:668:9: ( p_EQName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:668:11: p_EQName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_PreviousItem4459);\n            p_EQName146=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName146.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NextItem_return: (function() {\n        XQueryParser.p_NextItem_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NextItem_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:672:1: p_NextItem : p_EQName ;\n    // $ANTLR start \"p_NextItem\"\n    p_NextItem: function() {\n        var retval = new XQueryParser.p_NextItem_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName147 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:673:9: ( p_EQName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:673:11: p_EQName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_NextItem4485);\n            p_EQName147=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName147.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CountClause_return: (function() {\n        XQueryParser.p_CountClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CountClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:677:1: p_CountClause : k= COUNT d= DOLLAR v= p_VarName ;\n    // $ANTLR start \"p_CountClause\"\n    p_CountClause: function() {\n        var retval = new XQueryParser.p_CountClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:678:9: (k= COUNT d= DOLLAR v= p_VarName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:678:11: k= COUNT d= DOLLAR v= p_VarName\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,COUNT,XQueryParser.FOLLOW_COUNT_in_p_CountClause4513); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_CountClause4519); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_CountClause4523);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_WhereClause_return: (function() {\n        XQueryParser.p_WhereClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_WhereClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:682:1: p_WhereClause : k= WHERE p_ExprSingle[true] ;\n    // $ANTLR start \"p_WhereClause\"\n    p_WhereClause: function() {\n        var retval = new XQueryParser.p_WhereClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_ExprSingle148 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:683:9: (k= WHERE p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:683:11: k= WHERE p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,WHERE,XQueryParser.FOLLOW_WHERE_in_p_WhereClause4561); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_WhereClause4565);\n            p_ExprSingle148=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle148.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_GroupByClause_return: (function() {\n        XQueryParser.p_GroupByClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_GroupByClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:687:1: p_GroupByClause : k= GROUP k= BY p_GroupingSpecList ;\n    // $ANTLR start \"p_GroupByClause\"\n    p_GroupByClause: function() {\n        var retval = new XQueryParser.p_GroupByClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_GroupingSpecList149 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:688:9: (k= GROUP k= BY p_GroupingSpecList )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:688:11: k= GROUP k= BY p_GroupingSpecList\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,GROUP,XQueryParser.FOLLOW_GROUP_in_p_GroupByClause4594); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,BY,XQueryParser.FOLLOW_BY_in_p_GroupByClause4600); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_GroupingSpecList_in_p_GroupByClause4604);\n            p_GroupingSpecList149=this.p_GroupingSpecList();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_GroupingSpecList149.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_GroupingSpecList_return: (function() {\n        XQueryParser.p_GroupingSpecList_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_GroupingSpecList_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:692:1: p_GroupingSpecList : p_GroupingSpec ( COMMA p_GroupingSpec )* ;\n    // $ANTLR start \"p_GroupingSpecList\"\n    p_GroupingSpecList: function() {\n        var retval = new XQueryParser.p_GroupingSpecList_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var COMMA151 = null;\n         var p_GroupingSpec150 = null;\n         var p_GroupingSpec152 = null;\n\n        var COMMA151_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:693:9: ( p_GroupingSpec ( COMMA p_GroupingSpec )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:693:11: p_GroupingSpec ( COMMA p_GroupingSpec )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_GroupingSpec_in_p_GroupingSpecList4630);\n            p_GroupingSpec150=this.p_GroupingSpec();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_GroupingSpec150.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:693:26: ( COMMA p_GroupingSpec )*\n            loop69:\n            do {\n                var alt69=2;\n                var LA69_0 = this.input.LA(1);\n\n                if ( (LA69_0==COMMA) ) {\n                    alt69=1;\n                }\n\n\n                switch (alt69) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:693:27: COMMA p_GroupingSpec\n                    COMMA151=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_GroupingSpecList4633); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA151_tree = this.adaptor.create(COMMA151);\n                    this.adaptor.addChild(root_0, COMMA151_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_GroupingSpec_in_p_GroupingSpecList4635);\n                    p_GroupingSpec152=this.p_GroupingSpec();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_GroupingSpec152.getTree());\n\n\n                    break;\n\n                default :\n                    break loop69;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_GroupingSpec_return: (function() {\n        XQueryParser.p_GroupingSpec_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_GroupingSpec_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:697:1: p_GroupingSpec : p_GroupingVariable ( ( p_TypeDeclaration )? BIND p_ExprSingle[true] )? (k= COLLATION p_StringLiteral )? ;\n    // $ANTLR start \"p_GroupingSpec\"\n    p_GroupingSpec: function() {\n        var retval = new XQueryParser.p_GroupingSpec_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var BIND155 = null;\n         var p_GroupingVariable153 = null;\n         var p_TypeDeclaration154 = null;\n         var p_ExprSingle156 = null;\n         var p_StringLiteral157 = null;\n\n        var k_tree=null;\n        var BIND155_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:9: ( p_GroupingVariable ( ( p_TypeDeclaration )? BIND p_ExprSingle[true] )? (k= COLLATION p_StringLiteral )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:11: p_GroupingVariable ( ( p_TypeDeclaration )? BIND p_ExprSingle[true] )? (k= COLLATION p_StringLiteral )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_GroupingVariable_in_p_GroupingSpec4663);\n            p_GroupingVariable153=this.p_GroupingVariable();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_GroupingVariable153.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:30: ( ( p_TypeDeclaration )? BIND p_ExprSingle[true] )?\n            var alt71=2;\n            var LA71_0 = this.input.LA(1);\n\n            if ( (LA71_0==AS||LA71_0==BIND) ) {\n                alt71=1;\n            }\n            switch (alt71) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:31: ( p_TypeDeclaration )? BIND p_ExprSingle[true]\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:31: ( p_TypeDeclaration )?\n                    var alt70=2;\n                    var LA70_0 = this.input.LA(1);\n\n                    if ( (LA70_0==AS) ) {\n                        alt70=1;\n                    }\n                    switch (alt70) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:31: p_TypeDeclaration\n                            this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_GroupingSpec4666);\n                            p_TypeDeclaration154=this.p_TypeDeclaration();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration154.getTree());\n\n\n                            break;\n\n                    }\n\n                    BIND155=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_GroupingSpec4669); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    BIND155_tree = this.adaptor.create(BIND155);\n                    this.adaptor.addChild(root_0, BIND155_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_GroupingSpec4671);\n                    p_ExprSingle156=this.p_ExprSingle(true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle156.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:76: (k= COLLATION p_StringLiteral )?\n            var alt72=2;\n            var LA72_0 = this.input.LA(1);\n\n            if ( (LA72_0==COLLATION) ) {\n                alt72=1;\n            }\n            switch (alt72) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:698:77: k= COLLATION p_StringLiteral\n                    k=this.match(this.input,COLLATION,XQueryParser.FOLLOW_COLLATION_in_p_GroupingSpec4679); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_GroupingSpec4683);\n                    p_StringLiteral157=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral157.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_GroupingVariable_return: (function() {\n        XQueryParser.p_GroupingVariable_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_GroupingVariable_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:701:1: p_GroupingVariable : d= DOLLAR v= p_VarName ;\n    // $ANTLR start \"p_GroupingVariable\"\n    p_GroupingVariable: function() {\n        var retval = new XQueryParser.p_GroupingVariable_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n         var v = null;\n\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:702:9: (d= DOLLAR v= p_VarName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:702:11: d= DOLLAR v= p_VarName\n            root_0 = this.adaptor.nil();\n\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_GroupingVariable4712); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_GroupingVariable4716);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_OrderByClause_return: (function() {\n        XQueryParser.p_OrderByClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_OrderByClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:706:1: p_OrderByClause : ( (k+= ORDER k+= BY ) | (k+= STABLE k+= ORDER k+= BY ) ) p_OrderSpecList ;\n    // $ANTLR start \"p_OrderByClause\"\n    p_OrderByClause: function() {\n        var retval = new XQueryParser.p_OrderByClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_OrderSpecList158 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:9: ( ( (k+= ORDER k+= BY ) | (k+= STABLE k+= ORDER k+= BY ) ) p_OrderSpecList )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:11: ( (k+= ORDER k+= BY ) | (k+= STABLE k+= ORDER k+= BY ) ) p_OrderSpecList\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:11: ( (k+= ORDER k+= BY ) | (k+= STABLE k+= ORDER k+= BY ) )\n            var alt73=2;\n            var LA73_0 = this.input.LA(1);\n\n            if ( (LA73_0==ORDER) ) {\n                alt73=1;\n            }\n            else if ( (LA73_0==STABLE) ) {\n                alt73=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 73, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt73) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:12: (k+= ORDER k+= BY )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:12: (k+= ORDER k+= BY )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:13: k+= ORDER k+= BY\n                    k=this.match(this.input,ORDER,XQueryParser.FOLLOW_ORDER_in_p_OrderByClause4748); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,BY,XQueryParser.FOLLOW_BY_in_p_OrderByClause4752); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:31: (k+= STABLE k+= ORDER k+= BY )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:31: (k+= STABLE k+= ORDER k+= BY )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:707:32: k+= STABLE k+= ORDER k+= BY\n                    k=this.match(this.input,STABLE,XQueryParser.FOLLOW_STABLE_in_p_OrderByClause4760); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,ORDER,XQueryParser.FOLLOW_ORDER_in_p_OrderByClause4764); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,BY,XQueryParser.FOLLOW_BY_in_p_OrderByClause4768); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_OrderSpecList_in_p_OrderByClause4774);\n            p_OrderSpecList158=this.p_OrderSpecList();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OrderSpecList158.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_OrderSpecList_return: (function() {\n        XQueryParser.p_OrderSpecList_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_OrderSpecList_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:711:1: p_OrderSpecList : p_OrderSpec ( COMMA p_OrderSpec )* ;\n    // $ANTLR start \"p_OrderSpecList\"\n    p_OrderSpecList: function() {\n        var retval = new XQueryParser.p_OrderSpecList_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var COMMA160 = null;\n         var p_OrderSpec159 = null;\n         var p_OrderSpec161 = null;\n\n        var COMMA160_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:712:9: ( p_OrderSpec ( COMMA p_OrderSpec )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:712:11: p_OrderSpec ( COMMA p_OrderSpec )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_OrderSpec_in_p_OrderSpecList4800);\n            p_OrderSpec159=this.p_OrderSpec();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OrderSpec159.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:712:23: ( COMMA p_OrderSpec )*\n            loop74:\n            do {\n                var alt74=2;\n                var LA74_0 = this.input.LA(1);\n\n                if ( (LA74_0==COMMA) ) {\n                    alt74=1;\n                }\n\n\n                switch (alt74) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:712:24: COMMA p_OrderSpec\n                    COMMA160=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_OrderSpecList4803); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA160_tree = this.adaptor.create(COMMA160);\n                    this.adaptor.addChild(root_0, COMMA160_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_OrderSpec_in_p_OrderSpecList4805);\n                    p_OrderSpec161=this.p_OrderSpec();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OrderSpec161.getTree());\n\n\n                    break;\n\n                default :\n                    break loop74;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_OrderSpec_return: (function() {\n        XQueryParser.p_OrderSpec_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_OrderSpec_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:716:1: p_OrderSpec : p_ExprSingle[true] p_OrderModifier ;\n    // $ANTLR start \"p_OrderSpec\"\n    p_OrderSpec: function() {\n        var retval = new XQueryParser.p_OrderSpec_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle162 = null;\n         var p_OrderModifier163 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:717:9: ( p_ExprSingle[true] p_OrderModifier )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:717:11: p_ExprSingle[true] p_OrderModifier\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_OrderSpec4833);\n            p_ExprSingle162=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle162.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_OrderModifier_in_p_OrderSpec4836);\n            p_OrderModifier163=this.p_OrderModifier();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OrderModifier163.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_OrderModifier_return: (function() {\n        XQueryParser.p_OrderModifier_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_OrderModifier_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:721:1: p_OrderModifier : (k+= ASCENDING | k+= DESCENDING )? (k+= EMPTY (k+= GREATEST | k+= LEAST ) )? (k+= COLLATION p_StringLiteral )? ;\n    // $ANTLR start \"p_OrderModifier\"\n    p_OrderModifier: function() {\n        var retval = new XQueryParser.p_OrderModifier_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_StringLiteral164 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:9: ( (k+= ASCENDING | k+= DESCENDING )? (k+= EMPTY (k+= GREATEST | k+= LEAST ) )? (k+= COLLATION p_StringLiteral )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:11: (k+= ASCENDING | k+= DESCENDING )? (k+= EMPTY (k+= GREATEST | k+= LEAST ) )? (k+= COLLATION p_StringLiteral )?\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:11: (k+= ASCENDING | k+= DESCENDING )?\n            var alt75=3;\n            var LA75_0 = this.input.LA(1);\n\n            if ( (LA75_0==ASCENDING) ) {\n                alt75=1;\n            }\n            else if ( (LA75_0==DESCENDING) ) {\n                alt75=2;\n            }\n            switch (alt75) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:12: k+= ASCENDING\n                    k=this.match(this.input,ASCENDING,XQueryParser.FOLLOW_ASCENDING_in_p_OrderModifier4865); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:27: k+= DESCENDING\n                    k=this.match(this.input,DESCENDING,XQueryParser.FOLLOW_DESCENDING_in_p_OrderModifier4871); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:43: (k+= EMPTY (k+= GREATEST | k+= LEAST ) )?\n            var alt77=2;\n            var LA77_0 = this.input.LA(1);\n\n            if ( (LA77_0==EMPTY) ) {\n                alt77=1;\n            }\n            switch (alt77) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:44: k+= EMPTY (k+= GREATEST | k+= LEAST )\n                    k=this.match(this.input,EMPTY,XQueryParser.FOLLOW_EMPTY_in_p_OrderModifier4878); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:53: (k+= GREATEST | k+= LEAST )\n                    var alt76=2;\n                    var LA76_0 = this.input.LA(1);\n\n                    if ( (LA76_0==GREATEST) ) {\n                        alt76=1;\n                    }\n                    else if ( (LA76_0==LEAST) ) {\n                        alt76=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 76, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt76) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:54: k+= GREATEST\n                            k=this.match(this.input,GREATEST,XQueryParser.FOLLOW_GREATEST_in_p_OrderModifier4883); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n                            if (org.antlr.lang.isNull(list_k)) list_k = [];\n                            list_k.push(k);\n\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:68: k+= LEAST\n                            k=this.match(this.input,LEAST,XQueryParser.FOLLOW_LEAST_in_p_OrderModifier4889); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n                            if (org.antlr.lang.isNull(list_k)) list_k = [];\n                            list_k.push(k);\n\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:80: (k+= COLLATION p_StringLiteral )?\n            var alt78=2;\n            var LA78_0 = this.input.LA(1);\n\n            if ( (LA78_0==COLLATION) ) {\n                alt78=1;\n            }\n            switch (alt78) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:722:81: k+= COLLATION p_StringLiteral\n                    k=this.match(this.input,COLLATION,XQueryParser.FOLLOW_COLLATION_in_p_OrderModifier4897); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_OrderModifier4899);\n                    p_StringLiteral164=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral164.getTree());\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ReturnHybrid_return: (function() {\n        XQueryParser.p_ReturnHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ReturnHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:726:1: p_ReturnHybrid[strict] : k= RETURN p_Hybrid[$strict,false] ;\n    // $ANTLR start \"p_ReturnHybrid\"\n    p_ReturnHybrid: function(strict) {\n        var retval = new XQueryParser.p_ReturnHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_Hybrid165 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:727:9: (k= RETURN p_Hybrid[$strict,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:727:11: k= RETURN p_Hybrid[$strict,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_ReturnHybrid4932); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_ReturnHybrid4936);\n            p_Hybrid165=this.p_Hybrid(strict, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid165.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_QuantifiedExpr_return: (function() {\n        XQueryParser.p_QuantifiedExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_QuantifiedExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:731:1: p_QuantifiedExpr : (k= SOME | k= EVERY ) d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] ( COMMA e= DOLLAR w= p_EQName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] )* k= SATISFIES p_ExprSingle[true] ;\n    // $ANTLR start \"p_QuantifiedExpr\"\n    p_QuantifiedExpr: function() {\n        var retval = new XQueryParser.p_QuantifiedExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n        var e = null;\n        var COMMA168 = null;\n         var v = null;\n         var w = null;\n         var p_TypeDeclaration166 = null;\n         var p_ExprSingle167 = null;\n         var p_TypeDeclaration169 = null;\n         var p_ExprSingle170 = null;\n         var p_ExprSingle171 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n        var e_tree=null;\n        var COMMA168_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:9: ( (k= SOME | k= EVERY ) d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] ( COMMA e= DOLLAR w= p_EQName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] )* k= SATISFIES p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:11: (k= SOME | k= EVERY ) d= DOLLAR v= p_VarName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] ( COMMA e= DOLLAR w= p_EQName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] )* k= SATISFIES p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:11: (k= SOME | k= EVERY )\n            var alt79=2;\n            var LA79_0 = this.input.LA(1);\n\n            if ( (LA79_0==SOME) ) {\n                alt79=1;\n            }\n            else if ( (LA79_0==EVERY) ) {\n                alt79=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 79, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt79) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:12: k= SOME\n                    k=this.match(this.input,SOME,XQueryParser.FOLLOW_SOME_in_p_QuantifiedExpr4966); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:21: k= EVERY\n                    k=this.match(this.input,EVERY,XQueryParser.FOLLOW_EVERY_in_p_QuantifiedExpr4972); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_QuantifiedExpr4979); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_QuantifiedExpr4983);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:92: ( p_TypeDeclaration )?\n            var alt80=2;\n            var LA80_0 = this.input.LA(1);\n\n            if ( (LA80_0==AS) ) {\n                alt80=1;\n            }\n            switch (alt80) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:92: p_TypeDeclaration\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_QuantifiedExpr4987);\n                    p_TypeDeclaration166=this.p_TypeDeclaration();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration166.getTree());\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,IN,XQueryParser.FOLLOW_IN_in_p_QuantifiedExpr4992); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_QuantifiedExpr4996);\n            p_ExprSingle167=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle167.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:150: ( COMMA e= DOLLAR w= p_EQName ( p_TypeDeclaration )? k= IN p_ExprSingle[true] )*\n            loop82:\n            do {\n                var alt82=2;\n                var LA82_0 = this.input.LA(1);\n\n                if ( (LA82_0==COMMA) ) {\n                    alt82=1;\n                }\n\n\n                switch (alt82) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:151: COMMA e= DOLLAR w= p_EQName ( p_TypeDeclaration )? k= IN p_ExprSingle[true]\n                    COMMA168=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_QuantifiedExpr5000); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA168_tree = this.adaptor.create(COMMA168);\n                    this.adaptor.addChild(root_0, COMMA168_tree);\n                    }\n                    e=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_QuantifiedExpr5004); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    e_tree = this.adaptor.create(e);\n                    this.adaptor.addChild(root_0, e_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_QuantifiedExpr5008);\n                    w=this.p_EQName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, w.getTree());\n                    if ( this.state.backtracking===0 ) {\n                      this.av(e, (w?w.stop:null));\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:201: ( p_TypeDeclaration )?\n                    var alt81=2;\n                    var LA81_0 = this.input.LA(1);\n\n                    if ( (LA81_0==AS) ) {\n                        alt81=1;\n                    }\n                    switch (alt81) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:732:201: p_TypeDeclaration\n                            this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_QuantifiedExpr5012);\n                            p_TypeDeclaration169=this.p_TypeDeclaration();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration169.getTree());\n\n\n                            break;\n\n                    }\n\n                    k=this.match(this.input,IN,XQueryParser.FOLLOW_IN_in_p_QuantifiedExpr5017); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_QuantifiedExpr5021);\n                    p_ExprSingle170=this.p_ExprSingle(true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle170.getTree());\n\n\n                    break;\n\n                default :\n                    break loop82;\n                }\n            } while (true);\n\n            k=this.match(this.input,SATISFIES,XQueryParser.FOLLOW_SATISFIES_in_p_QuantifiedExpr5028); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_QuantifiedExpr5032);\n            p_ExprSingle171=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle171.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SwitchHybrid_return: (function() {\n        XQueryParser.p_SwitchHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SwitchHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:736:1: p_SwitchHybrid[strict] : k= SWITCH LPAREN p_Expr[true,true] RPAREN ( p_SwitchCaseHybrid[$strict] )+ k= DEFAULT k= RETURN p_Hybrid[$strict,false] ;\n    // $ANTLR start \"p_SwitchHybrid\"\n    p_SwitchHybrid: function(strict) {\n        var retval = new XQueryParser.p_SwitchHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LPAREN172 = null;\n        var RPAREN174 = null;\n         var p_Expr173 = null;\n         var p_SwitchCaseHybrid175 = null;\n         var p_Hybrid176 = null;\n\n        var k_tree=null;\n        var LPAREN172_tree=null;\n        var RPAREN174_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:737:9: (k= SWITCH LPAREN p_Expr[true,true] RPAREN ( p_SwitchCaseHybrid[$strict] )+ k= DEFAULT k= RETURN p_Hybrid[$strict,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:737:11: k= SWITCH LPAREN p_Expr[true,true] RPAREN ( p_SwitchCaseHybrid[$strict] )+ k= DEFAULT k= RETURN p_Hybrid[$strict,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,SWITCH,XQueryParser.FOLLOW_SWITCH_in_p_SwitchHybrid5062); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LPAREN172=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_SwitchHybrid5066); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN172_tree = this.adaptor.create(LPAREN172);\n            this.adaptor.addChild(root_0, LPAREN172_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_SwitchHybrid5068);\n            p_Expr173=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr173.getTree());\n            RPAREN174=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_SwitchHybrid5071); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN174_tree = this.adaptor.create(RPAREN174);\n            this.adaptor.addChild(root_0, RPAREN174_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:737:67: ( p_SwitchCaseHybrid[$strict] )+\n            var cnt83=0;\n            loop83:\n            do {\n                var alt83=2;\n                var LA83_0 = this.input.LA(1);\n\n                if ( (LA83_0==CASE) ) {\n                    alt83=1;\n                }\n\n\n                switch (alt83) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:737:67: p_SwitchCaseHybrid[$strict]\n                    this.pushFollow(XQueryParser.FOLLOW_p_SwitchCaseHybrid_in_p_SwitchHybrid5073);\n                    p_SwitchCaseHybrid175=this.p_SwitchCaseHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SwitchCaseHybrid175.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt83 >= 1 ) {\n                        break loop83;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(83, this.input);\n                        throw eee;\n                }\n                cnt83++;\n            } while (true);\n\n            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_SwitchHybrid5079); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_SwitchHybrid5085); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_SwitchHybrid5089);\n            p_Hybrid176=this.p_Hybrid(strict, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid176.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SwitchCaseHybrid_return: (function() {\n        XQueryParser.p_SwitchCaseHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SwitchCaseHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:741:1: p_SwitchCaseHybrid[strict] : (k= CASE p_SwitchCaseOperand )+ k= RETURN p_Hybrid[$strict,false] ;\n    // $ANTLR start \"p_SwitchCaseHybrid\"\n    p_SwitchCaseHybrid: function(strict) {\n        var retval = new XQueryParser.p_SwitchCaseHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_SwitchCaseOperand177 = null;\n         var p_Hybrid178 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:742:9: ( (k= CASE p_SwitchCaseOperand )+ k= RETURN p_Hybrid[$strict,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:742:11: (k= CASE p_SwitchCaseOperand )+ k= RETURN p_Hybrid[$strict,false]\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:742:11: (k= CASE p_SwitchCaseOperand )+\n            var cnt84=0;\n            loop84:\n            do {\n                var alt84=2;\n                var LA84_0 = this.input.LA(1);\n\n                if ( (LA84_0==CASE) ) {\n                    alt84=1;\n                }\n\n\n                switch (alt84) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:742:12: k= CASE p_SwitchCaseOperand\n                    k=this.match(this.input,CASE,XQueryParser.FOLLOW_CASE_in_p_SwitchCaseHybrid5120); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SwitchCaseOperand_in_p_SwitchCaseHybrid5124);\n                    p_SwitchCaseOperand177=this.p_SwitchCaseOperand();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SwitchCaseOperand177.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt84 >= 1 ) {\n                        break loop84;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(84, this.input);\n                        throw eee;\n                }\n                cnt84++;\n            } while (true);\n\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_SwitchCaseHybrid5130); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_SwitchCaseHybrid5134);\n            p_Hybrid178=this.p_Hybrid(strict, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid178.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SwitchCaseOperand_return: (function() {\n        XQueryParser.p_SwitchCaseOperand_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SwitchCaseOperand_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:746:1: p_SwitchCaseOperand : p_ExprSingle[true] ;\n    // $ANTLR start \"p_SwitchCaseOperand\"\n    p_SwitchCaseOperand: function() {\n        var retval = new XQueryParser.p_SwitchCaseOperand_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle179 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:747:9: ( p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:747:11: p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_SwitchCaseOperand5161);\n            p_ExprSingle179=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle179.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TypeswitchHybrid_return: (function() {\n        XQueryParser.p_TypeswitchHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TypeswitchHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:751:1: p_TypeswitchHybrid[strict] : k= TYPESWITCH LPAREN p_Expr[true,true] RPAREN ( p_CaseHybrid[$strict] )+ k= DEFAULT (d= DOLLAR v= p_VarName )? k= RETURN p_Hybrid[$strict,false] ;\n    // $ANTLR start \"p_TypeswitchHybrid\"\n    p_TypeswitchHybrid: function(strict) {\n        var retval = new XQueryParser.p_TypeswitchHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n        var LPAREN180 = null;\n        var RPAREN182 = null;\n         var v = null;\n         var p_Expr181 = null;\n         var p_CaseHybrid183 = null;\n         var p_Hybrid184 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n        var LPAREN180_tree=null;\n        var RPAREN182_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:752:9: (k= TYPESWITCH LPAREN p_Expr[true,true] RPAREN ( p_CaseHybrid[$strict] )+ k= DEFAULT (d= DOLLAR v= p_VarName )? k= RETURN p_Hybrid[$strict,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:752:11: k= TYPESWITCH LPAREN p_Expr[true,true] RPAREN ( p_CaseHybrid[$strict] )+ k= DEFAULT (d= DOLLAR v= p_VarName )? k= RETURN p_Hybrid[$strict,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TYPESWITCH,XQueryParser.FOLLOW_TYPESWITCH_in_p_TypeswitchHybrid5191); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LPAREN180=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_TypeswitchHybrid5195); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN180_tree = this.adaptor.create(LPAREN180);\n            this.adaptor.addChild(root_0, LPAREN180_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_TypeswitchHybrid5197);\n            p_Expr181=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr181.getTree());\n            RPAREN182=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_TypeswitchHybrid5200); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN182_tree = this.adaptor.create(RPAREN182);\n            this.adaptor.addChild(root_0, RPAREN182_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:752:71: ( p_CaseHybrid[$strict] )+\n            var cnt85=0;\n            loop85:\n            do {\n                var alt85=2;\n                var LA85_0 = this.input.LA(1);\n\n                if ( (LA85_0==CASE) ) {\n                    alt85=1;\n                }\n\n\n                switch (alt85) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:752:71: p_CaseHybrid[$strict]\n                    this.pushFollow(XQueryParser.FOLLOW_p_CaseHybrid_in_p_TypeswitchHybrid5202);\n                    p_CaseHybrid183=this.p_CaseHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CaseHybrid183.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt85 >= 1 ) {\n                        break loop85;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(85, this.input);\n                        throw eee;\n                }\n                cnt85++;\n            } while (true);\n\n            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_TypeswitchHybrid5208); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:752:119: (d= DOLLAR v= p_VarName )?\n            var alt86=2;\n            var LA86_0 = this.input.LA(1);\n\n            if ( (LA86_0==DOLLAR) ) {\n                alt86=1;\n            }\n            switch (alt86) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:752:120: d= DOLLAR v= p_VarName\n                    d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_TypeswitchHybrid5215); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_TypeswitchHybrid5219);\n                    v=this.p_VarName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.av(d, (v?v.stop:null)); \n                    }\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_TypeswitchHybrid5227); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_TypeswitchHybrid5231);\n            p_Hybrid184=this.p_Hybrid(strict, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid184.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CaseHybrid_return: (function() {\n        XQueryParser.p_CaseHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CaseHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:756:1: p_CaseHybrid[strict] : k= CASE (d= DOLLAR v= p_VarName k= AS )? p_SequenceTypeUnion k= RETURN p_ExprSingle[false] ;\n    // $ANTLR start \"p_CaseHybrid\"\n    p_CaseHybrid: function(strict) {\n        var retval = new XQueryParser.p_CaseHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n         var p_SequenceTypeUnion185 = null;\n         var p_ExprSingle186 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:757:9: (k= CASE (d= DOLLAR v= p_VarName k= AS )? p_SequenceTypeUnion k= RETURN p_ExprSingle[false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:757:11: k= CASE (d= DOLLAR v= p_VarName k= AS )? p_SequenceTypeUnion k= RETURN p_ExprSingle[false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,CASE,XQueryParser.FOLLOW_CASE_in_p_CaseHybrid5261); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:757:33: (d= DOLLAR v= p_VarName k= AS )?\n            var alt87=2;\n            var LA87_0 = this.input.LA(1);\n\n            if ( (LA87_0==DOLLAR) ) {\n                alt87=1;\n            }\n            switch (alt87) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:757:34: d= DOLLAR v= p_VarName k= AS\n                    d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_CaseHybrid5268); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_CaseHybrid5272);\n                    v=this.p_VarName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.av(d, (v?v.stop:null)); \n                    }\n                    k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_CaseHybrid5278); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_SequenceTypeUnion_in_p_CaseHybrid5284);\n            p_SequenceTypeUnion185=this.p_SequenceTypeUnion();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceTypeUnion185.getTree());\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_CaseHybrid5288); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_CaseHybrid5292);\n            p_ExprSingle186=this.p_ExprSingle(false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle186.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SequenceTypeUnion_return: (function() {\n        XQueryParser.p_SequenceTypeUnion_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SequenceTypeUnion_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:761:1: p_SequenceTypeUnion : p_SequenceType ( VBAR p_SequenceType )* ;\n    // $ANTLR start \"p_SequenceTypeUnion\"\n    p_SequenceTypeUnion: function() {\n        var retval = new XQueryParser.p_SequenceTypeUnion_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var VBAR188 = null;\n         var p_SequenceType187 = null;\n         var p_SequenceType189 = null;\n\n        var VBAR188_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:762:9: ( p_SequenceType ( VBAR p_SequenceType )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:762:11: p_SequenceType ( VBAR p_SequenceType )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_SequenceTypeUnion5319);\n            p_SequenceType187=this.p_SequenceType();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType187.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:762:26: ( VBAR p_SequenceType )*\n            loop88:\n            do {\n                var alt88=2;\n                var LA88_0 = this.input.LA(1);\n\n                if ( (LA88_0==VBAR) ) {\n                    alt88=1;\n                }\n\n\n                switch (alt88) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:762:27: VBAR p_SequenceType\n                    VBAR188=this.match(this.input,VBAR,XQueryParser.FOLLOW_VBAR_in_p_SequenceTypeUnion5322); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    VBAR188_tree = this.adaptor.create(VBAR188);\n                    this.adaptor.addChild(root_0, VBAR188_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_SequenceTypeUnion5324);\n                    p_SequenceType189=this.p_SequenceType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType189.getTree());\n\n\n                    break;\n\n                default :\n                    break loop88;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IfHybrid_return: (function() {\n        XQueryParser.p_IfHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IfHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:766:1: p_IfHybrid[strict] : k= IF LPAREN p_Expr[true,true] RPAREN k= THEN p_Hybrid[$strict,false] k= ELSE p_Hybrid[$strict,false] ;\n    // $ANTLR start \"p_IfHybrid\"\n    p_IfHybrid: function(strict) {\n        var retval = new XQueryParser.p_IfHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LPAREN190 = null;\n        var RPAREN192 = null;\n         var p_Expr191 = null;\n         var p_Hybrid193 = null;\n         var p_Hybrid194 = null;\n\n        var k_tree=null;\n        var LPAREN190_tree=null;\n        var RPAREN192_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:767:9: (k= IF LPAREN p_Expr[true,true] RPAREN k= THEN p_Hybrid[$strict,false] k= ELSE p_Hybrid[$strict,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:767:11: k= IF LPAREN p_Expr[true,true] RPAREN k= THEN p_Hybrid[$strict,false] k= ELSE p_Hybrid[$strict,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,IF,XQueryParser.FOLLOW_IF_in_p_IfHybrid5355); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LPAREN190=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_IfHybrid5359); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN190_tree = this.adaptor.create(LPAREN190);\n            this.adaptor.addChild(root_0, LPAREN190_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_IfHybrid5361);\n            p_Expr191=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr191.getTree());\n            RPAREN192=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_IfHybrid5364); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN192_tree = this.adaptor.create(RPAREN192);\n            this.adaptor.addChild(root_0, RPAREN192_tree);\n            }\n            k=this.match(this.input,THEN,XQueryParser.FOLLOW_THEN_in_p_IfHybrid5368); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_IfHybrid5372);\n            p_Hybrid193=this.p_Hybrid(strict, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid193.getTree());\n            k=this.match(this.input,ELSE,XQueryParser.FOLLOW_ELSE_in_p_IfHybrid5377); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_IfHybrid5381);\n            p_Hybrid194=this.p_Hybrid(strict, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid194.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TryCatchExpr_return: (function() {\n        XQueryParser.p_TryCatchExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TryCatchExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:771:1: p_TryCatchExpr : p_TryClause ( p_CatchClause )+ ;\n    // $ANTLR start \"p_TryCatchExpr\"\n    p_TryCatchExpr: function() {\n        var retval = new XQueryParser.p_TryCatchExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_TryClause195 = null;\n         var p_CatchClause196 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:772:9: ( p_TryClause ( p_CatchClause )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:772:11: p_TryClause ( p_CatchClause )+\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_TryClause_in_p_TryCatchExpr5408);\n            p_TryClause195=this.p_TryClause();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TryClause195.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:772:23: ( p_CatchClause )+\n            var cnt89=0;\n            loop89:\n            do {\n                var alt89=2;\n                var LA89_0 = this.input.LA(1);\n\n                if ( (LA89_0==CATCH) ) {\n                    alt89=1;\n                }\n\n\n                switch (alt89) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:772:23: p_CatchClause\n                    this.pushFollow(XQueryParser.FOLLOW_p_CatchClause_in_p_TryCatchExpr5410);\n                    p_CatchClause196=this.p_CatchClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CatchClause196.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt89 >= 1 ) {\n                        break loop89;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(89, this.input);\n                        throw eee;\n                }\n                cnt89++;\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TryClause_return: (function() {\n        XQueryParser.p_TryClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TryClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:776:1: p_TryClause : k= TRY LBRACKET p_TryTargetExpr RBRACKET ;\n    // $ANTLR start \"p_TryClause\"\n    p_TryClause: function() {\n        var retval = new XQueryParser.p_TryClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET197 = null;\n        var RBRACKET199 = null;\n         var p_TryTargetExpr198 = null;\n\n        var k_tree=null;\n        var LBRACKET197_tree=null;\n        var RBRACKET199_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:777:9: (k= TRY LBRACKET p_TryTargetExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:777:11: k= TRY LBRACKET p_TryTargetExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TRY,XQueryParser.FOLLOW_TRY_in_p_TryClause5439); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LBRACKET197=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_TryClause5443); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET197_tree = this.adaptor.create(LBRACKET197);\n            this.adaptor.addChild(root_0, LBRACKET197_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_TryTargetExpr_in_p_TryClause5445);\n            p_TryTargetExpr198=this.p_TryTargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TryTargetExpr198.getTree());\n            RBRACKET199=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_TryClause5447); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET199_tree = this.adaptor.create(RBRACKET199);\n            this.adaptor.addChild(root_0, RBRACKET199_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TryTargetExpr_return: (function() {\n        XQueryParser.p_TryTargetExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TryTargetExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:781:1: p_TryTargetExpr : p_Expr[false,false] ;\n    // $ANTLR start \"p_TryTargetExpr\"\n    p_TryTargetExpr: function() {\n        var retval = new XQueryParser.p_TryTargetExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Expr200 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:782:9: ( p_Expr[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:782:11: p_Expr[false,false]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_TryTargetExpr5473);\n            p_Expr200=this.p_Expr(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr200.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CatchClause_return: (function() {\n        XQueryParser.p_CatchClause_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CatchClause_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:786:1: p_CatchClause : k= CATCH p_CatchErrorList LBRACKET p_Expr[false,false] RBRACKET ;\n    // $ANTLR start \"p_CatchClause\"\n    p_CatchClause: function() {\n        var retval = new XQueryParser.p_CatchClause_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET202 = null;\n        var RBRACKET204 = null;\n         var p_CatchErrorList201 = null;\n         var p_Expr203 = null;\n\n        var k_tree=null;\n        var LBRACKET202_tree=null;\n        var RBRACKET204_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:787:9: (k= CATCH p_CatchErrorList LBRACKET p_Expr[false,false] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:787:11: k= CATCH p_CatchErrorList LBRACKET p_Expr[false,false] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,CATCH,XQueryParser.FOLLOW_CATCH_in_p_CatchClause5502); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_CatchErrorList_in_p_CatchClause5506);\n            p_CatchErrorList201=this.p_CatchErrorList();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CatchErrorList201.getTree());\n            LBRACKET202=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_CatchClause5508); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET202_tree = this.adaptor.create(LBRACKET202);\n            this.adaptor.addChild(root_0, LBRACKET202_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_CatchClause5510);\n            p_Expr203=this.p_Expr(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr203.getTree());\n            RBRACKET204=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_CatchClause5513); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET204_tree = this.adaptor.create(RBRACKET204);\n            this.adaptor.addChild(root_0, RBRACKET204_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CatchErrorList_return: (function() {\n        XQueryParser.p_CatchErrorList_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CatchErrorList_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:791:1: p_CatchErrorList : p_NameTest ( VBAR p_NameTest )* ;\n    // $ANTLR start \"p_CatchErrorList\"\n    p_CatchErrorList: function() {\n        var retval = new XQueryParser.p_CatchErrorList_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var VBAR206 = null;\n         var p_NameTest205 = null;\n         var p_NameTest207 = null;\n\n        var VBAR206_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:792:9: ( p_NameTest ( VBAR p_NameTest )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:792:11: p_NameTest ( VBAR p_NameTest )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_NameTest_in_p_CatchErrorList5539);\n            p_NameTest205=this.p_NameTest();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NameTest205.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:792:22: ( VBAR p_NameTest )*\n            loop90:\n            do {\n                var alt90=2;\n                var LA90_0 = this.input.LA(1);\n\n                if ( (LA90_0==VBAR) ) {\n                    alt90=1;\n                }\n\n\n                switch (alt90) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:792:23: VBAR p_NameTest\n                    VBAR206=this.match(this.input,VBAR,XQueryParser.FOLLOW_VBAR_in_p_CatchErrorList5542); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    VBAR206_tree = this.adaptor.create(VBAR206);\n                    this.adaptor.addChild(root_0, VBAR206_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_NameTest_in_p_CatchErrorList5544);\n                    p_NameTest207=this.p_NameTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NameTest207.getTree());\n\n\n                    break;\n\n                default :\n                    break loop90;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_OrExpr_return: (function() {\n        XQueryParser.p_OrExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_OrExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:796:1: p_OrExpr : p_AndExpr (k= OR p_AndExpr )* ;\n    // $ANTLR start \"p_OrExpr\"\n    p_OrExpr: function() {\n        var retval = new XQueryParser.p_OrExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_AndExpr208 = null;\n         var p_AndExpr209 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:797:9: ( p_AndExpr (k= OR p_AndExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:797:11: p_AndExpr (k= OR p_AndExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_AndExpr_in_p_OrExpr5572);\n            p_AndExpr208=this.p_AndExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AndExpr208.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:797:21: (k= OR p_AndExpr )*\n            loop91:\n            do {\n                var alt91=2;\n                var LA91_0 = this.input.LA(1);\n\n                if ( (LA91_0==OR) ) {\n                    alt91=1;\n                }\n\n\n                switch (alt91) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:797:23: k= OR p_AndExpr\n                    k=this.match(this.input,OR,XQueryParser.FOLLOW_OR_in_p_OrExpr5578); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_AndExpr_in_p_OrExpr5582);\n                    p_AndExpr209=this.p_AndExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AndExpr209.getTree());\n\n\n                    break;\n\n                default :\n                    break loop91;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AndExpr_return: (function() {\n        XQueryParser.p_AndExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AndExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:801:1: p_AndExpr : p_ComparisonExpr (k= AND p_ComparisonExpr )* ;\n    // $ANTLR start \"p_AndExpr\"\n    p_AndExpr: function() {\n        var retval = new XQueryParser.p_AndExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_ComparisonExpr210 = null;\n         var p_ComparisonExpr211 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:802:9: ( p_ComparisonExpr (k= AND p_ComparisonExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:802:11: p_ComparisonExpr (k= AND p_ComparisonExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ComparisonExpr_in_p_AndExpr5611);\n            p_ComparisonExpr210=this.p_ComparisonExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ComparisonExpr210.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:802:28: (k= AND p_ComparisonExpr )*\n            loop92:\n            do {\n                var alt92=2;\n                var LA92_0 = this.input.LA(1);\n\n                if ( (LA92_0==AND) ) {\n                    alt92=1;\n                }\n\n\n                switch (alt92) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:802:30: k= AND p_ComparisonExpr\n                    k=this.match(this.input,AND,XQueryParser.FOLLOW_AND_in_p_AndExpr5617); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ComparisonExpr_in_p_AndExpr5621);\n                    p_ComparisonExpr211=this.p_ComparisonExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ComparisonExpr211.getTree());\n\n\n                    break;\n\n                default :\n                    break loop92;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ComparisonExpr_return: (function() {\n        XQueryParser.p_ComparisonExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ComparisonExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:807:1: p_ComparisonExpr : p_FTContainsExpr ( ( p_ValueComp | p_GeneralComp | p_NodeComp ) p_FTContainsExpr )? ;\n    // $ANTLR start \"p_ComparisonExpr\"\n    p_ComparisonExpr: function() {\n        var retval = new XQueryParser.p_ComparisonExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_FTContainsExpr212 = null;\n         var p_ValueComp213 = null;\n         var p_GeneralComp214 = null;\n         var p_NodeComp215 = null;\n         var p_FTContainsExpr216 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:9: ( p_FTContainsExpr ( ( p_ValueComp | p_GeneralComp | p_NodeComp ) p_FTContainsExpr )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:11: p_FTContainsExpr ( ( p_ValueComp | p_GeneralComp | p_NodeComp ) p_FTContainsExpr )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTContainsExpr_in_p_ComparisonExpr5651);\n            p_FTContainsExpr212=this.p_FTContainsExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTContainsExpr212.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:28: ( ( p_ValueComp | p_GeneralComp | p_NodeComp ) p_FTContainsExpr )?\n            var alt94=2;\n            var LA94_0 = this.input.LA(1);\n\n            if ( (LA94_0==EQ||LA94_0==GE||LA94_0==GT||LA94_0==IS||LA94_0==LE||LA94_0==LT||LA94_0==NE||LA94_0==EQUAL||LA94_0==NOTEQUAL||(LA94_0>=SMALLER && LA94_0<=GREATER_GREATER)) ) {\n                alt94=1;\n            }\n            switch (alt94) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:30: ( p_ValueComp | p_GeneralComp | p_NodeComp ) p_FTContainsExpr\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:30: ( p_ValueComp | p_GeneralComp | p_NodeComp )\n                    var alt93=3;\n                    switch ( this.input.LA(1) ) {\n                    case EQ:\n                    case GE:\n                    case GT:\n                    case LE:\n                    case LT:\n                    case NE:\n                        alt93=1;\n                        break;\n                    case EQUAL:\n                    case NOTEQUAL:\n                    case SMALLER:\n                    case GREATER:\n                    case SMALLEREQ:\n                    case GREATEREQ:\n                        alt93=2;\n                        break;\n                    case IS:\n                    case SMALLER_SMALLER:\n                    case GREATER_GREATER:\n                        alt93=3;\n                        break;\n                    default:\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 93, 0, this.input);\n\n                        throw nvae;\n                    }\n\n                    switch (alt93) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:31: p_ValueComp\n                            this.pushFollow(XQueryParser.FOLLOW_p_ValueComp_in_p_ComparisonExpr5656);\n                            p_ValueComp213=this.p_ValueComp();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ValueComp213.getTree());\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:45: p_GeneralComp\n                            this.pushFollow(XQueryParser.FOLLOW_p_GeneralComp_in_p_ComparisonExpr5660);\n                            p_GeneralComp214=this.p_GeneralComp();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_GeneralComp214.getTree());\n\n\n                            break;\n                        case 3 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:808:61: p_NodeComp\n                            this.pushFollow(XQueryParser.FOLLOW_p_NodeComp_in_p_ComparisonExpr5664);\n                            p_NodeComp215=this.p_NodeComp();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NodeComp215.getTree());\n\n\n                            break;\n\n                    }\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTContainsExpr_in_p_ComparisonExpr5667);\n                    p_FTContainsExpr216=this.p_FTContainsExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTContainsExpr216.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_RangeExpr_return: (function() {\n        XQueryParser.p_RangeExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_RangeExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:812:1: p_RangeExpr : p_AdditiveExpr (k= TO p_AdditiveExpr )? ;\n    // $ANTLR start \"p_RangeExpr\"\n    p_RangeExpr: function() {\n        var retval = new XQueryParser.p_RangeExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_AdditiveExpr217 = null;\n         var p_AdditiveExpr218 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:813:9: ( p_AdditiveExpr (k= TO p_AdditiveExpr )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:813:11: p_AdditiveExpr (k= TO p_AdditiveExpr )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_RangeExpr5696);\n            p_AdditiveExpr217=this.p_AdditiveExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr217.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:813:26: (k= TO p_AdditiveExpr )?\n            var alt95=2;\n            var LA95_0 = this.input.LA(1);\n\n            if ( (LA95_0==TO) ) {\n                alt95=1;\n            }\n            switch (alt95) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:813:28: k= TO p_AdditiveExpr\n                    k=this.match(this.input,TO,XQueryParser.FOLLOW_TO_in_p_RangeExpr5702); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_RangeExpr5706);\n                    p_AdditiveExpr218=this.p_AdditiveExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr218.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AdditiveExpr_return: (function() {\n        XQueryParser.p_AdditiveExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AdditiveExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:817:1: p_AdditiveExpr : p_MultiplicativeExpr ( (o= PLUS | o= MINUS ) p_MultiplicativeExpr )* ;\n    // $ANTLR start \"p_AdditiveExpr\"\n    p_AdditiveExpr: function() {\n        var retval = new XQueryParser.p_AdditiveExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var o = null;\n         var p_MultiplicativeExpr219 = null;\n         var p_MultiplicativeExpr220 = null;\n\n        var o_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:818:9: ( p_MultiplicativeExpr ( (o= PLUS | o= MINUS ) p_MultiplicativeExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:818:11: p_MultiplicativeExpr ( (o= PLUS | o= MINUS ) p_MultiplicativeExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_MultiplicativeExpr_in_p_AdditiveExpr5735);\n            p_MultiplicativeExpr219=this.p_MultiplicativeExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_MultiplicativeExpr219.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:818:32: ( (o= PLUS | o= MINUS ) p_MultiplicativeExpr )*\n            loop97:\n            do {\n                var alt97=2;\n                var LA97_0 = this.input.LA(1);\n\n                if ( ((LA97_0>=PLUS && LA97_0<=MINUS)) ) {\n                    alt97=1;\n                }\n\n\n                switch (alt97) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:818:34: (o= PLUS | o= MINUS ) p_MultiplicativeExpr\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:818:34: (o= PLUS | o= MINUS )\n                    var alt96=2;\n                    var LA96_0 = this.input.LA(1);\n\n                    if ( (LA96_0==PLUS) ) {\n                        alt96=1;\n                    }\n                    else if ( (LA96_0==MINUS) ) {\n                        alt96=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 96, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt96) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:818:35: o= PLUS\n                            o=this.match(this.input,PLUS,XQueryParser.FOLLOW_PLUS_in_p_AdditiveExpr5742); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            o_tree = this.adaptor.create(o);\n                            this.adaptor.addChild(root_0, o_tree);\n                            }\n                            if ( this.state.backtracking===0 ) {\n                              this.ao(o);\n                            }\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:818:59: o= MINUS\n                            o=this.match(this.input,MINUS,XQueryParser.FOLLOW_MINUS_in_p_AdditiveExpr5750); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            o_tree = this.adaptor.create(o);\n                            this.adaptor.addChild(root_0, o_tree);\n                            }\n                            if ( this.state.backtracking===0 ) {\n                              this.ao(o);\n                            }\n\n\n                            break;\n\n                    }\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_MultiplicativeExpr_in_p_AdditiveExpr5755);\n                    p_MultiplicativeExpr220=this.p_MultiplicativeExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_MultiplicativeExpr220.getTree());\n\n\n                    break;\n\n                default :\n                    break loop97;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_MultiplicativeExpr_return: (function() {\n        XQueryParser.p_MultiplicativeExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_MultiplicativeExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:822:1: p_MultiplicativeExpr : p_UnionExpr ( (o= STAR | (k= DIV | k= IDIV | k= MOD ) ) p_UnionExpr )* ;\n    // $ANTLR start \"p_MultiplicativeExpr\"\n    p_MultiplicativeExpr: function() {\n        var retval = new XQueryParser.p_MultiplicativeExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var o = null;\n        var k = null;\n         var p_UnionExpr221 = null;\n         var p_UnionExpr222 = null;\n\n        var o_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:9: ( p_UnionExpr ( (o= STAR | (k= DIV | k= IDIV | k= MOD ) ) p_UnionExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:11: p_UnionExpr ( (o= STAR | (k= DIV | k= IDIV | k= MOD ) ) p_UnionExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_UnionExpr_in_p_MultiplicativeExpr5784);\n            p_UnionExpr221=this.p_UnionExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_UnionExpr221.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:23: ( (o= STAR | (k= DIV | k= IDIV | k= MOD ) ) p_UnionExpr )*\n            loop100:\n            do {\n                var alt100=2;\n                var LA100_0 = this.input.LA(1);\n\n                if ( (LA100_0==DIV||LA100_0==IDIV||LA100_0==MOD||LA100_0==STAR) ) {\n                    alt100=1;\n                }\n\n\n                switch (alt100) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:25: (o= STAR | (k= DIV | k= IDIV | k= MOD ) ) p_UnionExpr\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:25: (o= STAR | (k= DIV | k= IDIV | k= MOD ) )\n                    var alt99=2;\n                    var LA99_0 = this.input.LA(1);\n\n                    if ( (LA99_0==STAR) ) {\n                        alt99=1;\n                    }\n                    else if ( (LA99_0==DIV||LA99_0==IDIV||LA99_0==MOD) ) {\n                        alt99=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 99, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt99) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:26: o= STAR\n                            o=this.match(this.input,STAR,XQueryParser.FOLLOW_STAR_in_p_MultiplicativeExpr5791); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            o_tree = this.adaptor.create(o);\n                            this.adaptor.addChild(root_0, o_tree);\n                            }\n                            if ( this.state.backtracking===0 ) {\n                              this.ao(o);\n                            }\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:50: (k= DIV | k= IDIV | k= MOD )\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:50: (k= DIV | k= IDIV | k= MOD )\n                            var alt98=3;\n                            switch ( this.input.LA(1) ) {\n                            case DIV:\n                                alt98=1;\n                                break;\n                            case IDIV:\n                                alt98=2;\n                                break;\n                            case MOD:\n                                alt98=3;\n                                break;\n                            default:\n                                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                                var nvae =\n                                    new org.antlr.runtime.NoViableAltException(\"\", 98, 0, this.input);\n\n                                throw nvae;\n                            }\n\n                            switch (alt98) {\n                                case 1 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:51: k= DIV\n                                    k=this.match(this.input,DIV,XQueryParser.FOLLOW_DIV_in_p_MultiplicativeExpr5800); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    k_tree = this.adaptor.create(k);\n                                    this.adaptor.addChild(root_0, k_tree);\n                                    }\n\n\n                                    break;\n                                case 2 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:59: k= IDIV\n                                    k=this.match(this.input,IDIV,XQueryParser.FOLLOW_IDIV_in_p_MultiplicativeExpr5806); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    k_tree = this.adaptor.create(k);\n                                    this.adaptor.addChild(root_0, k_tree);\n                                    }\n\n\n                                    break;\n                                case 3 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:823:68: k= MOD\n                                    k=this.match(this.input,MOD,XQueryParser.FOLLOW_MOD_in_p_MultiplicativeExpr5812); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    k_tree = this.adaptor.create(k);\n                                    this.adaptor.addChild(root_0, k_tree);\n                                    }\n\n\n                                    break;\n\n                            }\n\n                            if ( this.state.backtracking===0 ) {\n                              this.ak(k);\n                            }\n\n\n                            break;\n\n                    }\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_UnionExpr_in_p_MultiplicativeExpr5818);\n                    p_UnionExpr222=this.p_UnionExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_UnionExpr222.getTree());\n\n\n                    break;\n\n                default :\n                    break loop100;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_UnionExpr_return: (function() {\n        XQueryParser.p_UnionExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_UnionExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:827:1: p_UnionExpr : p_IntersectExceptExpr ( (k= UNION | VBAR ) p_IntersectExceptExpr )* ;\n    // $ANTLR start \"p_UnionExpr\"\n    p_UnionExpr: function() {\n        var retval = new XQueryParser.p_UnionExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var VBAR224 = null;\n         var p_IntersectExceptExpr223 = null;\n         var p_IntersectExceptExpr225 = null;\n\n        var k_tree=null;\n        var VBAR224_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:828:9: ( p_IntersectExceptExpr ( (k= UNION | VBAR ) p_IntersectExceptExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:828:11: p_IntersectExceptExpr ( (k= UNION | VBAR ) p_IntersectExceptExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_IntersectExceptExpr_in_p_UnionExpr5847);\n            p_IntersectExceptExpr223=this.p_IntersectExceptExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IntersectExceptExpr223.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:828:33: ( (k= UNION | VBAR ) p_IntersectExceptExpr )*\n            loop102:\n            do {\n                var alt102=2;\n                var LA102_0 = this.input.LA(1);\n\n                if ( (LA102_0==UNION||LA102_0==VBAR) ) {\n                    alt102=1;\n                }\n\n\n                switch (alt102) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:828:35: (k= UNION | VBAR ) p_IntersectExceptExpr\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:828:35: (k= UNION | VBAR )\n                    var alt101=2;\n                    var LA101_0 = this.input.LA(1);\n\n                    if ( (LA101_0==UNION) ) {\n                        alt101=1;\n                    }\n                    else if ( (LA101_0==VBAR) ) {\n                        alt101=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 101, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt101) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:828:36: k= UNION\n                            k=this.match(this.input,UNION,XQueryParser.FOLLOW_UNION_in_p_UnionExpr5854); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n                            if ( this.state.backtracking===0 ) {\n                              this.ak(k);\n                            }\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:828:61: VBAR\n                            VBAR224=this.match(this.input,VBAR,XQueryParser.FOLLOW_VBAR_in_p_UnionExpr5860); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            VBAR224_tree = this.adaptor.create(VBAR224);\n                            this.adaptor.addChild(root_0, VBAR224_tree);\n                            }\n\n\n                            break;\n\n                    }\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_IntersectExceptExpr_in_p_UnionExpr5863);\n                    p_IntersectExceptExpr225=this.p_IntersectExceptExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IntersectExceptExpr225.getTree());\n\n\n                    break;\n\n                default :\n                    break loop102;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IntersectExceptExpr_return: (function() {\n        XQueryParser.p_IntersectExceptExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IntersectExceptExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:832:1: p_IntersectExceptExpr : p_InstanceofExpr ( (k= INTERSECT | k= EXCEPT ) p_InstanceofExpr )* ;\n    // $ANTLR start \"p_IntersectExceptExpr\"\n    p_IntersectExceptExpr: function() {\n        var retval = new XQueryParser.p_IntersectExceptExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_InstanceofExpr226 = null;\n         var p_InstanceofExpr227 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:833:9: ( p_InstanceofExpr ( (k= INTERSECT | k= EXCEPT ) p_InstanceofExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:833:11: p_InstanceofExpr ( (k= INTERSECT | k= EXCEPT ) p_InstanceofExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_InstanceofExpr_in_p_IntersectExceptExpr5892);\n            p_InstanceofExpr226=this.p_InstanceofExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InstanceofExpr226.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:833:28: ( (k= INTERSECT | k= EXCEPT ) p_InstanceofExpr )*\n            loop104:\n            do {\n                var alt104=2;\n                var LA104_0 = this.input.LA(1);\n\n                if ( (LA104_0==EXCEPT||LA104_0==INTERSECT) ) {\n                    alt104=1;\n                }\n\n\n                switch (alt104) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:833:30: (k= INTERSECT | k= EXCEPT ) p_InstanceofExpr\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:833:30: (k= INTERSECT | k= EXCEPT )\n                    var alt103=2;\n                    var LA103_0 = this.input.LA(1);\n\n                    if ( (LA103_0==INTERSECT) ) {\n                        alt103=1;\n                    }\n                    else if ( (LA103_0==EXCEPT) ) {\n                        alt103=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 103, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt103) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:833:31: k= INTERSECT\n                            k=this.match(this.input,INTERSECT,XQueryParser.FOLLOW_INTERSECT_in_p_IntersectExceptExpr5899); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:833:45: k= EXCEPT\n                            k=this.match(this.input,EXCEPT,XQueryParser.FOLLOW_EXCEPT_in_p_IntersectExceptExpr5905); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n\n\n                            break;\n\n                    }\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_InstanceofExpr_in_p_IntersectExceptExpr5910);\n                    p_InstanceofExpr227=this.p_InstanceofExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InstanceofExpr227.getTree());\n\n\n                    break;\n\n                default :\n                    break loop104;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_InstanceofExpr_return: (function() {\n        XQueryParser.p_InstanceofExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_InstanceofExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:837:1: p_InstanceofExpr : p_TreatExpr (k= INSTANCE k= OF p_SequenceType )? ;\n    // $ANTLR start \"p_InstanceofExpr\"\n    p_InstanceofExpr: function() {\n        var retval = new XQueryParser.p_InstanceofExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_TreatExpr228 = null;\n         var p_SequenceType229 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:838:9: ( p_TreatExpr (k= INSTANCE k= OF p_SequenceType )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:838:11: p_TreatExpr (k= INSTANCE k= OF p_SequenceType )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_TreatExpr_in_p_InstanceofExpr5939);\n            p_TreatExpr228=this.p_TreatExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TreatExpr228.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:838:23: (k= INSTANCE k= OF p_SequenceType )?\n            var alt105=2;\n            var LA105_0 = this.input.LA(1);\n\n            if ( (LA105_0==INSTANCE) ) {\n                alt105=1;\n            }\n            switch (alt105) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:838:25: k= INSTANCE k= OF p_SequenceType\n                    k=this.match(this.input,INSTANCE,XQueryParser.FOLLOW_INSTANCE_in_p_InstanceofExpr5945); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    k=this.match(this.input,OF,XQueryParser.FOLLOW_OF_in_p_InstanceofExpr5951); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_InstanceofExpr5955);\n                    p_SequenceType229=this.p_SequenceType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType229.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TreatExpr_return: (function() {\n        XQueryParser.p_TreatExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TreatExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:842:1: p_TreatExpr : p_CastableExpr (k= TREAT k= AS p_SequenceType )? ;\n    // $ANTLR start \"p_TreatExpr\"\n    p_TreatExpr: function() {\n        var retval = new XQueryParser.p_TreatExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_CastableExpr230 = null;\n         var p_SequenceType231 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:843:9: ( p_CastableExpr (k= TREAT k= AS p_SequenceType )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:843:11: p_CastableExpr (k= TREAT k= AS p_SequenceType )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_CastableExpr_in_p_TreatExpr5983);\n            p_CastableExpr230=this.p_CastableExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CastableExpr230.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:843:26: (k= TREAT k= AS p_SequenceType )?\n            var alt106=2;\n            var LA106_0 = this.input.LA(1);\n\n            if ( (LA106_0==TREAT) ) {\n                alt106=1;\n            }\n            switch (alt106) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:843:28: k= TREAT k= AS p_SequenceType\n                    k=this.match(this.input,TREAT,XQueryParser.FOLLOW_TREAT_in_p_TreatExpr5989); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_TreatExpr5995); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_TreatExpr5999);\n                    p_SequenceType231=this.p_SequenceType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType231.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CastableExpr_return: (function() {\n        XQueryParser.p_CastableExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CastableExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:847:1: p_CastableExpr : p_CastExpr (k= CASTABLE k= AS p_SingleType )? ;\n    // $ANTLR start \"p_CastableExpr\"\n    p_CastableExpr: function() {\n        var retval = new XQueryParser.p_CastableExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_CastExpr232 = null;\n         var p_SingleType233 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:848:9: ( p_CastExpr (k= CASTABLE k= AS p_SingleType )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:848:11: p_CastExpr (k= CASTABLE k= AS p_SingleType )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_CastExpr_in_p_CastableExpr6036);\n            p_CastExpr232=this.p_CastExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CastExpr232.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:848:22: (k= CASTABLE k= AS p_SingleType )?\n            var alt107=2;\n            var LA107_0 = this.input.LA(1);\n\n            if ( (LA107_0==CASTABLE) ) {\n                alt107=1;\n            }\n            switch (alt107) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:848:24: k= CASTABLE k= AS p_SingleType\n                    k=this.match(this.input,CASTABLE,XQueryParser.FOLLOW_CASTABLE_in_p_CastableExpr6042); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_CastableExpr6048); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SingleType_in_p_CastableExpr6052);\n                    p_SingleType233=this.p_SingleType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SingleType233.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CastExpr_return: (function() {\n        XQueryParser.p_CastExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CastExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:852:1: p_CastExpr : p_UnaryExpr (k= CAST k= AS p_SingleType )? ;\n    // $ANTLR start \"p_CastExpr\"\n    p_CastExpr: function() {\n        var retval = new XQueryParser.p_CastExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_UnaryExpr234 = null;\n         var p_SingleType235 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:853:9: ( p_UnaryExpr (k= CAST k= AS p_SingleType )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:853:11: p_UnaryExpr (k= CAST k= AS p_SingleType )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_UnaryExpr_in_p_CastExpr6089);\n            p_UnaryExpr234=this.p_UnaryExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_UnaryExpr234.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:853:23: (k= CAST k= AS p_SingleType )?\n            var alt108=2;\n            var LA108_0 = this.input.LA(1);\n\n            if ( (LA108_0==CAST) ) {\n                alt108=1;\n            }\n            switch (alt108) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:853:25: k= CAST k= AS p_SingleType\n                    k=this.match(this.input,CAST,XQueryParser.FOLLOW_CAST_in_p_CastExpr6095); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_CastExpr6101); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SingleType_in_p_CastExpr6105);\n                    p_SingleType235=this.p_SingleType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SingleType235.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_UnaryExpr_return: (function() {\n        XQueryParser.p_UnaryExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_UnaryExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:857:1: p_UnaryExpr : (o= PLUS | o= MINUS )* p_ValueExpr -> ^( UnaryExpr ( PLUS )* p_ValueExpr ) ;\n    // $ANTLR start \"p_UnaryExpr\"\n    p_UnaryExpr: function() {\n        var retval = new XQueryParser.p_UnaryExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var o = null;\n         var p_ValueExpr236 = null;\n\n        var o_tree=null;\n        var stream_PLUS=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token PLUS\");\n        var stream_MINUS=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token MINUS\");\n        var stream_p_ValueExpr=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_ValueExpr\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:858:9: ( (o= PLUS | o= MINUS )* p_ValueExpr -> ^( UnaryExpr ( PLUS )* p_ValueExpr ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:858:11: (o= PLUS | o= MINUS )* p_ValueExpr\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:858:11: (o= PLUS | o= MINUS )*\n            loop109:\n            do {\n                var alt109=3;\n                var LA109_0 = this.input.LA(1);\n\n                if ( (LA109_0==PLUS) ) {\n                    alt109=1;\n                }\n                else if ( (LA109_0==MINUS) ) {\n                    alt109=2;\n                }\n\n\n                switch (alt109) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:858:12: o= PLUS\n                    o=this.match(this.input,PLUS,XQueryParser.FOLLOW_PLUS_in_p_UnaryExpr6137); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_PLUS.add(o);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ao(o);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:858:36: o= MINUS\n                    o=this.match(this.input,MINUS,XQueryParser.FOLLOW_MINUS_in_p_UnaryExpr6145); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_MINUS.add(o);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ao(o);\n                    }\n\n\n                    break;\n\n                default :\n                    break loop109;\n                }\n            } while (true);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ValueExpr_in_p_UnaryExpr6150);\n            p_ValueExpr236=this.p_ValueExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_ValueExpr.add(p_ValueExpr236.getTree());\n\n\n            // AST REWRITE\n            // elements: p_ValueExpr, PLUS\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 859:17: -> ^( UnaryExpr ( PLUS )* p_ValueExpr )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:859:20: ^( UnaryExpr ( PLUS )* p_ValueExpr )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(UnaryExpr, \"UnaryExpr\"), root_1);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:859:32: ( PLUS )*\n                while ( stream_PLUS.hasNext() ) {\n                    this.adaptor.addChild(root_1, stream_PLUS.nextNode());\n\n                }\n                stream_PLUS.reset();\n                this.adaptor.addChild(root_1, stream_p_ValueExpr.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ValueExpr_return: (function() {\n        XQueryParser.p_ValueExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ValueExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:863:1: p_ValueExpr : ( ( VALIDATE ( p_ValidationMode | TYPE )? )=> p_ValidateExpr | p_SimpleMapExpr | p_ExtensionExpr );\n    // $ANTLR start \"p_ValueExpr\"\n    p_ValueExpr: function() {\n        var retval = new XQueryParser.p_ValueExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ValidateExpr237 = null;\n         var p_SimpleMapExpr238 = null;\n         var p_ExtensionExpr239 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:864:9: ( ( VALIDATE ( p_ValidationMode | TYPE )? )=> p_ValidateExpr | p_SimpleMapExpr | p_ExtensionExpr )\n            var alt110=3;\n            switch ( this.input.LA(1) ) {\n            case VALIDATE:\n                var LA110_1 = this.input.LA(2);\n\n                if ( (LA110_1==LAX) && (this.synpred6_XQueryParser())) {\n                    alt110=1;\n                }\n                else if ( (LA110_1==STRICT) && (this.synpred6_XQueryParser())) {\n                    alt110=1;\n                }\n                else if ( (LA110_1==TYPE) && (this.synpred6_XQueryParser())) {\n                    alt110=1;\n                }\n                else if ( (LA110_1==LBRACKET) && (this.synpred6_XQueryParser())) {\n                    alt110=1;\n                }\n                else if ( (LA110_1==EOF||(LA110_1>=AND && LA110_1<=AT)||(LA110_1>=CASE && LA110_1<=CASTABLE)||LA110_1==COLLATION||LA110_1==DEFAULT||(LA110_1>=DESCENDING && LA110_1<=DIV)||LA110_1==EMPTY||LA110_1==EQ||LA110_1==EXCEPT||LA110_1==FOR||LA110_1==GE||(LA110_1>=GT && LA110_1<=IDIV)||(LA110_1>=INSTANCE && LA110_1<=IS)||LA110_1==LE||(LA110_1>=LET && LA110_1<=MOD)||LA110_1==NE||(LA110_1>=OR && LA110_1<=ORDER)||(LA110_1>=RETURN && LA110_1<=SATISFIES)||LA110_1==STABLE||(LA110_1>=TO && LA110_1<=TREAT)||LA110_1==UNION||LA110_1==WHERE||LA110_1==COUNT||(LA110_1>=END && LA110_1<=GROUP)||LA110_1==ONLY||LA110_1==START||(LA110_1>=AFTER && LA110_1<=BEFORE)||LA110_1==INTO||LA110_1==MODIFY||LA110_1==WITH||LA110_1==CONTAINS||LA110_1==PARAGRAPHS||LA110_1==SENTENCES||LA110_1==TIMES||LA110_1==WORDS||(LA110_1>=CONCAT && LA110_1<=RPAREN)||LA110_1==R_UNION_BRACKET||(LA110_1>=RBRACKET && LA110_1<=EQUAL)||LA110_1==NOTEQUAL||LA110_1==HASH||LA110_1==COMMA||(LA110_1>=STAR && LA110_1<=BANG)||LA110_1==COLON||(LA110_1>=SEMICOLON && LA110_1<=VBAR)) ) {\n                    alt110=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 110, 1, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case ANCESTOR:\n            case ANCESTOR_OR_SELF:\n            case AND:\n            case AS:\n            case ASCENDING:\n            case AT:\n            case ATTRIBUTE:\n            case BASE_URI:\n            case BOUNDARY_SPACE:\n            case BY:\n            case CASE:\n            case CAST:\n            case CASTABLE:\n            case CHILD:\n            case COLLATION:\n            case COMMENT:\n            case CONSTRUCTION:\n            case COPY_NAMESPACES:\n            case DECLARE:\n            case DEFAULT:\n            case DESCENDANT:\n            case DESCENDANT_OR_SELF:\n            case DESCENDING:\n            case DIV:\n            case DOCUMENT:\n            case DOCUMENT_NODE:\n            case ELEMENT:\n            case ELSE:\n            case EMPTY:\n            case EMPTY_SEQUENCE:\n            case ENCODING:\n            case EQ:\n            case EVERY:\n            case EXCEPT:\n            case EXTERNAL:\n            case FOLLOWING:\n            case FOLLOWING_SIBLING:\n            case FOR:\n            case FUNCTION:\n            case GE:\n            case GREATEST:\n            case GT:\n            case IDIV:\n            case IF:\n            case IMPORT:\n            case IN:\n            case INHERIT:\n            case INSTANCE:\n            case INTERSECT:\n            case IS:\n            case ITEM:\n            case LAX:\n            case LE:\n            case LEAST:\n            case LET:\n            case LT:\n            case MOD:\n            case MODULE:\n            case NAMESPACE:\n            case NE:\n            case NO_INHERIT:\n            case NO_PRESERVE:\n            case NODE:\n            case JSON:\n            case OF:\n            case OPTION:\n            case OR:\n            case ORDER:\n            case ORDERED:\n            case ORDERING:\n            case PARENT:\n            case PRECEDING:\n            case PRECEDING_SIBLING:\n            case PRESERVE:\n            case PROCESSING_INSTRUCTION:\n            case STRUCTURED_ITEM:\n            case JSON_ITEM:\n            case OBJECT:\n            case ARRAY:\n            case RETURN:\n            case SATISFIES:\n            case SCHEMA:\n            case SCHEMA_ATTRIBUTE:\n            case SCHEMA_ELEMENT:\n            case SELF:\n            case SOME:\n            case STABLE:\n            case STRICT:\n            case STRIP:\n            case TEXT:\n            case THEN:\n            case TO:\n            case TREAT:\n            case TYPESWITCH:\n            case UNION:\n            case UNORDERED:\n            case VARIABLE:\n            case VERSION:\n            case WHERE:\n            case XQUERY:\n            case ALLOWING:\n            case CATCH:\n            case CONTEXT:\n            case COUNT:\n            case DECIMAL_FORMAT:\n            case DECIMAL_SEPARATOR:\n            case DIGIT:\n            case END:\n            case GROUP:\n            case GROUPING_SEPARATOR:\n            case INFINITY:\n            case MINUS_SIGN:\n            case NAMESPACE_NODE:\n            case NAN:\n            case NEXT:\n            case ONLY:\n            case PATTERN_SEPARATOR:\n            case PERCENT:\n            case PER_MILLE:\n            case PREVIOUS:\n            case SLIDING:\n            case START:\n            case SWITCH:\n            case TRY:\n            case TUMBLING:\n            case TYPE:\n            case WHEN:\n            case WINDOW:\n            case ZERO_DIGIT:\n            case AFTER:\n            case BEFORE:\n            case COPY:\n            case DELETE:\n            case FIRST:\n            case INSERT:\n            case INTO:\n            case POSITION:\n            case APPEND:\n            case LAST:\n            case MODIFY:\n            case NODES:\n            case RENAME:\n            case REPLACE:\n            case REVALIDATION:\n            case SKIP:\n            case UPDATING:\n            case VALUE:\n            case WITH:\n            case ALL:\n            case ANY:\n            case CONTAINS:\n            case CONTENT:\n            case DIACRITICS:\n            case DIFFERENT:\n            case DISTANCE:\n            case ENTIRE:\n            case EXACTLY:\n            case FROM:\n            case FT_OPTION:\n            case FTAND:\n            case FTNOT:\n            case FTOR:\n            case INSENSITIVE:\n            case LANGUAGE:\n            case LEVELS:\n            case LOWERCASE:\n            case MOST:\n            case NO:\n            case NOT:\n            case OCCURS:\n            case PARAGRAPH:\n            case PARAGRAPHS:\n            case PHRASE:\n            case RELATIONSHIP:\n            case SAME:\n            case SCORE:\n            case SENSITIVE:\n            case SENTENCE:\n            case SENTENCES:\n            case STEMMING:\n            case STOP:\n            case THESAURUS:\n            case TIMES:\n            case UPPERCASE:\n            case USING:\n            case WEIGHT:\n            case WILDCARDS:\n            case WITHOUT:\n            case WORD:\n            case WORDS:\n            case BREAK:\n            case CONTINUE:\n            case EXIT:\n            case LOOP:\n            case RETURNING:\n            case WHILE:\n            case CHECK:\n            case COLLECTION:\n            case CONSTRAINT:\n            case FOREACH:\n            case FOREIGN:\n            case INDEX:\n            case INTEGRITY:\n            case KEY:\n            case ON:\n            case UNIQUE:\n            case AMP_ER:\n            case APOS_ER:\n            case QUOT_ER:\n            case LPAREN:\n            case DOLLAR:\n            case L_UNION_BRACKET:\n            case LBRACKET:\n            case LSQUARE:\n            case STAR:\n            case SMALLER:\n            case SLASH:\n            case SLASH_SLASH:\n            case DOT:\n            case DOT_DOT:\n            case ATTR_SIGN:\n            case Q:\n            case APOS:\n            case QUOT:\n            case L_NCName:\n            case L_DirCommentConstructor:\n            case L_DirPIConstructor:\n            case L_IntegerLiteral:\n            case L_DecimalLiteral:\n            case L_DoubleLiteral:\n                alt110=2;\n                break;\n            case L_Pragma:\n                alt110=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 110, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt110) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:864:11: ( VALIDATE ( p_ValidationMode | TYPE )? )=> p_ValidateExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ValidateExpr_in_p_ValueExpr6220);\n                    p_ValidateExpr237=this.p_ValidateExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ValidateExpr237.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:865:11: p_SimpleMapExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_SimpleMapExpr_in_p_ValueExpr6232);\n                    p_SimpleMapExpr238=this.p_SimpleMapExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SimpleMapExpr238.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:866:11: p_ExtensionExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExtensionExpr_in_p_ValueExpr6244);\n                    p_ExtensionExpr239=this.p_ExtensionExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExtensionExpr239.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SimpleMapExpr_return: (function() {\n        XQueryParser.p_SimpleMapExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SimpleMapExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:869:1: p_SimpleMapExpr : p_PathExpr ( BANG p_PathExpr )* ;\n    // $ANTLR start \"p_SimpleMapExpr\"\n    p_SimpleMapExpr: function() {\n        var retval = new XQueryParser.p_SimpleMapExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var BANG241 = null;\n         var p_PathExpr240 = null;\n         var p_PathExpr242 = null;\n\n        var BANG241_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:870:9: ( p_PathExpr ( BANG p_PathExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:870:11: p_PathExpr ( BANG p_PathExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_PathExpr_in_p_SimpleMapExpr6269);\n            p_PathExpr240=this.p_PathExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PathExpr240.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:870:22: ( BANG p_PathExpr )*\n            loop111:\n            do {\n                var alt111=2;\n                var LA111_0 = this.input.LA(1);\n\n                if ( (LA111_0==BANG) ) {\n                    alt111=1;\n                }\n\n\n                switch (alt111) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:870:23: BANG p_PathExpr\n                    BANG241=this.match(this.input,BANG,XQueryParser.FOLLOW_BANG_in_p_SimpleMapExpr6272); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    BANG241_tree = this.adaptor.create(BANG241);\n                    this.adaptor.addChild(root_0, BANG241_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_PathExpr_in_p_SimpleMapExpr6274);\n                    p_PathExpr242=this.p_PathExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PathExpr242.getTree());\n\n\n                    break;\n\n                default :\n                    break loop111;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_GeneralComp_return: (function() {\n        XQueryParser.p_GeneralComp_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_GeneralComp_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:874:1: p_GeneralComp : (o= EQUAL | o= NOTEQUAL | o= SMALLER | o= SMALLEREQ | o= GREATER | o= GREATEREQ ) ;\n    // $ANTLR start \"p_GeneralComp\"\n    p_GeneralComp: function() {\n        var retval = new XQueryParser.p_GeneralComp_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var o = null;\n\n        var o_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:9: ( (o= EQUAL | o= NOTEQUAL | o= SMALLER | o= SMALLEREQ | o= GREATER | o= GREATEREQ ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:11: (o= EQUAL | o= NOTEQUAL | o= SMALLER | o= SMALLEREQ | o= GREATER | o= GREATEREQ )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:11: (o= EQUAL | o= NOTEQUAL | o= SMALLER | o= SMALLEREQ | o= GREATER | o= GREATEREQ )\n            var alt112=6;\n            switch ( this.input.LA(1) ) {\n            case EQUAL:\n                alt112=1;\n                break;\n            case NOTEQUAL:\n                alt112=2;\n                break;\n            case SMALLER:\n                alt112=3;\n                break;\n            case SMALLEREQ:\n                alt112=4;\n                break;\n            case GREATER:\n                alt112=5;\n                break;\n            case GREATEREQ:\n                alt112=6;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 112, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt112) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:12: o= EQUAL\n                    o=this.match(this.input,EQUAL,XQueryParser.FOLLOW_EQUAL_in_p_GeneralComp6305); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    o_tree = this.adaptor.create(o);\n                    this.adaptor.addChild(root_0, o_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:22: o= NOTEQUAL\n                    o=this.match(this.input,NOTEQUAL,XQueryParser.FOLLOW_NOTEQUAL_in_p_GeneralComp6311); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    o_tree = this.adaptor.create(o);\n                    this.adaptor.addChild(root_0, o_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:35: o= SMALLER\n                    o=this.match(this.input,SMALLER,XQueryParser.FOLLOW_SMALLER_in_p_GeneralComp6317); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    o_tree = this.adaptor.create(o);\n                    this.adaptor.addChild(root_0, o_tree);\n                    }\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:47: o= SMALLEREQ\n                    o=this.match(this.input,SMALLEREQ,XQueryParser.FOLLOW_SMALLEREQ_in_p_GeneralComp6323); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    o_tree = this.adaptor.create(o);\n                    this.adaptor.addChild(root_0, o_tree);\n                    }\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:61: o= GREATER\n                    o=this.match(this.input,GREATER,XQueryParser.FOLLOW_GREATER_in_p_GeneralComp6329); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    o_tree = this.adaptor.create(o);\n                    this.adaptor.addChild(root_0, o_tree);\n                    }\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:875:73: o= GREATEREQ\n                    o=this.match(this.input,GREATEREQ,XQueryParser.FOLLOW_GREATEREQ_in_p_GeneralComp6335); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    o_tree = this.adaptor.create(o);\n                    this.adaptor.addChild(root_0, o_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n               this.ao(o); \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ValueComp_return: (function() {\n        XQueryParser.p_ValueComp_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ValueComp_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:879:1: p_ValueComp : (k= EQ | k= NE | k= LT | k= LE | k= GT | k= GE ) ;\n    // $ANTLR start \"p_ValueComp\"\n    p_ValueComp: function() {\n        var retval = new XQueryParser.p_ValueComp_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:9: ( (k= EQ | k= NE | k= LT | k= LE | k= GT | k= GE ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:11: (k= EQ | k= NE | k= LT | k= LE | k= GT | k= GE )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:11: (k= EQ | k= NE | k= LT | k= LE | k= GT | k= GE )\n            var alt113=6;\n            switch ( this.input.LA(1) ) {\n            case EQ:\n                alt113=1;\n                break;\n            case NE:\n                alt113=2;\n                break;\n            case LT:\n                alt113=3;\n                break;\n            case LE:\n                alt113=4;\n                break;\n            case GT:\n                alt113=5;\n                break;\n            case GE:\n                alt113=6;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 113, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt113) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:12: k= EQ\n                    k=this.match(this.input,EQ,XQueryParser.FOLLOW_EQ_in_p_ValueComp6367); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:19: k= NE\n                    k=this.match(this.input,NE,XQueryParser.FOLLOW_NE_in_p_ValueComp6373); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:26: k= LT\n                    k=this.match(this.input,LT,XQueryParser.FOLLOW_LT_in_p_ValueComp6379); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:33: k= LE\n                    k=this.match(this.input,LE,XQueryParser.FOLLOW_LE_in_p_ValueComp6385); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:40: k= GT\n                    k=this.match(this.input,GT,XQueryParser.FOLLOW_GT_in_p_ValueComp6391); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:880:47: k= GE\n                    k=this.match(this.input,GE,XQueryParser.FOLLOW_GE_in_p_ValueComp6397); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NodeComp_return: (function() {\n        XQueryParser.p_NodeComp_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NodeComp_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:884:1: p_NodeComp : (k= IS | SMALLER_SMALLER | GREATER_GREATER );\n    // $ANTLR start \"p_NodeComp\"\n    p_NodeComp: function() {\n        var retval = new XQueryParser.p_NodeComp_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SMALLER_SMALLER243 = null;\n        var GREATER_GREATER244 = null;\n\n        var k_tree=null;\n        var SMALLER_SMALLER243_tree=null;\n        var GREATER_GREATER244_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:885:9: (k= IS | SMALLER_SMALLER | GREATER_GREATER )\n            var alt114=3;\n            switch ( this.input.LA(1) ) {\n            case IS:\n                alt114=1;\n                break;\n            case SMALLER_SMALLER:\n                alt114=2;\n                break;\n            case GREATER_GREATER:\n                alt114=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 114, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt114) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:885:11: k= IS\n                    root_0 = this.adaptor.nil();\n\n                    k=this.match(this.input,IS,XQueryParser.FOLLOW_IS_in_p_NodeComp6428); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:885:33: SMALLER_SMALLER\n                    root_0 = this.adaptor.nil();\n\n                    SMALLER_SMALLER243=this.match(this.input,SMALLER_SMALLER,XQueryParser.FOLLOW_SMALLER_SMALLER_in_p_NodeComp6434); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    SMALLER_SMALLER243_tree = this.adaptor.create(SMALLER_SMALLER243);\n                    this.adaptor.addChild(root_0, SMALLER_SMALLER243_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:885:51: GREATER_GREATER\n                    root_0 = this.adaptor.nil();\n\n                    GREATER_GREATER244=this.match(this.input,GREATER_GREATER,XQueryParser.FOLLOW_GREATER_GREATER_in_p_NodeComp6438); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    GREATER_GREATER244_tree = this.adaptor.create(GREATER_GREATER244);\n                    this.adaptor.addChild(root_0, GREATER_GREATER244_tree);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ValidateExpr_return: (function() {\n        XQueryParser.p_ValidateExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ValidateExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:889:1: p_ValidateExpr : k= VALIDATE ( p_ValidationMode | k= TYPE p_TypeName )? LBRACKET p_Expr[true,true] RBRACKET ;\n    // $ANTLR start \"p_ValidateExpr\"\n    p_ValidateExpr: function() {\n        var retval = new XQueryParser.p_ValidateExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET247 = null;\n        var RBRACKET249 = null;\n         var p_ValidationMode245 = null;\n         var p_TypeName246 = null;\n         var p_Expr248 = null;\n\n        var k_tree=null;\n        var LBRACKET247_tree=null;\n        var RBRACKET249_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:890:9: (k= VALIDATE ( p_ValidationMode | k= TYPE p_TypeName )? LBRACKET p_Expr[true,true] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:890:11: k= VALIDATE ( p_ValidationMode | k= TYPE p_TypeName )? LBRACKET p_Expr[true,true] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,VALIDATE,XQueryParser.FOLLOW_VALIDATE_in_p_ValidateExpr6466); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:890:37: ( p_ValidationMode | k= TYPE p_TypeName )?\n            var alt115=3;\n            var LA115_0 = this.input.LA(1);\n\n            if ( (LA115_0==LAX||LA115_0==STRICT) ) {\n                alt115=1;\n            }\n            else if ( (LA115_0==TYPE) ) {\n                alt115=2;\n            }\n            switch (alt115) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:890:39: p_ValidationMode\n                    this.pushFollow(XQueryParser.FOLLOW_p_ValidationMode_in_p_ValidateExpr6472);\n                    p_ValidationMode245=this.p_ValidationMode();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ValidationMode245.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:890:58: k= TYPE p_TypeName\n                    k=this.match(this.input,TYPE,XQueryParser.FOLLOW_TYPE_in_p_ValidateExpr6478); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeName_in_p_ValidateExpr6482);\n                    p_TypeName246=this.p_TypeName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeName246.getTree());\n\n\n                    break;\n\n            }\n\n            LBRACKET247=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_ValidateExpr6487); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET247_tree = this.adaptor.create(LBRACKET247);\n            this.adaptor.addChild(root_0, LBRACKET247_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_ValidateExpr6489);\n            p_Expr248=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr248.getTree());\n            RBRACKET249=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_ValidateExpr6492); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET249_tree = this.adaptor.create(RBRACKET249);\n            this.adaptor.addChild(root_0, RBRACKET249_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ValidationMode_return: (function() {\n        XQueryParser.p_ValidationMode_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ValidationMode_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:894:1: p_ValidationMode : (k= LAX | k= STRICT ) ;\n    // $ANTLR start \"p_ValidationMode\"\n    p_ValidationMode: function() {\n        var retval = new XQueryParser.p_ValidationMode_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:895:9: ( (k= LAX | k= STRICT ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:895:11: (k= LAX | k= STRICT )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:895:11: (k= LAX | k= STRICT )\n            var alt116=2;\n            var LA116_0 = this.input.LA(1);\n\n            if ( (LA116_0==LAX) ) {\n                alt116=1;\n            }\n            else if ( (LA116_0==STRICT) ) {\n                alt116=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 116, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt116) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:895:12: k= LAX\n                    k=this.match(this.input,LAX,XQueryParser.FOLLOW_LAX_in_p_ValidationMode6521); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:895:20: k= STRICT\n                    k=this.match(this.input,STRICT,XQueryParser.FOLLOW_STRICT_in_p_ValidationMode6527); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ExtensionExpr_return: (function() {\n        XQueryParser.p_ExtensionExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ExtensionExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:899:1: p_ExtensionExpr : ( L_Pragma )+ LBRACKET ( p_Expr[true,true] )? RBRACKET ;\n    // $ANTLR start \"p_ExtensionExpr\"\n    p_ExtensionExpr: function() {\n        var retval = new XQueryParser.p_ExtensionExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var L_Pragma250 = null;\n        var LBRACKET251 = null;\n        var RBRACKET253 = null;\n         var p_Expr252 = null;\n\n        var L_Pragma250_tree=null;\n        var LBRACKET251_tree=null;\n        var RBRACKET253_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:900:9: ( ( L_Pragma )+ LBRACKET ( p_Expr[true,true] )? RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:900:11: ( L_Pragma )+ LBRACKET ( p_Expr[true,true] )? RBRACKET\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:900:11: ( L_Pragma )+\n            var cnt117=0;\n            loop117:\n            do {\n                var alt117=2;\n                var LA117_0 = this.input.LA(1);\n\n                if ( (LA117_0==L_Pragma) ) {\n                    alt117=1;\n                }\n\n\n                switch (alt117) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:900:11: L_Pragma\n                    L_Pragma250=this.match(this.input,L_Pragma,XQueryParser.FOLLOW_L_Pragma_in_p_ExtensionExpr6556); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_Pragma250_tree = this.adaptor.create(L_Pragma250);\n                    this.adaptor.addChild(root_0, L_Pragma250_tree);\n                    }\n\n\n                    break;\n\n                default :\n                    if ( cnt117 >= 1 ) {\n                        break loop117;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(117, this.input);\n                        throw eee;\n                }\n                cnt117++;\n            } while (true);\n\n            LBRACKET251=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_ExtensionExpr6559); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET251_tree = this.adaptor.create(LBRACKET251);\n            this.adaptor.addChild(root_0, LBRACKET251_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:900:30: ( p_Expr[true,true] )?\n            var alt118=2;\n            var LA118_0 = this.input.LA(1);\n\n            if ( ((LA118_0>=ANCESTOR && LA118_0<=QUOT_ER)||LA118_0==LPAREN||(LA118_0>=DOLLAR && LA118_0<=L_UNION_BRACKET)||LA118_0==LBRACKET||LA118_0==LSQUARE||(LA118_0>=STAR && LA118_0<=SMALLER)||(LA118_0>=SLASH && LA118_0<=SLASH_SLASH)||(LA118_0>=DOT && LA118_0<=DOT_DOT)||(LA118_0>=ATTR_SIGN && LA118_0<=Q)||(LA118_0>=APOS && LA118_0<=QUOT)||LA118_0==L_NCName||(LA118_0>=L_Pragma && LA118_0<=L_DoubleLiteral)) ) {\n                alt118=1;\n            }\n            switch (alt118) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:900:30: p_Expr[true,true]\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_ExtensionExpr6561);\n                    p_Expr252=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr252.getTree());\n\n\n                    break;\n\n            }\n\n            RBRACKET253=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_ExtensionExpr6565); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET253_tree = this.adaptor.create(RBRACKET253);\n            this.adaptor.addChild(root_0, RBRACKET253_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PathExpr_return: (function() {\n        XQueryParser.p_PathExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PathExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:912:1: p_PathExpr : ( ( SLASH p_RelativePathExpr )=> ( SLASH p_RelativePathExpr ) | SLASH | SLASH_SLASH p_RelativePathExpr | p_RelativePathExpr );\n    // $ANTLR start \"p_PathExpr\"\n    p_PathExpr: function() {\n        var retval = new XQueryParser.p_PathExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SLASH254 = null;\n        var SLASH256 = null;\n        var SLASH_SLASH257 = null;\n         var p_RelativePathExpr255 = null;\n         var p_RelativePathExpr258 = null;\n         var p_RelativePathExpr259 = null;\n\n        var SLASH254_tree=null;\n        var SLASH256_tree=null;\n        var SLASH_SLASH257_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:913:9: ( ( SLASH p_RelativePathExpr )=> ( SLASH p_RelativePathExpr ) | SLASH | SLASH_SLASH p_RelativePathExpr | p_RelativePathExpr )\n            var alt119=4;\n            alt119 = this.dfa119.predict(this.input);\n            switch (alt119) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:913:11: ( SLASH p_RelativePathExpr )=> ( SLASH p_RelativePathExpr )\n                    root_0 = this.adaptor.nil();\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:913:41: ( SLASH p_RelativePathExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:913:42: SLASH p_RelativePathExpr\n                    SLASH254=this.match(this.input,SLASH,XQueryParser.FOLLOW_SLASH_in_p_PathExpr6608); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    SLASH254_tree = this.adaptor.create(SLASH254);\n                    this.adaptor.addChild(root_0, SLASH254_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_RelativePathExpr_in_p_PathExpr6610);\n                    p_RelativePathExpr255=this.p_RelativePathExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_RelativePathExpr255.getTree());\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:914:11: SLASH\n                    root_0 = this.adaptor.nil();\n\n                    SLASH256=this.match(this.input,SLASH,XQueryParser.FOLLOW_SLASH_in_p_PathExpr6623); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    SLASH256_tree = this.adaptor.create(SLASH256);\n                    this.adaptor.addChild(root_0, SLASH256_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:915:11: SLASH_SLASH p_RelativePathExpr\n                    root_0 = this.adaptor.nil();\n\n                    SLASH_SLASH257=this.match(this.input,SLASH_SLASH,XQueryParser.FOLLOW_SLASH_SLASH_in_p_PathExpr6635); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    SLASH_SLASH257_tree = this.adaptor.create(SLASH_SLASH257);\n                    this.adaptor.addChild(root_0, SLASH_SLASH257_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_RelativePathExpr_in_p_PathExpr6637);\n                    p_RelativePathExpr258=this.p_RelativePathExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_RelativePathExpr258.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:916:11: p_RelativePathExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_RelativePathExpr_in_p_PathExpr6649);\n                    p_RelativePathExpr259=this.p_RelativePathExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_RelativePathExpr259.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_RelativePathExpr_return: (function() {\n        XQueryParser.p_RelativePathExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_RelativePathExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:920:1: p_RelativePathExpr : p_StepExpr ( ( SLASH | SLASH_SLASH ) p_StepExpr )* ;\n    // $ANTLR start \"p_RelativePathExpr\"\n    p_RelativePathExpr: function() {\n        var retval = new XQueryParser.p_RelativePathExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var set261 = null;\n         var p_StepExpr260 = null;\n         var p_StepExpr262 = null;\n\n        var set261_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:921:9: ( p_StepExpr ( ( SLASH | SLASH_SLASH ) p_StepExpr )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:921:11: p_StepExpr ( ( SLASH | SLASH_SLASH ) p_StepExpr )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StepExpr_in_p_RelativePathExpr6677);\n            p_StepExpr260=this.p_StepExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StepExpr260.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:921:22: ( ( SLASH | SLASH_SLASH ) p_StepExpr )*\n            loop120:\n            do {\n                var alt120=2;\n                var LA120_0 = this.input.LA(1);\n\n                if ( ((LA120_0>=SLASH && LA120_0<=SLASH_SLASH)) ) {\n                    alt120=1;\n                }\n\n\n                switch (alt120) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:921:23: ( SLASH | SLASH_SLASH ) p_StepExpr\n                    set261=this.input.LT(1);\n                    if ( (this.input.LA(1)>=SLASH && this.input.LA(1)<=SLASH_SLASH) ) {\n                        this.input.consume();\n                        if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, this.adaptor.create(set261));\n                        this.state.errorRecovery=false;this.state.failed=false;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        throw mse;\n                    }\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_StepExpr_in_p_RelativePathExpr6688);\n                    p_StepExpr262=this.p_StepExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StepExpr262.getTree());\n\n\n                    break;\n\n                default :\n                    break loop120;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_StepExpr_return: (function() {\n        XQueryParser.p_StepExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_StepExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:925:1: p_StepExpr : ( ( LBRACKET | LPAREN | SMALLER | QUOT | APOS | DOLLAR )=> p_PostfixExpr | ( ( ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET ) | ( ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET ) | ( ( DOCUMENT | TEXT | COMMENT ) LBRACKET ) )=> p_PostfixExpr | ( p_KindTest )=> p_AxisStep | ( p_EQName LPAREN )=> p_PostfixExpr | ( p_PrimaryExpr )=> p_PostfixExpr | p_AxisStep );\n    // $ANTLR start \"p_StepExpr\"\n    p_StepExpr: function() {\n        var retval = new XQueryParser.p_StepExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_PostfixExpr263 = null;\n         var p_PostfixExpr264 = null;\n         var p_AxisStep265 = null;\n         var p_PostfixExpr266 = null;\n         var p_PostfixExpr267 = null;\n         var p_AxisStep268 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:926:9: ( ( LBRACKET | LPAREN | SMALLER | QUOT | APOS | DOLLAR )=> p_PostfixExpr | ( ( ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET ) | ( ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET ) | ( ( DOCUMENT | TEXT | COMMENT ) LBRACKET ) )=> p_PostfixExpr | ( p_KindTest )=> p_AxisStep | ( p_EQName LPAREN )=> p_PostfixExpr | ( p_PrimaryExpr )=> p_PostfixExpr | p_AxisStep )\n            var alt121=6;\n            alt121 = this.dfa121.predict(this.input);\n            switch (alt121) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:926:11: ( LBRACKET | LPAREN | SMALLER | QUOT | APOS | DOLLAR )=> p_PostfixExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_PostfixExpr_in_p_StepExpr6742);\n                    p_PostfixExpr263=this.p_PostfixExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PostfixExpr263.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:927:11: ( ( ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET ) | ( ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET ) | ( ( DOCUMENT | TEXT | COMMENT ) LBRACKET ) )=> p_PostfixExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_PostfixExpr_in_p_StepExpr6856);\n                    p_PostfixExpr264=this.p_PostfixExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PostfixExpr264.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:932:11: ( p_KindTest )=> p_AxisStep\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AxisStep_in_p_StepExpr6874);\n                    p_AxisStep265=this.p_AxisStep();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AxisStep265.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:933:11: ( p_EQName LPAREN )=> p_PostfixExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_PostfixExpr_in_p_StepExpr6895);\n                    p_PostfixExpr266=this.p_PostfixExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PostfixExpr266.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:934:11: ( p_PrimaryExpr )=> p_PostfixExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_PostfixExpr_in_p_StepExpr6913);\n                    p_PostfixExpr267=this.p_PostfixExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PostfixExpr267.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:935:11: p_AxisStep\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AxisStep_in_p_StepExpr6925);\n                    p_AxisStep268=this.p_AxisStep();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AxisStep268.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AxisStep_return: (function() {\n        XQueryParser.p_AxisStep_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AxisStep_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:939:1: p_AxisStep : ( p_ReverseStep | p_ForwardStep ) p_PredicateList ;\n    // $ANTLR start \"p_AxisStep\"\n    p_AxisStep: function() {\n        var retval = new XQueryParser.p_AxisStep_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ReverseStep269 = null;\n         var p_ForwardStep270 = null;\n         var p_PredicateList271 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:940:9: ( ( p_ReverseStep | p_ForwardStep ) p_PredicateList )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:940:11: ( p_ReverseStep | p_ForwardStep ) p_PredicateList\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:940:11: ( p_ReverseStep | p_ForwardStep )\n            var alt122=2;\n            switch ( this.input.LA(1) ) {\n            case PARENT:\n                var LA122_1 = this.input.LA(2);\n\n                if ( (LA122_1==COLON_COLON) ) {\n                    alt122=1;\n                }\n                else if ( (LA122_1==EOF||(LA122_1>=AND && LA122_1<=AT)||(LA122_1>=BY && LA122_1<=CASTABLE)||LA122_1==COLLATION||LA122_1==DEFAULT||(LA122_1>=DESCENDING && LA122_1<=DIV)||LA122_1==EMPTY||LA122_1==EQ||LA122_1==EXCEPT||LA122_1==FOR||LA122_1==GE||(LA122_1>=GT && LA122_1<=IDIV)||(LA122_1>=INSTANCE && LA122_1<=IS)||LA122_1==LE||(LA122_1>=LET && LA122_1<=MOD)||LA122_1==NE||(LA122_1>=OR && LA122_1<=ORDER)||(LA122_1>=RETURN && LA122_1<=SATISFIES)||LA122_1==STABLE||(LA122_1>=TO && LA122_1<=TREAT)||LA122_1==UNION||LA122_1==WHERE||LA122_1==COUNT||(LA122_1>=END && LA122_1<=GROUP)||LA122_1==ONLY||LA122_1==START||(LA122_1>=AFTER && LA122_1<=BEFORE)||LA122_1==INTO||LA122_1==MODIFY||LA122_1==WITH||LA122_1==CONTAINS||LA122_1==PARAGRAPHS||LA122_1==SENTENCES||LA122_1==TIMES||LA122_1==WORDS||LA122_1==CONCAT||LA122_1==RPAREN||LA122_1==R_UNION_BRACKET||(LA122_1>=RBRACKET && LA122_1<=EQUAL)||LA122_1==NOTEQUAL||LA122_1==COMMA||(LA122_1>=STAR && LA122_1<=BANG)||LA122_1==COLON||(LA122_1>=SEMICOLON && LA122_1<=VBAR)) ) {\n                    alt122=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 122, 1, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case ANCESTOR:\n                var LA122_2 = this.input.LA(2);\n\n                if ( (LA122_2==COLON_COLON) ) {\n                    alt122=1;\n                }\n                else if ( (LA122_2==EOF||(LA122_2>=AND && LA122_2<=AT)||(LA122_2>=BY && LA122_2<=CASTABLE)||LA122_2==COLLATION||LA122_2==DEFAULT||(LA122_2>=DESCENDING && LA122_2<=DIV)||LA122_2==EMPTY||LA122_2==EQ||LA122_2==EXCEPT||LA122_2==FOR||LA122_2==GE||(LA122_2>=GT && LA122_2<=IDIV)||(LA122_2>=INSTANCE && LA122_2<=IS)||LA122_2==LE||(LA122_2>=LET && LA122_2<=MOD)||LA122_2==NE||(LA122_2>=OR && LA122_2<=ORDER)||(LA122_2>=RETURN && LA122_2<=SATISFIES)||LA122_2==STABLE||(LA122_2>=TO && LA122_2<=TREAT)||LA122_2==UNION||LA122_2==WHERE||LA122_2==COUNT||(LA122_2>=END && LA122_2<=GROUP)||LA122_2==ONLY||LA122_2==START||(LA122_2>=AFTER && LA122_2<=BEFORE)||LA122_2==INTO||LA122_2==MODIFY||LA122_2==WITH||LA122_2==CONTAINS||LA122_2==PARAGRAPHS||LA122_2==SENTENCES||LA122_2==TIMES||LA122_2==WORDS||LA122_2==CONCAT||LA122_2==RPAREN||LA122_2==R_UNION_BRACKET||(LA122_2>=RBRACKET && LA122_2<=EQUAL)||LA122_2==NOTEQUAL||LA122_2==COMMA||(LA122_2>=STAR && LA122_2<=BANG)||LA122_2==COLON||(LA122_2>=SEMICOLON && LA122_2<=VBAR)) ) {\n                    alt122=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 122, 2, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case PRECEDING_SIBLING:\n                var LA122_3 = this.input.LA(2);\n\n                if ( (LA122_3==COLON_COLON) ) {\n                    alt122=1;\n                }\n                else if ( (LA122_3==EOF||(LA122_3>=AND && LA122_3<=AT)||(LA122_3>=BY && LA122_3<=CASTABLE)||LA122_3==COLLATION||LA122_3==DEFAULT||(LA122_3>=DESCENDING && LA122_3<=DIV)||LA122_3==EMPTY||LA122_3==EQ||LA122_3==EXCEPT||LA122_3==FOR||LA122_3==GE||(LA122_3>=GT && LA122_3<=IDIV)||(LA122_3>=INSTANCE && LA122_3<=IS)||LA122_3==LE||(LA122_3>=LET && LA122_3<=MOD)||LA122_3==NE||(LA122_3>=OR && LA122_3<=ORDER)||(LA122_3>=RETURN && LA122_3<=SATISFIES)||LA122_3==STABLE||(LA122_3>=TO && LA122_3<=TREAT)||LA122_3==UNION||LA122_3==WHERE||LA122_3==COUNT||(LA122_3>=END && LA122_3<=GROUP)||LA122_3==ONLY||LA122_3==START||(LA122_3>=AFTER && LA122_3<=BEFORE)||LA122_3==INTO||LA122_3==MODIFY||LA122_3==WITH||LA122_3==CONTAINS||LA122_3==PARAGRAPHS||LA122_3==SENTENCES||LA122_3==TIMES||LA122_3==WORDS||LA122_3==CONCAT||LA122_3==RPAREN||LA122_3==R_UNION_BRACKET||(LA122_3>=RBRACKET && LA122_3<=EQUAL)||LA122_3==NOTEQUAL||LA122_3==COMMA||(LA122_3>=STAR && LA122_3<=BANG)||LA122_3==COLON||(LA122_3>=SEMICOLON && LA122_3<=VBAR)) ) {\n                    alt122=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 122, 3, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case PRECEDING:\n                var LA122_4 = this.input.LA(2);\n\n                if ( (LA122_4==COLON_COLON) ) {\n                    alt122=1;\n                }\n                else if ( (LA122_4==EOF||(LA122_4>=AND && LA122_4<=AT)||(LA122_4>=BY && LA122_4<=CASTABLE)||LA122_4==COLLATION||LA122_4==DEFAULT||(LA122_4>=DESCENDING && LA122_4<=DIV)||LA122_4==EMPTY||LA122_4==EQ||LA122_4==EXCEPT||LA122_4==FOR||LA122_4==GE||(LA122_4>=GT && LA122_4<=IDIV)||(LA122_4>=INSTANCE && LA122_4<=IS)||LA122_4==LE||(LA122_4>=LET && LA122_4<=MOD)||LA122_4==NE||(LA122_4>=OR && LA122_4<=ORDER)||(LA122_4>=RETURN && LA122_4<=SATISFIES)||LA122_4==STABLE||(LA122_4>=TO && LA122_4<=TREAT)||LA122_4==UNION||LA122_4==WHERE||LA122_4==COUNT||(LA122_4>=END && LA122_4<=GROUP)||LA122_4==ONLY||LA122_4==START||(LA122_4>=AFTER && LA122_4<=BEFORE)||LA122_4==INTO||LA122_4==MODIFY||LA122_4==WITH||LA122_4==CONTAINS||LA122_4==PARAGRAPHS||LA122_4==SENTENCES||LA122_4==TIMES||LA122_4==WORDS||LA122_4==CONCAT||LA122_4==RPAREN||LA122_4==R_UNION_BRACKET||(LA122_4>=RBRACKET && LA122_4<=EQUAL)||LA122_4==NOTEQUAL||LA122_4==COMMA||(LA122_4>=STAR && LA122_4<=BANG)||LA122_4==COLON||(LA122_4>=SEMICOLON && LA122_4<=VBAR)) ) {\n                    alt122=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 122, 4, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case ANCESTOR_OR_SELF:\n                var LA122_5 = this.input.LA(2);\n\n                if ( (LA122_5==COLON_COLON) ) {\n                    alt122=1;\n                }\n                else if ( (LA122_5==EOF||(LA122_5>=AND && LA122_5<=AT)||(LA122_5>=BY && LA122_5<=CASTABLE)||LA122_5==COLLATION||LA122_5==DEFAULT||(LA122_5>=DESCENDING && LA122_5<=DIV)||LA122_5==EMPTY||LA122_5==EQ||LA122_5==EXCEPT||LA122_5==FOR||LA122_5==GE||(LA122_5>=GT && LA122_5<=IDIV)||(LA122_5>=INSTANCE && LA122_5<=IS)||LA122_5==LE||(LA122_5>=LET && LA122_5<=MOD)||LA122_5==NE||(LA122_5>=OR && LA122_5<=ORDER)||(LA122_5>=RETURN && LA122_5<=SATISFIES)||LA122_5==STABLE||(LA122_5>=TO && LA122_5<=TREAT)||LA122_5==UNION||LA122_5==WHERE||LA122_5==COUNT||(LA122_5>=END && LA122_5<=GROUP)||LA122_5==ONLY||LA122_5==START||(LA122_5>=AFTER && LA122_5<=BEFORE)||LA122_5==INTO||LA122_5==MODIFY||LA122_5==WITH||LA122_5==CONTAINS||LA122_5==PARAGRAPHS||LA122_5==SENTENCES||LA122_5==TIMES||LA122_5==WORDS||LA122_5==CONCAT||LA122_5==RPAREN||LA122_5==R_UNION_BRACKET||(LA122_5>=RBRACKET && LA122_5<=EQUAL)||LA122_5==NOTEQUAL||LA122_5==COMMA||(LA122_5>=STAR && LA122_5<=BANG)||LA122_5==COLON||(LA122_5>=SEMICOLON && LA122_5<=VBAR)) ) {\n                    alt122=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 122, 5, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case DOT_DOT:\n                alt122=1;\n                break;\n            case AND:\n            case AS:\n            case ASCENDING:\n            case AT:\n            case ATTRIBUTE:\n            case BASE_URI:\n            case BOUNDARY_SPACE:\n            case BY:\n            case CASE:\n            case CAST:\n            case CASTABLE:\n            case CHILD:\n            case COLLATION:\n            case COMMENT:\n            case CONSTRUCTION:\n            case COPY_NAMESPACES:\n            case DECLARE:\n            case DEFAULT:\n            case DESCENDANT:\n            case DESCENDANT_OR_SELF:\n            case DESCENDING:\n            case DIV:\n            case DOCUMENT:\n            case DOCUMENT_NODE:\n            case ELEMENT:\n            case ELSE:\n            case EMPTY:\n            case EMPTY_SEQUENCE:\n            case ENCODING:\n            case EQ:\n            case EVERY:\n            case EXCEPT:\n            case EXTERNAL:\n            case FOLLOWING:\n            case FOLLOWING_SIBLING:\n            case FOR:\n            case FUNCTION:\n            case GE:\n            case GREATEST:\n            case GT:\n            case IDIV:\n            case IF:\n            case IMPORT:\n            case IN:\n            case INHERIT:\n            case INSTANCE:\n            case INTERSECT:\n            case IS:\n            case ITEM:\n            case LAX:\n            case LE:\n            case LEAST:\n            case LET:\n            case LT:\n            case MOD:\n            case MODULE:\n            case NAMESPACE:\n            case NE:\n            case NO_INHERIT:\n            case NO_PRESERVE:\n            case NODE:\n            case JSON:\n            case OF:\n            case OPTION:\n            case OR:\n            case ORDER:\n            case ORDERED:\n            case ORDERING:\n            case PRESERVE:\n            case PROCESSING_INSTRUCTION:\n            case STRUCTURED_ITEM:\n            case JSON_ITEM:\n            case OBJECT:\n            case ARRAY:\n            case RETURN:\n            case SATISFIES:\n            case SCHEMA:\n            case SCHEMA_ATTRIBUTE:\n            case SCHEMA_ELEMENT:\n            case SELF:\n            case SOME:\n            case STABLE:\n            case STRICT:\n            case STRIP:\n            case TEXT:\n            case THEN:\n            case TO:\n            case TREAT:\n            case TYPESWITCH:\n            case UNION:\n            case UNORDERED:\n            case VALIDATE:\n            case VARIABLE:\n            case VERSION:\n            case WHERE:\n            case XQUERY:\n            case ALLOWING:\n            case CATCH:\n            case CONTEXT:\n            case COUNT:\n            case DECIMAL_FORMAT:\n            case DECIMAL_SEPARATOR:\n            case DIGIT:\n            case END:\n            case GROUP:\n            case GROUPING_SEPARATOR:\n            case INFINITY:\n            case MINUS_SIGN:\n            case NAMESPACE_NODE:\n            case NAN:\n            case NEXT:\n            case ONLY:\n            case PATTERN_SEPARATOR:\n            case PERCENT:\n            case PER_MILLE:\n            case PREVIOUS:\n            case SLIDING:\n            case START:\n            case SWITCH:\n            case TRY:\n            case TUMBLING:\n            case TYPE:\n            case WHEN:\n            case WINDOW:\n            case ZERO_DIGIT:\n            case AFTER:\n            case BEFORE:\n            case COPY:\n            case DELETE:\n            case FIRST:\n            case INSERT:\n            case INTO:\n            case POSITION:\n            case APPEND:\n            case LAST:\n            case MODIFY:\n            case NODES:\n            case RENAME:\n            case REPLACE:\n            case REVALIDATION:\n            case SKIP:\n            case VALUE:\n            case WITH:\n            case ALL:\n            case ANY:\n            case CONTAINS:\n            case CONTENT:\n            case DIACRITICS:\n            case DIFFERENT:\n            case DISTANCE:\n            case ENTIRE:\n            case EXACTLY:\n            case FROM:\n            case FT_OPTION:\n            case FTAND:\n            case FTNOT:\n            case FTOR:\n            case INSENSITIVE:\n            case LANGUAGE:\n            case LEVELS:\n            case LOWERCASE:\n            case MOST:\n            case NO:\n            case NOT:\n            case OCCURS:\n            case PARAGRAPH:\n            case PARAGRAPHS:\n            case PHRASE:\n            case RELATIONSHIP:\n            case SAME:\n            case SCORE:\n            case SENSITIVE:\n            case SENTENCE:\n            case SENTENCES:\n            case STEMMING:\n            case STOP:\n            case THESAURUS:\n            case TIMES:\n            case UPPERCASE:\n            case USING:\n            case WEIGHT:\n            case WILDCARDS:\n            case WITHOUT:\n            case WORD:\n            case WORDS:\n            case BREAK:\n            case CONTINUE:\n            case EXIT:\n            case LOOP:\n            case RETURNING:\n            case WHILE:\n            case CHECK:\n            case COLLECTION:\n            case CONSTRAINT:\n            case FOREACH:\n            case FOREIGN:\n            case INDEX:\n            case INTEGRITY:\n            case KEY:\n            case ON:\n            case UNIQUE:\n            case AMP_ER:\n            case APOS_ER:\n            case QUOT_ER:\n            case STAR:\n            case ATTR_SIGN:\n            case Q:\n            case L_NCName:\n                alt122=2;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 122, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt122) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:940:12: p_ReverseStep\n                    this.pushFollow(XQueryParser.FOLLOW_p_ReverseStep_in_p_AxisStep6952);\n                    p_ReverseStep269=this.p_ReverseStep();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ReverseStep269.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:940:28: p_ForwardStep\n                    this.pushFollow(XQueryParser.FOLLOW_p_ForwardStep_in_p_AxisStep6956);\n                    p_ForwardStep270=this.p_ForwardStep();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ForwardStep270.getTree());\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_PredicateList_in_p_AxisStep6959);\n            p_PredicateList271=this.p_PredicateList();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PredicateList271.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ForwardStep_return: (function() {\n        XQueryParser.p_ForwardStep_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ForwardStep_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:944:1: p_ForwardStep : ( p_ForwardAxis p_NodeTest | p_AbbrevForwardStep );\n    // $ANTLR start \"p_ForwardStep\"\n    p_ForwardStep: function() {\n        var retval = new XQueryParser.p_ForwardStep_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ForwardAxis272 = null;\n         var p_NodeTest273 = null;\n         var p_AbbrevForwardStep274 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:945:9: ( p_ForwardAxis p_NodeTest | p_AbbrevForwardStep )\n            var alt123=2;\n            alt123 = this.dfa123.predict(this.input);\n            switch (alt123) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:945:11: p_ForwardAxis p_NodeTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ForwardAxis_in_p_ForwardStep6985);\n                    p_ForwardAxis272=this.p_ForwardAxis();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ForwardAxis272.getTree());\n                    this.pushFollow(XQueryParser.FOLLOW_p_NodeTest_in_p_ForwardStep6987);\n                    p_NodeTest273=this.p_NodeTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NodeTest273.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:946:11: p_AbbrevForwardStep\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AbbrevForwardStep_in_p_ForwardStep6999);\n                    p_AbbrevForwardStep274=this.p_AbbrevForwardStep();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AbbrevForwardStep274.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ForwardAxis_return: (function() {\n        XQueryParser.p_ForwardAxis_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ForwardAxis_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:950:1: p_ForwardAxis : ( CHILD COLON_COLON | DESCENDANT COLON_COLON | ATTRIBUTE COLON_COLON | SELF COLON_COLON | DESCENDANT_OR_SELF COLON_COLON | FOLLOWING_SIBLING COLON_COLON | FOLLOWING COLON_COLON );\n    // $ANTLR start \"p_ForwardAxis\"\n    p_ForwardAxis: function() {\n        var retval = new XQueryParser.p_ForwardAxis_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var CHILD275 = null;\n        var COLON_COLON276 = null;\n        var DESCENDANT277 = null;\n        var COLON_COLON278 = null;\n        var ATTRIBUTE279 = null;\n        var COLON_COLON280 = null;\n        var SELF281 = null;\n        var COLON_COLON282 = null;\n        var DESCENDANT_OR_SELF283 = null;\n        var COLON_COLON284 = null;\n        var FOLLOWING_SIBLING285 = null;\n        var COLON_COLON286 = null;\n        var FOLLOWING287 = null;\n        var COLON_COLON288 = null;\n\n        var CHILD275_tree=null;\n        var COLON_COLON276_tree=null;\n        var DESCENDANT277_tree=null;\n        var COLON_COLON278_tree=null;\n        var ATTRIBUTE279_tree=null;\n        var COLON_COLON280_tree=null;\n        var SELF281_tree=null;\n        var COLON_COLON282_tree=null;\n        var DESCENDANT_OR_SELF283_tree=null;\n        var COLON_COLON284_tree=null;\n        var FOLLOWING_SIBLING285_tree=null;\n        var COLON_COLON286_tree=null;\n        var FOLLOWING287_tree=null;\n        var COLON_COLON288_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:951:9: ( CHILD COLON_COLON | DESCENDANT COLON_COLON | ATTRIBUTE COLON_COLON | SELF COLON_COLON | DESCENDANT_OR_SELF COLON_COLON | FOLLOWING_SIBLING COLON_COLON | FOLLOWING COLON_COLON )\n            var alt124=7;\n            switch ( this.input.LA(1) ) {\n            case CHILD:\n                alt124=1;\n                break;\n            case DESCENDANT:\n                alt124=2;\n                break;\n            case ATTRIBUTE:\n                alt124=3;\n                break;\n            case SELF:\n                alt124=4;\n                break;\n            case DESCENDANT_OR_SELF:\n                alt124=5;\n                break;\n            case FOLLOWING_SIBLING:\n                alt124=6;\n                break;\n            case FOLLOWING:\n                alt124=7;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 124, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt124) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:951:11: CHILD COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    CHILD275=this.match(this.input,CHILD,XQueryParser.FOLLOW_CHILD_in_p_ForwardAxis7025); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    CHILD275_tree = this.adaptor.create(CHILD275);\n                    this.adaptor.addChild(root_0, CHILD275_tree);\n                    }\n                    COLON_COLON276=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ForwardAxis7027); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON276_tree = this.adaptor.create(COLON_COLON276);\n                    this.adaptor.addChild(root_0, COLON_COLON276_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:952:11: DESCENDANT COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    DESCENDANT277=this.match(this.input,DESCENDANT,XQueryParser.FOLLOW_DESCENDANT_in_p_ForwardAxis7039); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    DESCENDANT277_tree = this.adaptor.create(DESCENDANT277);\n                    this.adaptor.addChild(root_0, DESCENDANT277_tree);\n                    }\n                    COLON_COLON278=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ForwardAxis7041); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON278_tree = this.adaptor.create(COLON_COLON278);\n                    this.adaptor.addChild(root_0, COLON_COLON278_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:953:11: ATTRIBUTE COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    ATTRIBUTE279=this.match(this.input,ATTRIBUTE,XQueryParser.FOLLOW_ATTRIBUTE_in_p_ForwardAxis7053); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ATTRIBUTE279_tree = this.adaptor.create(ATTRIBUTE279);\n                    this.adaptor.addChild(root_0, ATTRIBUTE279_tree);\n                    }\n                    COLON_COLON280=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ForwardAxis7055); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON280_tree = this.adaptor.create(COLON_COLON280);\n                    this.adaptor.addChild(root_0, COLON_COLON280_tree);\n                    }\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:954:11: SELF COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    SELF281=this.match(this.input,SELF,XQueryParser.FOLLOW_SELF_in_p_ForwardAxis7067); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    SELF281_tree = this.adaptor.create(SELF281);\n                    this.adaptor.addChild(root_0, SELF281_tree);\n                    }\n                    COLON_COLON282=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ForwardAxis7069); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON282_tree = this.adaptor.create(COLON_COLON282);\n                    this.adaptor.addChild(root_0, COLON_COLON282_tree);\n                    }\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:955:11: DESCENDANT_OR_SELF COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    DESCENDANT_OR_SELF283=this.match(this.input,DESCENDANT_OR_SELF,XQueryParser.FOLLOW_DESCENDANT_OR_SELF_in_p_ForwardAxis7081); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    DESCENDANT_OR_SELF283_tree = this.adaptor.create(DESCENDANT_OR_SELF283);\n                    this.adaptor.addChild(root_0, DESCENDANT_OR_SELF283_tree);\n                    }\n                    COLON_COLON284=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ForwardAxis7083); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON284_tree = this.adaptor.create(COLON_COLON284);\n                    this.adaptor.addChild(root_0, COLON_COLON284_tree);\n                    }\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:956:11: FOLLOWING_SIBLING COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    FOLLOWING_SIBLING285=this.match(this.input,FOLLOWING_SIBLING,XQueryParser.FOLLOW_FOLLOWING_SIBLING_in_p_ForwardAxis7095); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    FOLLOWING_SIBLING285_tree = this.adaptor.create(FOLLOWING_SIBLING285);\n                    this.adaptor.addChild(root_0, FOLLOWING_SIBLING285_tree);\n                    }\n                    COLON_COLON286=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ForwardAxis7097); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON286_tree = this.adaptor.create(COLON_COLON286);\n                    this.adaptor.addChild(root_0, COLON_COLON286_tree);\n                    }\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:957:11: FOLLOWING COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    FOLLOWING287=this.match(this.input,FOLLOWING,XQueryParser.FOLLOW_FOLLOWING_in_p_ForwardAxis7109); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    FOLLOWING287_tree = this.adaptor.create(FOLLOWING287);\n                    this.adaptor.addChild(root_0, FOLLOWING287_tree);\n                    }\n                    COLON_COLON288=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ForwardAxis7111); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON288_tree = this.adaptor.create(COLON_COLON288);\n                    this.adaptor.addChild(root_0, COLON_COLON288_tree);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AbbrevForwardStep_return: (function() {\n        XQueryParser.p_AbbrevForwardStep_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AbbrevForwardStep_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:961:1: p_AbbrevForwardStep : ( ATTR_SIGN )? p_NodeTest ;\n    // $ANTLR start \"p_AbbrevForwardStep\"\n    p_AbbrevForwardStep: function() {\n        var retval = new XQueryParser.p_AbbrevForwardStep_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ATTR_SIGN289 = null;\n         var p_NodeTest290 = null;\n\n        var ATTR_SIGN289_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:962:9: ( ( ATTR_SIGN )? p_NodeTest )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:962:11: ( ATTR_SIGN )? p_NodeTest\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:962:11: ( ATTR_SIGN )?\n            var alt125=2;\n            var LA125_0 = this.input.LA(1);\n\n            if ( (LA125_0==ATTR_SIGN) ) {\n                alt125=1;\n            }\n            switch (alt125) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:962:11: ATTR_SIGN\n                    ATTR_SIGN289=this.match(this.input,ATTR_SIGN,XQueryParser.FOLLOW_ATTR_SIGN_in_p_AbbrevForwardStep7137); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ATTR_SIGN289_tree = this.adaptor.create(ATTR_SIGN289);\n                    this.adaptor.addChild(root_0, ATTR_SIGN289_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_NodeTest_in_p_AbbrevForwardStep7140);\n            p_NodeTest290=this.p_NodeTest();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NodeTest290.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ReverseStep_return: (function() {\n        XQueryParser.p_ReverseStep_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ReverseStep_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:966:1: p_ReverseStep : ( p_ReverseAxis p_NodeTest | p_AbbrevReverseStep );\n    // $ANTLR start \"p_ReverseStep\"\n    p_ReverseStep: function() {\n        var retval = new XQueryParser.p_ReverseStep_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ReverseAxis291 = null;\n         var p_NodeTest292 = null;\n         var p_AbbrevReverseStep293 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:967:9: ( p_ReverseAxis p_NodeTest | p_AbbrevReverseStep )\n            var alt126=2;\n            var LA126_0 = this.input.LA(1);\n\n            if ( ((LA126_0>=ANCESTOR && LA126_0<=ANCESTOR_OR_SELF)||(LA126_0>=PARENT && LA126_0<=PRECEDING_SIBLING)) ) {\n                alt126=1;\n            }\n            else if ( (LA126_0==DOT_DOT) ) {\n                alt126=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 126, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt126) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:967:11: p_ReverseAxis p_NodeTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ReverseAxis_in_p_ReverseStep7166);\n                    p_ReverseAxis291=this.p_ReverseAxis();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ReverseAxis291.getTree());\n                    this.pushFollow(XQueryParser.FOLLOW_p_NodeTest_in_p_ReverseStep7168);\n                    p_NodeTest292=this.p_NodeTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NodeTest292.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:968:11: p_AbbrevReverseStep\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AbbrevReverseStep_in_p_ReverseStep7180);\n                    p_AbbrevReverseStep293=this.p_AbbrevReverseStep();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AbbrevReverseStep293.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ReverseAxis_return: (function() {\n        XQueryParser.p_ReverseAxis_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ReverseAxis_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:972:1: p_ReverseAxis : ( PARENT COLON_COLON | ANCESTOR COLON_COLON | PRECEDING_SIBLING COLON_COLON | PRECEDING COLON_COLON | ANCESTOR_OR_SELF COLON_COLON );\n    // $ANTLR start \"p_ReverseAxis\"\n    p_ReverseAxis: function() {\n        var retval = new XQueryParser.p_ReverseAxis_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var PARENT294 = null;\n        var COLON_COLON295 = null;\n        var ANCESTOR296 = null;\n        var COLON_COLON297 = null;\n        var PRECEDING_SIBLING298 = null;\n        var COLON_COLON299 = null;\n        var PRECEDING300 = null;\n        var COLON_COLON301 = null;\n        var ANCESTOR_OR_SELF302 = null;\n        var COLON_COLON303 = null;\n\n        var PARENT294_tree=null;\n        var COLON_COLON295_tree=null;\n        var ANCESTOR296_tree=null;\n        var COLON_COLON297_tree=null;\n        var PRECEDING_SIBLING298_tree=null;\n        var COLON_COLON299_tree=null;\n        var PRECEDING300_tree=null;\n        var COLON_COLON301_tree=null;\n        var ANCESTOR_OR_SELF302_tree=null;\n        var COLON_COLON303_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:973:9: ( PARENT COLON_COLON | ANCESTOR COLON_COLON | PRECEDING_SIBLING COLON_COLON | PRECEDING COLON_COLON | ANCESTOR_OR_SELF COLON_COLON )\n            var alt127=5;\n            switch ( this.input.LA(1) ) {\n            case PARENT:\n                alt127=1;\n                break;\n            case ANCESTOR:\n                alt127=2;\n                break;\n            case PRECEDING_SIBLING:\n                alt127=3;\n                break;\n            case PRECEDING:\n                alt127=4;\n                break;\n            case ANCESTOR_OR_SELF:\n                alt127=5;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 127, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt127) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:973:11: PARENT COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    PARENT294=this.match(this.input,PARENT,XQueryParser.FOLLOW_PARENT_in_p_ReverseAxis7206); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    PARENT294_tree = this.adaptor.create(PARENT294);\n                    this.adaptor.addChild(root_0, PARENT294_tree);\n                    }\n                    COLON_COLON295=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ReverseAxis7208); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON295_tree = this.adaptor.create(COLON_COLON295);\n                    this.adaptor.addChild(root_0, COLON_COLON295_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:974:11: ANCESTOR COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    ANCESTOR296=this.match(this.input,ANCESTOR,XQueryParser.FOLLOW_ANCESTOR_in_p_ReverseAxis7220); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ANCESTOR296_tree = this.adaptor.create(ANCESTOR296);\n                    this.adaptor.addChild(root_0, ANCESTOR296_tree);\n                    }\n                    COLON_COLON297=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ReverseAxis7222); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON297_tree = this.adaptor.create(COLON_COLON297);\n                    this.adaptor.addChild(root_0, COLON_COLON297_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:975:11: PRECEDING_SIBLING COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    PRECEDING_SIBLING298=this.match(this.input,PRECEDING_SIBLING,XQueryParser.FOLLOW_PRECEDING_SIBLING_in_p_ReverseAxis7234); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    PRECEDING_SIBLING298_tree = this.adaptor.create(PRECEDING_SIBLING298);\n                    this.adaptor.addChild(root_0, PRECEDING_SIBLING298_tree);\n                    }\n                    COLON_COLON299=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ReverseAxis7236); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON299_tree = this.adaptor.create(COLON_COLON299);\n                    this.adaptor.addChild(root_0, COLON_COLON299_tree);\n                    }\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:976:11: PRECEDING COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    PRECEDING300=this.match(this.input,PRECEDING,XQueryParser.FOLLOW_PRECEDING_in_p_ReverseAxis7248); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    PRECEDING300_tree = this.adaptor.create(PRECEDING300);\n                    this.adaptor.addChild(root_0, PRECEDING300_tree);\n                    }\n                    COLON_COLON301=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ReverseAxis7250); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON301_tree = this.adaptor.create(COLON_COLON301);\n                    this.adaptor.addChild(root_0, COLON_COLON301_tree);\n                    }\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:977:11: ANCESTOR_OR_SELF COLON_COLON\n                    root_0 = this.adaptor.nil();\n\n                    ANCESTOR_OR_SELF302=this.match(this.input,ANCESTOR_OR_SELF,XQueryParser.FOLLOW_ANCESTOR_OR_SELF_in_p_ReverseAxis7262); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ANCESTOR_OR_SELF302_tree = this.adaptor.create(ANCESTOR_OR_SELF302);\n                    this.adaptor.addChild(root_0, ANCESTOR_OR_SELF302_tree);\n                    }\n                    COLON_COLON303=this.match(this.input,COLON_COLON,XQueryParser.FOLLOW_COLON_COLON_in_p_ReverseAxis7264); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON_COLON303_tree = this.adaptor.create(COLON_COLON303);\n                    this.adaptor.addChild(root_0, COLON_COLON303_tree);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AbbrevReverseStep_return: (function() {\n        XQueryParser.p_AbbrevReverseStep_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AbbrevReverseStep_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:981:1: p_AbbrevReverseStep : DOT_DOT ;\n    // $ANTLR start \"p_AbbrevReverseStep\"\n    p_AbbrevReverseStep: function() {\n        var retval = new XQueryParser.p_AbbrevReverseStep_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var DOT_DOT304 = null;\n\n        var DOT_DOT304_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:982:9: ( DOT_DOT )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:982:11: DOT_DOT\n            root_0 = this.adaptor.nil();\n\n            DOT_DOT304=this.match(this.input,DOT_DOT,XQueryParser.FOLLOW_DOT_DOT_in_p_AbbrevReverseStep7290); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            DOT_DOT304_tree = this.adaptor.create(DOT_DOT304);\n            this.adaptor.addChild(root_0, DOT_DOT304_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NodeTest_return: (function() {\n        XQueryParser.p_NodeTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NodeTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:986:1: p_NodeTest : ( p_KindTest | p_NameTest );\n    // $ANTLR start \"p_NodeTest\"\n    p_NodeTest: function() {\n        var retval = new XQueryParser.p_NodeTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_KindTest305 = null;\n         var p_NameTest306 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:987:9: ( p_KindTest | p_NameTest )\n            var alt128=2;\n            alt128 = this.dfa128.predict(this.input);\n            switch (alt128) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:987:11: p_KindTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_KindTest_in_p_NodeTest7316);\n                    p_KindTest305=this.p_KindTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_KindTest305.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:987:24: p_NameTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_NameTest_in_p_NodeTest7320);\n                    p_NameTest306=this.p_NameTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NameTest306.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NameTest_return: (function() {\n        XQueryParser.p_NameTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NameTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:991:1: p_NameTest : ( p_EQName | p_Wildcard );\n    // $ANTLR start \"p_NameTest\"\n    p_NameTest: function() {\n        var retval = new XQueryParser.p_NameTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName307 = null;\n         var p_Wildcard308 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:992:9: ( p_EQName | p_Wildcard )\n            var alt129=2;\n            alt129 = this.dfa129.predict(this.input);\n            switch (alt129) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:992:11: p_EQName\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_NameTest7346);\n                    p_EQName307=this.p_EQName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName307.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:992:22: p_Wildcard\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_Wildcard_in_p_NameTest7350);\n                    p_Wildcard308=this.p_Wildcard();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Wildcard308.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Wildcard_return: (function() {\n        XQueryParser.p_Wildcard_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Wildcard_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:999:1: p_Wildcard : ( STAR ( COLON p_NCName )? | p_NCName COLON STAR | p_BracedURILiteral STAR );\n    // $ANTLR start \"p_Wildcard\"\n    p_Wildcard: function() {\n        var retval = new XQueryParser.p_Wildcard_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var STAR309 = null;\n        var COLON310 = null;\n        var COLON313 = null;\n        var STAR314 = null;\n        var STAR316 = null;\n         var p_NCName311 = null;\n         var p_NCName312 = null;\n         var p_BracedURILiteral315 = null;\n\n        var STAR309_tree=null;\n        var COLON310_tree=null;\n        var COLON313_tree=null;\n        var STAR314_tree=null;\n        var STAR316_tree=null;\n\n        this.setWsExplicit(true);\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1000:9: ( STAR ( COLON p_NCName )? | p_NCName COLON STAR | p_BracedURILiteral STAR )\n            var alt131=3;\n            switch ( this.input.LA(1) ) {\n            case STAR:\n                alt131=1;\n                break;\n            case ANCESTOR:\n            case ANCESTOR_OR_SELF:\n            case AND:\n            case AS:\n            case ASCENDING:\n            case AT:\n            case ATTRIBUTE:\n            case BASE_URI:\n            case BOUNDARY_SPACE:\n            case BY:\n            case CASE:\n            case CAST:\n            case CASTABLE:\n            case CHILD:\n            case COLLATION:\n            case COMMENT:\n            case CONSTRUCTION:\n            case COPY_NAMESPACES:\n            case DECLARE:\n            case DEFAULT:\n            case DESCENDANT:\n            case DESCENDANT_OR_SELF:\n            case DESCENDING:\n            case DIV:\n            case DOCUMENT:\n            case DOCUMENT_NODE:\n            case ELEMENT:\n            case ELSE:\n            case EMPTY:\n            case EMPTY_SEQUENCE:\n            case ENCODING:\n            case EQ:\n            case EVERY:\n            case EXCEPT:\n            case EXTERNAL:\n            case FOLLOWING:\n            case FOLLOWING_SIBLING:\n            case FOR:\n            case FUNCTION:\n            case GE:\n            case GREATEST:\n            case GT:\n            case IDIV:\n            case IF:\n            case IMPORT:\n            case IN:\n            case INHERIT:\n            case INSTANCE:\n            case INTERSECT:\n            case IS:\n            case ITEM:\n            case LAX:\n            case LE:\n            case LEAST:\n            case LET:\n            case LT:\n            case MOD:\n            case MODULE:\n            case NAMESPACE:\n            case NE:\n            case NO_INHERIT:\n            case NO_PRESERVE:\n            case NODE:\n            case JSON:\n            case OF:\n            case OPTION:\n            case OR:\n            case ORDER:\n            case ORDERED:\n            case ORDERING:\n            case PARENT:\n            case PRECEDING:\n            case PRECEDING_SIBLING:\n            case PRESERVE:\n            case PROCESSING_INSTRUCTION:\n            case STRUCTURED_ITEM:\n            case JSON_ITEM:\n            case OBJECT:\n            case ARRAY:\n            case RETURN:\n            case SATISFIES:\n            case SCHEMA:\n            case SCHEMA_ATTRIBUTE:\n            case SCHEMA_ELEMENT:\n            case SELF:\n            case SOME:\n            case STABLE:\n            case STRICT:\n            case STRIP:\n            case TEXT:\n            case THEN:\n            case TO:\n            case TREAT:\n            case TYPESWITCH:\n            case UNION:\n            case UNORDERED:\n            case VALIDATE:\n            case VARIABLE:\n            case VERSION:\n            case WHERE:\n            case XQUERY:\n            case ALLOWING:\n            case CATCH:\n            case CONTEXT:\n            case COUNT:\n            case DECIMAL_FORMAT:\n            case DECIMAL_SEPARATOR:\n            case DIGIT:\n            case END:\n            case GROUP:\n            case GROUPING_SEPARATOR:\n            case INFINITY:\n            case MINUS_SIGN:\n            case NAMESPACE_NODE:\n            case NAN:\n            case NEXT:\n            case ONLY:\n            case PATTERN_SEPARATOR:\n            case PERCENT:\n            case PER_MILLE:\n            case PREVIOUS:\n            case SLIDING:\n            case START:\n            case SWITCH:\n            case TRY:\n            case TUMBLING:\n            case TYPE:\n            case WHEN:\n            case WINDOW:\n            case ZERO_DIGIT:\n            case AFTER:\n            case BEFORE:\n            case COPY:\n            case DELETE:\n            case FIRST:\n            case INSERT:\n            case INTO:\n            case POSITION:\n            case APPEND:\n            case LAST:\n            case MODIFY:\n            case NODES:\n            case RENAME:\n            case REPLACE:\n            case REVALIDATION:\n            case SKIP:\n            case VALUE:\n            case WITH:\n            case ALL:\n            case ANY:\n            case CONTAINS:\n            case CONTENT:\n            case DIACRITICS:\n            case DIFFERENT:\n            case DISTANCE:\n            case ENTIRE:\n            case EXACTLY:\n            case FROM:\n            case FT_OPTION:\n            case FTAND:\n            case FTNOT:\n            case FTOR:\n            case INSENSITIVE:\n            case LANGUAGE:\n            case LEVELS:\n            case LOWERCASE:\n            case MOST:\n            case NO:\n            case NOT:\n            case OCCURS:\n            case PARAGRAPH:\n            case PARAGRAPHS:\n            case PHRASE:\n            case RELATIONSHIP:\n            case SAME:\n            case SCORE:\n            case SENSITIVE:\n            case SENTENCE:\n            case SENTENCES:\n            case STEMMING:\n            case STOP:\n            case THESAURUS:\n            case TIMES:\n            case UPPERCASE:\n            case USING:\n            case WEIGHT:\n            case WILDCARDS:\n            case WITHOUT:\n            case WORD:\n            case WORDS:\n            case BREAK:\n            case CONTINUE:\n            case EXIT:\n            case LOOP:\n            case RETURNING:\n            case WHILE:\n            case CHECK:\n            case COLLECTION:\n            case CONSTRAINT:\n            case FOREACH:\n            case FOREIGN:\n            case INDEX:\n            case INTEGRITY:\n            case KEY:\n            case ON:\n            case UNIQUE:\n            case AMP_ER:\n            case APOS_ER:\n            case QUOT_ER:\n            case L_NCName:\n                alt131=2;\n                break;\n            case Q:\n                alt131=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 131, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt131) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1000:11: STAR ( COLON p_NCName )?\n                    root_0 = this.adaptor.nil();\n\n                    STAR309=this.match(this.input,STAR,XQueryParser.FOLLOW_STAR_in_p_Wildcard7383); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    STAR309_tree = this.adaptor.create(STAR309);\n                    this.adaptor.addChild(root_0, STAR309_tree);\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1000:16: ( COLON p_NCName )?\n                    var alt130=2;\n                    var LA130_0 = this.input.LA(1);\n\n                    if ( (LA130_0==COLON) ) {\n                        alt130=1;\n                    }\n                    switch (alt130) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1000:17: COLON p_NCName\n                            COLON310=this.match(this.input,COLON,XQueryParser.FOLLOW_COLON_in_p_Wildcard7386); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COLON310_tree = this.adaptor.create(COLON310);\n                            this.adaptor.addChild(root_0, COLON310_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_Wildcard7388);\n                            p_NCName311=this.p_NCName();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NCName311.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1001:11: p_NCName COLON STAR\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_Wildcard7402);\n                    p_NCName312=this.p_NCName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NCName312.getTree());\n                    COLON313=this.match(this.input,COLON,XQueryParser.FOLLOW_COLON_in_p_Wildcard7404); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COLON313_tree = this.adaptor.create(COLON313);\n                    this.adaptor.addChild(root_0, COLON313_tree);\n                    }\n                    STAR314=this.match(this.input,STAR,XQueryParser.FOLLOW_STAR_in_p_Wildcard7406); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    STAR314_tree = this.adaptor.create(STAR314);\n                    this.adaptor.addChild(root_0, STAR314_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1002:11: p_BracedURILiteral STAR\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_BracedURILiteral_in_p_Wildcard7418);\n                    p_BracedURILiteral315=this.p_BracedURILiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BracedURILiteral315.getTree());\n                    STAR316=this.match(this.input,STAR,XQueryParser.FOLLOW_STAR_in_p_Wildcard7420); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    STAR316_tree = this.adaptor.create(STAR316);\n                    this.adaptor.addChild(root_0, STAR316_tree);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n            this.setWsExplicit(false);\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PostfixExpr_return: (function() {\n        XQueryParser.p_PostfixExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PostfixExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1007:1: p_PostfixExpr : p_PrimaryExpr ( p_Predicate | p_ArgumentList )* ;\n    // $ANTLR start \"p_PostfixExpr\"\n    p_PostfixExpr: function() {\n        var retval = new XQueryParser.p_PostfixExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_PrimaryExpr317 = null;\n         var p_Predicate318 = null;\n         var p_ArgumentList319 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1008:9: ( p_PrimaryExpr ( p_Predicate | p_ArgumentList )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1008:11: p_PrimaryExpr ( p_Predicate | p_ArgumentList )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_PrimaryExpr_in_p_PostfixExpr7458);\n            p_PrimaryExpr317=this.p_PrimaryExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PrimaryExpr317.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1008:25: ( p_Predicate | p_ArgumentList )*\n            loop132:\n            do {\n                var alt132=3;\n                var LA132_0 = this.input.LA(1);\n\n                if ( (LA132_0==LSQUARE) ) {\n                    alt132=1;\n                }\n                else if ( (LA132_0==LPAREN) ) {\n                    alt132=2;\n                }\n\n\n                switch (alt132) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1008:26: p_Predicate\n                    this.pushFollow(XQueryParser.FOLLOW_p_Predicate_in_p_PostfixExpr7461);\n                    p_Predicate318=this.p_Predicate();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Predicate318.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1008:40: p_ArgumentList\n                    this.pushFollow(XQueryParser.FOLLOW_p_ArgumentList_in_p_PostfixExpr7465);\n                    p_ArgumentList319=this.p_ArgumentList();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ArgumentList319.getTree());\n\n\n                    break;\n\n                default :\n                    break loop132;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ArgumentList_return: (function() {\n        XQueryParser.p_ArgumentList_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ArgumentList_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1012:1: p_ArgumentList : LPAREN ( p_Argument ( COMMA p_Argument )* )? RPAREN ;\n    // $ANTLR start \"p_ArgumentList\"\n    p_ArgumentList: function() {\n        var retval = new XQueryParser.p_ArgumentList_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LPAREN320 = null;\n        var COMMA322 = null;\n        var RPAREN324 = null;\n         var p_Argument321 = null;\n         var p_Argument323 = null;\n\n        var LPAREN320_tree=null;\n        var COMMA322_tree=null;\n        var RPAREN324_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1013:9: ( LPAREN ( p_Argument ( COMMA p_Argument )* )? RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1013:11: LPAREN ( p_Argument ( COMMA p_Argument )* )? RPAREN\n            root_0 = this.adaptor.nil();\n\n            LPAREN320=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_ArgumentList7493); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN320_tree = this.adaptor.create(LPAREN320);\n            this.adaptor.addChild(root_0, LPAREN320_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1013:18: ( p_Argument ( COMMA p_Argument )* )?\n            var alt134=2;\n            var LA134_0 = this.input.LA(1);\n\n            if ( ((LA134_0>=ANCESTOR && LA134_0<=QUOT_ER)||LA134_0==LPAREN||(LA134_0>=DOLLAR && LA134_0<=L_UNION_BRACKET)||LA134_0==LBRACKET||LA134_0==LSQUARE||(LA134_0>=QUESTION && LA134_0<=SMALLER)||(LA134_0>=SLASH && LA134_0<=SLASH_SLASH)||(LA134_0>=DOT && LA134_0<=DOT_DOT)||(LA134_0>=ATTR_SIGN && LA134_0<=Q)||(LA134_0>=APOS && LA134_0<=QUOT)||LA134_0==L_NCName||(LA134_0>=L_Pragma && LA134_0<=L_DoubleLiteral)) ) {\n                alt134=1;\n            }\n            switch (alt134) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1013:19: p_Argument ( COMMA p_Argument )*\n                    this.pushFollow(XQueryParser.FOLLOW_p_Argument_in_p_ArgumentList7496);\n                    p_Argument321=this.p_Argument();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Argument321.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1013:30: ( COMMA p_Argument )*\n                    loop133:\n                    do {\n                        var alt133=2;\n                        var LA133_0 = this.input.LA(1);\n\n                        if ( (LA133_0==COMMA) ) {\n                            alt133=1;\n                        }\n\n\n                        switch (alt133) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1013:31: COMMA p_Argument\n                            COMMA322=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_ArgumentList7499); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COMMA322_tree = this.adaptor.create(COMMA322);\n                            this.adaptor.addChild(root_0, COMMA322_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_Argument_in_p_ArgumentList7501);\n                            p_Argument323=this.p_Argument();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Argument323.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop133;\n                        }\n                    } while (true);\n\n\n\n                    break;\n\n            }\n\n            RPAREN324=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_ArgumentList7507); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN324_tree = this.adaptor.create(RPAREN324);\n            this.adaptor.addChild(root_0, RPAREN324_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PredicateList_return: (function() {\n        XQueryParser.p_PredicateList_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PredicateList_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1017:1: p_PredicateList : ( p_Predicate )* ;\n    // $ANTLR start \"p_PredicateList\"\n    p_PredicateList: function() {\n        var retval = new XQueryParser.p_PredicateList_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Predicate325 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1018:9: ( ( p_Predicate )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1018:11: ( p_Predicate )*\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1018:11: ( p_Predicate )*\n            loop135:\n            do {\n                var alt135=2;\n                var LA135_0 = this.input.LA(1);\n\n                if ( (LA135_0==LSQUARE) ) {\n                    alt135=1;\n                }\n\n\n                switch (alt135) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1018:11: p_Predicate\n                    this.pushFollow(XQueryParser.FOLLOW_p_Predicate_in_p_PredicateList7533);\n                    p_Predicate325=this.p_Predicate();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Predicate325.getTree());\n\n\n                    break;\n\n                default :\n                    break loop135;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Predicate_return: (function() {\n        XQueryParser.p_Predicate_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Predicate_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1022:1: p_Predicate : LSQUARE p_Expr[true,true] RSQUARE ;\n    // $ANTLR start \"p_Predicate\"\n    p_Predicate: function() {\n        var retval = new XQueryParser.p_Predicate_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LSQUARE326 = null;\n        var RSQUARE328 = null;\n         var p_Expr327 = null;\n\n        var LSQUARE326_tree=null;\n        var RSQUARE328_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1023:9: ( LSQUARE p_Expr[true,true] RSQUARE )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1023:11: LSQUARE p_Expr[true,true] RSQUARE\n            root_0 = this.adaptor.nil();\n\n            LSQUARE326=this.match(this.input,LSQUARE,XQueryParser.FOLLOW_LSQUARE_in_p_Predicate7560); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LSQUARE326_tree = this.adaptor.create(LSQUARE326);\n            this.adaptor.addChild(root_0, LSQUARE326_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_Predicate7562);\n            p_Expr327=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr327.getTree());\n            RSQUARE328=this.match(this.input,RSQUARE,XQueryParser.FOLLOW_RSQUARE_in_p_Predicate7565); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RSQUARE328_tree = this.adaptor.create(RSQUARE328);\n            this.adaptor.addChild(root_0, RSQUARE328_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PrimaryExpr_return: (function() {\n        XQueryParser.p_PrimaryExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PrimaryExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1028:1: p_PrimaryExpr : ( ( LPAREN )=> p_ParenthesizedExpr | p_Literal | p_VarRef | p_ContextItemExpr | p_FunctionCall | p_OrderedExpr | p_UnorderedExpr | p_Constructor | p_BlockExpr | p_FunctionItemExpr | p_ArrayConstructor | p_SimpleObjectUnion );\n    // $ANTLR start \"p_PrimaryExpr\"\n    p_PrimaryExpr: function() {\n        var retval = new XQueryParser.p_PrimaryExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ParenthesizedExpr329 = null;\n         var p_Literal330 = null;\n         var p_VarRef331 = null;\n         var p_ContextItemExpr332 = null;\n         var p_FunctionCall333 = null;\n         var p_OrderedExpr334 = null;\n         var p_UnorderedExpr335 = null;\n         var p_Constructor336 = null;\n         var p_BlockExpr337 = null;\n         var p_FunctionItemExpr338 = null;\n         var p_ArrayConstructor339 = null;\n         var p_SimpleObjectUnion340 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1029:9: ( ( LPAREN )=> p_ParenthesizedExpr | p_Literal | p_VarRef | p_ContextItemExpr | p_FunctionCall | p_OrderedExpr | p_UnorderedExpr | p_Constructor | p_BlockExpr | p_FunctionItemExpr | p_ArrayConstructor | p_SimpleObjectUnion )\n            var alt136=12;\n            alt136 = this.dfa136.predict(this.input);\n            switch (alt136) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1029:11: ( LPAREN )=> p_ParenthesizedExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ParenthesizedExpr_in_p_PrimaryExpr7598);\n                    p_ParenthesizedExpr329=this.p_ParenthesizedExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ParenthesizedExpr329.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1030:11: p_Literal\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_Literal_in_p_PrimaryExpr7610);\n                    p_Literal330=this.p_Literal();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Literal330.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1031:11: p_VarRef\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarRef_in_p_PrimaryExpr7622);\n                    p_VarRef331=this.p_VarRef();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_VarRef331.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1032:11: p_ContextItemExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ContextItemExpr_in_p_PrimaryExpr7634);\n                    p_ContextItemExpr332=this.p_ContextItemExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ContextItemExpr332.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1033:11: p_FunctionCall\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FunctionCall_in_p_PrimaryExpr7646);\n                    p_FunctionCall333=this.p_FunctionCall();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FunctionCall333.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1034:11: p_OrderedExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_OrderedExpr_in_p_PrimaryExpr7659);\n                    p_OrderedExpr334=this.p_OrderedExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OrderedExpr334.getTree());\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1035:11: p_UnorderedExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_UnorderedExpr_in_p_PrimaryExpr7671);\n                    p_UnorderedExpr335=this.p_UnorderedExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_UnorderedExpr335.getTree());\n\n\n                    break;\n                case 8 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1036:11: p_Constructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_Constructor_in_p_PrimaryExpr7683);\n                    p_Constructor336=this.p_Constructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Constructor336.getTree());\n\n\n                    break;\n                case 9 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1037:11: p_BlockExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_BlockExpr_in_p_PrimaryExpr7696);\n                    p_BlockExpr337=this.p_BlockExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BlockExpr337.getTree());\n\n\n                    break;\n                case 10 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1038:11: p_FunctionItemExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FunctionItemExpr_in_p_PrimaryExpr7708);\n                    p_FunctionItemExpr338=this.p_FunctionItemExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FunctionItemExpr338.getTree());\n\n\n                    break;\n                case 11 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1039:11: p_ArrayConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ArrayConstructor_in_p_PrimaryExpr7721);\n                    p_ArrayConstructor339=this.p_ArrayConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ArrayConstructor339.getTree());\n\n\n                    break;\n                case 12 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1040:11: p_SimpleObjectUnion\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_SimpleObjectUnion_in_p_PrimaryExpr7733);\n                    p_SimpleObjectUnion340=this.p_SimpleObjectUnion();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SimpleObjectUnion340.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SimpleObjectUnion_return: (function() {\n        XQueryParser.p_SimpleObjectUnion_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SimpleObjectUnion_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1044:1: p_SimpleObjectUnion : L_UNION_BRACKET ( p_Expr[true, true] )? R_UNION_BRACKET ;\n    // $ANTLR start \"p_SimpleObjectUnion\"\n    p_SimpleObjectUnion: function() {\n        var retval = new XQueryParser.p_SimpleObjectUnion_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var L_UNION_BRACKET341 = null;\n        var R_UNION_BRACKET343 = null;\n         var p_Expr342 = null;\n\n        var L_UNION_BRACKET341_tree=null;\n        var R_UNION_BRACKET343_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1045:11: ( L_UNION_BRACKET ( p_Expr[true, true] )? R_UNION_BRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1045:13: L_UNION_BRACKET ( p_Expr[true, true] )? R_UNION_BRACKET\n            root_0 = this.adaptor.nil();\n\n            L_UNION_BRACKET341=this.match(this.input,L_UNION_BRACKET,XQueryParser.FOLLOW_L_UNION_BRACKET_in_p_SimpleObjectUnion7769); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            L_UNION_BRACKET341_tree = this.adaptor.create(L_UNION_BRACKET341);\n            this.adaptor.addChild(root_0, L_UNION_BRACKET341_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1045:29: ( p_Expr[true, true] )?\n            var alt137=2;\n            var LA137_0 = this.input.LA(1);\n\n            if ( ((LA137_0>=ANCESTOR && LA137_0<=QUOT_ER)||LA137_0==LPAREN||(LA137_0>=DOLLAR && LA137_0<=L_UNION_BRACKET)||LA137_0==LBRACKET||LA137_0==LSQUARE||(LA137_0>=STAR && LA137_0<=SMALLER)||(LA137_0>=SLASH && LA137_0<=SLASH_SLASH)||(LA137_0>=DOT && LA137_0<=DOT_DOT)||(LA137_0>=ATTR_SIGN && LA137_0<=Q)||(LA137_0>=APOS && LA137_0<=QUOT)||LA137_0==L_NCName||(LA137_0>=L_Pragma && LA137_0<=L_DoubleLiteral)) ) {\n                alt137=1;\n            }\n            switch (alt137) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1045:29: p_Expr[true, true]\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_SimpleObjectUnion7771);\n                    p_Expr342=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr342.getTree());\n\n\n                    break;\n\n            }\n\n            R_UNION_BRACKET343=this.match(this.input,R_UNION_BRACKET,XQueryParser.FOLLOW_R_UNION_BRACKET_in_p_SimpleObjectUnion7775); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            R_UNION_BRACKET343_tree = this.adaptor.create(R_UNION_BRACKET343);\n            this.adaptor.addChild(root_0, R_UNION_BRACKET343_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PairConstructor_return: (function() {\n        XQueryParser.p_PairConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PairConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1060:1: p_PairConstructor : COLON p_ExprSingle[true] ( COMMA p_Hybrid[true, false] )* ;\n    // $ANTLR start \"p_PairConstructor\"\n    p_PairConstructor: function() {\n        var retval = new XQueryParser.p_PairConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var COLON344 = null;\n        var COMMA346 = null;\n         var p_ExprSingle345 = null;\n         var p_Hybrid347 = null;\n\n        var COLON344_tree=null;\n        var COMMA346_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1061:11: ( COLON p_ExprSingle[true] ( COMMA p_Hybrid[true, false] )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1061:13: COLON p_ExprSingle[true] ( COMMA p_Hybrid[true, false] )*\n            root_0 = this.adaptor.nil();\n\n            COLON344=this.match(this.input,COLON,XQueryParser.FOLLOW_COLON_in_p_PairConstructor7817); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            COLON344_tree = this.adaptor.create(COLON344);\n            this.adaptor.addChild(root_0, COLON344_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_PairConstructor7819);\n            p_ExprSingle345=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle345.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1061:38: ( COMMA p_Hybrid[true, false] )*\n            loop138:\n            do {\n                var alt138=2;\n                var LA138_0 = this.input.LA(1);\n\n                if ( (LA138_0==COMMA) ) {\n                    alt138=1;\n                }\n\n\n                switch (alt138) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1061:39: COMMA p_Hybrid[true, false]\n                    COMMA346=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_PairConstructor7823); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA346_tree = this.adaptor.create(COMMA346);\n                    this.adaptor.addChild(root_0, COMMA346_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_PairConstructor7825);\n                    p_Hybrid347=this.p_Hybrid(true, false);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid347.getTree());\n\n\n                    break;\n\n                default :\n                    break loop138;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ArrayConstructor_return: (function() {\n        XQueryParser.p_ArrayConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ArrayConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1064:1: p_ArrayConstructor : LSQUARE ( p_Expr[true, true] )? RSQUARE ;\n    // $ANTLR start \"p_ArrayConstructor\"\n    p_ArrayConstructor: function() {\n        var retval = new XQueryParser.p_ArrayConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LSQUARE348 = null;\n        var RSQUARE350 = null;\n         var p_Expr349 = null;\n\n        var LSQUARE348_tree=null;\n        var RSQUARE350_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1065:9: ( LSQUARE ( p_Expr[true, true] )? RSQUARE )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1065:12: LSQUARE ( p_Expr[true, true] )? RSQUARE\n            root_0 = this.adaptor.nil();\n\n            LSQUARE348=this.match(this.input,LSQUARE,XQueryParser.FOLLOW_LSQUARE_in_p_ArrayConstructor7856); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LSQUARE348_tree = this.adaptor.create(LSQUARE348);\n            this.adaptor.addChild(root_0, LSQUARE348_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1065:20: ( p_Expr[true, true] )?\n            var alt139=2;\n            var LA139_0 = this.input.LA(1);\n\n            if ( ((LA139_0>=ANCESTOR && LA139_0<=QUOT_ER)||LA139_0==LPAREN||(LA139_0>=DOLLAR && LA139_0<=L_UNION_BRACKET)||LA139_0==LBRACKET||LA139_0==LSQUARE||(LA139_0>=STAR && LA139_0<=SMALLER)||(LA139_0>=SLASH && LA139_0<=SLASH_SLASH)||(LA139_0>=DOT && LA139_0<=DOT_DOT)||(LA139_0>=ATTR_SIGN && LA139_0<=Q)||(LA139_0>=APOS && LA139_0<=QUOT)||LA139_0==L_NCName||(LA139_0>=L_Pragma && LA139_0<=L_DoubleLiteral)) ) {\n                alt139=1;\n            }\n            switch (alt139) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1065:20: p_Expr[true, true]\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_ArrayConstructor7858);\n                    p_Expr349=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr349.getTree());\n\n\n                    break;\n\n            }\n\n            RSQUARE350=this.match(this.input,RSQUARE,XQueryParser.FOLLOW_RSQUARE_in_p_ArrayConstructor7862); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RSQUARE350_tree = this.adaptor.create(RSQUARE350);\n            this.adaptor.addChild(root_0, RSQUARE350_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Literal_return: (function() {\n        XQueryParser.p_Literal_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Literal_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1069:1: p_Literal : ( p_NumericLiteral | p_StringLiteral );\n    // $ANTLR start \"p_Literal\"\n    p_Literal: function() {\n        var retval = new XQueryParser.p_Literal_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_NumericLiteral351 = null;\n         var p_StringLiteral352 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1070:9: ( p_NumericLiteral | p_StringLiteral )\n            var alt140=2;\n            var LA140_0 = this.input.LA(1);\n\n            if ( ((LA140_0>=L_IntegerLiteral && LA140_0<=L_DoubleLiteral)) ) {\n                alt140=1;\n            }\n            else if ( ((LA140_0>=APOS && LA140_0<=QUOT)) ) {\n                alt140=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 140, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt140) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1070:11: p_NumericLiteral\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_NumericLiteral_in_p_Literal7888);\n                    p_NumericLiteral351=this.p_NumericLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NumericLiteral351.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1070:30: p_StringLiteral\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_Literal7892);\n                    p_StringLiteral352=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral352.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NumericLiteral_return: (function() {\n        XQueryParser.p_NumericLiteral_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NumericLiteral_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1074:1: p_NumericLiteral : (d+= L_IntegerLiteral | d+= L_DecimalLiteral | d+= L_DoubleLiteral );\n    // $ANTLR start \"p_NumericLiteral\"\n    p_NumericLiteral: function() {\n        var retval = new XQueryParser.p_NumericLiteral_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n        var list_d=null;\n\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1075:9: (d+= L_IntegerLiteral | d+= L_DecimalLiteral | d+= L_DoubleLiteral )\n            var alt141=3;\n            switch ( this.input.LA(1) ) {\n            case L_IntegerLiteral:\n                alt141=1;\n                break;\n            case L_DecimalLiteral:\n                alt141=2;\n                break;\n            case L_DoubleLiteral:\n                alt141=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 141, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt141) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1075:11: d+= L_IntegerLiteral\n                    root_0 = this.adaptor.nil();\n\n                    d=this.match(this.input,L_IntegerLiteral,XQueryParser.FOLLOW_L_IntegerLiteral_in_p_NumericLiteral7920); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_d)) list_d = [];\n                    list_d.push(d);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ad(list_d);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1075:48: d+= L_DecimalLiteral\n                    root_0 = this.adaptor.nil();\n\n                    d=this.match(this.input,L_DecimalLiteral,XQueryParser.FOLLOW_L_DecimalLiteral_in_p_NumericLiteral7928); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_d)) list_d = [];\n                    list_d.push(d);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ad(list_d);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1075:85: d+= L_DoubleLiteral\n                    root_0 = this.adaptor.nil();\n\n                    d=this.match(this.input,L_DoubleLiteral,XQueryParser.FOLLOW_L_DoubleLiteral_in_p_NumericLiteral7936); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_d)) list_d = [];\n                    list_d.push(d);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ad(list_d);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_VarRef_return: (function() {\n        XQueryParser.p_VarRef_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_VarRef_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1079:1: p_VarRef : d= DOLLAR v= p_VarName ;\n    // $ANTLR start \"p_VarRef\"\n    p_VarRef: function() {\n        var retval = new XQueryParser.p_VarRef_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n         var v = null;\n\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1080:9: (d= DOLLAR v= p_VarName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1080:11: d= DOLLAR v= p_VarName\n            root_0 = this.adaptor.nil();\n\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_VarRef7974); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_VarRef7978);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_VarName_return: (function() {\n        XQueryParser.p_VarName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_VarName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1084:1: p_VarName : p_EQName ;\n    // $ANTLR start \"p_VarName\"\n    p_VarName: function() {\n        var retval = new XQueryParser.p_VarName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName353 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1085:9: ( p_EQName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1085:11: p_EQName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_VarName8006);\n            p_EQName353=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName353.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ParenthesizedExpr_return: (function() {\n        XQueryParser.p_ParenthesizedExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ParenthesizedExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1089:1: p_ParenthesizedExpr : LPAREN ( p_Expr[true,true] )? RPAREN ;\n    // $ANTLR start \"p_ParenthesizedExpr\"\n    p_ParenthesizedExpr: function() {\n        var retval = new XQueryParser.p_ParenthesizedExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LPAREN354 = null;\n        var RPAREN356 = null;\n         var p_Expr355 = null;\n\n        var LPAREN354_tree=null;\n        var RPAREN356_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1090:9: ( LPAREN ( p_Expr[true,true] )? RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1090:11: LPAREN ( p_Expr[true,true] )? RPAREN\n            root_0 = this.adaptor.nil();\n\n            LPAREN354=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_ParenthesizedExpr8032); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN354_tree = this.adaptor.create(LPAREN354);\n            this.adaptor.addChild(root_0, LPAREN354_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1090:18: ( p_Expr[true,true] )?\n            var alt142=2;\n            var LA142_0 = this.input.LA(1);\n\n            if ( ((LA142_0>=ANCESTOR && LA142_0<=QUOT_ER)||LA142_0==LPAREN||(LA142_0>=DOLLAR && LA142_0<=L_UNION_BRACKET)||LA142_0==LBRACKET||LA142_0==LSQUARE||(LA142_0>=STAR && LA142_0<=SMALLER)||(LA142_0>=SLASH && LA142_0<=SLASH_SLASH)||(LA142_0>=DOT && LA142_0<=DOT_DOT)||(LA142_0>=ATTR_SIGN && LA142_0<=Q)||(LA142_0>=APOS && LA142_0<=QUOT)||LA142_0==L_NCName||(LA142_0>=L_Pragma && LA142_0<=L_DoubleLiteral)) ) {\n                alt142=1;\n            }\n            switch (alt142) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1090:18: p_Expr[true,true]\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_ParenthesizedExpr8034);\n                    p_Expr355=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr355.getTree());\n\n\n                    break;\n\n            }\n\n            RPAREN356=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_ParenthesizedExpr8038); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN356_tree = this.adaptor.create(RPAREN356);\n            this.adaptor.addChild(root_0, RPAREN356_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ContextItemExpr_return: (function() {\n        XQueryParser.p_ContextItemExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ContextItemExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1094:1: p_ContextItemExpr : DOT ;\n    // $ANTLR start \"p_ContextItemExpr\"\n    p_ContextItemExpr: function() {\n        var retval = new XQueryParser.p_ContextItemExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var DOT357 = null;\n\n        var DOT357_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1095:9: ( DOT )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1095:11: DOT\n            root_0 = this.adaptor.nil();\n\n            DOT357=this.match(this.input,DOT,XQueryParser.FOLLOW_DOT_in_p_ContextItemExpr8064); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            DOT357_tree = this.adaptor.create(DOT357);\n            this.adaptor.addChild(root_0, DOT357_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_OrderedExpr_return: (function() {\n        XQueryParser.p_OrderedExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_OrderedExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1099:1: p_OrderedExpr : k= ORDERED LBRACKET p_Expr[true,true] RBRACKET ;\n    // $ANTLR start \"p_OrderedExpr\"\n    p_OrderedExpr: function() {\n        var retval = new XQueryParser.p_OrderedExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET358 = null;\n        var RBRACKET360 = null;\n         var p_Expr359 = null;\n\n        var k_tree=null;\n        var LBRACKET358_tree=null;\n        var RBRACKET360_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1100:9: (k= ORDERED LBRACKET p_Expr[true,true] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1100:11: k= ORDERED LBRACKET p_Expr[true,true] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,ORDERED,XQueryParser.FOLLOW_ORDERED_in_p_OrderedExpr8092); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LBRACKET358=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_OrderedExpr8096); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET358_tree = this.adaptor.create(LBRACKET358);\n            this.adaptor.addChild(root_0, LBRACKET358_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_OrderedExpr8098);\n            p_Expr359=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr359.getTree());\n            RBRACKET360=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_OrderedExpr8101); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET360_tree = this.adaptor.create(RBRACKET360);\n            this.adaptor.addChild(root_0, RBRACKET360_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_UnorderedExpr_return: (function() {\n        XQueryParser.p_UnorderedExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_UnorderedExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1104:1: p_UnorderedExpr : k= UNORDERED LBRACKET p_Expr[true,true] RBRACKET ;\n    // $ANTLR start \"p_UnorderedExpr\"\n    p_UnorderedExpr: function() {\n        var retval = new XQueryParser.p_UnorderedExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET361 = null;\n        var RBRACKET363 = null;\n         var p_Expr362 = null;\n\n        var k_tree=null;\n        var LBRACKET361_tree=null;\n        var RBRACKET363_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1105:9: (k= UNORDERED LBRACKET p_Expr[true,true] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1105:11: k= UNORDERED LBRACKET p_Expr[true,true] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,UNORDERED,XQueryParser.FOLLOW_UNORDERED_in_p_UnorderedExpr8129); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LBRACKET361=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_UnorderedExpr8133); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET361_tree = this.adaptor.create(LBRACKET361);\n            this.adaptor.addChild(root_0, LBRACKET361_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_UnorderedExpr8135);\n            p_Expr362=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr362.getTree());\n            RBRACKET363=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_UnorderedExpr8138); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET363_tree = this.adaptor.create(RBRACKET363);\n            this.adaptor.addChild(root_0, RBRACKET363_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FunctionCall_return: (function() {\n        XQueryParser.p_FunctionCall_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FunctionCall_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1110:1: p_FunctionCall : f= pg_FQName p_ArgumentList ;\n    // $ANTLR start \"p_FunctionCall\"\n    p_FunctionCall: function() {\n        var retval = new XQueryParser.p_FunctionCall_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var f = null;\n         var p_ArgumentList364 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1111:9: (f= pg_FQName p_ArgumentList )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1111:11: f= pg_FQName p_ArgumentList\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_pg_FQName_in_p_FunctionCall8167);\n            f=this.pg_FQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, f.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.af((f?f.start:null), (f?f.stop:null));\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ArgumentList_in_p_FunctionCall8172);\n            p_ArgumentList364=this.p_ArgumentList();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ArgumentList364.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Argument_return: (function() {\n        XQueryParser.p_Argument_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Argument_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1115:1: p_Argument : ( p_ExprSingle[true] | p_ArgumentPlaceholder );\n    // $ANTLR start \"p_Argument\"\n    p_Argument: function() {\n        var retval = new XQueryParser.p_Argument_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle365 = null;\n         var p_ArgumentPlaceholder366 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1116:9: ( p_ExprSingle[true] | p_ArgumentPlaceholder )\n            var alt143=2;\n            var LA143_0 = this.input.LA(1);\n\n            if ( ((LA143_0>=ANCESTOR && LA143_0<=QUOT_ER)||LA143_0==LPAREN||(LA143_0>=DOLLAR && LA143_0<=L_UNION_BRACKET)||LA143_0==LBRACKET||LA143_0==LSQUARE||(LA143_0>=STAR && LA143_0<=SMALLER)||(LA143_0>=SLASH && LA143_0<=SLASH_SLASH)||(LA143_0>=DOT && LA143_0<=DOT_DOT)||(LA143_0>=ATTR_SIGN && LA143_0<=Q)||(LA143_0>=APOS && LA143_0<=QUOT)||LA143_0==L_NCName||(LA143_0>=L_Pragma && LA143_0<=L_DoubleLiteral)) ) {\n                alt143=1;\n            }\n            else if ( (LA143_0==QUESTION) ) {\n                alt143=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 143, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt143) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1116:11: p_ExprSingle[true]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_Argument8198);\n                    p_ExprSingle365=this.p_ExprSingle(true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle365.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1116:32: p_ArgumentPlaceholder\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ArgumentPlaceholder_in_p_Argument8203);\n                    p_ArgumentPlaceholder366=this.p_ArgumentPlaceholder();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ArgumentPlaceholder366.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ArgumentPlaceholder_return: (function() {\n        XQueryParser.p_ArgumentPlaceholder_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ArgumentPlaceholder_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1120:1: p_ArgumentPlaceholder : QUESTION ;\n    // $ANTLR start \"p_ArgumentPlaceholder\"\n    p_ArgumentPlaceholder: function() {\n        var retval = new XQueryParser.p_ArgumentPlaceholder_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var QUESTION367 = null;\n\n        var QUESTION367_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1121:9: ( QUESTION )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1121:11: QUESTION\n            root_0 = this.adaptor.nil();\n\n            QUESTION367=this.match(this.input,QUESTION,XQueryParser.FOLLOW_QUESTION_in_p_ArgumentPlaceholder8229); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            QUESTION367_tree = this.adaptor.create(QUESTION367);\n            this.adaptor.addChild(root_0, QUESTION367_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Constructor_return: (function() {\n        XQueryParser.p_Constructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Constructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1125:1: p_Constructor : ( p_DirectConstructor | p_ComputedConstructor );\n    // $ANTLR start \"p_Constructor\"\n    p_Constructor: function() {\n        var retval = new XQueryParser.p_Constructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_DirectConstructor368 = null;\n         var p_ComputedConstructor369 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1126:9: ( p_DirectConstructor | p_ComputedConstructor )\n            var alt144=2;\n            var LA144_0 = this.input.LA(1);\n\n            if ( (LA144_0==SMALLER||(LA144_0>=L_DirCommentConstructor && LA144_0<=L_DirPIConstructor)) ) {\n                alt144=1;\n            }\n            else if ( (LA144_0==ATTRIBUTE||LA144_0==COMMENT||LA144_0==DOCUMENT||LA144_0==ELEMENT||LA144_0==NAMESPACE||LA144_0==PROCESSING_INSTRUCTION||LA144_0==TEXT) ) {\n                alt144=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 144, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt144) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1126:11: p_DirectConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_DirectConstructor_in_p_Constructor8255);\n                    p_DirectConstructor368=this.p_DirectConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DirectConstructor368.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1127:11: p_ComputedConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ComputedConstructor_in_p_Constructor8267);\n                    p_ComputedConstructor369=this.p_ComputedConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ComputedConstructor369.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DirectConstructor_return: (function() {\n        XQueryParser.p_DirectConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DirectConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1131:1: p_DirectConstructor : ( p_DirElemConstructor | p_DirCommentConstructor | p_DirPIConstructor );\n    // $ANTLR start \"p_DirectConstructor\"\n    p_DirectConstructor: function() {\n        var retval = new XQueryParser.p_DirectConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_DirElemConstructor370 = null;\n         var p_DirCommentConstructor371 = null;\n         var p_DirPIConstructor372 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1132:9: ( p_DirElemConstructor | p_DirCommentConstructor | p_DirPIConstructor )\n            var alt145=3;\n            switch ( this.input.LA(1) ) {\n            case SMALLER:\n                alt145=1;\n                break;\n            case L_DirCommentConstructor:\n                alt145=2;\n                break;\n            case L_DirPIConstructor:\n                alt145=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 145, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt145) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1132:11: p_DirElemConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_DirElemConstructor_in_p_DirectConstructor8293);\n                    p_DirElemConstructor370=this.p_DirElemConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DirElemConstructor370.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1133:11: p_DirCommentConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_DirCommentConstructor_in_p_DirectConstructor8305);\n                    p_DirCommentConstructor371=this.p_DirCommentConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DirCommentConstructor371.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1134:11: p_DirPIConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_DirPIConstructor_in_p_DirectConstructor8317);\n                    p_DirPIConstructor372=this.p_DirPIConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DirPIConstructor372.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DirElemConstructor_return: (function() {\n        XQueryParser.p_DirElemConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DirElemConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1138:1: p_DirElemConstructor : SMALLER ts= p_QName p_DirAttributeList ( EMPTY_CLOSE_TAG | ( GREATER ( pm_DirElemContent )* CLOSE_TAG te= p_QName ( S )? GREATER ) ) -> ^( DirElemConstructor ^( DirAttributeList ( p_DirAttributeList )* ) ^( DirElemContent ( pm_DirElemContent )* ) ) ;\n    // $ANTLR start \"p_DirElemConstructor\"\n    p_DirElemConstructor: function() {\n        var retval = new XQueryParser.p_DirElemConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SMALLER373 = null;\n        var EMPTY_CLOSE_TAG375 = null;\n        var GREATER376 = null;\n        var CLOSE_TAG378 = null;\n        var S379 = null;\n        var GREATER380 = null;\n         var ts = null;\n         var te = null;\n         var p_DirAttributeList374 = null;\n         var pm_DirElemContent377 = null;\n\n        var SMALLER373_tree=null;\n        var EMPTY_CLOSE_TAG375_tree=null;\n        var GREATER376_tree=null;\n        var CLOSE_TAG378_tree=null;\n        var S379_tree=null;\n        var GREATER380_tree=null;\n        var stream_CLOSE_TAG=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token CLOSE_TAG\");\n        var stream_GREATER=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token GREATER\");\n        var stream_S=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token S\");\n        var stream_EMPTY_CLOSE_TAG=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EMPTY_CLOSE_TAG\");\n        var stream_SMALLER=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token SMALLER\");\n        var stream_p_DirAttributeList=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_DirAttributeList\");\n        var stream_pm_DirElemContent=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pm_DirElemContent\");\n        var stream_p_QName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_QName\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1139:9: ( SMALLER ts= p_QName p_DirAttributeList ( EMPTY_CLOSE_TAG | ( GREATER ( pm_DirElemContent )* CLOSE_TAG te= p_QName ( S )? GREATER ) ) -> ^( DirElemConstructor ^( DirAttributeList ( p_DirAttributeList )* ) ^( DirElemContent ( pm_DirElemContent )* ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1139:11: SMALLER ts= p_QName p_DirAttributeList ( EMPTY_CLOSE_TAG | ( GREATER ( pm_DirElemContent )* CLOSE_TAG te= p_QName ( S )? GREATER ) )\n            SMALLER373=this.match(this.input,SMALLER,XQueryParser.FOLLOW_SMALLER_in_p_DirElemConstructor8344); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_SMALLER.add(SMALLER373);\n\n            if ( this.state.backtracking===0 ) {\n              this.pushXMLLexer();\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_DirElemConstructor8360);\n            ts=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_QName.add(ts.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.at((ts?ts.start:null), (ts?ts.stop:null));\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_DirAttributeList_in_p_DirElemConstructor8365);\n            p_DirAttributeList374=this.p_DirAttributeList();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_DirAttributeList.add(p_DirAttributeList374.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:11: ( EMPTY_CLOSE_TAG | ( GREATER ( pm_DirElemContent )* CLOSE_TAG te= p_QName ( S )? GREATER ) )\n            var alt148=2;\n            var LA148_0 = this.input.LA(1);\n\n            if ( (LA148_0==EMPTY_CLOSE_TAG) ) {\n                alt148=1;\n            }\n            else if ( (LA148_0==GREATER) ) {\n                alt148=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 148, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt148) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:12: EMPTY_CLOSE_TAG\n                    EMPTY_CLOSE_TAG375=this.match(this.input,EMPTY_CLOSE_TAG,XQueryParser.FOLLOW_EMPTY_CLOSE_TAG_in_p_DirElemConstructor8379); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_EMPTY_CLOSE_TAG.add(EMPTY_CLOSE_TAG375);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:30: ( GREATER ( pm_DirElemContent )* CLOSE_TAG te= p_QName ( S )? GREATER )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:30: ( GREATER ( pm_DirElemContent )* CLOSE_TAG te= p_QName ( S )? GREATER )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:31: GREATER ( pm_DirElemContent )* CLOSE_TAG te= p_QName ( S )? GREATER\n                    GREATER376=this.match(this.input,GREATER,XQueryParser.FOLLOW_GREATER_in_p_DirElemConstructor8384); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_GREATER.add(GREATER376);\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:39: ( pm_DirElemContent )*\n                    loop146:\n                    do {\n                        var alt146=2;\n                        var LA146_0 = this.input.LA(1);\n\n                        if ( ((LA146_0>=L_ElementContentChar && LA146_0<=ESCAPE_RBRACKET)||LA146_0==LBRACKET||LA146_0==SMALLER||(LA146_0>=L_DirCommentConstructor && LA146_0<=L_DirPIConstructor)) ) {\n                            alt146=1;\n                        }\n\n\n                        switch (alt146) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:39: pm_DirElemContent\n                            this.pushFollow(XQueryParser.FOLLOW_pm_DirElemContent_in_p_DirElemConstructor8386);\n                            pm_DirElemContent377=this.pm_DirElemContent();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_pm_DirElemContent.add(pm_DirElemContent377.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop146;\n                        }\n                    } while (true);\n\n                    CLOSE_TAG378=this.match(this.input,CLOSE_TAG,XQueryParser.FOLLOW_CLOSE_TAG_in_p_DirElemConstructor8389); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_CLOSE_TAG.add(CLOSE_TAG378);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_DirElemConstructor8393);\n                    te=this.p_QName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_QName.add(te.getTree());\n                    if ( this.state.backtracking===0 ) {\n                      this.at((te?te.start:null), (te?te.stop:null));\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:111: ( S )?\n                    var alt147=2;\n                    var LA147_0 = this.input.LA(1);\n\n                    if ( (LA147_0==S) ) {\n                        alt147=1;\n                    }\n                    switch (alt147) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1141:111: S\n                            S379=this.match(this.input,S,XQueryParser.FOLLOW_S_in_p_DirElemConstructor8397); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_S.add(S379);\n\n\n\n                            break;\n\n                    }\n\n                    GREATER380=this.match(this.input,GREATER,XQueryParser.FOLLOW_GREATER_in_p_DirElemConstructor8400); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_GREATER.add(GREATER380);\n\n\n\n\n\n\n                    break;\n\n            }\n\n\n\n            // AST REWRITE\n            // elements: pm_DirElemContent, p_DirAttributeList\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 1142:17: -> ^( DirElemConstructor ^( DirAttributeList ( p_DirAttributeList )* ) ^( DirElemContent ( pm_DirElemContent )* ) )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1142:20: ^( DirElemConstructor ^( DirAttributeList ( p_DirAttributeList )* ) ^( DirElemContent ( pm_DirElemContent )* ) )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(DirElemConstructor, \"DirElemConstructor\"), root_1);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1142:41: ^( DirAttributeList ( p_DirAttributeList )* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(DirAttributeList, \"DirAttributeList\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1142:60: ( p_DirAttributeList )*\n                while ( stream_p_DirAttributeList.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_p_DirAttributeList.nextTree());\n\n                }\n                stream_p_DirAttributeList.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1142:81: ^( DirElemContent ( pm_DirElemContent )* )\n                {\n                var root_2 = this.adaptor.nil();\n                root_2 = this.adaptor.becomeRoot(this.adaptor.create(DirElemContent, \"DirElemContent\"), root_2);\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1142:98: ( pm_DirElemContent )*\n                while ( stream_pm_DirElemContent.hasNext() ) {\n                    this.adaptor.addChild(root_2, stream_pm_DirElemContent.nextTree());\n\n                }\n                stream_pm_DirElemContent.reset();\n\n                this.adaptor.addChild(root_1, root_2);\n                }\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n            this.popLexer(); \n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DirAttributeList_return: (function() {\n        XQueryParser.p_DirAttributeList_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DirAttributeList_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1147:1: p_DirAttributeList : ( S (t= p_QName ( S )? EQUAL ( S )? v= p_DirAttributeValue )? )* ;\n    // $ANTLR start \"p_DirAttributeList\"\n    p_DirAttributeList: function() {\n        var retval = new XQueryParser.p_DirAttributeList_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var S381 = null;\n        var S382 = null;\n        var EQUAL383 = null;\n        var S384 = null;\n         var t = null;\n         var v = null;\n\n        var S381_tree=null;\n        var S382_tree=null;\n        var EQUAL383_tree=null;\n        var S384_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:9: ( ( S (t= p_QName ( S )? EQUAL ( S )? v= p_DirAttributeValue )? )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:11: ( S (t= p_QName ( S )? EQUAL ( S )? v= p_DirAttributeValue )? )*\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:11: ( S (t= p_QName ( S )? EQUAL ( S )? v= p_DirAttributeValue )? )*\n            loop152:\n            do {\n                var alt152=2;\n                var LA152_0 = this.input.LA(1);\n\n                if ( (LA152_0==S) ) {\n                    alt152=1;\n                }\n\n\n                switch (alt152) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:12: S (t= p_QName ( S )? EQUAL ( S )? v= p_DirAttributeValue )?\n                    S381=this.match(this.input,S,XQueryParser.FOLLOW_S_in_p_DirAttributeList8477); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    S381_tree = this.adaptor.create(S381);\n                    this.adaptor.addChild(root_0, S381_tree);\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:14: (t= p_QName ( S )? EQUAL ( S )? v= p_DirAttributeValue )?\n                    var alt151=2;\n                    var LA151_0 = this.input.LA(1);\n\n                    if ( ((LA151_0>=ANCESTOR && LA151_0<=SKIP)||(LA151_0>=VALUE && LA151_0<=QUOT_ER)||LA151_0==L_NCName) ) {\n                        alt151=1;\n                    }\n                    switch (alt151) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:15: t= p_QName ( S )? EQUAL ( S )? v= p_DirAttributeValue\n                            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_DirAttributeList8482);\n                            t=this.p_QName();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, t.getTree());\n                            if ( this.state.backtracking===0 ) {\n                              this.at((t?t.start:null), (t?t.stop:null));\n                            }\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:55: ( S )?\n                            var alt149=2;\n                            var LA149_0 = this.input.LA(1);\n\n                            if ( (LA149_0==S) ) {\n                                alt149=1;\n                            }\n                            switch (alt149) {\n                                case 1 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:55: S\n                                    S382=this.match(this.input,S,XQueryParser.FOLLOW_S_in_p_DirAttributeList8486); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    S382_tree = this.adaptor.create(S382);\n                                    this.adaptor.addChild(root_0, S382_tree);\n                                    }\n\n\n                                    break;\n\n                            }\n\n                            EQUAL383=this.match(this.input,EQUAL,XQueryParser.FOLLOW_EQUAL_in_p_DirAttributeList8489); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            EQUAL383_tree = this.adaptor.create(EQUAL383);\n                            this.adaptor.addChild(root_0, EQUAL383_tree);\n                            }\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:64: ( S )?\n                            var alt150=2;\n                            var LA150_0 = this.input.LA(1);\n\n                            if ( (LA150_0==S) ) {\n                                alt150=1;\n                            }\n                            switch (alt150) {\n                                case 1 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1148:64: S\n                                    S384=this.match(this.input,S,XQueryParser.FOLLOW_S_in_p_DirAttributeList8491); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    S384_tree = this.adaptor.create(S384);\n                                    this.adaptor.addChild(root_0, S384_tree);\n                                    }\n\n\n                                    break;\n\n                            }\n\n                            this.pushFollow(XQueryParser.FOLLOW_p_DirAttributeValue_in_p_DirAttributeList8496);\n                            v=this.p_DirAttributeValue();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n\n                default :\n                    break loop152;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DirAttributeValue_return: (function() {\n        XQueryParser.p_DirAttributeValue_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DirAttributeValue_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1152:1: p_DirAttributeValue : ( (s+= QUOT (s+= ESCAPE_QUOT | s+= APOS | p_QuotAttrValueContent )* s+= QUOT ) -> ^( DirAttributeValue ( p_QuotAttrValueContent )* ) | (s+= APOS (s+= ESCAPE_APOS | s+= QUOT | p_AposAttrValueContent )* s+= APOS ) -> ^( DirAttributeValue ( p_AposAttrValueContent )* ) );\n    // $ANTLR start \"p_DirAttributeValue\"\n    p_DirAttributeValue: function() {\n        var retval = new XQueryParser.p_DirAttributeValue_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var s = null;\n        var list_s=null;\n         var p_QuotAttrValueContent385 = null;\n         var p_AposAttrValueContent386 = null;\n\n        var s_tree=null;\n        var stream_ESCAPE_QUOT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token ESCAPE_QUOT\");\n        var stream_APOS=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token APOS\");\n        var stream_ESCAPE_APOS=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token ESCAPE_APOS\");\n        var stream_QUOT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token QUOT\");\n        var stream_p_QuotAttrValueContent=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_QuotAttrValueContent\");\n        var stream_p_AposAttrValueContent=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_AposAttrValueContent\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:9: ( (s+= QUOT (s+= ESCAPE_QUOT | s+= APOS | p_QuotAttrValueContent )* s+= QUOT ) -> ^( DirAttributeValue ( p_QuotAttrValueContent )* ) | (s+= APOS (s+= ESCAPE_APOS | s+= QUOT | p_AposAttrValueContent )* s+= APOS ) -> ^( DirAttributeValue ( p_AposAttrValueContent )* ) )\n            var alt155=2;\n            var LA155_0 = this.input.LA(1);\n\n            if ( (LA155_0==QUOT) ) {\n                alt155=1;\n            }\n            else if ( (LA155_0==APOS) ) {\n                alt155=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 155, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt155) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:11: (s+= QUOT (s+= ESCAPE_QUOT | s+= APOS | p_QuotAttrValueContent )* s+= QUOT )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:11: (s+= QUOT (s+= ESCAPE_QUOT | s+= APOS | p_QuotAttrValueContent )* s+= QUOT )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:12: s+= QUOT (s+= ESCAPE_QUOT | s+= APOS | p_QuotAttrValueContent )* s+= QUOT\n                    s=this.match(this.input,QUOT,XQueryParser.FOLLOW_QUOT_in_p_DirAttributeValue8530); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_QUOT.add(s);\n\n                    if (org.antlr.lang.isNull(list_s)) list_s = [];\n                    list_s.push(s);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.isInAttr = true; \n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:45: (s+= ESCAPE_QUOT | s+= APOS | p_QuotAttrValueContent )*\n                    loop153:\n                    do {\n                        var alt153=4;\n                        switch ( this.input.LA(1) ) {\n                        case ESCAPE_QUOT:\n                            alt153=1;\n                            break;\n                        case APOS:\n                            alt153=2;\n                            break;\n                        case L_QuotAttrContentChar:\n                        case L_PredefinedEntityRef:\n                        case L_CharRef:\n                        case ESCAPE_LBRACKET:\n                        case ESCAPE_RBRACKET:\n                        case LBRACKET:\n                            alt153=3;\n                            break;\n\n                        }\n\n                        switch (alt153) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:46: s+= ESCAPE_QUOT\n                            s=this.match(this.input,ESCAPE_QUOT,XQueryParser.FOLLOW_ESCAPE_QUOT_in_p_DirAttributeValue8537); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_ESCAPE_QUOT.add(s);\n\n                            if (org.antlr.lang.isNull(list_s)) list_s = [];\n                            list_s.push(s);\n\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:63: s+= APOS\n                            s=this.match(this.input,APOS,XQueryParser.FOLLOW_APOS_in_p_DirAttributeValue8543); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_APOS.add(s);\n\n                            if (org.antlr.lang.isNull(list_s)) list_s = [];\n                            list_s.push(s);\n\n\n\n                            break;\n                        case 3 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1153:73: p_QuotAttrValueContent\n                            this.pushFollow(XQueryParser.FOLLOW_p_QuotAttrValueContent_in_p_DirAttributeValue8547);\n                            p_QuotAttrValueContent385=this.p_QuotAttrValueContent();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_QuotAttrValueContent.add(p_QuotAttrValueContent385.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop153;\n                        }\n                    } while (true);\n\n                    s=this.match(this.input,QUOT,XQueryParser.FOLLOW_QUOT_in_p_DirAttributeValue8553); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_QUOT.add(s);\n\n                    if (org.antlr.lang.isNull(list_s)) list_s = [];\n                    list_s.push(s);\n\n                    if ( this.state.backtracking===0 ) {\n                       this.isInAttr = false; \n                    }\n\n\n\n                    if ( this.state.backtracking===0 ) {\n                       this.addToken(list_s, \"string\"); \n                    }\n\n\n                    // AST REWRITE\n                    // elements: p_QuotAttrValueContent\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1154:17: -> ^( DirAttributeValue ( p_QuotAttrValueContent )* )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1154:20: ^( DirAttributeValue ( p_QuotAttrValueContent )* )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(DirAttributeValue, \"DirAttributeValue\"), root_1);\n\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1154:40: ( p_QuotAttrValueContent )*\n                        while ( stream_p_QuotAttrValueContent.hasNext() ) {\n                            this.adaptor.addChild(root_1, stream_p_QuotAttrValueContent.nextTree());\n\n                        }\n                        stream_p_QuotAttrValueContent.reset();\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1155:11: (s+= APOS (s+= ESCAPE_APOS | s+= QUOT | p_AposAttrValueContent )* s+= APOS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1155:11: (s+= APOS (s+= ESCAPE_APOS | s+= QUOT | p_AposAttrValueContent )* s+= APOS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1155:12: s+= APOS (s+= ESCAPE_APOS | s+= QUOT | p_AposAttrValueContent )* s+= APOS\n                    s=this.match(this.input,APOS,XQueryParser.FOLLOW_APOS_in_p_DirAttributeValue8598); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_APOS.add(s);\n\n                    if (org.antlr.lang.isNull(list_s)) list_s = [];\n                    list_s.push(s);\n\n                    if ( this.state.backtracking===0 ) {\n                       this.isInAttr = true; \n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1155:46: (s+= ESCAPE_APOS | s+= QUOT | p_AposAttrValueContent )*\n                    loop154:\n                    do {\n                        var alt154=4;\n                        switch ( this.input.LA(1) ) {\n                        case ESCAPE_APOS:\n                            alt154=1;\n                            break;\n                        case QUOT:\n                            alt154=2;\n                            break;\n                        case L_AposAttrContentChar:\n                        case L_PredefinedEntityRef:\n                        case L_CharRef:\n                        case ESCAPE_LBRACKET:\n                        case ESCAPE_RBRACKET:\n                        case LBRACKET:\n                            alt154=3;\n                            break;\n\n                        }\n\n                        switch (alt154) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1155:47: s+= ESCAPE_APOS\n                            s=this.match(this.input,ESCAPE_APOS,XQueryParser.FOLLOW_ESCAPE_APOS_in_p_DirAttributeValue8605); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_ESCAPE_APOS.add(s);\n\n                            if (org.antlr.lang.isNull(list_s)) list_s = [];\n                            list_s.push(s);\n\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1155:64: s+= QUOT\n                            s=this.match(this.input,QUOT,XQueryParser.FOLLOW_QUOT_in_p_DirAttributeValue8611); if (this.state.failed) return retval; \n                            if ( this.state.backtracking===0 ) stream_QUOT.add(s);\n\n                            if (org.antlr.lang.isNull(list_s)) list_s = [];\n                            list_s.push(s);\n\n\n\n                            break;\n                        case 3 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1155:74: p_AposAttrValueContent\n                            this.pushFollow(XQueryParser.FOLLOW_p_AposAttrValueContent_in_p_DirAttributeValue8615);\n                            p_AposAttrValueContent386=this.p_AposAttrValueContent();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_AposAttrValueContent.add(p_AposAttrValueContent386.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop154;\n                        }\n                    } while (true);\n\n                    s=this.match(this.input,APOS,XQueryParser.FOLLOW_APOS_in_p_DirAttributeValue8621); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_APOS.add(s);\n\n                    if (org.antlr.lang.isNull(list_s)) list_s = [];\n                    list_s.push(s);\n\n                    if ( this.state.backtracking===0 ) {\n                       this.isInAttr = false; \n                    }\n\n\n\n                    if ( this.state.backtracking===0 ) {\n                       this.addToken(list_s, \"string\"); \n                    }\n\n\n                    // AST REWRITE\n                    // elements: p_AposAttrValueContent\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1156:17: -> ^( DirAttributeValue ( p_AposAttrValueContent )* )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1156:20: ^( DirAttributeValue ( p_AposAttrValueContent )* )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(DirAttributeValue, \"DirAttributeValue\"), root_1);\n\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1156:40: ( p_AposAttrValueContent )*\n                        while ( stream_p_AposAttrValueContent.hasNext() ) {\n                            this.adaptor.addChild(root_1, stream_p_AposAttrValueContent.nextTree());\n\n                        }\n                        stream_p_AposAttrValueContent.reset();\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_QuotAttrValueContent_return: (function() {\n        XQueryParser.p_QuotAttrValueContent_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_QuotAttrValueContent_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1160:1: p_QuotAttrValueContent : (s= p_QuotAttrContentChar | pm_CommonContent );\n    // $ANTLR start \"p_QuotAttrValueContent\"\n    p_QuotAttrValueContent: function() {\n        var retval = new XQueryParser.p_QuotAttrValueContent_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var s = null;\n         var pm_CommonContent387 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1161:9: (s= p_QuotAttrContentChar | pm_CommonContent )\n            var alt156=2;\n            var LA156_0 = this.input.LA(1);\n\n            if ( (LA156_0==L_QuotAttrContentChar) ) {\n                alt156=1;\n            }\n            else if ( ((LA156_0>=L_PredefinedEntityRef && LA156_0<=ESCAPE_RBRACKET)||LA156_0==LBRACKET) ) {\n                alt156=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 156, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt156) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1161:11: s= p_QuotAttrContentChar\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_QuotAttrContentChar_in_p_QuotAttrValueContent8679);\n                    s=this.p_QuotAttrContentChar();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, s.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.addString((s?s.start:null), (s?s.stop:null)); \n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1161:76: pm_CommonContent\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CommonContent_in_p_QuotAttrValueContent8685);\n                    pm_CommonContent387=this.pm_CommonContent();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CommonContent387.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AposAttrValueContent_return: (function() {\n        XQueryParser.p_AposAttrValueContent_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AposAttrValueContent_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1165:1: p_AposAttrValueContent : (s= p_AposAttrContentChar | pm_CommonContent );\n    // $ANTLR start \"p_AposAttrValueContent\"\n    p_AposAttrValueContent: function() {\n        var retval = new XQueryParser.p_AposAttrValueContent_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var s = null;\n         var pm_CommonContent388 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1166:9: (s= p_AposAttrContentChar | pm_CommonContent )\n            var alt157=2;\n            var LA157_0 = this.input.LA(1);\n\n            if ( (LA157_0==L_AposAttrContentChar) ) {\n                alt157=1;\n            }\n            else if ( ((LA157_0>=L_PredefinedEntityRef && LA157_0<=ESCAPE_RBRACKET)||LA157_0==LBRACKET) ) {\n                alt157=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 157, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt157) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1166:11: s= p_AposAttrContentChar\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AposAttrContentChar_in_p_AposAttrValueContent8713);\n                    s=this.p_AposAttrContentChar();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, s.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.addString((s?s.start:null), (s?s.stop:null)); \n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1166:76: pm_CommonContent\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CommonContent_in_p_AposAttrValueContent8719);\n                    pm_CommonContent388=this.pm_CommonContent();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CommonContent388.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_DirElemContent_return: (function() {\n        XQueryParser.pm_DirElemContent_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_DirElemContent_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1170:1: pm_DirElemContent : ( p_DirectConstructor | p_CDataSection | pm_CommonContent | p_ElementContentChar );\n    // $ANTLR start \"pm_DirElemContent\"\n    pm_DirElemContent: function() {\n        var retval = new XQueryParser.pm_DirElemContent_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_DirectConstructor389 = null;\n         var p_CDataSection390 = null;\n         var pm_CommonContent391 = null;\n         var p_ElementContentChar392 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1171:9: ( p_DirectConstructor | p_CDataSection | pm_CommonContent | p_ElementContentChar )\n            var alt158=4;\n            switch ( this.input.LA(1) ) {\n            case SMALLER:\n            case L_DirCommentConstructor:\n            case L_DirPIConstructor:\n                alt158=1;\n                break;\n            case L_CDataSection:\n                alt158=2;\n                break;\n            case L_PredefinedEntityRef:\n            case L_CharRef:\n            case ESCAPE_LBRACKET:\n            case ESCAPE_RBRACKET:\n            case LBRACKET:\n                alt158=3;\n                break;\n            case L_ElementContentChar:\n                alt158=4;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 158, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt158) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1171:11: p_DirectConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_DirectConstructor_in_pm_DirElemContent8745);\n                    p_DirectConstructor389=this.p_DirectConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DirectConstructor389.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1172:11: p_CDataSection\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_CDataSection_in_pm_DirElemContent8757);\n                    p_CDataSection390=this.p_CDataSection();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CDataSection390.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1173:11: pm_CommonContent\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CommonContent_in_pm_DirElemContent8769);\n                    pm_CommonContent391=this.pm_CommonContent();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CommonContent391.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1174:11: p_ElementContentChar\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ElementContentChar_in_pm_DirElemContent8781);\n                    p_ElementContentChar392=this.p_ElementContentChar();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ElementContentChar392.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_CommonContent_return: (function() {\n        XQueryParser.pm_CommonContent_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_CommonContent_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1180:1: pm_CommonContent : ( L_PredefinedEntityRef | L_CharRef | s= ESCAPE_LBRACKET | s= ESCAPE_RBRACKET | pg_EnclosedExprXml );\n    // $ANTLR start \"pm_CommonContent\"\n    pm_CommonContent: function() {\n        var retval = new XQueryParser.pm_CommonContent_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var s = null;\n        var L_PredefinedEntityRef393 = null;\n        var L_CharRef394 = null;\n         var pg_EnclosedExprXml395 = null;\n\n        var s_tree=null;\n        var L_PredefinedEntityRef393_tree=null;\n        var L_CharRef394_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1181:9: ( L_PredefinedEntityRef | L_CharRef | s= ESCAPE_LBRACKET | s= ESCAPE_RBRACKET | pg_EnclosedExprXml )\n            var alt159=5;\n            switch ( this.input.LA(1) ) {\n            case L_PredefinedEntityRef:\n                alt159=1;\n                break;\n            case L_CharRef:\n                alt159=2;\n                break;\n            case ESCAPE_LBRACKET:\n                alt159=3;\n                break;\n            case ESCAPE_RBRACKET:\n                alt159=4;\n                break;\n            case LBRACKET:\n                alt159=5;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 159, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt159) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1181:11: L_PredefinedEntityRef\n                    root_0 = this.adaptor.nil();\n\n                    L_PredefinedEntityRef393=this.match(this.input,L_PredefinedEntityRef,XQueryParser.FOLLOW_L_PredefinedEntityRef_in_pm_CommonContent8809); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_PredefinedEntityRef393_tree = this.adaptor.create(L_PredefinedEntityRef393);\n                    this.adaptor.addChild(root_0, L_PredefinedEntityRef393_tree);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1182:11: L_CharRef\n                    root_0 = this.adaptor.nil();\n\n                    L_CharRef394=this.match(this.input,L_CharRef,XQueryParser.FOLLOW_L_CharRef_in_pm_CommonContent8821); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_CharRef394_tree = this.adaptor.create(L_CharRef394);\n                    this.adaptor.addChild(root_0, L_CharRef394_tree);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1183:11: s= ESCAPE_LBRACKET\n                    root_0 = this.adaptor.nil();\n\n                    s=this.match(this.input,ESCAPE_LBRACKET,XQueryParser.FOLLOW_ESCAPE_LBRACKET_in_pm_CommonContent8835); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    s_tree = this.adaptor.create(s);\n                    this.adaptor.addChild(root_0, s_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                       if(this.isInAttr) { this.addToken(s, \"string\");  } \n                    }\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1184:11: s= ESCAPE_RBRACKET\n                    root_0 = this.adaptor.nil();\n\n                    s=this.match(this.input,ESCAPE_RBRACKET,XQueryParser.FOLLOW_ESCAPE_RBRACKET_in_pm_CommonContent8851); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    s_tree = this.adaptor.create(s);\n                    this.adaptor.addChild(root_0, s_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                       if(this.isInAttr) { this.addToken(s, \"string\");  } \n                    }\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1185:11: pg_EnclosedExprXml\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pg_EnclosedExprXml_in_pm_CommonContent8865);\n                    pg_EnclosedExprXml395=this.pg_EnclosedExprXml();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pg_EnclosedExprXml395.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_EnclosedExprXml_return: (function() {\n        XQueryParser.pg_EnclosedExprXml_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_EnclosedExprXml_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1193:1: pg_EnclosedExprXml : LBRACKET p_StatementsAndOptionalExpr RBRACKET ;\n    // $ANTLR start \"pg_EnclosedExprXml\"\n    pg_EnclosedExprXml: function() {\n        var retval = new XQueryParser.pg_EnclosedExprXml_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LBRACKET396 = null;\n        var RBRACKET398 = null;\n         var p_StatementsAndOptionalExpr397 = null;\n\n        var LBRACKET396_tree=null;\n        var RBRACKET398_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1194:9: ( LBRACKET p_StatementsAndOptionalExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1194:13: LBRACKET p_StatementsAndOptionalExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            LBRACKET396=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pg_EnclosedExprXml8897); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET396_tree = this.adaptor.create(LBRACKET396);\n            this.adaptor.addChild(root_0, LBRACKET396_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.pushXQueryLexer();\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_pg_EnclosedExprXml8913);\n            p_StatementsAndOptionalExpr397=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr397.getTree());\n            RBRACKET398=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pg_EnclosedExprXml8927); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET398_tree = this.adaptor.create(RBRACKET398);\n            this.adaptor.addChild(root_0, RBRACKET398_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.popLexer();\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DirCommentConstructor_return: (function() {\n        XQueryParser.p_DirCommentConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DirCommentConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1201:1: p_DirCommentConstructor : c= L_DirCommentConstructor ;\n    // $ANTLR start \"p_DirCommentConstructor\"\n    p_DirCommentConstructor: function() {\n        var retval = new XQueryParser.p_DirCommentConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var c = null;\n\n        var c_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1202:9: (c= L_DirCommentConstructor )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1202:11: c= L_DirCommentConstructor\n            root_0 = this.adaptor.nil();\n\n            c=this.match(this.input,L_DirCommentConstructor,XQueryParser.FOLLOW_L_DirCommentConstructor_in_p_DirCommentConstructor8958); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            c_tree = this.adaptor.create(c);\n            this.adaptor.addChild(root_0, c_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ac(c);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DirPIConstructor_return: (function() {\n        XQueryParser.p_DirPIConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DirPIConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1209:1: p_DirPIConstructor : p= L_DirPIConstructor ;\n    // $ANTLR start \"p_DirPIConstructor\"\n    p_DirPIConstructor: function() {\n        var retval = new XQueryParser.p_DirPIConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var p = null;\n\n        var p_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1210:9: (p= L_DirPIConstructor )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1210:11: p= L_DirPIConstructor\n            root_0 = this.adaptor.nil();\n\n            p=this.match(this.input,L_DirPIConstructor,XQueryParser.FOLLOW_L_DirPIConstructor_in_p_DirPIConstructor8994); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            p_tree = this.adaptor.create(p);\n            this.adaptor.addChild(root_0, p_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n               this.ap(p);  \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CDataSection_return: (function() {\n        XQueryParser.p_CDataSection_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CDataSection_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1217:1: p_CDataSection : c= L_CDataSection ;\n    // $ANTLR start \"p_CDataSection\"\n    p_CDataSection: function() {\n        var retval = new XQueryParser.p_CDataSection_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var c = null;\n\n        var c_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1218:9: (c= L_CDataSection )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1218:11: c= L_CDataSection\n            root_0 = this.adaptor.nil();\n\n            c=this.match(this.input,L_CDataSection,XQueryParser.FOLLOW_L_CDataSection_in_p_CDataSection9031); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            c_tree = this.adaptor.create(c);\n            this.adaptor.addChild(root_0, c_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n               this.ac(c); \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ComputedConstructor_return: (function() {\n        XQueryParser.p_ComputedConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ComputedConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1225:1: p_ComputedConstructor : ( pm_CompDocConstructor | pm_CompElemConstructor | pm_CompAttrConstructor | p_CompNamespaceConstructor | p_CompTextConstructor | pm_CompCommentConstructor | pm_CompPIConstructor );\n    // $ANTLR start \"p_ComputedConstructor\"\n    p_ComputedConstructor: function() {\n        var retval = new XQueryParser.p_ComputedConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var pm_CompDocConstructor399 = null;\n         var pm_CompElemConstructor400 = null;\n         var pm_CompAttrConstructor401 = null;\n         var p_CompNamespaceConstructor402 = null;\n         var p_CompTextConstructor403 = null;\n         var pm_CompCommentConstructor404 = null;\n         var pm_CompPIConstructor405 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1226:9: ( pm_CompDocConstructor | pm_CompElemConstructor | pm_CompAttrConstructor | p_CompNamespaceConstructor | p_CompTextConstructor | pm_CompCommentConstructor | pm_CompPIConstructor )\n            var alt160=7;\n            switch ( this.input.LA(1) ) {\n            case DOCUMENT:\n                alt160=1;\n                break;\n            case ELEMENT:\n                alt160=2;\n                break;\n            case ATTRIBUTE:\n                alt160=3;\n                break;\n            case NAMESPACE:\n                alt160=4;\n                break;\n            case TEXT:\n                alt160=5;\n                break;\n            case COMMENT:\n                alt160=6;\n                break;\n            case PROCESSING_INSTRUCTION:\n                alt160=7;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 160, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt160) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1226:11: pm_CompDocConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CompDocConstructor_in_p_ComputedConstructor9065);\n                    pm_CompDocConstructor399=this.pm_CompDocConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CompDocConstructor399.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1227:11: pm_CompElemConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CompElemConstructor_in_p_ComputedConstructor9077);\n                    pm_CompElemConstructor400=this.pm_CompElemConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CompElemConstructor400.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1228:11: pm_CompAttrConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CompAttrConstructor_in_p_ComputedConstructor9089);\n                    pm_CompAttrConstructor401=this.pm_CompAttrConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CompAttrConstructor401.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1229:11: p_CompNamespaceConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_CompNamespaceConstructor_in_p_ComputedConstructor9101);\n                    p_CompNamespaceConstructor402=this.p_CompNamespaceConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CompNamespaceConstructor402.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1230:11: p_CompTextConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_CompTextConstructor_in_p_ComputedConstructor9113);\n                    p_CompTextConstructor403=this.p_CompTextConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CompTextConstructor403.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1231:11: pm_CompCommentConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CompCommentConstructor_in_p_ComputedConstructor9125);\n                    pm_CompCommentConstructor404=this.pm_CompCommentConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CompCommentConstructor404.getTree());\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1232:11: pm_CompPIConstructor\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pm_CompPIConstructor_in_p_ComputedConstructor9137);\n                    pm_CompPIConstructor405=this.pm_CompPIConstructor();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_CompPIConstructor405.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_CompDocConstructor_return: (function() {\n        XQueryParser.pm_CompDocConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_CompDocConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1237:1: pm_CompDocConstructor : k= DOCUMENT LBRACKET p_StatementsAndOptionalExpr RBRACKET ;\n    // $ANTLR start \"pm_CompDocConstructor\"\n    pm_CompDocConstructor: function() {\n        var retval = new XQueryParser.pm_CompDocConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET406 = null;\n        var RBRACKET408 = null;\n         var p_StatementsAndOptionalExpr407 = null;\n\n        var k_tree=null;\n        var LBRACKET406_tree=null;\n        var RBRACKET408_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1238:9: (k= DOCUMENT LBRACKET p_StatementsAndOptionalExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1238:11: k= DOCUMENT LBRACKET p_StatementsAndOptionalExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DOCUMENT,XQueryParser.FOLLOW_DOCUMENT_in_pm_CompDocConstructor9166); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LBRACKET406=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompDocConstructor9170); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET406_tree = this.adaptor.create(LBRACKET406);\n            this.adaptor.addChild(root_0, LBRACKET406_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompDocConstructor9172);\n            p_StatementsAndOptionalExpr407=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr407.getTree());\n            RBRACKET408=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompDocConstructor9174); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET408_tree = this.adaptor.create(RBRACKET408);\n            this.adaptor.addChild(root_0, RBRACKET408_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_CompElemConstructor_return: (function() {\n        XQueryParser.pm_CompElemConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_CompElemConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1242:1: pm_CompElemConstructor : k= ELEMENT ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET pm_ContentExpr RBRACKET ;\n    // $ANTLR start \"pm_CompElemConstructor\"\n    pm_CompElemConstructor: function() {\n        var retval = new XQueryParser.pm_CompElemConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET410 = null;\n        var RBRACKET412 = null;\n        var LBRACKET413 = null;\n        var RBRACKET415 = null;\n         var p_EQName409 = null;\n         var p_Expr411 = null;\n         var pm_ContentExpr414 = null;\n\n        var k_tree=null;\n        var LBRACKET410_tree=null;\n        var RBRACKET412_tree=null;\n        var LBRACKET413_tree=null;\n        var RBRACKET415_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1243:9: (k= ELEMENT ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET pm_ContentExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1243:11: k= ELEMENT ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET pm_ContentExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,ELEMENT,XQueryParser.FOLLOW_ELEMENT_in_pm_CompElemConstructor9210); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1243:36: ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) )\n            var alt161=2;\n            var LA161_0 = this.input.LA(1);\n\n            if ( ((LA161_0>=ANCESTOR && LA161_0<=SKIP)||(LA161_0>=VALUE && LA161_0<=QUOT_ER)||LA161_0==Q||LA161_0==L_NCName) ) {\n                alt161=1;\n            }\n            else if ( (LA161_0==LBRACKET) ) {\n                alt161=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 161, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt161) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1243:37: p_EQName\n                    this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_pm_CompElemConstructor9215);\n                    p_EQName409=this.p_EQName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName409.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1243:48: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1243:48: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1243:49: LBRACKET p_Expr[true,true] RBRACKET\n                    LBRACKET410=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompElemConstructor9220); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LBRACKET410_tree = this.adaptor.create(LBRACKET410);\n                    this.adaptor.addChild(root_0, LBRACKET410_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_pm_CompElemConstructor9222);\n                    p_Expr411=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr411.getTree());\n                    RBRACKET412=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompElemConstructor9225); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RBRACKET412_tree = this.adaptor.create(RBRACKET412);\n                    this.adaptor.addChild(root_0, RBRACKET412_tree);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n\n            LBRACKET413=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompElemConstructor9229); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET413_tree = this.adaptor.create(LBRACKET413);\n            this.adaptor.addChild(root_0, LBRACKET413_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_pm_ContentExpr_in_pm_CompElemConstructor9231);\n            pm_ContentExpr414=this.pm_ContentExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pm_ContentExpr414.getTree());\n            RBRACKET415=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompElemConstructor9233); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET415_tree = this.adaptor.create(RBRACKET415);\n            this.adaptor.addChild(root_0, RBRACKET415_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_ContentExpr_return: (function() {\n        XQueryParser.pm_ContentExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_ContentExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1248:1: pm_ContentExpr : p_StatementsAndOptionalExpr ;\n    // $ANTLR start \"pm_ContentExpr\"\n    pm_ContentExpr: function() {\n        var retval = new XQueryParser.pm_ContentExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_StatementsAndOptionalExpr416 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1249:9: ( p_StatementsAndOptionalExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1249:11: p_StatementsAndOptionalExpr\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_pm_ContentExpr9260);\n            p_StatementsAndOptionalExpr416=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr416.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_CompAttrConstructor_return: (function() {\n        XQueryParser.pm_CompAttrConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_CompAttrConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1254:1: pm_CompAttrConstructor : k= ATTRIBUTE ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET p_StatementsAndOptionalExpr RBRACKET ;\n    // $ANTLR start \"pm_CompAttrConstructor\"\n    pm_CompAttrConstructor: function() {\n        var retval = new XQueryParser.pm_CompAttrConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET418 = null;\n        var RBRACKET420 = null;\n        var LBRACKET421 = null;\n        var RBRACKET423 = null;\n         var p_EQName417 = null;\n         var p_Expr419 = null;\n         var p_StatementsAndOptionalExpr422 = null;\n\n        var k_tree=null;\n        var LBRACKET418_tree=null;\n        var RBRACKET420_tree=null;\n        var LBRACKET421_tree=null;\n        var RBRACKET423_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1255:9: (k= ATTRIBUTE ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET p_StatementsAndOptionalExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1255:11: k= ATTRIBUTE ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET p_StatementsAndOptionalExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,ATTRIBUTE,XQueryParser.FOLLOW_ATTRIBUTE_in_pm_CompAttrConstructor9289); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1255:38: ( p_EQName | ( LBRACKET p_Expr[true,true] RBRACKET ) )\n            var alt162=2;\n            var LA162_0 = this.input.LA(1);\n\n            if ( ((LA162_0>=ANCESTOR && LA162_0<=SKIP)||(LA162_0>=VALUE && LA162_0<=QUOT_ER)||LA162_0==Q||LA162_0==L_NCName) ) {\n                alt162=1;\n            }\n            else if ( (LA162_0==LBRACKET) ) {\n                alt162=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 162, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt162) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1255:39: p_EQName\n                    this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_pm_CompAttrConstructor9294);\n                    p_EQName417=this.p_EQName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName417.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1255:50: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1255:50: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1255:51: LBRACKET p_Expr[true,true] RBRACKET\n                    LBRACKET418=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompAttrConstructor9299); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LBRACKET418_tree = this.adaptor.create(LBRACKET418);\n                    this.adaptor.addChild(root_0, LBRACKET418_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_pm_CompAttrConstructor9301);\n                    p_Expr419=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr419.getTree());\n                    RBRACKET420=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompAttrConstructor9304); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RBRACKET420_tree = this.adaptor.create(RBRACKET420);\n                    this.adaptor.addChild(root_0, RBRACKET420_tree);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n\n            LBRACKET421=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompAttrConstructor9308); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET421_tree = this.adaptor.create(LBRACKET421);\n            this.adaptor.addChild(root_0, LBRACKET421_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompAttrConstructor9310);\n            p_StatementsAndOptionalExpr422=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr422.getTree());\n            RBRACKET423=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompAttrConstructor9312); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET423_tree = this.adaptor.create(RBRACKET423);\n            this.adaptor.addChild(root_0, RBRACKET423_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CompNamespaceConstructor_return: (function() {\n        XQueryParser.p_CompNamespaceConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CompNamespaceConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1259:1: p_CompNamespaceConstructor : k= NAMESPACE ( p_Prefix | ( LBRACKET p_PrefixExpr RBRACKET ) ) LBRACKET ( p_URIExpr )? RBRACKET ;\n    // $ANTLR start \"p_CompNamespaceConstructor\"\n    p_CompNamespaceConstructor: function() {\n        var retval = new XQueryParser.p_CompNamespaceConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET425 = null;\n        var RBRACKET427 = null;\n        var LBRACKET428 = null;\n        var RBRACKET430 = null;\n         var p_Prefix424 = null;\n         var p_PrefixExpr426 = null;\n         var p_URIExpr429 = null;\n\n        var k_tree=null;\n        var LBRACKET425_tree=null;\n        var RBRACKET427_tree=null;\n        var LBRACKET428_tree=null;\n        var RBRACKET430_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:9: (k= NAMESPACE ( p_Prefix | ( LBRACKET p_PrefixExpr RBRACKET ) ) LBRACKET ( p_URIExpr )? RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:11: k= NAMESPACE ( p_Prefix | ( LBRACKET p_PrefixExpr RBRACKET ) ) LBRACKET ( p_URIExpr )? RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,NAMESPACE,XQueryParser.FOLLOW_NAMESPACE_in_p_CompNamespaceConstructor9340); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:38: ( p_Prefix | ( LBRACKET p_PrefixExpr RBRACKET ) )\n            var alt163=2;\n            var LA163_0 = this.input.LA(1);\n\n            if ( ((LA163_0>=ANCESTOR && LA163_0<=SKIP)||(LA163_0>=VALUE && LA163_0<=QUOT_ER)||LA163_0==L_NCName) ) {\n                alt163=1;\n            }\n            else if ( (LA163_0==LBRACKET) ) {\n                alt163=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 163, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt163) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:39: p_Prefix\n                    this.pushFollow(XQueryParser.FOLLOW_p_Prefix_in_p_CompNamespaceConstructor9345);\n                    p_Prefix424=this.p_Prefix();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Prefix424.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:50: ( LBRACKET p_PrefixExpr RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:50: ( LBRACKET p_PrefixExpr RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:51: LBRACKET p_PrefixExpr RBRACKET\n                    LBRACKET425=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_CompNamespaceConstructor9350); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LBRACKET425_tree = this.adaptor.create(LBRACKET425);\n                    this.adaptor.addChild(root_0, LBRACKET425_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_PrefixExpr_in_p_CompNamespaceConstructor9352);\n                    p_PrefixExpr426=this.p_PrefixExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PrefixExpr426.getTree());\n                    RBRACKET427=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_CompNamespaceConstructor9354); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RBRACKET427_tree = this.adaptor.create(RBRACKET427);\n                    this.adaptor.addChild(root_0, RBRACKET427_tree);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n\n            LBRACKET428=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_CompNamespaceConstructor9358); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET428_tree = this.adaptor.create(LBRACKET428);\n            this.adaptor.addChild(root_0, LBRACKET428_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:93: ( p_URIExpr )?\n            var alt164=2;\n            var LA164_0 = this.input.LA(1);\n\n            if ( ((LA164_0>=ANCESTOR && LA164_0<=QUOT_ER)||LA164_0==LPAREN||(LA164_0>=DOLLAR && LA164_0<=L_UNION_BRACKET)||LA164_0==LBRACKET||LA164_0==LSQUARE||(LA164_0>=STAR && LA164_0<=SMALLER)||(LA164_0>=SLASH && LA164_0<=SLASH_SLASH)||(LA164_0>=DOT && LA164_0<=DOT_DOT)||(LA164_0>=ATTR_SIGN && LA164_0<=Q)||(LA164_0>=APOS && LA164_0<=QUOT)||LA164_0==L_NCName||(LA164_0>=L_Pragma && LA164_0<=L_DoubleLiteral)) ) {\n                alt164=1;\n            }\n            switch (alt164) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1260:93: p_URIExpr\n                    this.pushFollow(XQueryParser.FOLLOW_p_URIExpr_in_p_CompNamespaceConstructor9360);\n                    p_URIExpr429=this.p_URIExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_URIExpr429.getTree());\n\n\n                    break;\n\n            }\n\n            RBRACKET430=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_CompNamespaceConstructor9363); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET430_tree = this.adaptor.create(RBRACKET430);\n            this.adaptor.addChild(root_0, RBRACKET430_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Prefix_return: (function() {\n        XQueryParser.p_Prefix_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Prefix_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1264:1: p_Prefix : p_NCName ;\n    // $ANTLR start \"p_Prefix\"\n    p_Prefix: function() {\n        var retval = new XQueryParser.p_Prefix_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_NCName431 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1265:9: ( p_NCName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1265:11: p_NCName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_Prefix9389);\n            p_NCName431=this.p_NCName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NCName431.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PrefixExpr_return: (function() {\n        XQueryParser.p_PrefixExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PrefixExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1269:1: p_PrefixExpr : p_Expr[true,true] ;\n    // $ANTLR start \"p_PrefixExpr\"\n    p_PrefixExpr: function() {\n        var retval = new XQueryParser.p_PrefixExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Expr432 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1270:9: ( p_Expr[true,true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1270:11: p_Expr[true,true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_PrefixExpr9415);\n            p_Expr432=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr432.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_URIExpr_return: (function() {\n        XQueryParser.p_URIExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_URIExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1274:1: p_URIExpr : p_Expr[true,true] ;\n    // $ANTLR start \"p_URIExpr\"\n    p_URIExpr: function() {\n        var retval = new XQueryParser.p_URIExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Expr433 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1275:9: ( p_Expr[true,true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1275:11: p_Expr[true,true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_URIExpr9442);\n            p_Expr433=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr433.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CompTextConstructor_return: (function() {\n        XQueryParser.p_CompTextConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CompTextConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1279:1: p_CompTextConstructor : k= TEXT LBRACKET p_Expr[true,true] RBRACKET ;\n    // $ANTLR start \"p_CompTextConstructor\"\n    p_CompTextConstructor: function() {\n        var retval = new XQueryParser.p_CompTextConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET434 = null;\n        var RBRACKET436 = null;\n         var p_Expr435 = null;\n\n        var k_tree=null;\n        var LBRACKET434_tree=null;\n        var RBRACKET436_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1280:9: (k= TEXT LBRACKET p_Expr[true,true] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1280:11: k= TEXT LBRACKET p_Expr[true,true] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TEXT,XQueryParser.FOLLOW_TEXT_in_p_CompTextConstructor9471); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LBRACKET434=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_CompTextConstructor9475); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET434_tree = this.adaptor.create(LBRACKET434);\n            this.adaptor.addChild(root_0, LBRACKET434_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_CompTextConstructor9477);\n            p_Expr435=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr435.getTree());\n            RBRACKET436=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_CompTextConstructor9480); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET436_tree = this.adaptor.create(RBRACKET436);\n            this.adaptor.addChild(root_0, RBRACKET436_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_CompCommentConstructor_return: (function() {\n        XQueryParser.pm_CompCommentConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_CompCommentConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1285:1: pm_CompCommentConstructor : k= COMMENT LBRACKET p_StatementsAndOptionalExpr RBRACKET ;\n    // $ANTLR start \"pm_CompCommentConstructor\"\n    pm_CompCommentConstructor: function() {\n        var retval = new XQueryParser.pm_CompCommentConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET437 = null;\n        var RBRACKET439 = null;\n         var p_StatementsAndOptionalExpr438 = null;\n\n        var k_tree=null;\n        var LBRACKET437_tree=null;\n        var RBRACKET439_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1286:9: (k= COMMENT LBRACKET p_StatementsAndOptionalExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1286:11: k= COMMENT LBRACKET p_StatementsAndOptionalExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,COMMENT,XQueryParser.FOLLOW_COMMENT_in_pm_CompCommentConstructor9509); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LBRACKET437=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompCommentConstructor9513); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET437_tree = this.adaptor.create(LBRACKET437);\n            this.adaptor.addChild(root_0, LBRACKET437_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompCommentConstructor9515);\n            p_StatementsAndOptionalExpr438=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr438.getTree());\n            RBRACKET439=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompCommentConstructor9517); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET439_tree = this.adaptor.create(RBRACKET439);\n            this.adaptor.addChild(root_0, RBRACKET439_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_CompPIConstructor_return: (function() {\n        XQueryParser.pm_CompPIConstructor_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_CompPIConstructor_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1291:1: pm_CompPIConstructor : k= PROCESSING_INSTRUCTION ( p_NCName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET p_StatementsAndOptionalExpr RBRACKET ;\n    // $ANTLR start \"pm_CompPIConstructor\"\n    pm_CompPIConstructor: function() {\n        var retval = new XQueryParser.pm_CompPIConstructor_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LBRACKET441 = null;\n        var RBRACKET443 = null;\n        var LBRACKET444 = null;\n        var RBRACKET446 = null;\n         var p_NCName440 = null;\n         var p_Expr442 = null;\n         var p_StatementsAndOptionalExpr445 = null;\n\n        var k_tree=null;\n        var LBRACKET441_tree=null;\n        var RBRACKET443_tree=null;\n        var LBRACKET444_tree=null;\n        var RBRACKET446_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1292:9: (k= PROCESSING_INSTRUCTION ( p_NCName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET p_StatementsAndOptionalExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1292:11: k= PROCESSING_INSTRUCTION ( p_NCName | ( LBRACKET p_Expr[true,true] RBRACKET ) ) LBRACKET p_StatementsAndOptionalExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,PROCESSING_INSTRUCTION,XQueryParser.FOLLOW_PROCESSING_INSTRUCTION_in_pm_CompPIConstructor9546); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1292:51: ( p_NCName | ( LBRACKET p_Expr[true,true] RBRACKET ) )\n            var alt165=2;\n            var LA165_0 = this.input.LA(1);\n\n            if ( ((LA165_0>=ANCESTOR && LA165_0<=SKIP)||(LA165_0>=VALUE && LA165_0<=QUOT_ER)||LA165_0==L_NCName) ) {\n                alt165=1;\n            }\n            else if ( (LA165_0==LBRACKET) ) {\n                alt165=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 165, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt165) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1292:52: p_NCName\n                    this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_pm_CompPIConstructor9551);\n                    p_NCName440=this.p_NCName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NCName440.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1292:63: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1292:63: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1292:64: LBRACKET p_Expr[true,true] RBRACKET\n                    LBRACKET441=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompPIConstructor9556); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LBRACKET441_tree = this.adaptor.create(LBRACKET441);\n                    this.adaptor.addChild(root_0, LBRACKET441_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_pm_CompPIConstructor9558);\n                    p_Expr442=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr442.getTree());\n                    RBRACKET443=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompPIConstructor9561); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RBRACKET443_tree = this.adaptor.create(RBRACKET443);\n                    this.adaptor.addChild(root_0, RBRACKET443_tree);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n\n            LBRACKET444=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_pm_CompPIConstructor9565); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET444_tree = this.adaptor.create(LBRACKET444);\n            this.adaptor.addChild(root_0, LBRACKET444_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompPIConstructor9567);\n            p_StatementsAndOptionalExpr445=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr445.getTree());\n            RBRACKET446=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_pm_CompPIConstructor9569); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET446_tree = this.adaptor.create(RBRACKET446);\n            this.adaptor.addChild(root_0, RBRACKET446_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FunctionItemExpr_return: (function() {\n        XQueryParser.p_FunctionItemExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FunctionItemExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1296:1: p_FunctionItemExpr : p_LiteralFunctionItem ;\n    // $ANTLR start \"p_FunctionItemExpr\"\n    p_FunctionItemExpr: function() {\n        var retval = new XQueryParser.p_FunctionItemExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_LiteralFunctionItem447 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1297:9: ( p_LiteralFunctionItem )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1297:11: p_LiteralFunctionItem\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_LiteralFunctionItem_in_p_FunctionItemExpr9595);\n            p_LiteralFunctionItem447=this.p_LiteralFunctionItem();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_LiteralFunctionItem447.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_LiteralFunctionItem_return: (function() {\n        XQueryParser.p_LiteralFunctionItem_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_LiteralFunctionItem_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1302:1: p_LiteralFunctionItem : p_EQName HASH L_IntegerLiteral ;\n    // $ANTLR start \"p_LiteralFunctionItem\"\n    p_LiteralFunctionItem: function() {\n        var retval = new XQueryParser.p_LiteralFunctionItem_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var HASH449 = null;\n        var L_IntegerLiteral450 = null;\n         var p_EQName448 = null;\n\n        var HASH449_tree=null;\n        var L_IntegerLiteral450_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1303:9: ( p_EQName HASH L_IntegerLiteral )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1303:11: p_EQName HASH L_IntegerLiteral\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_LiteralFunctionItem9622);\n            p_EQName448=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName448.getTree());\n            HASH449=this.match(this.input,HASH,XQueryParser.FOLLOW_HASH_in_p_LiteralFunctionItem9624); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            HASH449_tree = this.adaptor.create(HASH449);\n            this.adaptor.addChild(root_0, HASH449_tree);\n            }\n            L_IntegerLiteral450=this.match(this.input,L_IntegerLiteral,XQueryParser.FOLLOW_L_IntegerLiteral_in_p_LiteralFunctionItem9626); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            L_IntegerLiteral450_tree = this.adaptor.create(L_IntegerLiteral450);\n            this.adaptor.addChild(root_0, L_IntegerLiteral450_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_InlineFunction_return: (function() {\n        XQueryParser.p_InlineFunction_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_InlineFunction_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1307:1: p_InlineFunction : ( p_Annotation )* k= FUNCTION LPAREN ( p_ParamList )? RPAREN (k= AS p_SequenceType )? LBRACKET p_StatementsAndOptionalExpr RBRACKET ;\n    // $ANTLR start \"p_InlineFunction\"\n    p_InlineFunction: function() {\n        var retval = new XQueryParser.p_InlineFunction_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LPAREN452 = null;\n        var RPAREN454 = null;\n        var LBRACKET456 = null;\n        var RBRACKET458 = null;\n         var p_Annotation451 = null;\n         var p_ParamList453 = null;\n         var p_SequenceType455 = null;\n         var p_StatementsAndOptionalExpr457 = null;\n\n        var k_tree=null;\n        var LPAREN452_tree=null;\n        var RPAREN454_tree=null;\n        var LBRACKET456_tree=null;\n        var RBRACKET458_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:9: ( ( p_Annotation )* k= FUNCTION LPAREN ( p_ParamList )? RPAREN (k= AS p_SequenceType )? LBRACKET p_StatementsAndOptionalExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:11: ( p_Annotation )* k= FUNCTION LPAREN ( p_ParamList )? RPAREN (k= AS p_SequenceType )? LBRACKET p_StatementsAndOptionalExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:11: ( p_Annotation )*\n            loop166:\n            do {\n                var alt166=2;\n                var LA166_0 = this.input.LA(1);\n\n                if ( (LA166_0==ANN_PERCENT) ) {\n                    alt166=1;\n                }\n\n\n                switch (alt166) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:11: p_Annotation\n                    this.pushFollow(XQueryParser.FOLLOW_p_Annotation_in_p_InlineFunction9661);\n                    p_Annotation451=this.p_Annotation();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Annotation451.getTree());\n\n\n                    break;\n\n                default :\n                    break loop166;\n                }\n            } while (true);\n\n            k=this.match(this.input,FUNCTION,XQueryParser.FOLLOW_FUNCTION_in_p_InlineFunction9666); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n               this.ak(k); \n            }\n            LPAREN452=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_InlineFunction9670); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN452_tree = this.adaptor.create(LPAREN452);\n            this.adaptor.addChild(root_0, LPAREN452_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:60: ( p_ParamList )?\n            var alt167=2;\n            var LA167_0 = this.input.LA(1);\n\n            if ( (LA167_0==DOLLAR) ) {\n                alt167=1;\n            }\n            switch (alt167) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:60: p_ParamList\n                    this.pushFollow(XQueryParser.FOLLOW_p_ParamList_in_p_InlineFunction9672);\n                    p_ParamList453=this.p_ParamList();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ParamList453.getTree());\n\n\n                    break;\n\n            }\n\n            RPAREN454=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_InlineFunction9675); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN454_tree = this.adaptor.create(RPAREN454);\n            this.adaptor.addChild(root_0, RPAREN454_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:80: (k= AS p_SequenceType )?\n            var alt168=2;\n            var LA168_0 = this.input.LA(1);\n\n            if ( (LA168_0==AS) ) {\n                alt168=1;\n            }\n            switch (alt168) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1309:81: k= AS p_SequenceType\n                    k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_InlineFunction9680); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_InlineFunction9684);\n                    p_SequenceType455=this.p_SequenceType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType455.getTree());\n\n\n                    break;\n\n            }\n\n            LBRACKET456=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_InlineFunction9688); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET456_tree = this.adaptor.create(LBRACKET456);\n            this.adaptor.addChild(root_0, LBRACKET456_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_p_InlineFunction9690);\n            p_StatementsAndOptionalExpr457=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr457.getTree());\n            RBRACKET458=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_InlineFunction9692); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET458_tree = this.adaptor.create(RBRACKET458);\n            this.adaptor.addChild(root_0, RBRACKET458_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SingleType_return: (function() {\n        XQueryParser.p_SingleType_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SingleType_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1313:1: p_SingleType : p_AtomicOrUnionType ( QUESTION )? ;\n    // $ANTLR start \"p_SingleType\"\n    p_SingleType: function() {\n        var retval = new XQueryParser.p_SingleType_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var QUESTION460 = null;\n         var p_AtomicOrUnionType459 = null;\n\n        var QUESTION460_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1314:9: ( p_AtomicOrUnionType ( QUESTION )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1314:11: p_AtomicOrUnionType ( QUESTION )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_AtomicOrUnionType_in_p_SingleType9718);\n            p_AtomicOrUnionType459=this.p_AtomicOrUnionType();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AtomicOrUnionType459.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1314:31: ( QUESTION )?\n            var alt169=2;\n            var LA169_0 = this.input.LA(1);\n\n            if ( (LA169_0==QUESTION) ) {\n                alt169=1;\n            }\n            switch (alt169) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1314:31: QUESTION\n                    QUESTION460=this.match(this.input,QUESTION,XQueryParser.FOLLOW_QUESTION_in_p_SingleType9720); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    QUESTION460_tree = this.adaptor.create(QUESTION460);\n                    this.adaptor.addChild(root_0, QUESTION460_tree);\n                    }\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TypeDeclaration_return: (function() {\n        XQueryParser.p_TypeDeclaration_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TypeDeclaration_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1318:1: p_TypeDeclaration : k= AS st= p_SequenceType -> ^( TypeDeclaration $st) ;\n    // $ANTLR start \"p_TypeDeclaration\"\n    p_TypeDeclaration: function() {\n        var retval = new XQueryParser.p_TypeDeclaration_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var st = null;\n\n        var k_tree=null;\n        var stream_AS=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token AS\");\n        var stream_p_SequenceType=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_SequenceType\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1319:9: (k= AS st= p_SequenceType -> ^( TypeDeclaration $st) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1319:11: k= AS st= p_SequenceType\n            k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_TypeDeclaration9749); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_AS.add(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_TypeDeclaration9755);\n            st=this.p_SequenceType();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_SequenceType.add(st.getTree());\n\n\n            // AST REWRITE\n            // elements: st\n            // token labels: \n            // rule labels: retval, st\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_st=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token st\",st!=null?st.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 1320:17: -> ^( TypeDeclaration $st)\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1320:20: ^( TypeDeclaration $st)\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(TypeDeclaration, \"TypeDeclaration\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_st.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SequenceType_return: (function() {\n        XQueryParser.p_SequenceType_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SequenceType_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1324:1: p_SequenceType : (k= EMPTY_SEQUENCE l= LPAREN r= RPAREN -> ^( SequenceType ^( EmptySequenceTest $k $l $r) ) | it= p_ItemType ( ( p_OccurrenceIndicator )=>oi= p_OccurrenceIndicator )? -> ^( SequenceType $it ( $oi)? ) );\n    // $ANTLR start \"p_SequenceType\"\n    p_SequenceType: function() {\n        var retval = new XQueryParser.p_SequenceType_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var l = null;\n        var r = null;\n         var it = null;\n         var oi = null;\n\n        var k_tree=null;\n        var l_tree=null;\n        var r_tree=null;\n        var stream_EMPTY_SEQUENCE=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token EMPTY_SEQUENCE\");\n        var stream_RPAREN=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token RPAREN\");\n        var stream_LPAREN=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token LPAREN\");\n        var stream_p_ItemType=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_ItemType\");\n        var stream_p_OccurrenceIndicator=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_OccurrenceIndicator\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1325:9: (k= EMPTY_SEQUENCE l= LPAREN r= RPAREN -> ^( SequenceType ^( EmptySequenceTest $k $l $r) ) | it= p_ItemType ( ( p_OccurrenceIndicator )=>oi= p_OccurrenceIndicator )? -> ^( SequenceType $it ( $oi)? ) )\n            var alt171=2;\n            var LA171_0 = this.input.LA(1);\n\n            if ( (LA171_0==EMPTY_SEQUENCE) ) {\n                var LA171_1 = this.input.LA(2);\n\n                if ( (LA171_1==LPAREN) ) {\n                    alt171=1;\n                }\n                else if ( (LA171_1==EOF||(LA171_1>=AND && LA171_1<=AT)||LA171_1==CASE||LA171_1==COLLATION||LA171_1==DEFAULT||(LA171_1>=DESCENDING && LA171_1<=DIV)||LA171_1==EMPTY||LA171_1==EQ||(LA171_1>=EXCEPT && LA171_1<=EXTERNAL)||LA171_1==FOR||LA171_1==GE||(LA171_1>=GT && LA171_1<=IDIV)||LA171_1==IN||(LA171_1>=INSTANCE && LA171_1<=IS)||LA171_1==LE||(LA171_1>=LET && LA171_1<=MOD)||LA171_1==NE||(LA171_1>=OR && LA171_1<=ORDER)||(LA171_1>=RETURN && LA171_1<=SATISFIES)||LA171_1==STABLE||LA171_1==TO||LA171_1==UNION||LA171_1==WHERE||LA171_1==ALLOWING||LA171_1==COUNT||(LA171_1>=END && LA171_1<=GROUP)||LA171_1==ONLY||LA171_1==START||(LA171_1>=AFTER && LA171_1<=BEFORE)||LA171_1==INTO||LA171_1==MODIFY||LA171_1==WITH||LA171_1==CONTAINS||LA171_1==PARAGRAPHS||LA171_1==SCORE||LA171_1==SENTENCES||LA171_1==TIMES||LA171_1==WORDS||LA171_1==CONCAT||LA171_1==RPAREN||(LA171_1>=R_UNION_BRACKET && LA171_1<=RBRACKET)||(LA171_1>=RSQUARE && LA171_1<=NOTEQUAL)||(LA171_1>=COMMA && LA171_1<=GREATER_GREATER)||LA171_1==COLON||(LA171_1>=SEMICOLON && LA171_1<=VBAR)) ) {\n                    alt171=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 171, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else if ( ((LA171_0>=ANCESTOR && LA171_0<=EMPTY)||(LA171_0>=ENCODING && LA171_0<=SKIP)||(LA171_0>=VALUE && LA171_0<=QUOT_ER)||LA171_0==LPAREN||LA171_0==ANN_PERCENT||LA171_0==Q||LA171_0==L_NCName) ) {\n                alt171=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 171, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt171) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1325:11: k= EMPTY_SEQUENCE l= LPAREN r= RPAREN\n                    k=this.match(this.input,EMPTY_SEQUENCE,XQueryParser.FOLLOW_EMPTY_SEQUENCE_in_p_SequenceType9808); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_EMPTY_SEQUENCE.add(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    l=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_SequenceType9814); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_LPAREN.add(l);\n\n                    r=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_SequenceType9818); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_RPAREN.add(r);\n\n\n\n                    // AST REWRITE\n                    // elements: r, k, l\n                    // token labels: r, l, k\n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_r=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token r\",r);\n                    var stream_l=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token l\",l);\n                    var stream_k=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token k\",k);\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1326:17: -> ^( SequenceType ^( EmptySequenceTest $k $l $r) )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1326:20: ^( SequenceType ^( EmptySequenceTest $k $l $r) )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(SequenceType, \"SequenceType\"), root_1);\n\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1326:35: ^( EmptySequenceTest $k $l $r)\n                        {\n                        var root_2 = this.adaptor.nil();\n                        root_2 = this.adaptor.becomeRoot(this.adaptor.create(EmptySequenceTest, \"EmptySequenceTest\"), root_2);\n\n                        this.adaptor.addChild(root_2, stream_k.nextNode());\n                        this.adaptor.addChild(root_2, stream_l.nextNode());\n                        this.adaptor.addChild(root_2, stream_r.nextNode());\n\n                        this.adaptor.addChild(root_1, root_2);\n                        }\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1327:11: it= p_ItemType ( ( p_OccurrenceIndicator )=>oi= p_OccurrenceIndicator )?\n                    this.pushFollow(XQueryParser.FOLLOW_p_ItemType_in_p_SequenceType9867);\n                    it=this.p_ItemType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_ItemType.add(it.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1327:25: ( ( p_OccurrenceIndicator )=>oi= p_OccurrenceIndicator )?\n                    var alt170=2;\n                    switch ( this.input.LA(1) ) {\n                        case STAR:\n                            var LA170_1 = this.input.LA(2);\n\n                            if ( (this.synpred14_XQueryParser()) ) {\n                                alt170=1;\n                            }\n                            break;\n                        case PLUS:\n                            var LA170_3 = this.input.LA(2);\n\n                            if ( (this.synpred14_XQueryParser()) ) {\n                                alt170=1;\n                            }\n                            break;\n                        case QUESTION:\n                            var LA170_4 = this.input.LA(2);\n\n                            if ( (this.synpred14_XQueryParser()) ) {\n                                alt170=1;\n                            }\n                            break;\n                    }\n\n                    switch (alt170) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1327:26: ( p_OccurrenceIndicator )=>oi= p_OccurrenceIndicator\n                            this.pushFollow(XQueryParser.FOLLOW_p_OccurrenceIndicator_in_p_SequenceType9878);\n                            oi=this.p_OccurrenceIndicator();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) stream_p_OccurrenceIndicator.add(oi.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n                    // AST REWRITE\n                    // elements: it, oi\n                    // token labels: \n                    // rule labels: retval, it, oi\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n                    var stream_it=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token it\",it!=null?it.tree:null);\n                    var stream_oi=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token oi\",oi!=null?oi.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1328:17: -> ^( SequenceType $it ( $oi)? )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1328:20: ^( SequenceType $it ( $oi)? )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(SequenceType, \"SequenceType\"), root_1);\n\n                        this.adaptor.addChild(root_1, stream_it.nextTree());\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1328:39: ( $oi)?\n                        if ( stream_oi.hasNext() ) {\n                            this.adaptor.addChild(root_1, stream_oi.nextTree());\n\n                        }\n                        stream_oi.reset();\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_OccurrenceIndicator_return: (function() {\n        XQueryParser.p_OccurrenceIndicator_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_OccurrenceIndicator_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1332:1: p_OccurrenceIndicator : ( QUESTION | STAR | PLUS );\n    // $ANTLR start \"p_OccurrenceIndicator\"\n    p_OccurrenceIndicator: function() {\n        var retval = new XQueryParser.p_OccurrenceIndicator_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var set461 = null;\n\n        var set461_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1333:9: ( QUESTION | STAR | PLUS )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:\n            root_0 = this.adaptor.nil();\n\n            set461=this.input.LT(1);\n            if ( (this.input.LA(1)>=QUESTION && this.input.LA(1)<=PLUS) ) {\n                this.input.consume();\n                if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, this.adaptor.create(set461));\n                this.state.errorRecovery=false;this.state.failed=false;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                throw mse;\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ItemType_return: (function() {\n        XQueryParser.p_ItemType_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ItemType_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1337:1: p_ItemType : ( p_KindTest -> ^( KindTest p_KindTest ) | ( ITEM LPAREN RPAREN ) -> ^( ItemTest ITEM LPAREN RPAREN ) | p_FunctionTest -> ^( FunctionTest p_FunctionTest ) | p_AtomicOrUnionType | p_ParenthesizedItemType | p_JSONTest | p_StructuredItemTest );\n    // $ANTLR start \"p_ItemType\"\n    p_ItemType: function() {\n        var retval = new XQueryParser.p_ItemType_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ITEM463 = null;\n        var LPAREN464 = null;\n        var RPAREN465 = null;\n         var p_KindTest462 = null;\n         var p_FunctionTest466 = null;\n         var p_AtomicOrUnionType467 = null;\n         var p_ParenthesizedItemType468 = null;\n         var p_JSONTest469 = null;\n         var p_StructuredItemTest470 = null;\n\n        var ITEM463_tree=null;\n        var LPAREN464_tree=null;\n        var RPAREN465_tree=null;\n        var stream_RPAREN=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token RPAREN\");\n        var stream_ITEM=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token ITEM\");\n        var stream_LPAREN=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token LPAREN\");\n        var stream_p_FunctionTest=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_FunctionTest\");\n        var stream_p_KindTest=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_KindTest\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1338:9: ( p_KindTest -> ^( KindTest p_KindTest ) | ( ITEM LPAREN RPAREN ) -> ^( ItemTest ITEM LPAREN RPAREN ) | p_FunctionTest -> ^( FunctionTest p_FunctionTest ) | p_AtomicOrUnionType | p_ParenthesizedItemType | p_JSONTest | p_StructuredItemTest )\n            var alt172=7;\n            alt172 = this.dfa172.predict(this.input);\n            switch (alt172) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1338:11: p_KindTest\n                    this.pushFollow(XQueryParser.FOLLOW_p_KindTest_in_p_ItemType9980);\n                    p_KindTest462=this.p_KindTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_KindTest.add(p_KindTest462.getTree());\n\n\n                    // AST REWRITE\n                    // elements: p_KindTest\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1339:17: -> ^( KindTest p_KindTest )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1339:20: ^( KindTest p_KindTest )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(KindTest, \"KindTest\"), root_1);\n\n                        this.adaptor.addChild(root_1, stream_p_KindTest.nextTree());\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1340:11: ( ITEM LPAREN RPAREN )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1340:11: ( ITEM LPAREN RPAREN )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1340:12: ITEM LPAREN RPAREN\n                    ITEM463=this.match(this.input,ITEM,XQueryParser.FOLLOW_ITEM_in_p_ItemType10017); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_ITEM.add(ITEM463);\n\n                    LPAREN464=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_ItemType10019); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_LPAREN.add(LPAREN464);\n\n                    RPAREN465=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_ItemType10021); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_RPAREN.add(RPAREN465);\n\n\n\n\n\n\n                    // AST REWRITE\n                    // elements: RPAREN, LPAREN, ITEM\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1341:17: -> ^( ItemTest ITEM LPAREN RPAREN )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1341:20: ^( ItemTest ITEM LPAREN RPAREN )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(ItemTest, \"ItemTest\"), root_1);\n\n                        this.adaptor.addChild(root_1, stream_ITEM.nextNode());\n                        this.adaptor.addChild(root_1, stream_LPAREN.nextNode());\n                        this.adaptor.addChild(root_1, stream_RPAREN.nextNode());\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1342:11: p_FunctionTest\n                    this.pushFollow(XQueryParser.FOLLOW_p_FunctionTest_in_p_ItemType10062);\n                    p_FunctionTest466=this.p_FunctionTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_FunctionTest.add(p_FunctionTest466.getTree());\n\n\n                    // AST REWRITE\n                    // elements: p_FunctionTest\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1343:17: -> ^( FunctionTest p_FunctionTest )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1343:20: ^( FunctionTest p_FunctionTest )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(FunctionTest, \"FunctionTest\"), root_1);\n\n                        this.adaptor.addChild(root_1, stream_p_FunctionTest.nextTree());\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1344:11: p_AtomicOrUnionType\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AtomicOrUnionType_in_p_ItemType10098);\n                    p_AtomicOrUnionType467=this.p_AtomicOrUnionType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AtomicOrUnionType467.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1345:11: p_ParenthesizedItemType\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ParenthesizedItemType_in_p_ItemType10110);\n                    p_ParenthesizedItemType468=this.p_ParenthesizedItemType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ParenthesizedItemType468.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1346:11: p_JSONTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONTest_in_p_ItemType10122);\n                    p_JSONTest469=this.p_JSONTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONTest469.getTree());\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1347:11: p_StructuredItemTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_StructuredItemTest_in_p_ItemType10134);\n                    p_StructuredItemTest470=this.p_StructuredItemTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StructuredItemTest470.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONTest_return: (function() {\n        XQueryParser.p_JSONTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1350:1: p_JSONTest : ( p_JSONItemTest | p_JSONObjectTest | p_JSONArrayTest );\n    // $ANTLR start \"p_JSONTest\"\n    p_JSONTest: function() {\n        var retval = new XQueryParser.p_JSONTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_JSONItemTest471 = null;\n         var p_JSONObjectTest472 = null;\n         var p_JSONArrayTest473 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1351:9: ( p_JSONItemTest | p_JSONObjectTest | p_JSONArrayTest )\n            var alt173=3;\n            switch ( this.input.LA(1) ) {\n            case JSON_ITEM:\n                alt173=1;\n                break;\n            case OBJECT:\n                alt173=2;\n                break;\n            case ARRAY:\n                alt173=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 173, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt173) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1351:11: p_JSONItemTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONItemTest_in_p_JSONTest10159);\n                    p_JSONItemTest471=this.p_JSONItemTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONItemTest471.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1352:11: p_JSONObjectTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONObjectTest_in_p_JSONTest10171);\n                    p_JSONObjectTest472=this.p_JSONObjectTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONObjectTest472.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1353:11: p_JSONArrayTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONArrayTest_in_p_JSONTest10183);\n                    p_JSONArrayTest473=this.p_JSONArrayTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONArrayTest473.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_StructuredItemTest_return: (function() {\n        XQueryParser.p_StructuredItemTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_StructuredItemTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1356:1: p_StructuredItemTest : STRUCTURED_ITEM LPAREN RPAREN ;\n    // $ANTLR start \"p_StructuredItemTest\"\n    p_StructuredItemTest: function() {\n        var retval = new XQueryParser.p_StructuredItemTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var STRUCTURED_ITEM474 = null;\n        var LPAREN475 = null;\n        var RPAREN476 = null;\n\n        var STRUCTURED_ITEM474_tree=null;\n        var LPAREN475_tree=null;\n        var RPAREN476_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1357:9: ( STRUCTURED_ITEM LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1357:11: STRUCTURED_ITEM LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            STRUCTURED_ITEM474=this.match(this.input,STRUCTURED_ITEM,XQueryParser.FOLLOW_STRUCTURED_ITEM_in_p_StructuredItemTest10208); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            STRUCTURED_ITEM474_tree = this.adaptor.create(STRUCTURED_ITEM474);\n            this.adaptor.addChild(root_0, STRUCTURED_ITEM474_tree);\n            }\n            LPAREN475=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_StructuredItemTest10210); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN475_tree = this.adaptor.create(LPAREN475);\n            this.adaptor.addChild(root_0, LPAREN475_tree);\n            }\n            RPAREN476=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_StructuredItemTest10212); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN476_tree = this.adaptor.create(RPAREN476);\n            this.adaptor.addChild(root_0, RPAREN476_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONItemTest_return: (function() {\n        XQueryParser.p_JSONItemTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONItemTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1360:1: p_JSONItemTest : JSON_ITEM LPAREN RPAREN ;\n    // $ANTLR start \"p_JSONItemTest\"\n    p_JSONItemTest: function() {\n        var retval = new XQueryParser.p_JSONItemTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var JSON_ITEM477 = null;\n        var LPAREN478 = null;\n        var RPAREN479 = null;\n\n        var JSON_ITEM477_tree=null;\n        var LPAREN478_tree=null;\n        var RPAREN479_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1361:9: ( JSON_ITEM LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1361:11: JSON_ITEM LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            JSON_ITEM477=this.match(this.input,JSON_ITEM,XQueryParser.FOLLOW_JSON_ITEM_in_p_JSONItemTest10237); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            JSON_ITEM477_tree = this.adaptor.create(JSON_ITEM477);\n            this.adaptor.addChild(root_0, JSON_ITEM477_tree);\n            }\n            LPAREN478=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_JSONItemTest10239); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN478_tree = this.adaptor.create(LPAREN478);\n            this.adaptor.addChild(root_0, LPAREN478_tree);\n            }\n            RPAREN479=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_JSONItemTest10241); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN479_tree = this.adaptor.create(RPAREN479);\n            this.adaptor.addChild(root_0, RPAREN479_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONObjectTest_return: (function() {\n        XQueryParser.p_JSONObjectTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONObjectTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1364:1: p_JSONObjectTest : OBJECT LPAREN RPAREN ;\n    // $ANTLR start \"p_JSONObjectTest\"\n    p_JSONObjectTest: function() {\n        var retval = new XQueryParser.p_JSONObjectTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var OBJECT480 = null;\n        var LPAREN481 = null;\n        var RPAREN482 = null;\n\n        var OBJECT480_tree=null;\n        var LPAREN481_tree=null;\n        var RPAREN482_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1365:9: ( OBJECT LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1365:11: OBJECT LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            OBJECT480=this.match(this.input,OBJECT,XQueryParser.FOLLOW_OBJECT_in_p_JSONObjectTest10266); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            OBJECT480_tree = this.adaptor.create(OBJECT480);\n            this.adaptor.addChild(root_0, OBJECT480_tree);\n            }\n            LPAREN481=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_JSONObjectTest10268); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN481_tree = this.adaptor.create(LPAREN481);\n            this.adaptor.addChild(root_0, LPAREN481_tree);\n            }\n            RPAREN482=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_JSONObjectTest10270); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN482_tree = this.adaptor.create(RPAREN482);\n            this.adaptor.addChild(root_0, RPAREN482_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONArrayTest_return: (function() {\n        XQueryParser.p_JSONArrayTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONArrayTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1368:1: p_JSONArrayTest : ARRAY LPAREN RPAREN ;\n    // $ANTLR start \"p_JSONArrayTest\"\n    p_JSONArrayTest: function() {\n        var retval = new XQueryParser.p_JSONArrayTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ARRAY483 = null;\n        var LPAREN484 = null;\n        var RPAREN485 = null;\n\n        var ARRAY483_tree=null;\n        var LPAREN484_tree=null;\n        var RPAREN485_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1369:9: ( ARRAY LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1369:11: ARRAY LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            ARRAY483=this.match(this.input,ARRAY,XQueryParser.FOLLOW_ARRAY_in_p_JSONArrayTest10295); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            ARRAY483_tree = this.adaptor.create(ARRAY483);\n            this.adaptor.addChild(root_0, ARRAY483_tree);\n            }\n            LPAREN484=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_JSONArrayTest10297); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN484_tree = this.adaptor.create(LPAREN484);\n            this.adaptor.addChild(root_0, LPAREN484_tree);\n            }\n            RPAREN485=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_JSONArrayTest10299); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN485_tree = this.adaptor.create(RPAREN485);\n            this.adaptor.addChild(root_0, RPAREN485_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AtomicOrUnionType_return: (function() {\n        XQueryParser.p_AtomicOrUnionType_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AtomicOrUnionType_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1373:1: p_AtomicOrUnionType : p_EQName -> ^( AtomicOrUnionType p_EQName ) ;\n    // $ANTLR start \"p_AtomicOrUnionType\"\n    p_AtomicOrUnionType: function() {\n        var retval = new XQueryParser.p_AtomicOrUnionType_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName486 = null;\n\n        var stream_p_EQName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_EQName\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1374:9: ( p_EQName -> ^( AtomicOrUnionType p_EQName ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1374:11: p_EQName\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_AtomicOrUnionType10325);\n            p_EQName486=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_EQName.add(p_EQName486.getTree());\n\n\n            // AST REWRITE\n            // elements: p_EQName\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 1375:17: -> ^( AtomicOrUnionType p_EQName )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1375:20: ^( AtomicOrUnionType p_EQName )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(AtomicOrUnionType, \"AtomicOrUnionType\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_p_EQName.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_KindTest_return: (function() {\n        XQueryParser.p_KindTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_KindTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1379:1: p_KindTest : ( p_DocumentTest | p_ElementTest | p_AttributeTest | p_SchemaElementTest | p_SchemaAttributeTest | p_PITest | p_CommentTest | p_TextTest | p_NamespaceNodeTest | p_AnyKindTest );\n    // $ANTLR start \"p_KindTest\"\n    p_KindTest: function() {\n        var retval = new XQueryParser.p_KindTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_DocumentTest487 = null;\n         var p_ElementTest488 = null;\n         var p_AttributeTest489 = null;\n         var p_SchemaElementTest490 = null;\n         var p_SchemaAttributeTest491 = null;\n         var p_PITest492 = null;\n         var p_CommentTest493 = null;\n         var p_TextTest494 = null;\n         var p_NamespaceNodeTest495 = null;\n         var p_AnyKindTest496 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1380:9: ( p_DocumentTest | p_ElementTest | p_AttributeTest | p_SchemaElementTest | p_SchemaAttributeTest | p_PITest | p_CommentTest | p_TextTest | p_NamespaceNodeTest | p_AnyKindTest )\n            var alt174=10;\n            switch ( this.input.LA(1) ) {\n            case DOCUMENT_NODE:\n                alt174=1;\n                break;\n            case ELEMENT:\n                alt174=2;\n                break;\n            case ATTRIBUTE:\n                alt174=3;\n                break;\n            case SCHEMA_ELEMENT:\n                alt174=4;\n                break;\n            case SCHEMA_ATTRIBUTE:\n                alt174=5;\n                break;\n            case PROCESSING_INSTRUCTION:\n                alt174=6;\n                break;\n            case COMMENT:\n                alt174=7;\n                break;\n            case TEXT:\n                alt174=8;\n                break;\n            case NAMESPACE_NODE:\n                alt174=9;\n                break;\n            case NODE:\n                alt174=10;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 174, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt174) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1380:11: p_DocumentTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_DocumentTest_in_p_KindTest10375);\n                    p_DocumentTest487=this.p_DocumentTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DocumentTest487.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1381:11: p_ElementTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ElementTest_in_p_KindTest10387);\n                    p_ElementTest488=this.p_ElementTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ElementTest488.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1382:11: p_AttributeTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AttributeTest_in_p_KindTest10399);\n                    p_AttributeTest489=this.p_AttributeTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AttributeTest489.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1383:11: p_SchemaElementTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_SchemaElementTest_in_p_KindTest10411);\n                    p_SchemaElementTest490=this.p_SchemaElementTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SchemaElementTest490.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1384:11: p_SchemaAttributeTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_SchemaAttributeTest_in_p_KindTest10423);\n                    p_SchemaAttributeTest491=this.p_SchemaAttributeTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SchemaAttributeTest491.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1385:11: p_PITest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_PITest_in_p_KindTest10435);\n                    p_PITest492=this.p_PITest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PITest492.getTree());\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1386:11: p_CommentTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_CommentTest_in_p_KindTest10447);\n                    p_CommentTest493=this.p_CommentTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CommentTest493.getTree());\n\n\n                    break;\n                case 8 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1387:11: p_TextTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_TextTest_in_p_KindTest10459);\n                    p_TextTest494=this.p_TextTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TextTest494.getTree());\n\n\n                    break;\n                case 9 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1388:11: p_NamespaceNodeTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_NamespaceNodeTest_in_p_KindTest10471);\n                    p_NamespaceNodeTest495=this.p_NamespaceNodeTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NamespaceNodeTest495.getTree());\n\n\n                    break;\n                case 10 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1389:11: p_AnyKindTest\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AnyKindTest_in_p_KindTest10483);\n                    p_AnyKindTest496=this.p_AnyKindTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AnyKindTest496.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AnyKindTest_return: (function() {\n        XQueryParser.p_AnyKindTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AnyKindTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1393:1: p_AnyKindTest : NODE LPAREN RPAREN ;\n    // $ANTLR start \"p_AnyKindTest\"\n    p_AnyKindTest: function() {\n        var retval = new XQueryParser.p_AnyKindTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var NODE497 = null;\n        var LPAREN498 = null;\n        var RPAREN499 = null;\n\n        var NODE497_tree=null;\n        var LPAREN498_tree=null;\n        var RPAREN499_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1394:9: ( NODE LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1394:11: NODE LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            NODE497=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_AnyKindTest10509); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            NODE497_tree = this.adaptor.create(NODE497);\n            this.adaptor.addChild(root_0, NODE497_tree);\n            }\n            LPAREN498=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_AnyKindTest10511); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN498_tree = this.adaptor.create(LPAREN498);\n            this.adaptor.addChild(root_0, LPAREN498_tree);\n            }\n            RPAREN499=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_AnyKindTest10513); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN499_tree = this.adaptor.create(RPAREN499);\n            this.adaptor.addChild(root_0, RPAREN499_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DocumentTest_return: (function() {\n        XQueryParser.p_DocumentTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DocumentTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1398:1: p_DocumentTest : DOCUMENT_NODE LPAREN ( p_ElementTest | p_SchemaElementTest )? RPAREN ;\n    // $ANTLR start \"p_DocumentTest\"\n    p_DocumentTest: function() {\n        var retval = new XQueryParser.p_DocumentTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var DOCUMENT_NODE500 = null;\n        var LPAREN501 = null;\n        var RPAREN504 = null;\n         var p_ElementTest502 = null;\n         var p_SchemaElementTest503 = null;\n\n        var DOCUMENT_NODE500_tree=null;\n        var LPAREN501_tree=null;\n        var RPAREN504_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1399:9: ( DOCUMENT_NODE LPAREN ( p_ElementTest | p_SchemaElementTest )? RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1399:11: DOCUMENT_NODE LPAREN ( p_ElementTest | p_SchemaElementTest )? RPAREN\n            root_0 = this.adaptor.nil();\n\n            DOCUMENT_NODE500=this.match(this.input,DOCUMENT_NODE,XQueryParser.FOLLOW_DOCUMENT_NODE_in_p_DocumentTest10539); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            DOCUMENT_NODE500_tree = this.adaptor.create(DOCUMENT_NODE500);\n            this.adaptor.addChild(root_0, DOCUMENT_NODE500_tree);\n            }\n            LPAREN501=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_DocumentTest10541); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN501_tree = this.adaptor.create(LPAREN501);\n            this.adaptor.addChild(root_0, LPAREN501_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1399:32: ( p_ElementTest | p_SchemaElementTest )?\n            var alt175=3;\n            var LA175_0 = this.input.LA(1);\n\n            if ( (LA175_0==ELEMENT) ) {\n                alt175=1;\n            }\n            else if ( (LA175_0==SCHEMA_ELEMENT) ) {\n                alt175=2;\n            }\n            switch (alt175) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1399:33: p_ElementTest\n                    this.pushFollow(XQueryParser.FOLLOW_p_ElementTest_in_p_DocumentTest10544);\n                    p_ElementTest502=this.p_ElementTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ElementTest502.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1399:49: p_SchemaElementTest\n                    this.pushFollow(XQueryParser.FOLLOW_p_SchemaElementTest_in_p_DocumentTest10548);\n                    p_SchemaElementTest503=this.p_SchemaElementTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SchemaElementTest503.getTree());\n\n\n                    break;\n\n            }\n\n            RPAREN504=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_DocumentTest10552); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN504_tree = this.adaptor.create(RPAREN504);\n            this.adaptor.addChild(root_0, RPAREN504_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TextTest_return: (function() {\n        XQueryParser.p_TextTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TextTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1403:1: p_TextTest : TEXT LPAREN RPAREN ;\n    // $ANTLR start \"p_TextTest\"\n    p_TextTest: function() {\n        var retval = new XQueryParser.p_TextTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var TEXT505 = null;\n        var LPAREN506 = null;\n        var RPAREN507 = null;\n\n        var TEXT505_tree=null;\n        var LPAREN506_tree=null;\n        var RPAREN507_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1404:9: ( TEXT LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1404:11: TEXT LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            TEXT505=this.match(this.input,TEXT,XQueryParser.FOLLOW_TEXT_in_p_TextTest10578); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            TEXT505_tree = this.adaptor.create(TEXT505);\n            this.adaptor.addChild(root_0, TEXT505_tree);\n            }\n            LPAREN506=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_TextTest10580); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN506_tree = this.adaptor.create(LPAREN506);\n            this.adaptor.addChild(root_0, LPAREN506_tree);\n            }\n            RPAREN507=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_TextTest10582); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN507_tree = this.adaptor.create(RPAREN507);\n            this.adaptor.addChild(root_0, RPAREN507_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CommentTest_return: (function() {\n        XQueryParser.p_CommentTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CommentTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1408:1: p_CommentTest : COMMENT LPAREN RPAREN ;\n    // $ANTLR start \"p_CommentTest\"\n    p_CommentTest: function() {\n        var retval = new XQueryParser.p_CommentTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var COMMENT508 = null;\n        var LPAREN509 = null;\n        var RPAREN510 = null;\n\n        var COMMENT508_tree=null;\n        var LPAREN509_tree=null;\n        var RPAREN510_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1409:9: ( COMMENT LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1409:11: COMMENT LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            COMMENT508=this.match(this.input,COMMENT,XQueryParser.FOLLOW_COMMENT_in_p_CommentTest10608); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            COMMENT508_tree = this.adaptor.create(COMMENT508);\n            this.adaptor.addChild(root_0, COMMENT508_tree);\n            }\n            LPAREN509=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_CommentTest10610); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN509_tree = this.adaptor.create(LPAREN509);\n            this.adaptor.addChild(root_0, LPAREN509_tree);\n            }\n            RPAREN510=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_CommentTest10612); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN510_tree = this.adaptor.create(RPAREN510);\n            this.adaptor.addChild(root_0, RPAREN510_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NamespaceNodeTest_return: (function() {\n        XQueryParser.p_NamespaceNodeTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NamespaceNodeTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1413:1: p_NamespaceNodeTest : NAMESPACE_NODE LPAREN RPAREN ;\n    // $ANTLR start \"p_NamespaceNodeTest\"\n    p_NamespaceNodeTest: function() {\n        var retval = new XQueryParser.p_NamespaceNodeTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var NAMESPACE_NODE511 = null;\n        var LPAREN512 = null;\n        var RPAREN513 = null;\n\n        var NAMESPACE_NODE511_tree=null;\n        var LPAREN512_tree=null;\n        var RPAREN513_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1414:9: ( NAMESPACE_NODE LPAREN RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1414:11: NAMESPACE_NODE LPAREN RPAREN\n            root_0 = this.adaptor.nil();\n\n            NAMESPACE_NODE511=this.match(this.input,NAMESPACE_NODE,XQueryParser.FOLLOW_NAMESPACE_NODE_in_p_NamespaceNodeTest10638); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            NAMESPACE_NODE511_tree = this.adaptor.create(NAMESPACE_NODE511);\n            this.adaptor.addChild(root_0, NAMESPACE_NODE511_tree);\n            }\n            LPAREN512=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_NamespaceNodeTest10640); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN512_tree = this.adaptor.create(LPAREN512);\n            this.adaptor.addChild(root_0, LPAREN512_tree);\n            }\n            RPAREN513=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_NamespaceNodeTest10642); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN513_tree = this.adaptor.create(RPAREN513);\n            this.adaptor.addChild(root_0, RPAREN513_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_PITest_return: (function() {\n        XQueryParser.p_PITest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_PITest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1418:1: p_PITest : PROCESSING_INSTRUCTION LPAREN ( p_NCName | p_StringLiteral )? RPAREN ;\n    // $ANTLR start \"p_PITest\"\n    p_PITest: function() {\n        var retval = new XQueryParser.p_PITest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var PROCESSING_INSTRUCTION514 = null;\n        var LPAREN515 = null;\n        var RPAREN518 = null;\n         var p_NCName516 = null;\n         var p_StringLiteral517 = null;\n\n        var PROCESSING_INSTRUCTION514_tree=null;\n        var LPAREN515_tree=null;\n        var RPAREN518_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1419:9: ( PROCESSING_INSTRUCTION LPAREN ( p_NCName | p_StringLiteral )? RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1419:11: PROCESSING_INSTRUCTION LPAREN ( p_NCName | p_StringLiteral )? RPAREN\n            root_0 = this.adaptor.nil();\n\n            PROCESSING_INSTRUCTION514=this.match(this.input,PROCESSING_INSTRUCTION,XQueryParser.FOLLOW_PROCESSING_INSTRUCTION_in_p_PITest10668); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            PROCESSING_INSTRUCTION514_tree = this.adaptor.create(PROCESSING_INSTRUCTION514);\n            this.adaptor.addChild(root_0, PROCESSING_INSTRUCTION514_tree);\n            }\n            LPAREN515=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_PITest10670); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN515_tree = this.adaptor.create(LPAREN515);\n            this.adaptor.addChild(root_0, LPAREN515_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1419:41: ( p_NCName | p_StringLiteral )?\n            var alt176=3;\n            var LA176_0 = this.input.LA(1);\n\n            if ( ((LA176_0>=ANCESTOR && LA176_0<=SKIP)||(LA176_0>=VALUE && LA176_0<=QUOT_ER)||LA176_0==L_NCName) ) {\n                alt176=1;\n            }\n            else if ( ((LA176_0>=APOS && LA176_0<=QUOT)) ) {\n                alt176=2;\n            }\n            switch (alt176) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1419:42: p_NCName\n                    this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_PITest10673);\n                    p_NCName516=this.p_NCName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NCName516.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1419:53: p_StringLiteral\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_PITest10677);\n                    p_StringLiteral517=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral517.getTree());\n\n\n                    break;\n\n            }\n\n            RPAREN518=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_PITest10681); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN518_tree = this.adaptor.create(RPAREN518);\n            this.adaptor.addChild(root_0, RPAREN518_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AttributeTest_return: (function() {\n        XQueryParser.p_AttributeTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AttributeTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1423:1: p_AttributeTest : ATTRIBUTE LPAREN ( p_AttribNameOrWildcard ( COMMA p_TypeName )? )? RPAREN ;\n    // $ANTLR start \"p_AttributeTest\"\n    p_AttributeTest: function() {\n        var retval = new XQueryParser.p_AttributeTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ATTRIBUTE519 = null;\n        var LPAREN520 = null;\n        var COMMA522 = null;\n        var RPAREN524 = null;\n         var p_AttribNameOrWildcard521 = null;\n         var p_TypeName523 = null;\n\n        var ATTRIBUTE519_tree=null;\n        var LPAREN520_tree=null;\n        var COMMA522_tree=null;\n        var RPAREN524_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1424:9: ( ATTRIBUTE LPAREN ( p_AttribNameOrWildcard ( COMMA p_TypeName )? )? RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1424:11: ATTRIBUTE LPAREN ( p_AttribNameOrWildcard ( COMMA p_TypeName )? )? RPAREN\n            root_0 = this.adaptor.nil();\n\n            ATTRIBUTE519=this.match(this.input,ATTRIBUTE,XQueryParser.FOLLOW_ATTRIBUTE_in_p_AttributeTest10707); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            ATTRIBUTE519_tree = this.adaptor.create(ATTRIBUTE519);\n            this.adaptor.addChild(root_0, ATTRIBUTE519_tree);\n            }\n            LPAREN520=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_AttributeTest10709); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN520_tree = this.adaptor.create(LPAREN520);\n            this.adaptor.addChild(root_0, LPAREN520_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1424:28: ( p_AttribNameOrWildcard ( COMMA p_TypeName )? )?\n            var alt178=2;\n            var LA178_0 = this.input.LA(1);\n\n            if ( ((LA178_0>=ANCESTOR && LA178_0<=SKIP)||(LA178_0>=VALUE && LA178_0<=QUOT_ER)||LA178_0==STAR||LA178_0==Q||LA178_0==L_NCName) ) {\n                alt178=1;\n            }\n            switch (alt178) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1424:29: p_AttribNameOrWildcard ( COMMA p_TypeName )?\n                    this.pushFollow(XQueryParser.FOLLOW_p_AttribNameOrWildcard_in_p_AttributeTest10712);\n                    p_AttribNameOrWildcard521=this.p_AttribNameOrWildcard();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AttribNameOrWildcard521.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1424:52: ( COMMA p_TypeName )?\n                    var alt177=2;\n                    var LA177_0 = this.input.LA(1);\n\n                    if ( (LA177_0==COMMA) ) {\n                        alt177=1;\n                    }\n                    switch (alt177) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1424:53: COMMA p_TypeName\n                            COMMA522=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_AttributeTest10715); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COMMA522_tree = this.adaptor.create(COMMA522);\n                            this.adaptor.addChild(root_0, COMMA522_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_TypeName_in_p_AttributeTest10717);\n                            p_TypeName523=this.p_TypeName();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeName523.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n\n            }\n\n            RPAREN524=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_AttributeTest10723); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN524_tree = this.adaptor.create(RPAREN524);\n            this.adaptor.addChild(root_0, RPAREN524_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AttribNameOrWildcard_return: (function() {\n        XQueryParser.p_AttribNameOrWildcard_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AttribNameOrWildcard_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1428:1: p_AttribNameOrWildcard : ( p_AttributeName | STAR );\n    // $ANTLR start \"p_AttribNameOrWildcard\"\n    p_AttribNameOrWildcard: function() {\n        var retval = new XQueryParser.p_AttribNameOrWildcard_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var STAR526 = null;\n         var p_AttributeName525 = null;\n\n        var STAR526_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1429:9: ( p_AttributeName | STAR )\n            var alt179=2;\n            var LA179_0 = this.input.LA(1);\n\n            if ( ((LA179_0>=ANCESTOR && LA179_0<=SKIP)||(LA179_0>=VALUE && LA179_0<=QUOT_ER)||LA179_0==Q||LA179_0==L_NCName) ) {\n                alt179=1;\n            }\n            else if ( (LA179_0==STAR) ) {\n                alt179=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 179, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt179) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1429:11: p_AttributeName\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AttributeName_in_p_AttribNameOrWildcard10751);\n                    p_AttributeName525=this.p_AttributeName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AttributeName525.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1429:29: STAR\n                    root_0 = this.adaptor.nil();\n\n                    STAR526=this.match(this.input,STAR,XQueryParser.FOLLOW_STAR_in_p_AttribNameOrWildcard10755); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    STAR526_tree = this.adaptor.create(STAR526);\n                    this.adaptor.addChild(root_0, STAR526_tree);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SchemaAttributeTest_return: (function() {\n        XQueryParser.p_SchemaAttributeTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SchemaAttributeTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1433:1: p_SchemaAttributeTest : SCHEMA_ATTRIBUTE LPAREN p_AttributeDeclaration RPAREN ;\n    // $ANTLR start \"p_SchemaAttributeTest\"\n    p_SchemaAttributeTest: function() {\n        var retval = new XQueryParser.p_SchemaAttributeTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SCHEMA_ATTRIBUTE527 = null;\n        var LPAREN528 = null;\n        var RPAREN530 = null;\n         var p_AttributeDeclaration529 = null;\n\n        var SCHEMA_ATTRIBUTE527_tree=null;\n        var LPAREN528_tree=null;\n        var RPAREN530_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1434:9: ( SCHEMA_ATTRIBUTE LPAREN p_AttributeDeclaration RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1434:11: SCHEMA_ATTRIBUTE LPAREN p_AttributeDeclaration RPAREN\n            root_0 = this.adaptor.nil();\n\n            SCHEMA_ATTRIBUTE527=this.match(this.input,SCHEMA_ATTRIBUTE,XQueryParser.FOLLOW_SCHEMA_ATTRIBUTE_in_p_SchemaAttributeTest10781); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SCHEMA_ATTRIBUTE527_tree = this.adaptor.create(SCHEMA_ATTRIBUTE527);\n            this.adaptor.addChild(root_0, SCHEMA_ATTRIBUTE527_tree);\n            }\n            LPAREN528=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_SchemaAttributeTest10783); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN528_tree = this.adaptor.create(LPAREN528);\n            this.adaptor.addChild(root_0, LPAREN528_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_AttributeDeclaration_in_p_SchemaAttributeTest10785);\n            p_AttributeDeclaration529=this.p_AttributeDeclaration();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AttributeDeclaration529.getTree());\n            RPAREN530=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_SchemaAttributeTest10787); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN530_tree = this.adaptor.create(RPAREN530);\n            this.adaptor.addChild(root_0, RPAREN530_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AttributeDeclaration_return: (function() {\n        XQueryParser.p_AttributeDeclaration_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AttributeDeclaration_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1438:1: p_AttributeDeclaration : p_AttributeName ;\n    // $ANTLR start \"p_AttributeDeclaration\"\n    p_AttributeDeclaration: function() {\n        var retval = new XQueryParser.p_AttributeDeclaration_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_AttributeName531 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1439:9: ( p_AttributeName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1439:11: p_AttributeName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_AttributeName_in_p_AttributeDeclaration10813);\n            p_AttributeName531=this.p_AttributeName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AttributeName531.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ElementTest_return: (function() {\n        XQueryParser.p_ElementTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ElementTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1443:1: p_ElementTest : ELEMENT LPAREN ( p_ElementNameOrWildcard ( COMMA p_TypeName ( QUESTION )? )? )? RPAREN ;\n    // $ANTLR start \"p_ElementTest\"\n    p_ElementTest: function() {\n        var retval = new XQueryParser.p_ElementTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ELEMENT532 = null;\n        var LPAREN533 = null;\n        var COMMA535 = null;\n        var QUESTION537 = null;\n        var RPAREN538 = null;\n         var p_ElementNameOrWildcard534 = null;\n         var p_TypeName536 = null;\n\n        var ELEMENT532_tree=null;\n        var LPAREN533_tree=null;\n        var COMMA535_tree=null;\n        var QUESTION537_tree=null;\n        var RPAREN538_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:9: ( ELEMENT LPAREN ( p_ElementNameOrWildcard ( COMMA p_TypeName ( QUESTION )? )? )? RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:11: ELEMENT LPAREN ( p_ElementNameOrWildcard ( COMMA p_TypeName ( QUESTION )? )? )? RPAREN\n            root_0 = this.adaptor.nil();\n\n            ELEMENT532=this.match(this.input,ELEMENT,XQueryParser.FOLLOW_ELEMENT_in_p_ElementTest10839); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            ELEMENT532_tree = this.adaptor.create(ELEMENT532);\n            this.adaptor.addChild(root_0, ELEMENT532_tree);\n            }\n            LPAREN533=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_ElementTest10841); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN533_tree = this.adaptor.create(LPAREN533);\n            this.adaptor.addChild(root_0, LPAREN533_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:26: ( p_ElementNameOrWildcard ( COMMA p_TypeName ( QUESTION )? )? )?\n            var alt182=2;\n            var LA182_0 = this.input.LA(1);\n\n            if ( ((LA182_0>=ANCESTOR && LA182_0<=SKIP)||(LA182_0>=VALUE && LA182_0<=QUOT_ER)||LA182_0==STAR||LA182_0==Q||LA182_0==L_NCName) ) {\n                alt182=1;\n            }\n            switch (alt182) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:27: p_ElementNameOrWildcard ( COMMA p_TypeName ( QUESTION )? )?\n                    this.pushFollow(XQueryParser.FOLLOW_p_ElementNameOrWildcard_in_p_ElementTest10844);\n                    p_ElementNameOrWildcard534=this.p_ElementNameOrWildcard();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ElementNameOrWildcard534.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:51: ( COMMA p_TypeName ( QUESTION )? )?\n                    var alt181=2;\n                    var LA181_0 = this.input.LA(1);\n\n                    if ( (LA181_0==COMMA) ) {\n                        alt181=1;\n                    }\n                    switch (alt181) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:52: COMMA p_TypeName ( QUESTION )?\n                            COMMA535=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_ElementTest10847); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COMMA535_tree = this.adaptor.create(COMMA535);\n                            this.adaptor.addChild(root_0, COMMA535_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_TypeName_in_p_ElementTest10849);\n                            p_TypeName536=this.p_TypeName();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeName536.getTree());\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:69: ( QUESTION )?\n                            var alt180=2;\n                            var LA180_0 = this.input.LA(1);\n\n                            if ( (LA180_0==QUESTION) ) {\n                                alt180=1;\n                            }\n                            switch (alt180) {\n                                case 1 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1444:69: QUESTION\n                                    QUESTION537=this.match(this.input,QUESTION,XQueryParser.FOLLOW_QUESTION_in_p_ElementTest10851); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    QUESTION537_tree = this.adaptor.create(QUESTION537);\n                                    this.adaptor.addChild(root_0, QUESTION537_tree);\n                                    }\n\n\n                                    break;\n\n                            }\n\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n\n            }\n\n            RPAREN538=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_ElementTest10858); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN538_tree = this.adaptor.create(RPAREN538);\n            this.adaptor.addChild(root_0, RPAREN538_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ElementNameOrWildcard_return: (function() {\n        XQueryParser.p_ElementNameOrWildcard_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ElementNameOrWildcard_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1448:1: p_ElementNameOrWildcard : ( p_EQName | STAR );\n    // $ANTLR start \"p_ElementNameOrWildcard\"\n    p_ElementNameOrWildcard: function() {\n        var retval = new XQueryParser.p_ElementNameOrWildcard_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var STAR540 = null;\n         var p_EQName539 = null;\n\n        var STAR540_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1449:9: ( p_EQName | STAR )\n            var alt183=2;\n            var LA183_0 = this.input.LA(1);\n\n            if ( ((LA183_0>=ANCESTOR && LA183_0<=SKIP)||(LA183_0>=VALUE && LA183_0<=QUOT_ER)||LA183_0==Q||LA183_0==L_NCName) ) {\n                alt183=1;\n            }\n            else if ( (LA183_0==STAR) ) {\n                alt183=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 183, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt183) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1449:11: p_EQName\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_ElementNameOrWildcard10884);\n                    p_EQName539=this.p_EQName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName539.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1449:22: STAR\n                    root_0 = this.adaptor.nil();\n\n                    STAR540=this.match(this.input,STAR,XQueryParser.FOLLOW_STAR_in_p_ElementNameOrWildcard10888); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    STAR540_tree = this.adaptor.create(STAR540);\n                    this.adaptor.addChild(root_0, STAR540_tree);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SchemaElementTest_return: (function() {\n        XQueryParser.p_SchemaElementTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SchemaElementTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1452:1: p_SchemaElementTest : SCHEMA_ELEMENT LPAREN p_ElementDeclaration RPAREN ;\n    // $ANTLR start \"p_SchemaElementTest\"\n    p_SchemaElementTest: function() {\n        var retval = new XQueryParser.p_SchemaElementTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SCHEMA_ELEMENT541 = null;\n        var LPAREN542 = null;\n        var RPAREN544 = null;\n         var p_ElementDeclaration543 = null;\n\n        var SCHEMA_ELEMENT541_tree=null;\n        var LPAREN542_tree=null;\n        var RPAREN544_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1453:9: ( SCHEMA_ELEMENT LPAREN p_ElementDeclaration RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1453:11: SCHEMA_ELEMENT LPAREN p_ElementDeclaration RPAREN\n            root_0 = this.adaptor.nil();\n\n            SCHEMA_ELEMENT541=this.match(this.input,SCHEMA_ELEMENT,XQueryParser.FOLLOW_SCHEMA_ELEMENT_in_p_SchemaElementTest10906); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SCHEMA_ELEMENT541_tree = this.adaptor.create(SCHEMA_ELEMENT541);\n            this.adaptor.addChild(root_0, SCHEMA_ELEMENT541_tree);\n            }\n            LPAREN542=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_SchemaElementTest10908); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN542_tree = this.adaptor.create(LPAREN542);\n            this.adaptor.addChild(root_0, LPAREN542_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ElementDeclaration_in_p_SchemaElementTest10910);\n            p_ElementDeclaration543=this.p_ElementDeclaration();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ElementDeclaration543.getTree());\n            RPAREN544=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_SchemaElementTest10912); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN544_tree = this.adaptor.create(RPAREN544);\n            this.adaptor.addChild(root_0, RPAREN544_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ElementDeclaration_return: (function() {\n        XQueryParser.p_ElementDeclaration_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ElementDeclaration_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1457:1: p_ElementDeclaration : p_ElementName ;\n    // $ANTLR start \"p_ElementDeclaration\"\n    p_ElementDeclaration: function() {\n        var retval = new XQueryParser.p_ElementDeclaration_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ElementName545 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1458:9: ( p_ElementName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1458:11: p_ElementName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ElementName_in_p_ElementDeclaration10938);\n            p_ElementName545=this.p_ElementName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ElementName545.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AttributeName_return: (function() {\n        XQueryParser.p_AttributeName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AttributeName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1462:1: p_AttributeName : p_EQName ;\n    // $ANTLR start \"p_AttributeName\"\n    p_AttributeName: function() {\n        var retval = new XQueryParser.p_AttributeName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName546 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1463:9: ( p_EQName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1463:11: p_EQName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_AttributeName10964);\n            p_EQName546=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName546.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ElementName_return: (function() {\n        XQueryParser.p_ElementName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ElementName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1467:1: p_ElementName : p_EQName ;\n    // $ANTLR start \"p_ElementName\"\n    p_ElementName: function() {\n        var retval = new XQueryParser.p_ElementName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName547 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1468:9: ( p_EQName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1468:11: p_EQName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_ElementName10990);\n            p_EQName547=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName547.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TypeName_return: (function() {\n        XQueryParser.p_TypeName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TypeName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1472:1: p_TypeName : p_EQName ;\n    // $ANTLR start \"p_TypeName\"\n    p_TypeName: function() {\n        var retval = new XQueryParser.p_TypeName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_EQName548 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1473:9: ( p_EQName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1473:11: p_EQName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_p_TypeName11016);\n            p_EQName548=this.p_EQName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_EQName548.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FunctionTest_return: (function() {\n        XQueryParser.p_FunctionTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FunctionTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1477:1: p_FunctionTest : ( p_Annotation )* ( p_AnyFunctionTest | p_TypedFunctionTest ) ;\n    // $ANTLR start \"p_FunctionTest\"\n    p_FunctionTest: function() {\n        var retval = new XQueryParser.p_FunctionTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Annotation549 = null;\n         var p_AnyFunctionTest550 = null;\n         var p_TypedFunctionTest551 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1478:9: ( ( p_Annotation )* ( p_AnyFunctionTest | p_TypedFunctionTest ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1478:11: ( p_Annotation )* ( p_AnyFunctionTest | p_TypedFunctionTest )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1478:11: ( p_Annotation )*\n            loop184:\n            do {\n                var alt184=2;\n                var LA184_0 = this.input.LA(1);\n\n                if ( (LA184_0==ANN_PERCENT) ) {\n                    alt184=1;\n                }\n\n\n                switch (alt184) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1478:11: p_Annotation\n                    this.pushFollow(XQueryParser.FOLLOW_p_Annotation_in_p_FunctionTest11042);\n                    p_Annotation549=this.p_Annotation();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Annotation549.getTree());\n\n\n                    break;\n\n                default :\n                    break loop184;\n                }\n            } while (true);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1478:25: ( p_AnyFunctionTest | p_TypedFunctionTest )\n            var alt185=2;\n            var LA185_0 = this.input.LA(1);\n\n            if ( (LA185_0==FUNCTION) ) {\n                var LA185_1 = this.input.LA(2);\n\n                if ( (LA185_1==LPAREN) ) {\n                    var LA185_2 = this.input.LA(3);\n\n                    if ( (LA185_2==STAR) ) {\n                        alt185=1;\n                    }\n                    else if ( ((LA185_2>=ANCESTOR && LA185_2<=SKIP)||(LA185_2>=VALUE && LA185_2<=QUOT_ER)||(LA185_2>=LPAREN && LA185_2<=RPAREN)||LA185_2==ANN_PERCENT||LA185_2==Q||LA185_2==L_NCName) ) {\n                        alt185=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 185, 2, this.input);\n\n                        throw nvae;\n                    }\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 185, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 185, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt185) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1478:26: p_AnyFunctionTest\n                    this.pushFollow(XQueryParser.FOLLOW_p_AnyFunctionTest_in_p_FunctionTest11046);\n                    p_AnyFunctionTest550=this.p_AnyFunctionTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AnyFunctionTest550.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1478:46: p_TypedFunctionTest\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypedFunctionTest_in_p_FunctionTest11050);\n                    p_TypedFunctionTest551=this.p_TypedFunctionTest();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypedFunctionTest551.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AnyFunctionTest_return: (function() {\n        XQueryParser.p_AnyFunctionTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AnyFunctionTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1482:1: p_AnyFunctionTest : FUNCTION LPAREN STAR RPAREN ;\n    // $ANTLR start \"p_AnyFunctionTest\"\n    p_AnyFunctionTest: function() {\n        var retval = new XQueryParser.p_AnyFunctionTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var FUNCTION552 = null;\n        var LPAREN553 = null;\n        var STAR554 = null;\n        var RPAREN555 = null;\n\n        var FUNCTION552_tree=null;\n        var LPAREN553_tree=null;\n        var STAR554_tree=null;\n        var RPAREN555_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1483:9: ( FUNCTION LPAREN STAR RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1483:11: FUNCTION LPAREN STAR RPAREN\n            root_0 = this.adaptor.nil();\n\n            FUNCTION552=this.match(this.input,FUNCTION,XQueryParser.FOLLOW_FUNCTION_in_p_AnyFunctionTest11077); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            FUNCTION552_tree = this.adaptor.create(FUNCTION552);\n            this.adaptor.addChild(root_0, FUNCTION552_tree);\n            }\n            LPAREN553=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_AnyFunctionTest11079); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN553_tree = this.adaptor.create(LPAREN553);\n            this.adaptor.addChild(root_0, LPAREN553_tree);\n            }\n            STAR554=this.match(this.input,STAR,XQueryParser.FOLLOW_STAR_in_p_AnyFunctionTest11081); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            STAR554_tree = this.adaptor.create(STAR554);\n            this.adaptor.addChild(root_0, STAR554_tree);\n            }\n            RPAREN555=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_AnyFunctionTest11083); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN555_tree = this.adaptor.create(RPAREN555);\n            this.adaptor.addChild(root_0, RPAREN555_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TypedFunctionTest_return: (function() {\n        XQueryParser.p_TypedFunctionTest_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TypedFunctionTest_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1487:1: p_TypedFunctionTest : FUNCTION LPAREN ( p_SequenceType ( COMMA p_SequenceType )* )? RPAREN AS p_SequenceType ;\n    // $ANTLR start \"p_TypedFunctionTest\"\n    p_TypedFunctionTest: function() {\n        var retval = new XQueryParser.p_TypedFunctionTest_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var FUNCTION556 = null;\n        var LPAREN557 = null;\n        var COMMA559 = null;\n        var RPAREN561 = null;\n        var AS562 = null;\n         var p_SequenceType558 = null;\n         var p_SequenceType560 = null;\n         var p_SequenceType563 = null;\n\n        var FUNCTION556_tree=null;\n        var LPAREN557_tree=null;\n        var COMMA559_tree=null;\n        var RPAREN561_tree=null;\n        var AS562_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1488:9: ( FUNCTION LPAREN ( p_SequenceType ( COMMA p_SequenceType )* )? RPAREN AS p_SequenceType )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1488:11: FUNCTION LPAREN ( p_SequenceType ( COMMA p_SequenceType )* )? RPAREN AS p_SequenceType\n            root_0 = this.adaptor.nil();\n\n            FUNCTION556=this.match(this.input,FUNCTION,XQueryParser.FOLLOW_FUNCTION_in_p_TypedFunctionTest11109); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            FUNCTION556_tree = this.adaptor.create(FUNCTION556);\n            this.adaptor.addChild(root_0, FUNCTION556_tree);\n            }\n            LPAREN557=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_TypedFunctionTest11111); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN557_tree = this.adaptor.create(LPAREN557);\n            this.adaptor.addChild(root_0, LPAREN557_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1488:27: ( p_SequenceType ( COMMA p_SequenceType )* )?\n            var alt187=2;\n            var LA187_0 = this.input.LA(1);\n\n            if ( ((LA187_0>=ANCESTOR && LA187_0<=SKIP)||(LA187_0>=VALUE && LA187_0<=QUOT_ER)||LA187_0==LPAREN||LA187_0==ANN_PERCENT||LA187_0==Q||LA187_0==L_NCName) ) {\n                alt187=1;\n            }\n            switch (alt187) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1488:28: p_SequenceType ( COMMA p_SequenceType )*\n                    this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_TypedFunctionTest11114);\n                    p_SequenceType558=this.p_SequenceType();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType558.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1488:43: ( COMMA p_SequenceType )*\n                    loop186:\n                    do {\n                        var alt186=2;\n                        var LA186_0 = this.input.LA(1);\n\n                        if ( (LA186_0==COMMA) ) {\n                            alt186=1;\n                        }\n\n\n                        switch (alt186) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1488:44: COMMA p_SequenceType\n                            COMMA559=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_TypedFunctionTest11117); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COMMA559_tree = this.adaptor.create(COMMA559);\n                            this.adaptor.addChild(root_0, COMMA559_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_TypedFunctionTest11119);\n                            p_SequenceType560=this.p_SequenceType();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType560.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop186;\n                        }\n                    } while (true);\n\n\n\n                    break;\n\n            }\n\n            RPAREN561=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_TypedFunctionTest11125); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN561_tree = this.adaptor.create(RPAREN561);\n            this.adaptor.addChild(root_0, RPAREN561_tree);\n            }\n            AS562=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_TypedFunctionTest11127); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            AS562_tree = this.adaptor.create(AS562);\n            this.adaptor.addChild(root_0, AS562_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_TypedFunctionTest11129);\n            p_SequenceType563=this.p_SequenceType();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType563.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ParenthesizedItemType_return: (function() {\n        XQueryParser.p_ParenthesizedItemType_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ParenthesizedItemType_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1492:1: p_ParenthesizedItemType : LPAREN p_ItemType RPAREN ;\n    // $ANTLR start \"p_ParenthesizedItemType\"\n    p_ParenthesizedItemType: function() {\n        var retval = new XQueryParser.p_ParenthesizedItemType_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LPAREN564 = null;\n        var RPAREN566 = null;\n         var p_ItemType565 = null;\n\n        var LPAREN564_tree=null;\n        var RPAREN566_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1493:9: ( LPAREN p_ItemType RPAREN )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1493:11: LPAREN p_ItemType RPAREN\n            root_0 = this.adaptor.nil();\n\n            LPAREN564=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_ParenthesizedItemType11155); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN564_tree = this.adaptor.create(LPAREN564);\n            this.adaptor.addChild(root_0, LPAREN564_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ItemType_in_p_ParenthesizedItemType11157);\n            p_ItemType565=this.p_ItemType();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ItemType565.getTree());\n            RPAREN566=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_ParenthesizedItemType11159); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN566_tree = this.adaptor.create(RPAREN566);\n            this.adaptor.addChild(root_0, RPAREN566_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_StringLiteral_return: (function() {\n        XQueryParser.p_StringLiteral_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_StringLiteral_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1522:1: p_StringLiteral : ( QUOT pg_QuotStringLiteralContent QUOT -> ^( StringLiteral ( pg_QuotStringLiteralContent )* ) | APOS pg_AposStringLiteralContent APOS -> ^( StringLiteral ( pg_AposStringLiteralContent )* ) );\n    // $ANTLR start \"p_StringLiteral\"\n    p_StringLiteral: function() {\n        var retval = new XQueryParser.p_StringLiteral_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var QUOT567 = null;\n        var QUOT569 = null;\n        var APOS570 = null;\n        var APOS572 = null;\n         var pg_QuotStringLiteralContent568 = null;\n         var pg_AposStringLiteralContent571 = null;\n\n        var QUOT567_tree=null;\n        var QUOT569_tree=null;\n        var APOS570_tree=null;\n        var APOS572_tree=null;\n        var stream_APOS=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token APOS\");\n        var stream_QUOT=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token QUOT\");\n        var stream_pg_QuotStringLiteralContent=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pg_QuotStringLiteralContent\");\n        var stream_pg_AposStringLiteralContent=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule pg_AposStringLiteralContent\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1523:9: ( QUOT pg_QuotStringLiteralContent QUOT -> ^( StringLiteral ( pg_QuotStringLiteralContent )* ) | APOS pg_AposStringLiteralContent APOS -> ^( StringLiteral ( pg_AposStringLiteralContent )* ) )\n            var alt188=2;\n            var LA188_0 = this.input.LA(1);\n\n            if ( (LA188_0==QUOT) ) {\n                alt188=1;\n            }\n            else if ( (LA188_0==APOS) ) {\n                alt188=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 188, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt188) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1523:11: QUOT pg_QuotStringLiteralContent QUOT\n                    QUOT567=this.match(this.input,QUOT,XQueryParser.FOLLOW_QUOT_in_p_StringLiteral11210); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_QUOT.add(QUOT567);\n\n                    if ( this.state.backtracking===0 ) {\n                       this.pushStringLexer(false);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_pg_QuotStringLiteralContent_in_p_StringLiteral11214);\n                    pg_QuotStringLiteralContent568=this.pg_QuotStringLiteralContent();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_pg_QuotStringLiteralContent.add(pg_QuotStringLiteralContent568.getTree());\n                    QUOT569=this.match(this.input,QUOT,XQueryParser.FOLLOW_QUOT_in_p_StringLiteral11216); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_QUOT.add(QUOT569);\n\n                    if ( this.state.backtracking===0 ) {\n                       this.popLexer(); \n                    }\n\n\n                    // AST REWRITE\n                    // elements: pg_QuotStringLiteralContent\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1524:17: -> ^( StringLiteral ( pg_QuotStringLiteralContent )* )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1524:20: ^( StringLiteral ( pg_QuotStringLiteralContent )* )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(StringLiteral, \"StringLiteral\"), root_1);\n\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1524:36: ( pg_QuotStringLiteralContent )*\n                        while ( stream_pg_QuotStringLiteralContent.hasNext() ) {\n                            this.adaptor.addChild(root_1, stream_pg_QuotStringLiteralContent.nextTree());\n\n                        }\n                        stream_pg_QuotStringLiteralContent.reset();\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1525:11: APOS pg_AposStringLiteralContent APOS\n                    APOS570=this.match(this.input,APOS,XQueryParser.FOLLOW_APOS_in_p_StringLiteral11255); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_APOS.add(APOS570);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.pushStringLexer(true);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_pg_AposStringLiteralContent_in_p_StringLiteral11259);\n                    pg_AposStringLiteralContent571=this.pg_AposStringLiteralContent();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_pg_AposStringLiteralContent.add(pg_AposStringLiteralContent571.getTree());\n                    APOS572=this.match(this.input,APOS,XQueryParser.FOLLOW_APOS_in_p_StringLiteral11261); if (this.state.failed) return retval; \n                    if ( this.state.backtracking===0 ) stream_APOS.add(APOS572);\n\n                    if ( this.state.backtracking===0 ) {\n                       this.popLexer(); \n                    }\n\n\n                    // AST REWRITE\n                    // elements: pg_AposStringLiteralContent\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1526:17: -> ^( StringLiteral ( pg_AposStringLiteralContent )* )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1526:20: ^( StringLiteral ( pg_AposStringLiteralContent )* )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(StringLiteral, \"StringLiteral\"), root_1);\n\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1526:36: ( pg_AposStringLiteralContent )*\n                        while ( stream_pg_AposStringLiteralContent.hasNext() ) {\n                            this.adaptor.addChild(root_1, stream_pg_AposStringLiteralContent.nextTree());\n\n                        }\n                        stream_pg_AposStringLiteralContent.reset();\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n             this.addString(retval.start, retval.stop); \n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_QuotStringLiteralContent_return: (function() {\n        XQueryParser.pg_QuotStringLiteralContent_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_QuotStringLiteralContent_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1532:1: pg_QuotStringLiteralContent : ( ESCAPE_QUOT | L_CharRef | L_PredefinedEntityRef | ~ ( QUOT | AMP ) )* ;\n    // $ANTLR start \"pg_QuotStringLiteralContent\"\n    pg_QuotStringLiteralContent: function() {\n        var retval = new XQueryParser.pg_QuotStringLiteralContent_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var set573 = null;\n\n        var set573_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1533:9: ( ( ESCAPE_QUOT | L_CharRef | L_PredefinedEntityRef | ~ ( QUOT | AMP ) )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1533:11: ( ESCAPE_QUOT | L_CharRef | L_PredefinedEntityRef | ~ ( QUOT | AMP ) )*\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1533:11: ( ESCAPE_QUOT | L_CharRef | L_PredefinedEntityRef | ~ ( QUOT | AMP ) )*\n            loop189:\n            do {\n                var alt189=2;\n                var LA189_0 = this.input.LA(1);\n\n                if ( ((LA189_0>=L_QuotAttrContentChar && LA189_0<=HASH)||(LA189_0>=COMMA && LA189_0<=APOS)||(LA189_0>=NCNameStartChar && LA189_0<=BlockExpr)) ) {\n                    alt189=1;\n                }\n\n\n                switch (alt189) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:\n                    set573=this.input.LT(1);\n                    if ( (this.input.LA(1)>=L_QuotAttrContentChar && this.input.LA(1)<=HASH)||(this.input.LA(1)>=COMMA && this.input.LA(1)<=APOS)||(this.input.LA(1)>=NCNameStartChar && this.input.LA(1)<=BlockExpr) ) {\n                        this.input.consume();\n                        if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, this.adaptor.create(set573));\n                        this.state.errorRecovery=false;this.state.failed=false;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        throw mse;\n                    }\n\n\n\n                    break;\n\n                default :\n                    break loop189;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_AposStringLiteralContent_return: (function() {\n        XQueryParser.pg_AposStringLiteralContent_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_AposStringLiteralContent_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1540:1: pg_AposStringLiteralContent : ( ESCAPE_APOS | L_CharRef | L_PredefinedEntityRef | ~ ( APOS | AMP ) )* ;\n    // $ANTLR start \"pg_AposStringLiteralContent\"\n    pg_AposStringLiteralContent: function() {\n        var retval = new XQueryParser.pg_AposStringLiteralContent_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var set574 = null;\n\n        var set574_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1541:9: ( ( ESCAPE_APOS | L_CharRef | L_PredefinedEntityRef | ~ ( APOS | AMP ) )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1541:11: ( ESCAPE_APOS | L_CharRef | L_PredefinedEntityRef | ~ ( APOS | AMP ) )*\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1541:11: ( ESCAPE_APOS | L_CharRef | L_PredefinedEntityRef | ~ ( APOS | AMP ) )*\n            loop190:\n            do {\n                var alt190=2;\n                var LA190_0 = this.input.LA(1);\n\n                if ( ((LA190_0>=L_QuotAttrContentChar && LA190_0<=HASH)||(LA190_0>=COMMA && LA190_0<=CHARREF_HEX)||(LA190_0>=QUOT && LA190_0<=BlockExpr)) ) {\n                    alt190=1;\n                }\n\n\n                switch (alt190) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:\n                    set574=this.input.LT(1);\n                    if ( (this.input.LA(1)>=L_QuotAttrContentChar && this.input.LA(1)<=HASH)||(this.input.LA(1)>=COMMA && this.input.LA(1)<=CHARREF_HEX)||(this.input.LA(1)>=QUOT && this.input.LA(1)<=BlockExpr) ) {\n                        this.input.consume();\n                        if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, this.adaptor.create(set574));\n                        this.state.errorRecovery=false;this.state.failed=false;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        throw mse;\n                    }\n\n\n\n                    break;\n\n                default :\n                    break loop190;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ElementContentChar_return: (function() {\n        XQueryParser.p_ElementContentChar_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ElementContentChar_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1555:1: p_ElementContentChar : L_ElementContentChar ;\n    // $ANTLR start \"p_ElementContentChar\"\n    p_ElementContentChar: function() {\n        var retval = new XQueryParser.p_ElementContentChar_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var L_ElementContentChar575 = null;\n\n        var L_ElementContentChar575_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1556:9: ( L_ElementContentChar )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1556:11: L_ElementContentChar\n            root_0 = this.adaptor.nil();\n\n            L_ElementContentChar575=this.match(this.input,L_ElementContentChar,XQueryParser.FOLLOW_L_ElementContentChar_in_p_ElementContentChar11436); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            L_ElementContentChar575_tree = this.adaptor.create(L_ElementContentChar575);\n            this.adaptor.addChild(root_0, L_ElementContentChar575_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_QuotAttrContentChar_return: (function() {\n        XQueryParser.p_QuotAttrContentChar_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_QuotAttrContentChar_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1560:1: p_QuotAttrContentChar : L_QuotAttrContentChar -> ^( AttributeValueChar L_QuotAttrContentChar ) ;\n    // $ANTLR start \"p_QuotAttrContentChar\"\n    p_QuotAttrContentChar: function() {\n        var retval = new XQueryParser.p_QuotAttrContentChar_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var L_QuotAttrContentChar576 = null;\n\n        var L_QuotAttrContentChar576_tree=null;\n        var stream_L_QuotAttrContentChar=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token L_QuotAttrContentChar\");\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1561:9: ( L_QuotAttrContentChar -> ^( AttributeValueChar L_QuotAttrContentChar ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1561:11: L_QuotAttrContentChar\n            L_QuotAttrContentChar576=this.match(this.input,L_QuotAttrContentChar,XQueryParser.FOLLOW_L_QuotAttrContentChar_in_p_QuotAttrContentChar11462); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_L_QuotAttrContentChar.add(L_QuotAttrContentChar576);\n\n\n\n            // AST REWRITE\n            // elements: L_QuotAttrContentChar\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 1562:17: -> ^( AttributeValueChar L_QuotAttrContentChar )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1562:20: ^( AttributeValueChar L_QuotAttrContentChar )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(AttributeValueChar, \"AttributeValueChar\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_L_QuotAttrContentChar.nextNode());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AposAttrContentChar_return: (function() {\n        XQueryParser.p_AposAttrContentChar_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AposAttrContentChar_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1566:1: p_AposAttrContentChar : L_AposAttrContentChar -> ^( AttributeValueChar L_AposAttrContentChar ) ;\n    // $ANTLR start \"p_AposAttrContentChar\"\n    p_AposAttrContentChar: function() {\n        var retval = new XQueryParser.p_AposAttrContentChar_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var L_AposAttrContentChar577 = null;\n\n        var L_AposAttrContentChar577_tree=null;\n        var stream_L_AposAttrContentChar=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token L_AposAttrContentChar\");\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1567:9: ( L_AposAttrContentChar -> ^( AttributeValueChar L_AposAttrContentChar ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1567:11: L_AposAttrContentChar\n            L_AposAttrContentChar577=this.match(this.input,L_AposAttrContentChar,XQueryParser.FOLLOW_L_AposAttrContentChar_in_p_AposAttrContentChar11512); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_L_AposAttrContentChar.add(L_AposAttrContentChar577);\n\n\n\n            // AST REWRITE\n            // elements: L_AposAttrContentChar\n            // token labels: \n            // rule labels: retval\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 1568:17: -> ^( AttributeValueChar L_AposAttrContentChar )\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1568:20: ^( AttributeValueChar L_AposAttrContentChar )\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(AttributeValueChar, \"AttributeValueChar\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_L_AposAttrContentChar.nextNode());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_EQName_return: (function() {\n        XQueryParser.p_EQName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_EQName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1583:1: p_EQName : ( p_QName | p_URIQualifiedName );\n    // $ANTLR start \"p_EQName\"\n    p_EQName: function() {\n        var retval = new XQueryParser.p_EQName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_QName578 = null;\n         var p_URIQualifiedName579 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1584:9: ( p_QName | p_URIQualifiedName )\n            var alt191=2;\n            var LA191_0 = this.input.LA(1);\n\n            if ( ((LA191_0>=ANCESTOR && LA191_0<=SKIP)||(LA191_0>=VALUE && LA191_0<=QUOT_ER)||LA191_0==L_NCName) ) {\n                alt191=1;\n            }\n            else if ( (LA191_0==Q) ) {\n                alt191=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 191, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt191) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1584:11: p_QName\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_EQName11581);\n                    p_QName578=this.p_QName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName578.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1585:11: p_URIQualifiedName\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_URIQualifiedName_in_p_EQName11593);\n                    p_URIQualifiedName579=this.p_URIQualifiedName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_URIQualifiedName579.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_URIQualifiedName_return: (function() {\n        XQueryParser.p_URIQualifiedName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_URIQualifiedName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1588:1: p_URIQualifiedName : p_BracedURILiteral p_NCName ;\n    // $ANTLR start \"p_URIQualifiedName\"\n    p_URIQualifiedName: function() {\n        var retval = new XQueryParser.p_URIQualifiedName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_BracedURILiteral580 = null;\n         var p_NCName581 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1589:9: ( p_BracedURILiteral p_NCName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1589:11: p_BracedURILiteral p_NCName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_BracedURILiteral_in_p_URIQualifiedName11618);\n            p_BracedURILiteral580=this.p_BracedURILiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BracedURILiteral580.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_URIQualifiedName11620);\n            p_NCName581=this.p_NCName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NCName581.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_BracedURILiteral_return: (function() {\n        XQueryParser.p_BracedURILiteral_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_BracedURILiteral_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1592:1: p_BracedURILiteral : Q LBRACKET ( L_PredefinedEntityRef | L_CharRef | ~ ( AMP | LBRACKET | RBRACKET ) )* RBRACKET ;\n    // $ANTLR start \"p_BracedURILiteral\"\n    p_BracedURILiteral: function() {\n        var retval = new XQueryParser.p_BracedURILiteral_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var Q582 = null;\n        var LBRACKET583 = null;\n        var set584 = null;\n        var RBRACKET585 = null;\n\n        var Q582_tree=null;\n        var LBRACKET583_tree=null;\n        var set584_tree=null;\n        var RBRACKET585_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1593:9: ( Q LBRACKET ( L_PredefinedEntityRef | L_CharRef | ~ ( AMP | LBRACKET | RBRACKET ) )* RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1593:11: Q LBRACKET ( L_PredefinedEntityRef | L_CharRef | ~ ( AMP | LBRACKET | RBRACKET ) )* RBRACKET\n            root_0 = this.adaptor.nil();\n\n            Q582=this.match(this.input,Q,XQueryParser.FOLLOW_Q_in_p_BracedURILiteral11645); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            Q582_tree = this.adaptor.create(Q582);\n            this.adaptor.addChild(root_0, Q582_tree);\n            }\n            LBRACKET583=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_BracedURILiteral11647); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET583_tree = this.adaptor.create(LBRACKET583);\n            this.adaptor.addChild(root_0, LBRACKET583_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1593:22: ( L_PredefinedEntityRef | L_CharRef | ~ ( AMP | LBRACKET | RBRACKET ) )*\n            loop192:\n            do {\n                var alt192=2;\n                var LA192_0 = this.input.LA(1);\n\n                if ( ((LA192_0>=L_QuotAttrContentChar && LA192_0<=R_UNION_BRACKET)||(LA192_0>=LSQUARE && LA192_0<=HASH)||(LA192_0>=COMMA && LA192_0<=BlockExpr)) ) {\n                    alt192=1;\n                }\n\n\n                switch (alt192) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:\n                    set584=this.input.LT(1);\n                    if ( (this.input.LA(1)>=L_QuotAttrContentChar && this.input.LA(1)<=R_UNION_BRACKET)||(this.input.LA(1)>=LSQUARE && this.input.LA(1)<=HASH)||(this.input.LA(1)>=COMMA && this.input.LA(1)<=BlockExpr) ) {\n                        this.input.consume();\n                        if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, this.adaptor.create(set584));\n                        this.state.errorRecovery=false;this.state.failed=false;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        throw mse;\n                    }\n\n\n\n                    break;\n\n                default :\n                    break loop192;\n                }\n            } while (true);\n\n            RBRACKET585=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_BracedURILiteral11673); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET585_tree = this.adaptor.create(RBRACKET585);\n            this.adaptor.addChild(root_0, RBRACKET585_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_QName_return: (function() {\n        XQueryParser.p_QName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_QName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1597:1: p_QName : ( pg_QName | p_NCName -> ^( QName p_NCName ) );\n    // $ANTLR start \"p_QName\"\n    p_QName: function() {\n        var retval = new XQueryParser.p_QName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var pg_QName586 = null;\n         var p_NCName587 = null;\n\n        var stream_p_NCName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_NCName\");\n        this.setWsExplicit(true);\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1599:9: ( pg_QName | p_NCName -> ^( QName p_NCName ) )\n            var alt193=2;\n            var LA193_0 = this.input.LA(1);\n\n            if ( ((LA193_0>=ANCESTOR && LA193_0<=SKIP)||(LA193_0>=VALUE && LA193_0<=QUOT_ER)||LA193_0==L_NCName) ) {\n                var LA193_1 = this.input.LA(2);\n\n                if ( (LA193_1==COLON) ) {\n                    alt193=1;\n                }\n                else if ( (LA193_1==EOF||(LA193_1>=AND && LA193_1<=AT)||(LA193_1>=BY && LA193_1<=CASTABLE)||LA193_1==COLLATION||LA193_1==DEFAULT||(LA193_1>=DESCENDING && LA193_1<=DIV)||LA193_1==EMPTY||LA193_1==EQ||(LA193_1>=EXCEPT && LA193_1<=EXTERNAL)||(LA193_1>=FOR && LA193_1<=GE)||(LA193_1>=GT && LA193_1<=IDIV)||LA193_1==IN||(LA193_1>=INSTANCE && LA193_1<=IS)||LA193_1==LE||(LA193_1>=LET && LA193_1<=MOD)||LA193_1==NE||LA193_1==NODE||(LA193_1>=OR && LA193_1<=ORDER)||(LA193_1>=RETURN && LA193_1<=SATISFIES)||LA193_1==STABLE||(LA193_1>=TO && LA193_1<=TREAT)||LA193_1==UNION||LA193_1==VARIABLE||LA193_1==WHERE||LA193_1==ALLOWING||LA193_1==COUNT||(LA193_1>=DECIMAL_SEPARATOR && LA193_1<=MINUS_SIGN)||(LA193_1>=NAN && LA193_1<=PREVIOUS)||LA193_1==START||LA193_1==WHEN||(LA193_1>=ZERO_DIGIT && LA193_1<=BEFORE)||LA193_1==INTO||LA193_1==MODIFY||LA193_1==UPDATING||LA193_1==WITH||LA193_1==CONTAINS||LA193_1==PARAGRAPHS||LA193_1==SCORE||LA193_1==SENTENCES||LA193_1==TIMES||LA193_1==WORDS||(LA193_1>=CHECK && LA193_1<=COLLECTION)||(LA193_1>=FOREACH && LA193_1<=ON)||(LA193_1>=CONCAT && LA193_1<=DOLLAR)||(LA193_1>=R_UNION_BRACKET && LA193_1<=HASH)||(LA193_1>=COMMA && LA193_1<=BANG)||LA193_1==EMPTY_CLOSE_TAG||(LA193_1>=SEMICOLON && LA193_1<=VBAR)||(LA193_1>=APOS && LA193_1<=QUOT)||LA193_1==S) ) {\n                    alt193=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 193, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 193, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt193) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1599:11: pg_QName\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pg_QName_in_p_QName11715);\n                    pg_QName586=this.pg_QName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pg_QName586.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1600:11: p_NCName\n                    this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_p_QName11727);\n                    p_NCName587=this.p_NCName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_NCName.add(p_NCName587.getTree());\n\n\n                    // AST REWRITE\n                    // elements: p_NCName\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1601:17: -> ^( QName p_NCName )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1601:20: ^( QName p_NCName )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(QName, \"QName\"), root_1);\n\n                        this.adaptor.addChild(root_1, stream_p_NCName.nextTree());\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n            this.setWsExplicit(false);\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_FQName_return: (function() {\n        XQueryParser.pg_FQName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_FQName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1605:1: pg_FQName : ( pg_QName | p_FNCName -> ^( QName p_FNCName ) );\n    // $ANTLR start \"pg_FQName\"\n    pg_FQName: function() {\n        var retval = new XQueryParser.pg_FQName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var pg_QName588 = null;\n         var p_FNCName589 = null;\n\n        var stream_p_FNCName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_FNCName\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1606:9: ( pg_QName | p_FNCName -> ^( QName p_FNCName ) )\n            var alt194=2;\n            switch ( this.input.LA(1) ) {\n            case ANCESTOR:\n            case ANCESTOR_OR_SELF:\n            case AND:\n            case AS:\n            case ASCENDING:\n            case AT:\n            case BASE_URI:\n            case BOUNDARY_SPACE:\n            case BY:\n            case CASE:\n            case CAST:\n            case CASTABLE:\n            case CHILD:\n            case COLLATION:\n            case CONSTRUCTION:\n            case COPY_NAMESPACES:\n            case DECLARE:\n            case DEFAULT:\n            case DESCENDANT:\n            case DESCENDANT_OR_SELF:\n            case DESCENDING:\n            case DIV:\n            case DOCUMENT:\n            case ELSE:\n            case EMPTY:\n            case ENCODING:\n            case EQ:\n            case EVERY:\n            case EXCEPT:\n            case EXTERNAL:\n            case FOLLOWING:\n            case FOLLOWING_SIBLING:\n            case FOR:\n            case FUNCTION:\n            case GE:\n            case GREATEST:\n            case GT:\n            case IDIV:\n            case IMPORT:\n            case IN:\n            case INHERIT:\n            case INSTANCE:\n            case INTERSECT:\n            case IS:\n            case LAX:\n            case LE:\n            case LEAST:\n            case LET:\n            case LT:\n            case MOD:\n            case MODULE:\n            case NAMESPACE:\n            case NE:\n            case NO_INHERIT:\n            case NO_PRESERVE:\n            case JSON:\n            case OF:\n            case OPTION:\n            case OR:\n            case ORDER:\n            case ORDERED:\n            case ORDERING:\n            case PARENT:\n            case PRECEDING:\n            case PRECEDING_SIBLING:\n            case PRESERVE:\n            case RETURN:\n            case SATISFIES:\n            case SCHEMA:\n            case SELF:\n            case SOME:\n            case STABLE:\n            case STRICT:\n            case STRIP:\n            case THEN:\n            case TO:\n            case TREAT:\n            case UNION:\n            case UNORDERED:\n            case VALIDATE:\n            case VARIABLE:\n            case VERSION:\n            case WHERE:\n            case XQUERY:\n            case ALLOWING:\n            case CATCH:\n            case CONTEXT:\n            case COUNT:\n            case DECIMAL_FORMAT:\n            case DECIMAL_SEPARATOR:\n            case DIGIT:\n            case END:\n            case GROUP:\n            case GROUPING_SEPARATOR:\n            case INFINITY:\n            case MINUS_SIGN:\n            case NAN:\n            case NEXT:\n            case ONLY:\n            case PATTERN_SEPARATOR:\n            case PERCENT:\n            case PER_MILLE:\n            case PREVIOUS:\n            case SLIDING:\n            case START:\n            case TRY:\n            case TUMBLING:\n            case TYPE:\n            case WHEN:\n            case WINDOW:\n            case ZERO_DIGIT:\n            case AFTER:\n            case BEFORE:\n            case COPY:\n            case DELETE:\n            case FIRST:\n            case INSERT:\n            case INTO:\n            case POSITION:\n            case APPEND:\n            case LAST:\n            case MODIFY:\n            case NODES:\n            case RENAME:\n            case REPLACE:\n            case REVALIDATION:\n            case SKIP:\n            case VALUE:\n            case WITH:\n            case ALL:\n            case ANY:\n            case CONTAINS:\n            case CONTENT:\n            case DIACRITICS:\n            case DIFFERENT:\n            case DISTANCE:\n            case ENTIRE:\n            case EXACTLY:\n            case FROM:\n            case FT_OPTION:\n            case FTAND:\n            case FTNOT:\n            case FTOR:\n            case INSENSITIVE:\n            case LANGUAGE:\n            case LEVELS:\n            case LOWERCASE:\n            case MOST:\n            case NO:\n            case NOT:\n            case OCCURS:\n            case PARAGRAPH:\n            case PARAGRAPHS:\n            case PHRASE:\n            case RELATIONSHIP:\n            case SAME:\n            case SCORE:\n            case SENSITIVE:\n            case SENTENCE:\n            case SENTENCES:\n            case STEMMING:\n            case STOP:\n            case THESAURUS:\n            case TIMES:\n            case UPPERCASE:\n            case USING:\n            case WEIGHT:\n            case WILDCARDS:\n            case WITHOUT:\n            case WORD:\n            case WORDS:\n            case BREAK:\n            case CONTINUE:\n            case EXIT:\n            case LOOP:\n            case RETURNING:\n            case CHECK:\n            case COLLECTION:\n            case CONSTRAINT:\n            case FOREACH:\n            case FOREIGN:\n            case INDEX:\n            case INTEGRITY:\n            case KEY:\n            case ON:\n            case UNIQUE:\n            case AMP_ER:\n            case APOS_ER:\n            case QUOT_ER:\n            case L_NCName:\n                var LA194_1 = this.input.LA(2);\n\n                if ( (LA194_1==COLON) ) {\n                    alt194=1;\n                }\n                else if ( (LA194_1==LPAREN) ) {\n                    alt194=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 194, 1, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case ATTRIBUTE:\n            case COMMENT:\n            case DOCUMENT_NODE:\n            case ELEMENT:\n            case EMPTY_SEQUENCE:\n            case IF:\n            case ITEM:\n            case NODE:\n            case PROCESSING_INSTRUCTION:\n            case STRUCTURED_ITEM:\n            case JSON_ITEM:\n            case OBJECT:\n            case ARRAY:\n            case SCHEMA_ATTRIBUTE:\n            case SCHEMA_ELEMENT:\n            case TEXT:\n            case TYPESWITCH:\n            case NAMESPACE_NODE:\n            case SWITCH:\n            case WHILE:\n                alt194=1;\n                break;\n            case UPDATING:\n                alt194=2;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 194, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt194) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1606:11: pg_QName\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_pg_QName_in_pg_FQName11788);\n                    pg_QName588=this.pg_QName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pg_QName588.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1607:11: p_FNCName\n                    this.pushFollow(XQueryParser.FOLLOW_p_FNCName_in_pg_FQName11800);\n                    p_FNCName589=this.p_FNCName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) stream_p_FNCName.add(p_FNCName589.getTree());\n\n\n                    // AST REWRITE\n                    // elements: p_FNCName\n                    // token labels: \n                    // rule labels: retval\n                    // token list labels: \n                    // rule list labels: \n                    if ( this.state.backtracking===0 ) {\n                    retval.tree = root_0;\n                    var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n\n                    root_0 = this.adaptor.nil();\n                    // 1608:17: -> ^( QName p_FNCName )\n                    {\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1608:20: ^( QName p_FNCName )\n                        {\n                        var root_1 = this.adaptor.nil();\n                        root_1 = this.adaptor.becomeRoot(this.adaptor.create(QName, \"QName\"), root_1);\n\n                        this.adaptor.addChild(root_1, stream_p_FNCName.nextTree());\n\n                        this.adaptor.addChild(root_0, root_1);\n                        }\n\n                    }\n\n                    retval.tree = root_0;}\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_QName_return: (function() {\n        XQueryParser.pg_QName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_QName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1610:1: pg_QName : nn= p_NCName COLON nl= p_NCName -> ^( QName $nn $nl) ;\n    // $ANTLR start \"pg_QName\"\n    pg_QName: function() {\n        var retval = new XQueryParser.pg_QName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var COLON590 = null;\n         var nn = null;\n         var nl = null;\n\n        var COLON590_tree=null;\n        var stream_COLON=new org.antlr.runtime.tree.RewriteRuleTokenStream(this.adaptor,\"token COLON\");\n        var stream_p_NCName=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"rule p_NCName\");\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1611:9: (nn= p_NCName COLON nl= p_NCName -> ^( QName $nn $nl) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1611:11: nn= p_NCName COLON nl= p_NCName\n            this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_pg_QName11844);\n            nn=this.p_NCName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_NCName.add(nn.getTree());\n            COLON590=this.match(this.input,COLON,XQueryParser.FOLLOW_COLON_in_pg_QName11846); if (this.state.failed) return retval; \n            if ( this.state.backtracking===0 ) stream_COLON.add(COLON590);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_pg_QName11850);\n            nl=this.p_NCName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) stream_p_NCName.add(nl.getTree());\n\n\n            // AST REWRITE\n            // elements: nl, nn\n            // token labels: \n            // rule labels: retval, nn, nl\n            // token list labels: \n            // rule list labels: \n            if ( this.state.backtracking===0 ) {\n            retval.tree = root_0;\n            var stream_retval=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token retval\",retval!=null?retval.tree:null);\n            var stream_nn=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token nn\",nn!=null?nn.tree:null);\n            var stream_nl=new org.antlr.runtime.tree.RewriteRuleSubtreeStream(this.adaptor,\"token nl\",nl!=null?nl.tree:null);\n\n            root_0 = this.adaptor.nil();\n            // 1612:17: -> ^( QName $nn $nl)\n            {\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1612:20: ^( QName $nn $nl)\n                {\n                var root_1 = this.adaptor.nil();\n                root_1 = this.adaptor.becomeRoot(this.adaptor.create(QName, \"QName\"), root_1);\n\n                this.adaptor.addChild(root_1, stream_nn.nextTree());\n                this.adaptor.addChild(root_1, stream_nl.nextTree());\n\n                this.adaptor.addChild(root_0, root_1);\n                }\n\n            }\n\n            retval.tree = root_0;}\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NCName_return: (function() {\n        XQueryParser.p_NCName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NCName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1642:1: p_NCName : ( L_NCName | ANCESTOR | ANCESTOR_OR_SELF | AND | AS | ASCENDING | AT | ATTRIBUTE | BASE_URI | BOUNDARY_SPACE | BY | CASE | CAST | CASTABLE | CHILD | COLLATION | COMMENT | CONSTRUCTION | COPY_NAMESPACES | DECLARE | DEFAULT | DESCENDANT | DESCENDANT_OR_SELF | DESCENDING | DIV | DOCUMENT | DOCUMENT_NODE | ELEMENT | ELSE | EMPTY | EMPTY_SEQUENCE | ENCODING | EQ | EVERY | EXCEPT | EXTERNAL | FOLLOWING | FOLLOWING_SIBLING | FOR | FUNCTION | GE | GREATEST | GT | IDIV | IF | IMPORT | IN | INHERIT | INSTANCE | INTERSECT | IS | ITEM | LAX | LE | LEAST | LET | LT | MOD | MODULE | NAMESPACE | NE | NO_INHERIT | NO_PRESERVE | NODE | OF | OPTION | OR | ORDER | ORDERED | ORDERING | PARENT | PRECEDING | PRECEDING_SIBLING | PRESERVE | PROCESSING_INSTRUCTION | RETURN | SATISFIES | SCHEMA | SCHEMA_ATTRIBUTE | SCHEMA_ELEMENT | SELF | SOME | STABLE | STRICT | STRIP | SWITCH | TEXT | THEN | TO | TREAT | TYPESWITCH | UNION | UNORDERED | VALIDATE | VARIABLE | VERSION | WHERE | XQUERY | ALLOWING | CATCH | CONTEXT | COUNT | DECIMAL_FORMAT | DECIMAL_SEPARATOR | DIGIT | END | GROUP | GROUPING_SEPARATOR | INFINITY | MINUS_SIGN | NAMESPACE_NODE | NAN | NEXT | ONLY | PATTERN_SEPARATOR | PERCENT | PER_MILLE | PREVIOUS | SLIDING | START | TRY | TUMBLING | TYPE | WHEN | WINDOW | ZERO_DIGIT | AFTER | BEFORE | COPY | DELETE | FIRST | INSERT | INTO | LAST | MODIFY | NODES | RENAME | REPLACE | REVALIDATION | SKIP | VALUE | WITH | APPEND | JSON | POSITION | STRUCTURED_ITEM | JSON_ITEM | OBJECT | ARRAY | ALL | ANY | CONTAINS | CONTENT | DIACRITICS | DIFFERENT | DISTANCE | ENTIRE | EXACTLY | FROM | FT_OPTION | FTAND | FTNOT | FTOR | INSENSITIVE | LANGUAGE | LEVELS | LOWERCASE | MOST | NO | NOT | OCCURS | PARAGRAPH | PARAGRAPHS | PHRASE | RELATIONSHIP | SAME | SCORE | SENSITIVE | SENTENCE | SENTENCES | STEMMING | STOP | THESAURUS | TIMES | UPPERCASE | USING | WEIGHT | WILDCARDS | WITHOUT | WORD | WORDS | BREAK | CONTINUE | EXIT | LOOP | RETURNING | WHILE | CHECK | COLLECTION | CONSTRAINT | FOREACH | FOREIGN | INDEX | INTEGRITY | KEY | ON | UNIQUE | AMP_ER | APOS_ER | QUOT_ER );\n    // $ANTLR start \"p_NCName\"\n    p_NCName: function() {\n        var retval = new XQueryParser.p_NCName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var set591 = null;\n\n        var set591_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1643:9: ( L_NCName | ANCESTOR | ANCESTOR_OR_SELF | AND | AS | ASCENDING | AT | ATTRIBUTE | BASE_URI | BOUNDARY_SPACE | BY | CASE | CAST | CASTABLE | CHILD | COLLATION | COMMENT | CONSTRUCTION | COPY_NAMESPACES | DECLARE | DEFAULT | DESCENDANT | DESCENDANT_OR_SELF | DESCENDING | DIV | DOCUMENT | DOCUMENT_NODE | ELEMENT | ELSE | EMPTY | EMPTY_SEQUENCE | ENCODING | EQ | EVERY | EXCEPT | EXTERNAL | FOLLOWING | FOLLOWING_SIBLING | FOR | FUNCTION | GE | GREATEST | GT | IDIV | IF | IMPORT | IN | INHERIT | INSTANCE | INTERSECT | IS | ITEM | LAX | LE | LEAST | LET | LT | MOD | MODULE | NAMESPACE | NE | NO_INHERIT | NO_PRESERVE | NODE | OF | OPTION | OR | ORDER | ORDERED | ORDERING | PARENT | PRECEDING | PRECEDING_SIBLING | PRESERVE | PROCESSING_INSTRUCTION | RETURN | SATISFIES | SCHEMA | SCHEMA_ATTRIBUTE | SCHEMA_ELEMENT | SELF | SOME | STABLE | STRICT | STRIP | SWITCH | TEXT | THEN | TO | TREAT | TYPESWITCH | UNION | UNORDERED | VALIDATE | VARIABLE | VERSION | WHERE | XQUERY | ALLOWING | CATCH | CONTEXT | COUNT | DECIMAL_FORMAT | DECIMAL_SEPARATOR | DIGIT | END | GROUP | GROUPING_SEPARATOR | INFINITY | MINUS_SIGN | NAMESPACE_NODE | NAN | NEXT | ONLY | PATTERN_SEPARATOR | PERCENT | PER_MILLE | PREVIOUS | SLIDING | START | TRY | TUMBLING | TYPE | WHEN | WINDOW | ZERO_DIGIT | AFTER | BEFORE | COPY | DELETE | FIRST | INSERT | INTO | LAST | MODIFY | NODES | RENAME | REPLACE | REVALIDATION | SKIP | VALUE | WITH | APPEND | JSON | POSITION | STRUCTURED_ITEM | JSON_ITEM | OBJECT | ARRAY | ALL | ANY | CONTAINS | CONTENT | DIACRITICS | DIFFERENT | DISTANCE | ENTIRE | EXACTLY | FROM | FT_OPTION | FTAND | FTNOT | FTOR | INSENSITIVE | LANGUAGE | LEVELS | LOWERCASE | MOST | NO | NOT | OCCURS | PARAGRAPH | PARAGRAPHS | PHRASE | RELATIONSHIP | SAME | SCORE | SENSITIVE | SENTENCE | SENTENCES | STEMMING | STOP | THESAURUS | TIMES | UPPERCASE | USING | WEIGHT | WILDCARDS | WITHOUT | WORD | WORDS | BREAK | CONTINUE | EXIT | LOOP | RETURNING | WHILE | CHECK | COLLECTION | CONSTRAINT | FOREACH | FOREIGN | INDEX | INTEGRITY | KEY | ON | UNIQUE | AMP_ER | APOS_ER | QUOT_ER )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:\n            root_0 = this.adaptor.nil();\n\n            set591=this.input.LT(1);\n            if ( (this.input.LA(1)>=ANCESTOR && this.input.LA(1)<=SKIP)||(this.input.LA(1)>=VALUE && this.input.LA(1)<=QUOT_ER)||this.input.LA(1)==L_NCName ) {\n                this.input.consume();\n                if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, this.adaptor.create(set591));\n                this.state.errorRecovery=false;this.state.failed=false;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                throw mse;\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FNCName_return: (function() {\n        XQueryParser.p_FNCName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FNCName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1660:1: p_FNCName : ( L_NCName | ANCESTOR | ANCESTOR_OR_SELF | AND | AS | ASCENDING | AT | BASE_URI | BOUNDARY_SPACE | BY | CASE | CAST | CASTABLE | CHILD | COLLATION | CONSTRUCTION | COPY_NAMESPACES | DECLARE | DEFAULT | DESCENDANT | DESCENDANT_OR_SELF | DESCENDING | DIV | DOCUMENT | ELSE | EMPTY | ENCODING | EQ | EVERY | EXCEPT | EXTERNAL | FOLLOWING | FOLLOWING_SIBLING | FOR | FUNCTION | GE | GREATEST | GT | IDIV | IMPORT | IN | INHERIT | INSTANCE | INTERSECT | IS | LAX | LE | LEAST | LET | LT | MOD | MODULE | NAMESPACE | NE | NO_INHERIT | NO_PRESERVE | OF | OPTION | OR | ORDER | ORDERED | ORDERING | PARENT | PRECEDING | PRECEDING_SIBLING | PRESERVE | RETURN | SATISFIES | SCHEMA | SELF | SOME | STABLE | STRICT | STRIP | THEN | TO | TREAT | UNION | UNORDERED | VALIDATE | VARIABLE | VERSION | WHERE | XQUERY | ALLOWING | CATCH | CONTEXT | COUNT | DECIMAL_FORMAT | DECIMAL_SEPARATOR | DIGIT | END | GROUP | GROUPING_SEPARATOR | INFINITY | MINUS_SIGN | NAN | NEXT | ONLY | PATTERN_SEPARATOR | PERCENT | PER_MILLE | PREVIOUS | SLIDING | START | TRY | TUMBLING | TYPE | WHEN | WINDOW | ZERO_DIGIT | AFTER | BEFORE | COPY | DELETE | FIRST | INSERT | INTO | LAST | MODIFY | NODES | RENAME | REPLACE | REVALIDATION | SKIP | UPDATING | VALUE | WITH | APPEND | JSON | POSITION | ALL | ANY | CONTAINS | CONTENT | DIACRITICS | DIFFERENT | DISTANCE | ENTIRE | EXACTLY | FROM | FT_OPTION | FTAND | FTNOT | FTOR | INSENSITIVE | LANGUAGE | LEVELS | LOWERCASE | MOST | NO | NOT | OCCURS | PARAGRAPH | PARAGRAPHS | PHRASE | RELATIONSHIP | SAME | SCORE | SENSITIVE | SENTENCE | SENTENCES | STEMMING | STOP | THESAURUS | TIMES | UPPERCASE | USING | WEIGHT | WILDCARDS | WITHOUT | WORD | WORDS | BREAK | CONTINUE | EXIT | LOOP | RETURNING | CHECK | COLLECTION | CONSTRAINT | FOREACH | FOREIGN | INDEX | INTEGRITY | KEY | ON | UNIQUE | AMP_ER | APOS_ER | QUOT_ER );\n    // $ANTLR start \"p_FNCName\"\n    p_FNCName: function() {\n        var retval = new XQueryParser.p_FNCName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var set592 = null;\n\n        var set592_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1661:9: ( L_NCName | ANCESTOR | ANCESTOR_OR_SELF | AND | AS | ASCENDING | AT | BASE_URI | BOUNDARY_SPACE | BY | CASE | CAST | CASTABLE | CHILD | COLLATION | CONSTRUCTION | COPY_NAMESPACES | DECLARE | DEFAULT | DESCENDANT | DESCENDANT_OR_SELF | DESCENDING | DIV | DOCUMENT | ELSE | EMPTY | ENCODING | EQ | EVERY | EXCEPT | EXTERNAL | FOLLOWING | FOLLOWING_SIBLING | FOR | FUNCTION | GE | GREATEST | GT | IDIV | IMPORT | IN | INHERIT | INSTANCE | INTERSECT | IS | LAX | LE | LEAST | LET | LT | MOD | MODULE | NAMESPACE | NE | NO_INHERIT | NO_PRESERVE | OF | OPTION | OR | ORDER | ORDERED | ORDERING | PARENT | PRECEDING | PRECEDING_SIBLING | PRESERVE | RETURN | SATISFIES | SCHEMA | SELF | SOME | STABLE | STRICT | STRIP | THEN | TO | TREAT | UNION | UNORDERED | VALIDATE | VARIABLE | VERSION | WHERE | XQUERY | ALLOWING | CATCH | CONTEXT | COUNT | DECIMAL_FORMAT | DECIMAL_SEPARATOR | DIGIT | END | GROUP | GROUPING_SEPARATOR | INFINITY | MINUS_SIGN | NAN | NEXT | ONLY | PATTERN_SEPARATOR | PERCENT | PER_MILLE | PREVIOUS | SLIDING | START | TRY | TUMBLING | TYPE | WHEN | WINDOW | ZERO_DIGIT | AFTER | BEFORE | COPY | DELETE | FIRST | INSERT | INTO | LAST | MODIFY | NODES | RENAME | REPLACE | REVALIDATION | SKIP | UPDATING | VALUE | WITH | APPEND | JSON | POSITION | ALL | ANY | CONTAINS | CONTENT | DIACRITICS | DIFFERENT | DISTANCE | ENTIRE | EXACTLY | FROM | FT_OPTION | FTAND | FTNOT | FTOR | INSENSITIVE | LANGUAGE | LEVELS | LOWERCASE | MOST | NO | NOT | OCCURS | PARAGRAPH | PARAGRAPHS | PHRASE | RELATIONSHIP | SAME | SCORE | SENSITIVE | SENTENCE | SENTENCES | STEMMING | STOP | THESAURUS | TIMES | UPPERCASE | USING | WEIGHT | WILDCARDS | WITHOUT | WORD | WORDS | BREAK | CONTINUE | EXIT | LOOP | RETURNING | CHECK | COLLECTION | CONSTRAINT | FOREACH | FOREIGN | INDEX | INTEGRITY | KEY | ON | UNIQUE | AMP_ER | APOS_ER | QUOT_ER )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:\n            root_0 = this.adaptor.nil();\n\n            set592=this.input.LT(1);\n            if ( (this.input.LA(1)>=ANCESTOR && this.input.LA(1)<=AT)||(this.input.LA(1)>=BASE_URI && this.input.LA(1)<=COLLATION)||(this.input.LA(1)>=CONSTRUCTION && this.input.LA(1)<=DOCUMENT)||(this.input.LA(1)>=ELSE && this.input.LA(1)<=EMPTY)||(this.input.LA(1)>=ENCODING && this.input.LA(1)<=IDIV)||(this.input.LA(1)>=IMPORT && this.input.LA(1)<=IS)||(this.input.LA(1)>=LAX && this.input.LA(1)<=NO_PRESERVE)||(this.input.LA(1)>=JSON && this.input.LA(1)<=PRESERVE)||(this.input.LA(1)>=RETURN && this.input.LA(1)<=SCHEMA)||(this.input.LA(1)>=SELF && this.input.LA(1)<=STRIP)||(this.input.LA(1)>=THEN && this.input.LA(1)<=TREAT)||(this.input.LA(1)>=UNION && this.input.LA(1)<=MINUS_SIGN)||(this.input.LA(1)>=NAN && this.input.LA(1)<=START)||(this.input.LA(1)>=TRY && this.input.LA(1)<=RETURNING)||(this.input.LA(1)>=CHECK && this.input.LA(1)<=QUOT_ER)||this.input.LA(1)==L_NCName ) {\n                this.input.consume();\n                if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, this.adaptor.create(set592));\n                this.state.errorRecovery=false;this.state.failed=false;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                throw mse;\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pg_UpdateExpr_return: (function() {\n        XQueryParser.pg_UpdateExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pg_UpdateExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1697:1: pg_UpdateExpr : ( p_InsertExpr | p_DeleteExpr | p_RenameExpr | p_ReplaceExpr | p_TransformExpr | p_JSONDeleteExpr | p_JSONInsertExpr | p_JSONRenameExpr | p_JSONReplaceExpr | p_JSONAppendExpr );\n    // $ANTLR start \"pg_UpdateExpr\"\n    pg_UpdateExpr: function() {\n        var retval = new XQueryParser.pg_UpdateExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_InsertExpr593 = null;\n         var p_DeleteExpr594 = null;\n         var p_RenameExpr595 = null;\n         var p_ReplaceExpr596 = null;\n         var p_TransformExpr597 = null;\n         var p_JSONDeleteExpr598 = null;\n         var p_JSONInsertExpr599 = null;\n         var p_JSONRenameExpr600 = null;\n         var p_JSONReplaceExpr601 = null;\n         var p_JSONAppendExpr602 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1698:9: ( p_InsertExpr | p_DeleteExpr | p_RenameExpr | p_ReplaceExpr | p_TransformExpr | p_JSONDeleteExpr | p_JSONInsertExpr | p_JSONRenameExpr | p_JSONReplaceExpr | p_JSONAppendExpr )\n            var alt195=10;\n            alt195 = this.dfa195.predict(this.input);\n            switch (alt195) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1698:11: p_InsertExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_InsertExpr_in_pg_UpdateExpr13847);\n                    p_InsertExpr593=this.p_InsertExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InsertExpr593.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1699:11: p_DeleteExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_DeleteExpr_in_pg_UpdateExpr13859);\n                    p_DeleteExpr594=this.p_DeleteExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_DeleteExpr594.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1700:11: p_RenameExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_RenameExpr_in_pg_UpdateExpr13871);\n                    p_RenameExpr595=this.p_RenameExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_RenameExpr595.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1701:11: p_ReplaceExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ReplaceExpr_in_pg_UpdateExpr13883);\n                    p_ReplaceExpr596=this.p_ReplaceExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ReplaceExpr596.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1702:11: p_TransformExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_TransformExpr_in_pg_UpdateExpr13895);\n                    p_TransformExpr597=this.p_TransformExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TransformExpr597.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1703:11: p_JSONDeleteExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONDeleteExpr_in_pg_UpdateExpr13907);\n                    p_JSONDeleteExpr598=this.p_JSONDeleteExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONDeleteExpr598.getTree());\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1704:11: p_JSONInsertExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONInsertExpr_in_pg_UpdateExpr13919);\n                    p_JSONInsertExpr599=this.p_JSONInsertExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONInsertExpr599.getTree());\n\n\n                    break;\n                case 8 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1705:11: p_JSONRenameExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONRenameExpr_in_pg_UpdateExpr13931);\n                    p_JSONRenameExpr600=this.p_JSONRenameExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONRenameExpr600.getTree());\n\n\n                    break;\n                case 9 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1706:11: p_JSONReplaceExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONReplaceExpr_in_pg_UpdateExpr13943);\n                    p_JSONReplaceExpr601=this.p_JSONReplaceExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONReplaceExpr601.getTree());\n\n\n                    break;\n                case 10 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1707:11: p_JSONAppendExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_JSONAppendExpr_in_pg_UpdateExpr13955);\n                    p_JSONAppendExpr602=this.p_JSONAppendExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_JSONAppendExpr602.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONDeleteExpr_return: (function() {\n        XQueryParser.p_JSONDeleteExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONDeleteExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1710:1: p_JSONDeleteExpr : k+= DELETE k+= JSON p_TargetExpr ;\n    // $ANTLR start \"p_JSONDeleteExpr\"\n    p_JSONDeleteExpr: function() {\n        var retval = new XQueryParser.p_JSONDeleteExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_TargetExpr603 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1711:9: (k+= DELETE k+= JSON p_TargetExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1711:11: k+= DELETE k+= JSON p_TargetExpr\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DELETE,XQueryParser.FOLLOW_DELETE_in_p_JSONDeleteExpr13982); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,JSON,XQueryParser.FOLLOW_JSON_in_p_JSONDeleteExpr13986); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_TargetExpr_in_p_JSONDeleteExpr13990);\n            p_TargetExpr603=this.p_TargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TargetExpr603.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONInsertExpr_return: (function() {\n        XQueryParser.p_JSONInsertExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONInsertExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1714:1: p_JSONInsertExpr : k+= INSERT k+= JSON p_SourceExpr k+= INTO p_TargetExpr (k+= AT k+= POSITION p_ExprSingle[true] )? ;\n    // $ANTLR start \"p_JSONInsertExpr\"\n    p_JSONInsertExpr: function() {\n        var retval = new XQueryParser.p_JSONInsertExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_SourceExpr604 = null;\n         var p_TargetExpr605 = null;\n         var p_ExprSingle606 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1715:9: (k+= INSERT k+= JSON p_SourceExpr k+= INTO p_TargetExpr (k+= AT k+= POSITION p_ExprSingle[true] )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1715:11: k+= INSERT k+= JSON p_SourceExpr k+= INTO p_TargetExpr (k+= AT k+= POSITION p_ExprSingle[true] )?\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,INSERT,XQueryParser.FOLLOW_INSERT_in_p_JSONInsertExpr14017); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,JSON,XQueryParser.FOLLOW_JSON_in_p_JSONInsertExpr14021); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_SourceExpr_in_p_JSONInsertExpr14023);\n            p_SourceExpr604=this.p_SourceExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SourceExpr604.getTree());\n            k=this.match(this.input,INTO,XQueryParser.FOLLOW_INTO_in_p_JSONInsertExpr14027); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_TargetExpr_in_p_JSONInsertExpr14029);\n            p_TargetExpr605=this.p_TargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TargetExpr605.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1715:63: (k+= AT k+= POSITION p_ExprSingle[true] )?\n            var alt196=2;\n            var LA196_0 = this.input.LA(1);\n\n            if ( (LA196_0==AT) ) {\n                alt196=1;\n            }\n            switch (alt196) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1715:64: k+= AT k+= POSITION p_ExprSingle[true]\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_JSONInsertExpr14034); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,POSITION,XQueryParser.FOLLOW_POSITION_in_p_JSONInsertExpr14038); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_JSONInsertExpr14040);\n                    p_ExprSingle606=this.p_ExprSingle(true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle606.getTree());\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONRenameExpr_return: (function() {\n        XQueryParser.p_JSONRenameExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONRenameExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1722:1: p_JSONRenameExpr : k+= RENAME k+= JSON p_TargetExpr k+= AS p_ExprSingle[true] ;\n    // $ANTLR start \"p_JSONRenameExpr\"\n    p_JSONRenameExpr: function() {\n        var retval = new XQueryParser.p_JSONRenameExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_TargetExpr607 = null;\n         var p_ExprSingle608 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1723:9: (k+= RENAME k+= JSON p_TargetExpr k+= AS p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1723:11: k+= RENAME k+= JSON p_TargetExpr k+= AS p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,RENAME,XQueryParser.FOLLOW_RENAME_in_p_JSONRenameExpr14076); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,JSON,XQueryParser.FOLLOW_JSON_in_p_JSONRenameExpr14080); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_TargetExpr_in_p_JSONRenameExpr14082);\n            p_TargetExpr607=this.p_TargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TargetExpr607.getTree());\n            k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_JSONRenameExpr14086); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_JSONRenameExpr14090);\n            p_ExprSingle608=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle608.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONReplaceExpr_return: (function() {\n        XQueryParser.p_JSONReplaceExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONReplaceExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1726:1: p_JSONReplaceExpr : k+= REPLACE k+= JSON k+= VALUE k+= OF p_TargetExpr k+= WITH p_ExprSingle[true] ;\n    // $ANTLR start \"p_JSONReplaceExpr\"\n    p_JSONReplaceExpr: function() {\n        var retval = new XQueryParser.p_JSONReplaceExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_TargetExpr609 = null;\n         var p_ExprSingle610 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1727:9: (k+= REPLACE k+= JSON k+= VALUE k+= OF p_TargetExpr k+= WITH p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1727:12: k+= REPLACE k+= JSON k+= VALUE k+= OF p_TargetExpr k+= WITH p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,REPLACE,XQueryParser.FOLLOW_REPLACE_in_p_JSONReplaceExpr14120); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,JSON,XQueryParser.FOLLOW_JSON_in_p_JSONReplaceExpr14124); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,VALUE,XQueryParser.FOLLOW_VALUE_in_p_JSONReplaceExpr14128); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,OF,XQueryParser.FOLLOW_OF_in_p_JSONReplaceExpr14132); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_TargetExpr_in_p_JSONReplaceExpr14134);\n            p_TargetExpr609=this.p_TargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TargetExpr609.getTree());\n            k=this.match(this.input,WITH,XQueryParser.FOLLOW_WITH_in_p_JSONReplaceExpr14138); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_JSONReplaceExpr14140);\n            p_ExprSingle610=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle610.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_JSONAppendExpr_return: (function() {\n        XQueryParser.p_JSONAppendExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_JSONAppendExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1730:1: p_JSONAppendExpr : k+= APPEND k+= JSON LSQUARE p_Expr[true, true] RSQUARE k+= TO p_ExprSingle[true] ;\n    // $ANTLR start \"p_JSONAppendExpr\"\n    p_JSONAppendExpr: function() {\n        var retval = new XQueryParser.p_JSONAppendExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LSQUARE611 = null;\n        var RSQUARE613 = null;\n        var k = null;\n        var list_k=null;\n         var p_Expr612 = null;\n         var p_ExprSingle614 = null;\n\n        var LSQUARE611_tree=null;\n        var RSQUARE613_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1731:9: (k+= APPEND k+= JSON LSQUARE p_Expr[true, true] RSQUARE k+= TO p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1731:12: k+= APPEND k+= JSON LSQUARE p_Expr[true, true] RSQUARE k+= TO p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,APPEND,XQueryParser.FOLLOW_APPEND_in_p_JSONAppendExpr14171); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,JSON,XQueryParser.FOLLOW_JSON_in_p_JSONAppendExpr14175); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            LSQUARE611=this.match(this.input,LSQUARE,XQueryParser.FOLLOW_LSQUARE_in_p_JSONAppendExpr14177); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LSQUARE611_tree = this.adaptor.create(LSQUARE611);\n            this.adaptor.addChild(root_0, LSQUARE611_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_JSONAppendExpr14179);\n            p_Expr612=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr612.getTree());\n            RSQUARE613=this.match(this.input,RSQUARE,XQueryParser.FOLLOW_RSQUARE_in_p_JSONAppendExpr14182); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RSQUARE613_tree = this.adaptor.create(RSQUARE613);\n            this.adaptor.addChild(root_0, RSQUARE613_tree);\n            }\n            k=this.match(this.input,TO,XQueryParser.FOLLOW_TO_in_p_JSONAppendExpr14186); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_JSONAppendExpr14188);\n            p_ExprSingle614=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle614.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_RevalidationDecl_return: (function() {\n        XQueryParser.pm_RevalidationDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_RevalidationDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1735:1: pm_RevalidationDecl : k+= DECLARE k+= REVALIDATION (k+= STRICT | k+= LAX | k+= SKIP ) SEMICOLON ;\n    // $ANTLR start \"pm_RevalidationDecl\"\n    pm_RevalidationDecl: function() {\n        var retval = new XQueryParser.pm_RevalidationDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SEMICOLON615 = null;\n        var k = null;\n        var list_k=null;\n\n        var SEMICOLON615_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1736:9: (k+= DECLARE k+= REVALIDATION (k+= STRICT | k+= LAX | k+= SKIP ) SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1736:11: k+= DECLARE k+= REVALIDATION (k+= STRICT | k+= LAX | k+= SKIP ) SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_RevalidationDecl14219); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,REVALIDATION,XQueryParser.FOLLOW_REVALIDATION_in_pm_RevalidationDecl14223); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1736:38: (k+= STRICT | k+= LAX | k+= SKIP )\n            var alt197=3;\n            switch ( this.input.LA(1) ) {\n            case STRICT:\n                alt197=1;\n                break;\n            case LAX:\n                alt197=2;\n                break;\n            case SKIP:\n                alt197=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 197, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt197) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1736:39: k+= STRICT\n                    k=this.match(this.input,STRICT,XQueryParser.FOLLOW_STRICT_in_pm_RevalidationDecl14228); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1736:51: k+= LAX\n                    k=this.match(this.input,LAX,XQueryParser.FOLLOW_LAX_in_pm_RevalidationDecl14234); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1736:60: k+= SKIP\n                    k=this.match(this.input,SKIP,XQueryParser.FOLLOW_SKIP_in_pm_RevalidationDecl14240); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n            SEMICOLON615=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_RevalidationDecl14245); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON615_tree = this.adaptor.create(SEMICOLON615);\n            this.adaptor.addChild(root_0, SEMICOLON615_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_InsertExprTargetChoice_return: (function() {\n        XQueryParser.p_InsertExprTargetChoice_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_InsertExprTargetChoice_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1740:1: p_InsertExprTargetChoice : ( ( (k+= AS (k+= FIRST | k+= LAST ) )? k+= INTO ) | ka= AFTER | kb= BEFORE );\n    // $ANTLR start \"p_InsertExprTargetChoice\"\n    p_InsertExprTargetChoice: function() {\n        var retval = new XQueryParser.p_InsertExprTargetChoice_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ka = null;\n        var kb = null;\n        var k = null;\n        var list_k=null;\n\n        var ka_tree=null;\n        var kb_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:9: ( ( (k+= AS (k+= FIRST | k+= LAST ) )? k+= INTO ) | ka= AFTER | kb= BEFORE )\n            var alt200=3;\n            switch ( this.input.LA(1) ) {\n            case AS:\n            case INTO:\n                alt200=1;\n                break;\n            case AFTER:\n                alt200=2;\n                break;\n            case BEFORE:\n                alt200=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 200, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt200) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:11: ( (k+= AS (k+= FIRST | k+= LAST ) )? k+= INTO )\n                    root_0 = this.adaptor.nil();\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:11: ( (k+= AS (k+= FIRST | k+= LAST ) )? k+= INTO )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:12: (k+= AS (k+= FIRST | k+= LAST ) )? k+= INTO\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:12: (k+= AS (k+= FIRST | k+= LAST ) )?\n                    var alt199=2;\n                    var LA199_0 = this.input.LA(1);\n\n                    if ( (LA199_0==AS) ) {\n                        alt199=1;\n                    }\n                    switch (alt199) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:13: k+= AS (k+= FIRST | k+= LAST )\n                            k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_InsertExprTargetChoice14275); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n                            if (org.antlr.lang.isNull(list_k)) list_k = [];\n                            list_k.push(k);\n\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:19: (k+= FIRST | k+= LAST )\n                            var alt198=2;\n                            var LA198_0 = this.input.LA(1);\n\n                            if ( (LA198_0==FIRST) ) {\n                                alt198=1;\n                            }\n                            else if ( (LA198_0==LAST) ) {\n                                alt198=2;\n                            }\n                            else {\n                                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                                var nvae =\n                                    new org.antlr.runtime.NoViableAltException(\"\", 198, 0, this.input);\n\n                                throw nvae;\n                            }\n                            switch (alt198) {\n                                case 1 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:20: k+= FIRST\n                                    k=this.match(this.input,FIRST,XQueryParser.FOLLOW_FIRST_in_p_InsertExprTargetChoice14280); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    k_tree = this.adaptor.create(k);\n                                    this.adaptor.addChild(root_0, k_tree);\n                                    }\n                                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                                    list_k.push(k);\n\n\n\n                                    break;\n                                case 2 :\n                                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1741:31: k+= LAST\n                                    k=this.match(this.input,LAST,XQueryParser.FOLLOW_LAST_in_p_InsertExprTargetChoice14286); if (this.state.failed) return retval;\n                                    if ( this.state.backtracking===0 ) {\n                                    k_tree = this.adaptor.create(k);\n                                    this.adaptor.addChild(root_0, k_tree);\n                                    }\n                                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                                    list_k.push(k);\n\n\n\n                                    break;\n\n                            }\n\n\n\n                            break;\n\n                    }\n\n                    k=this.match(this.input,INTO,XQueryParser.FOLLOW_INTO_in_p_InsertExprTargetChoice14293); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(list_k);\n                    }\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1742:11: ka= AFTER\n                    root_0 = this.adaptor.nil();\n\n                    ka=this.match(this.input,AFTER,XQueryParser.FOLLOW_AFTER_in_p_InsertExprTargetChoice14310); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ka_tree = this.adaptor.create(ka);\n                    this.adaptor.addChild(root_0, ka_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(ka);\n                    }\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1743:11: kb= BEFORE\n                    root_0 = this.adaptor.nil();\n\n                    kb=this.match(this.input,BEFORE,XQueryParser.FOLLOW_BEFORE_in_p_InsertExprTargetChoice14326); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    kb_tree = this.adaptor.create(kb);\n                    this.adaptor.addChild(root_0, kb_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(kb);\n                    }\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_InsertExpr_return: (function() {\n        XQueryParser.p_InsertExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_InsertExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1747:1: p_InsertExpr : k+= INSERT (k+= NODE | k+= NODES ) p_SourceExpr p_InsertExprTargetChoice p_TargetExpr ;\n    // $ANTLR start \"p_InsertExpr\"\n    p_InsertExpr: function() {\n        var retval = new XQueryParser.p_InsertExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_SourceExpr616 = null;\n         var p_InsertExprTargetChoice617 = null;\n         var p_TargetExpr618 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1748:9: (k+= INSERT (k+= NODE | k+= NODES ) p_SourceExpr p_InsertExprTargetChoice p_TargetExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1748:11: k+= INSERT (k+= NODE | k+= NODES ) p_SourceExpr p_InsertExprTargetChoice p_TargetExpr\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,INSERT,XQueryParser.FOLLOW_INSERT_in_p_InsertExpr14356); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1748:21: (k+= NODE | k+= NODES )\n            var alt201=2;\n            var LA201_0 = this.input.LA(1);\n\n            if ( (LA201_0==NODE) ) {\n                alt201=1;\n            }\n            else if ( (LA201_0==NODES) ) {\n                alt201=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 201, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt201) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1748:22: k+= NODE\n                    k=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_InsertExpr14361); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1748:32: k+= NODES\n                    k=this.match(this.input,NODES,XQueryParser.FOLLOW_NODES_in_p_InsertExpr14367); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_SourceExpr_in_p_InsertExpr14370);\n            p_SourceExpr616=this.p_SourceExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SourceExpr616.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_InsertExprTargetChoice_in_p_InsertExpr14372);\n            p_InsertExprTargetChoice617=this.p_InsertExprTargetChoice();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InsertExprTargetChoice617.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_TargetExpr_in_p_InsertExpr14374);\n            p_TargetExpr618=this.p_TargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TargetExpr618.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_DeleteExpr_return: (function() {\n        XQueryParser.p_DeleteExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_DeleteExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1752:1: p_DeleteExpr : k+= DELETE (k+= NODE | k+= NODES ) p_TargetExpr ;\n    // $ANTLR start \"p_DeleteExpr\"\n    p_DeleteExpr: function() {\n        var retval = new XQueryParser.p_DeleteExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_TargetExpr619 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1753:9: (k+= DELETE (k+= NODE | k+= NODES ) p_TargetExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1753:11: k+= DELETE (k+= NODE | k+= NODES ) p_TargetExpr\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DELETE,XQueryParser.FOLLOW_DELETE_in_p_DeleteExpr14404); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1753:21: (k+= NODE | k+= NODES )\n            var alt202=2;\n            var LA202_0 = this.input.LA(1);\n\n            if ( (LA202_0==NODE) ) {\n                alt202=1;\n            }\n            else if ( (LA202_0==NODES) ) {\n                alt202=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 202, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt202) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1753:22: k+= NODE\n                    k=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_DeleteExpr14409); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1753:32: k+= NODES\n                    k=this.match(this.input,NODES,XQueryParser.FOLLOW_NODES_in_p_DeleteExpr14415); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_TargetExpr_in_p_DeleteExpr14418);\n            p_TargetExpr619=this.p_TargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TargetExpr619.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ReplaceExpr_return: (function() {\n        XQueryParser.p_ReplaceExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ReplaceExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1757:1: p_ReplaceExpr : k+= REPLACE (k+= VALUE k+= OF )? k+= NODE p_ExprSingle[true] k+= WITH p_ExprSingle[true] ;\n    // $ANTLR start \"p_ReplaceExpr\"\n    p_ReplaceExpr: function() {\n        var retval = new XQueryParser.p_ReplaceExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_ExprSingle620 = null;\n         var p_ExprSingle621 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1758:9: (k+= REPLACE (k+= VALUE k+= OF )? k+= NODE p_ExprSingle[true] k+= WITH p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1758:11: k+= REPLACE (k+= VALUE k+= OF )? k+= NODE p_ExprSingle[true] k+= WITH p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,REPLACE,XQueryParser.FOLLOW_REPLACE_in_p_ReplaceExpr14448); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1758:22: (k+= VALUE k+= OF )?\n            var alt203=2;\n            var LA203_0 = this.input.LA(1);\n\n            if ( (LA203_0==VALUE) ) {\n                alt203=1;\n            }\n            switch (alt203) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1758:23: k+= VALUE k+= OF\n                    k=this.match(this.input,VALUE,XQueryParser.FOLLOW_VALUE_in_p_ReplaceExpr14453); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,OF,XQueryParser.FOLLOW_OF_in_p_ReplaceExpr14457); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_ReplaceExpr14463); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_ReplaceExpr14465);\n            p_ExprSingle620=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle620.getTree());\n            k=this.match(this.input,WITH,XQueryParser.FOLLOW_WITH_in_p_ReplaceExpr14470); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_ReplaceExpr14472);\n            p_ExprSingle621=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle621.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_RenameExpr_return: (function() {\n        XQueryParser.p_RenameExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_RenameExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1762:1: p_RenameExpr : k+= RENAME k+= NODE p_TargetExpr k+= AS p_NewNameExpr ;\n    // $ANTLR start \"p_RenameExpr\"\n    p_RenameExpr: function() {\n        var retval = new XQueryParser.p_RenameExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_TargetExpr622 = null;\n         var p_NewNameExpr623 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1763:9: (k+= RENAME k+= NODE p_TargetExpr k+= AS p_NewNameExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1763:11: k+= RENAME k+= NODE p_TargetExpr k+= AS p_NewNameExpr\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,RENAME,XQueryParser.FOLLOW_RENAME_in_p_RenameExpr14503); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_RenameExpr14507); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_TargetExpr_in_p_RenameExpr14509);\n            p_TargetExpr622=this.p_TargetExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TargetExpr622.getTree());\n            k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_RenameExpr14513); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_NewNameExpr_in_p_RenameExpr14515);\n            p_NewNameExpr623=this.p_NewNameExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_NewNameExpr623.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SourceExpr_return: (function() {\n        XQueryParser.p_SourceExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SourceExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1767:1: p_SourceExpr : p_ExprSingle[true] ;\n    // $ANTLR start \"p_SourceExpr\"\n    p_SourceExpr: function() {\n        var retval = new XQueryParser.p_SourceExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle624 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1768:9: ( p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1768:11: p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_SourceExpr14543);\n            p_ExprSingle624=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle624.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TargetExpr_return: (function() {\n        XQueryParser.p_TargetExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TargetExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1772:1: p_TargetExpr : p_ExprSingle[true] ;\n    // $ANTLR start \"p_TargetExpr\"\n    p_TargetExpr: function() {\n        var retval = new XQueryParser.p_TargetExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle625 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1773:9: ( p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1773:11: p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_TargetExpr14570);\n            p_ExprSingle625=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle625.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_NewNameExpr_return: (function() {\n        XQueryParser.p_NewNameExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_NewNameExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1777:1: p_NewNameExpr : p_ExprSingle[true] ;\n    // $ANTLR start \"p_NewNameExpr\"\n    p_NewNameExpr: function() {\n        var retval = new XQueryParser.p_NewNameExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_ExprSingle626 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1778:9: ( p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1778:11: p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_NewNameExpr14597);\n            p_ExprSingle626=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle626.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TransformExpr_return: (function() {\n        XQueryParser.p_TransformExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TransformExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1782:1: p_TransformExpr : k+= COPY d= DOLLAR v= p_VarName BIND p_ExprSingle[true] ( COMMA e= DOLLAR w= p_VarName BIND p_ExprSingle[true] )* k+= MODIFY p_ExprSingle[true] k+= RETURN p_ExprSingle[true] ;\n    // $ANTLR start \"p_TransformExpr\"\n    p_TransformExpr: function() {\n        var retval = new XQueryParser.p_TransformExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n        var e = null;\n        var BIND627 = null;\n        var COMMA629 = null;\n        var BIND630 = null;\n        var k = null;\n        var list_k=null;\n         var v = null;\n         var w = null;\n         var p_ExprSingle628 = null;\n         var p_ExprSingle631 = null;\n         var p_ExprSingle632 = null;\n         var p_ExprSingle633 = null;\n\n        var d_tree=null;\n        var e_tree=null;\n        var BIND627_tree=null;\n        var COMMA629_tree=null;\n        var BIND630_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1783:9: (k+= COPY d= DOLLAR v= p_VarName BIND p_ExprSingle[true] ( COMMA e= DOLLAR w= p_VarName BIND p_ExprSingle[true] )* k+= MODIFY p_ExprSingle[true] k+= RETURN p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1783:11: k+= COPY d= DOLLAR v= p_VarName BIND p_ExprSingle[true] ( COMMA e= DOLLAR w= p_VarName BIND p_ExprSingle[true] )* k+= MODIFY p_ExprSingle[true] k+= RETURN p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,COPY,XQueryParser.FOLLOW_COPY_in_p_TransformExpr14626); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_TransformExpr14630); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_TransformExpr14634);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            BIND627=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_TransformExpr14638); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            BIND627_tree = this.adaptor.create(BIND627);\n            this.adaptor.addChild(root_0, BIND627_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_TransformExpr14640);\n            p_ExprSingle628=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle628.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1783:90: ( COMMA e= DOLLAR w= p_VarName BIND p_ExprSingle[true] )*\n            loop204:\n            do {\n                var alt204=2;\n                var LA204_0 = this.input.LA(1);\n\n                if ( (LA204_0==COMMA) ) {\n                    alt204=1;\n                }\n\n\n                switch (alt204) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1783:91: COMMA e= DOLLAR w= p_VarName BIND p_ExprSingle[true]\n                    COMMA629=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_TransformExpr14644); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA629_tree = this.adaptor.create(COMMA629);\n                    this.adaptor.addChild(root_0, COMMA629_tree);\n                    }\n                    e=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_TransformExpr14648); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    e_tree = this.adaptor.create(e);\n                    this.adaptor.addChild(root_0, e_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_TransformExpr14652);\n                    w=this.p_VarName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, w.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.av(e, (w?w.stop:null)); \n                    }\n                    BIND630=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_TransformExpr14656); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    BIND630_tree = this.adaptor.create(BIND630);\n                    this.adaptor.addChild(root_0, BIND630_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_TransformExpr14658);\n                    p_ExprSingle631=this.p_ExprSingle(true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle631.getTree());\n\n\n                    break;\n\n                default :\n                    break loop204;\n                }\n            } while (true);\n\n            k=this.match(this.input,MODIFY,XQueryParser.FOLLOW_MODIFY_in_p_TransformExpr14665); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_TransformExpr14667);\n            p_ExprSingle632=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle632.getTree());\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_TransformExpr14672); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_TransformExpr14674);\n            p_ExprSingle633=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle633.getTree());\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    pm_FTOptionDecl_return: (function() {\n        XQueryParser.pm_FTOptionDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.pm_FTOptionDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1793:1: pm_FTOptionDecl : k+= DECLARE k+= FT_OPTION p_FTMatchOptions SEMICOLON ;\n    // $ANTLR start \"pm_FTOptionDecl\"\n    pm_FTOptionDecl: function() {\n        var retval = new XQueryParser.pm_FTOptionDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SEMICOLON635 = null;\n        var k = null;\n        var list_k=null;\n         var p_FTMatchOptions634 = null;\n\n        var SEMICOLON635_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1794:9: (k+= DECLARE k+= FT_OPTION p_FTMatchOptions SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1794:11: k+= DECLARE k+= FT_OPTION p_FTMatchOptions SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,DECLARE,XQueryParser.FOLLOW_DECLARE_in_pm_FTOptionDecl14712); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,FT_OPTION,XQueryParser.FOLLOW_FT_OPTION_in_pm_FTOptionDecl14716); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTMatchOptions_in_pm_FTOptionDecl14718);\n            p_FTMatchOptions634=this.p_FTMatchOptions();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTMatchOptions634.getTree());\n            SEMICOLON635=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_pm_FTOptionDecl14720); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON635_tree = this.adaptor.create(SEMICOLON635);\n            this.adaptor.addChild(root_0, SEMICOLON635_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTScoreVar_return: (function() {\n        XQueryParser.p_FTScoreVar_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTScoreVar_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1798:1: p_FTScoreVar : ks= SCORE d= DOLLAR v= p_VarName ;\n    // $ANTLR start \"p_FTScoreVar\"\n    p_FTScoreVar: function() {\n        var retval = new XQueryParser.p_FTScoreVar_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ks = null;\n        var d = null;\n         var v = null;\n\n        var ks_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1799:9: (ks= SCORE d= DOLLAR v= p_VarName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1799:11: ks= SCORE d= DOLLAR v= p_VarName\n            root_0 = this.adaptor.nil();\n\n            ks=this.match(this.input,SCORE,XQueryParser.FOLLOW_SCORE_in_p_FTScoreVar14750); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            ks_tree = this.adaptor.create(ks);\n            this.adaptor.addChild(root_0, ks_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(ks);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_FTScoreVar14756); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_FTScoreVar14760);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTContainsExpr_return: (function() {\n        XQueryParser.p_FTContainsExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTContainsExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1803:1: p_FTContainsExpr : p_StringConcatExpr (k+= CONTAINS k+= TEXT p_FTSelection ( p_FTIgnoreOption )? )? ;\n    // $ANTLR start \"p_FTContainsExpr\"\n    p_FTContainsExpr: function() {\n        var retval = new XQueryParser.p_FTContainsExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_StringConcatExpr636 = null;\n         var p_FTSelection637 = null;\n         var p_FTIgnoreOption638 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1804:9: ( p_StringConcatExpr (k+= CONTAINS k+= TEXT p_FTSelection ( p_FTIgnoreOption )? )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1804:11: p_StringConcatExpr (k+= CONTAINS k+= TEXT p_FTSelection ( p_FTIgnoreOption )? )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StringConcatExpr_in_p_FTContainsExpr14788);\n            p_StringConcatExpr636=this.p_StringConcatExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringConcatExpr636.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1804:30: (k+= CONTAINS k+= TEXT p_FTSelection ( p_FTIgnoreOption )? )?\n            var alt206=2;\n            var LA206_0 = this.input.LA(1);\n\n            if ( (LA206_0==CONTAINS) ) {\n                alt206=1;\n            }\n            switch (alt206) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1804:32: k+= CONTAINS k+= TEXT p_FTSelection ( p_FTIgnoreOption )?\n                    k=this.match(this.input,CONTAINS,XQueryParser.FOLLOW_CONTAINS_in_p_FTContainsExpr14794); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,TEXT,XQueryParser.FOLLOW_TEXT_in_p_FTContainsExpr14798); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(list_k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTSelection_in_p_FTContainsExpr14802);\n                    p_FTSelection637=this.p_FTSelection();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTSelection637.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1804:81: ( p_FTIgnoreOption )?\n                    var alt205=2;\n                    var LA205_0 = this.input.LA(1);\n\n                    if ( (LA205_0==WITHOUT) ) {\n                        alt205=1;\n                    }\n                    switch (alt205) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1804:81: p_FTIgnoreOption\n                            this.pushFollow(XQueryParser.FOLLOW_p_FTIgnoreOption_in_p_FTContainsExpr14804);\n                            p_FTIgnoreOption638=this.p_FTIgnoreOption();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTIgnoreOption638.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTSelection_return: (function() {\n        XQueryParser.p_FTSelection_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTSelection_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1808:1: p_FTSelection : p_FTOr ( p_FTPosFilter )* ;\n    // $ANTLR start \"p_FTSelection\"\n    p_FTSelection: function() {\n        var retval = new XQueryParser.p_FTSelection_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_FTOr639 = null;\n         var p_FTPosFilter640 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1809:9: ( p_FTOr ( p_FTPosFilter )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1809:11: p_FTOr ( p_FTPosFilter )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTOr_in_p_FTSelection14834);\n            p_FTOr639=this.p_FTOr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTOr639.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1809:18: ( p_FTPosFilter )*\n            loop207:\n            do {\n                var alt207=2;\n                var LA207_0 = this.input.LA(1);\n\n                if ( (LA207_0==AT) ) {\n                    var LA207_2 = this.input.LA(2);\n\n                    if ( (LA207_2==END||LA207_2==START) ) {\n                        alt207=1;\n                    }\n\n\n                }\n                else if ( (LA207_0==ORDERED||LA207_0==WINDOW||(LA207_0>=DIFFERENT && LA207_0<=ENTIRE)||LA207_0==SAME) ) {\n                    alt207=1;\n                }\n\n\n                switch (alt207) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1809:18: p_FTPosFilter\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTPosFilter_in_p_FTSelection14836);\n                    p_FTPosFilter640=this.p_FTPosFilter();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTPosFilter640.getTree());\n\n\n                    break;\n\n                default :\n                    break loop207;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTWeight_return: (function() {\n        XQueryParser.p_FTWeight_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTWeight_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1813:1: p_FTWeight : kw= WEIGHT LBRACKET p_Expr[true,true] RBRACKET ;\n    // $ANTLR start \"p_FTWeight\"\n    p_FTWeight: function() {\n        var retval = new XQueryParser.p_FTWeight_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var kw = null;\n        var LBRACKET641 = null;\n        var RBRACKET643 = null;\n         var p_Expr642 = null;\n\n        var kw_tree=null;\n        var LBRACKET641_tree=null;\n        var RBRACKET643_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1814:9: (kw= WEIGHT LBRACKET p_Expr[true,true] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1814:11: kw= WEIGHT LBRACKET p_Expr[true,true] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            kw=this.match(this.input,WEIGHT,XQueryParser.FOLLOW_WEIGHT_in_p_FTWeight14865); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            kw_tree = this.adaptor.create(kw);\n            this.adaptor.addChild(root_0, kw_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(kw);\n            }\n            LBRACKET641=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_FTWeight14869); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET641_tree = this.adaptor.create(LBRACKET641);\n            this.adaptor.addChild(root_0, LBRACKET641_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_FTWeight14871);\n            p_Expr642=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr642.getTree());\n            RBRACKET643=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_FTWeight14874); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET643_tree = this.adaptor.create(RBRACKET643);\n            this.adaptor.addChild(root_0, RBRACKET643_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTOr_return: (function() {\n        XQueryParser.p_FTOr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTOr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1818:1: p_FTOr : p_FTAnd (ko= FTOR p_FTAnd )* ;\n    // $ANTLR start \"p_FTOr\"\n    p_FTOr: function() {\n        var retval = new XQueryParser.p_FTOr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ko = null;\n         var p_FTAnd644 = null;\n         var p_FTAnd645 = null;\n\n        var ko_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1819:9: ( p_FTAnd (ko= FTOR p_FTAnd )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1819:11: p_FTAnd (ko= FTOR p_FTAnd )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTAnd_in_p_FTOr14900);\n            p_FTAnd644=this.p_FTAnd();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTAnd644.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1819:19: (ko= FTOR p_FTAnd )*\n            loop208:\n            do {\n                var alt208=2;\n                var LA208_0 = this.input.LA(1);\n\n                if ( (LA208_0==FTOR) ) {\n                    alt208=1;\n                }\n\n\n                switch (alt208) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1819:21: ko= FTOR p_FTAnd\n                    ko=this.match(this.input,FTOR,XQueryParser.FOLLOW_FTOR_in_p_FTOr14906); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ko_tree = this.adaptor.create(ko);\n                    this.adaptor.addChild(root_0, ko_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(ko);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTAnd_in_p_FTOr14910);\n                    p_FTAnd645=this.p_FTAnd();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTAnd645.getTree());\n\n\n                    break;\n\n                default :\n                    break loop208;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTAnd_return: (function() {\n        XQueryParser.p_FTAnd_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTAnd_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1823:1: p_FTAnd : p_FTMildNot (ka= FTAND p_FTMildNot )* ;\n    // $ANTLR start \"p_FTAnd\"\n    p_FTAnd: function() {\n        var retval = new XQueryParser.p_FTAnd_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ka = null;\n         var p_FTMildNot646 = null;\n         var p_FTMildNot647 = null;\n\n        var ka_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1824:9: ( p_FTMildNot (ka= FTAND p_FTMildNot )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1824:11: p_FTMildNot (ka= FTAND p_FTMildNot )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTMildNot_in_p_FTAnd14939);\n            p_FTMildNot646=this.p_FTMildNot();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTMildNot646.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1824:23: (ka= FTAND p_FTMildNot )*\n            loop209:\n            do {\n                var alt209=2;\n                var LA209_0 = this.input.LA(1);\n\n                if ( (LA209_0==FTAND) ) {\n                    alt209=1;\n                }\n\n\n                switch (alt209) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1824:25: ka= FTAND p_FTMildNot\n                    ka=this.match(this.input,FTAND,XQueryParser.FOLLOW_FTAND_in_p_FTAnd14945); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ka_tree = this.adaptor.create(ka);\n                    this.adaptor.addChild(root_0, ka_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(ka);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTMildNot_in_p_FTAnd14949);\n                    p_FTMildNot647=this.p_FTMildNot();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTMildNot647.getTree());\n\n\n                    break;\n\n                default :\n                    break loop209;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTMildNot_return: (function() {\n        XQueryParser.p_FTMildNot_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTMildNot_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1828:1: p_FTMildNot : p_FTUnaryNot (k+= NOT k+= IN p_FTUnaryNot )* ;\n    // $ANTLR start \"p_FTMildNot\"\n    p_FTMildNot: function() {\n        var retval = new XQueryParser.p_FTMildNot_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_FTUnaryNot648 = null;\n         var p_FTUnaryNot649 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1829:9: ( p_FTUnaryNot (k+= NOT k+= IN p_FTUnaryNot )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1829:11: p_FTUnaryNot (k+= NOT k+= IN p_FTUnaryNot )*\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTUnaryNot_in_p_FTMildNot14978);\n            p_FTUnaryNot648=this.p_FTUnaryNot();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTUnaryNot648.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1829:24: (k+= NOT k+= IN p_FTUnaryNot )*\n            loop210:\n            do {\n                var alt210=2;\n                var LA210_0 = this.input.LA(1);\n\n                if ( (LA210_0==NOT) ) {\n                    alt210=1;\n                }\n\n\n                switch (alt210) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1829:26: k+= NOT k+= IN p_FTUnaryNot\n                    k=this.match(this.input,NOT,XQueryParser.FOLLOW_NOT_in_p_FTMildNot14984); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,IN,XQueryParser.FOLLOW_IN_in_p_FTMildNot14988); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(list_k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTUnaryNot_in_p_FTMildNot14992);\n                    p_FTUnaryNot649=this.p_FTUnaryNot();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTUnaryNot649.getTree());\n\n\n                    break;\n\n                default :\n                    break loop210;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTUnaryNot_return: (function() {\n        XQueryParser.p_FTUnaryNot_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTUnaryNot_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1833:1: p_FTUnaryNot : (kn= FTNOT )? p_FTPrimaryWithOptions ;\n    // $ANTLR start \"p_FTUnaryNot\"\n    p_FTUnaryNot: function() {\n        var retval = new XQueryParser.p_FTUnaryNot_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var kn = null;\n         var p_FTPrimaryWithOptions650 = null;\n\n        var kn_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1834:9: ( (kn= FTNOT )? p_FTPrimaryWithOptions )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1834:11: (kn= FTNOT )? p_FTPrimaryWithOptions\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1834:11: (kn= FTNOT )?\n            var alt211=2;\n            var LA211_0 = this.input.LA(1);\n\n            if ( (LA211_0==FTNOT) ) {\n                alt211=1;\n            }\n            switch (alt211) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1834:13: kn= FTNOT\n                    kn=this.match(this.input,FTNOT,XQueryParser.FOLLOW_FTNOT_in_p_FTUnaryNot15025); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    kn_tree = this.adaptor.create(kn);\n                    this.adaptor.addChild(root_0, kn_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(kn);\n                    }\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTPrimaryWithOptions_in_p_FTUnaryNot15032);\n            p_FTPrimaryWithOptions650=this.p_FTPrimaryWithOptions();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTPrimaryWithOptions650.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTPrimaryWithOptions_return: (function() {\n        XQueryParser.p_FTPrimaryWithOptions_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTPrimaryWithOptions_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1838:1: p_FTPrimaryWithOptions : p_FTPrimary ( p_FTMatchOptions )? ( p_FTWeight )? ;\n    // $ANTLR start \"p_FTPrimaryWithOptions\"\n    p_FTPrimaryWithOptions: function() {\n        var retval = new XQueryParser.p_FTPrimaryWithOptions_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_FTPrimary651 = null;\n         var p_FTMatchOptions652 = null;\n         var p_FTWeight653 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1839:9: ( p_FTPrimary ( p_FTMatchOptions )? ( p_FTWeight )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1839:11: p_FTPrimary ( p_FTMatchOptions )? ( p_FTWeight )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTPrimary_in_p_FTPrimaryWithOptions15058);\n            p_FTPrimary651=this.p_FTPrimary();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTPrimary651.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1839:23: ( p_FTMatchOptions )?\n            var alt212=2;\n            var LA212_0 = this.input.LA(1);\n\n            if ( (LA212_0==USING) ) {\n                alt212=1;\n            }\n            switch (alt212) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1839:23: p_FTMatchOptions\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTMatchOptions_in_p_FTPrimaryWithOptions15060);\n                    p_FTMatchOptions652=this.p_FTMatchOptions();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTMatchOptions652.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1839:41: ( p_FTWeight )?\n            var alt213=2;\n            var LA213_0 = this.input.LA(1);\n\n            if ( (LA213_0==WEIGHT) ) {\n                alt213=1;\n            }\n            switch (alt213) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1839:41: p_FTWeight\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTWeight_in_p_FTPrimaryWithOptions15063);\n                    p_FTWeight653=this.p_FTWeight();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTWeight653.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTPrimary_return: (function() {\n        XQueryParser.p_FTPrimary_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTPrimary_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1846:1: p_FTPrimary : ( ( p_FTWords ( p_FTTimes )? ) | ( LPAREN p_FTSelection RPAREN ) | p_FTExtensionSelection );\n    // $ANTLR start \"p_FTPrimary\"\n    p_FTPrimary: function() {\n        var retval = new XQueryParser.p_FTPrimary_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LPAREN656 = null;\n        var RPAREN658 = null;\n         var p_FTWords654 = null;\n         var p_FTTimes655 = null;\n         var p_FTSelection657 = null;\n         var p_FTExtensionSelection659 = null;\n\n        var LPAREN656_tree=null;\n        var RPAREN658_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1847:9: ( ( p_FTWords ( p_FTTimes )? ) | ( LPAREN p_FTSelection RPAREN ) | p_FTExtensionSelection )\n            var alt215=3;\n            switch ( this.input.LA(1) ) {\n            case LBRACKET:\n            case APOS:\n            case QUOT:\n                alt215=1;\n                break;\n            case LPAREN:\n                alt215=2;\n                break;\n            case L_Pragma:\n                alt215=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 215, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt215) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1847:11: ( p_FTWords ( p_FTTimes )? )\n                    root_0 = this.adaptor.nil();\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1847:11: ( p_FTWords ( p_FTTimes )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1847:12: p_FTWords ( p_FTTimes )?\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTWords_in_p_FTPrimary15094);\n                    p_FTWords654=this.p_FTWords();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTWords654.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1847:22: ( p_FTTimes )?\n                    var alt214=2;\n                    var LA214_0 = this.input.LA(1);\n\n                    if ( (LA214_0==OCCURS) ) {\n                        alt214=1;\n                    }\n                    switch (alt214) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1847:22: p_FTTimes\n                            this.pushFollow(XQueryParser.FOLLOW_p_FTTimes_in_p_FTPrimary15096);\n                            p_FTTimes655=this.p_FTTimes();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTTimes655.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1848:11: ( LPAREN p_FTSelection RPAREN )\n                    root_0 = this.adaptor.nil();\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1848:11: ( LPAREN p_FTSelection RPAREN )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1848:12: LPAREN p_FTSelection RPAREN\n                    LPAREN656=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_FTPrimary15111); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LPAREN656_tree = this.adaptor.create(LPAREN656);\n                    this.adaptor.addChild(root_0, LPAREN656_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTSelection_in_p_FTPrimary15113);\n                    p_FTSelection657=this.p_FTSelection();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTSelection657.getTree());\n                    RPAREN658=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_FTPrimary15115); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RPAREN658_tree = this.adaptor.create(RPAREN658);\n                    this.adaptor.addChild(root_0, RPAREN658_tree);\n                    }\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1849:11: p_FTExtensionSelection\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTExtensionSelection_in_p_FTPrimary15128);\n                    p_FTExtensionSelection659=this.p_FTExtensionSelection();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTExtensionSelection659.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTWords_return: (function() {\n        XQueryParser.p_FTWords_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTWords_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1853:1: p_FTWords : p_FTWordsValue ( p_FTAnyallOption )? ;\n    // $ANTLR start \"p_FTWords\"\n    p_FTWords: function() {\n        var retval = new XQueryParser.p_FTWords_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_FTWordsValue660 = null;\n         var p_FTAnyallOption661 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1854:9: ( p_FTWordsValue ( p_FTAnyallOption )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1854:11: p_FTWordsValue ( p_FTAnyallOption )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTWordsValue_in_p_FTWords15154);\n            p_FTWordsValue660=this.p_FTWordsValue();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTWordsValue660.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1854:26: ( p_FTAnyallOption )?\n            var alt216=2;\n            var LA216_0 = this.input.LA(1);\n\n            if ( ((LA216_0>=ALL && LA216_0<=ANY)||LA216_0==PHRASE) ) {\n                alt216=1;\n            }\n            switch (alt216) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1854:26: p_FTAnyallOption\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTAnyallOption_in_p_FTWords15156);\n                    p_FTAnyallOption661=this.p_FTAnyallOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTAnyallOption661.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTWordsValue_return: (function() {\n        XQueryParser.p_FTWordsValue_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTWordsValue_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1858:1: p_FTWordsValue : ( p_StringLiteral | ( LBRACKET p_Expr[true,true] RBRACKET ) );\n    // $ANTLR start \"p_FTWordsValue\"\n    p_FTWordsValue: function() {\n        var retval = new XQueryParser.p_FTWordsValue_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LBRACKET663 = null;\n        var RBRACKET665 = null;\n         var p_StringLiteral662 = null;\n         var p_Expr664 = null;\n\n        var LBRACKET663_tree=null;\n        var RBRACKET665_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1859:9: ( p_StringLiteral | ( LBRACKET p_Expr[true,true] RBRACKET ) )\n            var alt217=2;\n            var LA217_0 = this.input.LA(1);\n\n            if ( ((LA217_0>=APOS && LA217_0<=QUOT)) ) {\n                alt217=1;\n            }\n            else if ( (LA217_0==LBRACKET) ) {\n                alt217=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 217, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt217) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1859:11: p_StringLiteral\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTWordsValue15183);\n                    p_StringLiteral662=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral662.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1860:11: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    root_0 = this.adaptor.nil();\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1860:11: ( LBRACKET p_Expr[true,true] RBRACKET )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1860:12: LBRACKET p_Expr[true,true] RBRACKET\n                    LBRACKET663=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_FTWordsValue15196); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LBRACKET663_tree = this.adaptor.create(LBRACKET663);\n                    this.adaptor.addChild(root_0, LBRACKET663_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_FTWordsValue15198);\n                    p_Expr664=this.p_Expr(true, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr664.getTree());\n                    RBRACKET665=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_FTWordsValue15201); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RBRACKET665_tree = this.adaptor.create(RBRACKET665);\n                    this.adaptor.addChild(root_0, RBRACKET665_tree);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTExtensionSelection_return: (function() {\n        XQueryParser.p_FTExtensionSelection_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTExtensionSelection_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1864:1: p_FTExtensionSelection : ( L_Pragma )+ LBRACKET ( p_FTSelection )? RBRACKET ;\n    // $ANTLR start \"p_FTExtensionSelection\"\n    p_FTExtensionSelection: function() {\n        var retval = new XQueryParser.p_FTExtensionSelection_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var L_Pragma666 = null;\n        var LBRACKET667 = null;\n        var RBRACKET669 = null;\n         var p_FTSelection668 = null;\n\n        var L_Pragma666_tree=null;\n        var LBRACKET667_tree=null;\n        var RBRACKET669_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1865:9: ( ( L_Pragma )+ LBRACKET ( p_FTSelection )? RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1865:11: ( L_Pragma )+ LBRACKET ( p_FTSelection )? RBRACKET\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1865:11: ( L_Pragma )+\n            var cnt218=0;\n            loop218:\n            do {\n                var alt218=2;\n                var LA218_0 = this.input.LA(1);\n\n                if ( (LA218_0==L_Pragma) ) {\n                    alt218=1;\n                }\n\n\n                switch (alt218) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1865:11: L_Pragma\n                    L_Pragma666=this.match(this.input,L_Pragma,XQueryParser.FOLLOW_L_Pragma_in_p_FTExtensionSelection15228); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_Pragma666_tree = this.adaptor.create(L_Pragma666);\n                    this.adaptor.addChild(root_0, L_Pragma666_tree);\n                    }\n\n\n                    break;\n\n                default :\n                    if ( cnt218 >= 1 ) {\n                        break loop218;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(218, this.input);\n                        throw eee;\n                }\n                cnt218++;\n            } while (true);\n\n            LBRACKET667=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_FTExtensionSelection15231); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET667_tree = this.adaptor.create(LBRACKET667);\n            this.adaptor.addChild(root_0, LBRACKET667_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1865:30: ( p_FTSelection )?\n            var alt219=2;\n            var LA219_0 = this.input.LA(1);\n\n            if ( (LA219_0==FTNOT||LA219_0==LPAREN||LA219_0==LBRACKET||(LA219_0>=APOS && LA219_0<=QUOT)||LA219_0==L_Pragma) ) {\n                alt219=1;\n            }\n            switch (alt219) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1865:30: p_FTSelection\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTSelection_in_p_FTExtensionSelection15233);\n                    p_FTSelection668=this.p_FTSelection();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTSelection668.getTree());\n\n\n                    break;\n\n            }\n\n            RBRACKET669=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_FTExtensionSelection15236); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET669_tree = this.adaptor.create(RBRACKET669);\n            this.adaptor.addChild(root_0, RBRACKET669_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTAnyallOption_return: (function() {\n        XQueryParser.p_FTAnyallOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTAnyallOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1869:1: p_FTAnyallOption : ( (k+= ANY (k+= WORD )? ) | (k+= ALL ( WORDS )? ) | k+= PHRASE ) ;\n    // $ANTLR start \"p_FTAnyallOption\"\n    p_FTAnyallOption: function() {\n        var retval = new XQueryParser.p_FTAnyallOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var WORDS670 = null;\n        var k = null;\n        var list_k=null;\n\n        var WORDS670_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:9: ( ( (k+= ANY (k+= WORD )? ) | (k+= ALL ( WORDS )? ) | k+= PHRASE ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:11: ( (k+= ANY (k+= WORD )? ) | (k+= ALL ( WORDS )? ) | k+= PHRASE )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:11: ( (k+= ANY (k+= WORD )? ) | (k+= ALL ( WORDS )? ) | k+= PHRASE )\n            var alt222=3;\n            switch ( this.input.LA(1) ) {\n            case ANY:\n                alt222=1;\n                break;\n            case ALL:\n                alt222=2;\n                break;\n            case PHRASE:\n                alt222=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 222, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt222) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:13: (k+= ANY (k+= WORD )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:13: (k+= ANY (k+= WORD )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:14: k+= ANY (k+= WORD )?\n                    k=this.match(this.input,ANY,XQueryParser.FOLLOW_ANY_in_p_FTAnyallOption15267); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:22: (k+= WORD )?\n                    var alt220=2;\n                    var LA220_0 = this.input.LA(1);\n\n                    if ( (LA220_0==WORD) ) {\n                        alt220=1;\n                    }\n                    switch (alt220) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:22: k+= WORD\n                            k=this.match(this.input,WORD,XQueryParser.FOLLOW_WORD_in_p_FTAnyallOption15271); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n                            if (org.antlr.lang.isNull(list_k)) list_k = [];\n                            list_k.push(k);\n\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:33: (k+= ALL ( WORDS )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:33: (k+= ALL ( WORDS )? )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:34: k+= ALL ( WORDS )?\n                    k=this.match(this.input,ALL,XQueryParser.FOLLOW_ALL_in_p_FTAnyallOption15280); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:41: ( WORDS )?\n                    var alt221=2;\n                    var LA221_0 = this.input.LA(1);\n\n                    if ( (LA221_0==WORDS) ) {\n                        alt221=1;\n                    }\n                    switch (alt221) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:41: WORDS\n                            WORDS670=this.match(this.input,WORDS,XQueryParser.FOLLOW_WORDS_in_p_FTAnyallOption15282); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            WORDS670_tree = this.adaptor.create(WORDS670);\n                            this.adaptor.addChild(root_0, WORDS670_tree);\n                            }\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1870:51: k+= PHRASE\n                    k=this.match(this.input,PHRASE,XQueryParser.FOLLOW_PHRASE_in_p_FTAnyallOption15290); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTTimes_return: (function() {\n        XQueryParser.p_FTTimes_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTTimes_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1874:1: p_FTTimes : k+= OCCURS p_FTRange k+= TIMES ;\n    // $ANTLR start \"p_FTTimes\"\n    p_FTTimes: function() {\n        var retval = new XQueryParser.p_FTTimes_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_FTRange671 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1875:9: (k+= OCCURS p_FTRange k+= TIMES )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1875:11: k+= OCCURS p_FTRange k+= TIMES\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,OCCURS,XQueryParser.FOLLOW_OCCURS_in_p_FTTimes15322); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTRange_in_p_FTTimes15324);\n            p_FTRange671=this.p_FTRange();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTRange671.getTree());\n            k=this.match(this.input,TIMES,XQueryParser.FOLLOW_TIMES_in_p_FTTimes15328); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTRange_return: (function() {\n        XQueryParser.p_FTRange_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTRange_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1879:1: p_FTRange : ( (k+= EXACTLY p_AdditiveExpr ) | (k+= AT k+= LEAST p_AdditiveExpr ) | (k+= AT k+= MOST p_AdditiveExpr ) | (k+= FROM p_AdditiveExpr k+= TO p_AdditiveExpr ) ) ;\n    // $ANTLR start \"p_FTRange\"\n    p_FTRange: function() {\n        var retval = new XQueryParser.p_FTRange_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_AdditiveExpr672 = null;\n         var p_AdditiveExpr673 = null;\n         var p_AdditiveExpr674 = null;\n         var p_AdditiveExpr675 = null;\n         var p_AdditiveExpr676 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1880:9: ( ( (k+= EXACTLY p_AdditiveExpr ) | (k+= AT k+= LEAST p_AdditiveExpr ) | (k+= AT k+= MOST p_AdditiveExpr ) | (k+= FROM p_AdditiveExpr k+= TO p_AdditiveExpr ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1880:11: ( (k+= EXACTLY p_AdditiveExpr ) | (k+= AT k+= LEAST p_AdditiveExpr ) | (k+= AT k+= MOST p_AdditiveExpr ) | (k+= FROM p_AdditiveExpr k+= TO p_AdditiveExpr ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1880:11: ( (k+= EXACTLY p_AdditiveExpr ) | (k+= AT k+= LEAST p_AdditiveExpr ) | (k+= AT k+= MOST p_AdditiveExpr ) | (k+= FROM p_AdditiveExpr k+= TO p_AdditiveExpr ) )\n            var alt223=4;\n            switch ( this.input.LA(1) ) {\n            case EXACTLY:\n                alt223=1;\n                break;\n            case AT:\n                var LA223_2 = this.input.LA(2);\n\n                if ( (LA223_2==LEAST) ) {\n                    alt223=2;\n                }\n                else if ( (LA223_2==MOST) ) {\n                    alt223=3;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 223, 2, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case FROM:\n                alt223=4;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 223, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt223) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1880:13: (k+= EXACTLY p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1880:13: (k+= EXACTLY p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1880:14: k+= EXACTLY p_AdditiveExpr\n                    k=this.match(this.input,EXACTLY,XQueryParser.FOLLOW_EXACTLY_in_p_FTRange15361); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_FTRange15363);\n                    p_AdditiveExpr672=this.p_AdditiveExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr672.getTree());\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1881:13: (k+= AT k+= LEAST p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1881:13: (k+= AT k+= LEAST p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1881:14: k+= AT k+= LEAST p_AdditiveExpr\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTRange15381); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,LEAST,XQueryParser.FOLLOW_LEAST_in_p_FTRange15385); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_FTRange15387);\n                    p_AdditiveExpr673=this.p_AdditiveExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr673.getTree());\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1882:13: (k+= AT k+= MOST p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1882:13: (k+= AT k+= MOST p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1882:14: k+= AT k+= MOST p_AdditiveExpr\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTRange15405); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,MOST,XQueryParser.FOLLOW_MOST_in_p_FTRange15409); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_FTRange15411);\n                    p_AdditiveExpr674=this.p_AdditiveExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr674.getTree());\n\n\n\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1883:13: (k+= FROM p_AdditiveExpr k+= TO p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1883:13: (k+= FROM p_AdditiveExpr k+= TO p_AdditiveExpr )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1883:14: k+= FROM p_AdditiveExpr k+= TO p_AdditiveExpr\n                    k=this.match(this.input,FROM,XQueryParser.FOLLOW_FROM_in_p_FTRange15429); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_FTRange15431);\n                    p_AdditiveExpr675=this.p_AdditiveExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr675.getTree());\n                    k=this.match(this.input,TO,XQueryParser.FOLLOW_TO_in_p_FTRange15435); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_FTRange15437);\n                    p_AdditiveExpr676=this.p_AdditiveExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr676.getTree());\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTPosFilter_return: (function() {\n        XQueryParser.p_FTPosFilter_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTPosFilter_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1887:1: p_FTPosFilter : ( p_FTOrder | p_FTWindow | p_FTDistance | p_FTScope | p_FTContent );\n    // $ANTLR start \"p_FTPosFilter\"\n    p_FTPosFilter: function() {\n        var retval = new XQueryParser.p_FTPosFilter_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_FTOrder677 = null;\n         var p_FTWindow678 = null;\n         var p_FTDistance679 = null;\n         var p_FTScope680 = null;\n         var p_FTContent681 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1888:9: ( p_FTOrder | p_FTWindow | p_FTDistance | p_FTScope | p_FTContent )\n            var alt224=5;\n            switch ( this.input.LA(1) ) {\n            case ORDERED:\n                alt224=1;\n                break;\n            case WINDOW:\n                alt224=2;\n                break;\n            case DISTANCE:\n                alt224=3;\n                break;\n            case DIFFERENT:\n            case SAME:\n                alt224=4;\n                break;\n            case AT:\n            case ENTIRE:\n                alt224=5;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 224, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt224) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1888:11: p_FTOrder\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTOrder_in_p_FTPosFilter15468);\n                    p_FTOrder677=this.p_FTOrder();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTOrder677.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1888:23: p_FTWindow\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTWindow_in_p_FTPosFilter15472);\n                    p_FTWindow678=this.p_FTWindow();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTWindow678.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1888:36: p_FTDistance\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTDistance_in_p_FTPosFilter15476);\n                    p_FTDistance679=this.p_FTDistance();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTDistance679.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1888:51: p_FTScope\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTScope_in_p_FTPosFilter15480);\n                    p_FTScope680=this.p_FTScope();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTScope680.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1888:63: p_FTContent\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTContent_in_p_FTPosFilter15484);\n                    p_FTContent681=this.p_FTContent();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTContent681.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTOrder_return: (function() {\n        XQueryParser.p_FTOrder_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTOrder_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1892:1: p_FTOrder : ko= ORDERED ;\n    // $ANTLR start \"p_FTOrder\"\n    p_FTOrder: function() {\n        var retval = new XQueryParser.p_FTOrder_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ko = null;\n\n        var ko_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1893:9: (ko= ORDERED )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1893:11: ko= ORDERED\n            root_0 = this.adaptor.nil();\n\n            ko=this.match(this.input,ORDERED,XQueryParser.FOLLOW_ORDERED_in_p_FTOrder15512); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            ko_tree = this.adaptor.create(ko);\n            this.adaptor.addChild(root_0, ko_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(ko);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTWindow_return: (function() {\n        XQueryParser.p_FTWindow_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTWindow_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1897:1: p_FTWindow : kw= WINDOW p_AdditiveExpr p_FTUnit ;\n    // $ANTLR start \"p_FTWindow\"\n    p_FTWindow: function() {\n        var retval = new XQueryParser.p_FTWindow_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var kw = null;\n         var p_AdditiveExpr682 = null;\n         var p_FTUnit683 = null;\n\n        var kw_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1898:9: (kw= WINDOW p_AdditiveExpr p_FTUnit )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1898:11: kw= WINDOW p_AdditiveExpr p_FTUnit\n            root_0 = this.adaptor.nil();\n\n            kw=this.match(this.input,WINDOW,XQueryParser.FOLLOW_WINDOW_in_p_FTWindow15542); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            kw_tree = this.adaptor.create(kw);\n            this.adaptor.addChild(root_0, kw_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(kw);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_AdditiveExpr_in_p_FTWindow15546);\n            p_AdditiveExpr682=this.p_AdditiveExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AdditiveExpr682.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_FTUnit_in_p_FTWindow15548);\n            p_FTUnit683=this.p_FTUnit();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTUnit683.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTDistance_return: (function() {\n        XQueryParser.p_FTDistance_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTDistance_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1902:1: p_FTDistance : kd= DISTANCE p_FTRange p_FTUnit ;\n    // $ANTLR start \"p_FTDistance\"\n    p_FTDistance: function() {\n        var retval = new XQueryParser.p_FTDistance_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var kd = null;\n         var p_FTRange684 = null;\n         var p_FTUnit685 = null;\n\n        var kd_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1903:9: (kd= DISTANCE p_FTRange p_FTUnit )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1903:11: kd= DISTANCE p_FTRange p_FTUnit\n            root_0 = this.adaptor.nil();\n\n            kd=this.match(this.input,DISTANCE,XQueryParser.FOLLOW_DISTANCE_in_p_FTDistance15576); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            kd_tree = this.adaptor.create(kd);\n            this.adaptor.addChild(root_0, kd_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(kd);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_FTRange_in_p_FTDistance15580);\n            p_FTRange684=this.p_FTRange();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTRange684.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_FTUnit_in_p_FTDistance15582);\n            p_FTUnit685=this.p_FTUnit();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTUnit685.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTUnit_return: (function() {\n        XQueryParser.p_FTUnit_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTUnit_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1907:1: p_FTUnit : (k+= WORDS | k+= SENTENCES | k+= PARAGRAPHS ) ;\n    // $ANTLR start \"p_FTUnit\"\n    p_FTUnit: function() {\n        var retval = new XQueryParser.p_FTUnit_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1908:9: ( (k+= WORDS | k+= SENTENCES | k+= PARAGRAPHS ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1908:11: (k+= WORDS | k+= SENTENCES | k+= PARAGRAPHS )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1908:11: (k+= WORDS | k+= SENTENCES | k+= PARAGRAPHS )\n            var alt225=3;\n            switch ( this.input.LA(1) ) {\n            case WORDS:\n                alt225=1;\n                break;\n            case SENTENCES:\n                alt225=2;\n                break;\n            case PARAGRAPHS:\n                alt225=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 225, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt225) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1908:13: k+= WORDS\n                    k=this.match(this.input,WORDS,XQueryParser.FOLLOW_WORDS_in_p_FTUnit15612); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1908:24: k+= SENTENCES\n                    k=this.match(this.input,SENTENCES,XQueryParser.FOLLOW_SENTENCES_in_p_FTUnit15618); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1908:39: k+= PARAGRAPHS\n                    k=this.match(this.input,PARAGRAPHS,XQueryParser.FOLLOW_PARAGRAPHS_in_p_FTUnit15624); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTScope_return: (function() {\n        XQueryParser.p_FTScope_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTScope_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1912:1: p_FTScope : (k+= SAME | k+= DIFFERENT ) p_FTBigUnit ;\n    // $ANTLR start \"p_FTScope\"\n    p_FTScope: function() {\n        var retval = new XQueryParser.p_FTScope_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_FTBigUnit686 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1913:9: ( (k+= SAME | k+= DIFFERENT ) p_FTBigUnit )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1913:11: (k+= SAME | k+= DIFFERENT ) p_FTBigUnit\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1913:11: (k+= SAME | k+= DIFFERENT )\n            var alt226=2;\n            var LA226_0 = this.input.LA(1);\n\n            if ( (LA226_0==SAME) ) {\n                alt226=1;\n            }\n            else if ( (LA226_0==DIFFERENT) ) {\n                alt226=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 226, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt226) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1913:12: k+= SAME\n                    k=this.match(this.input,SAME,XQueryParser.FOLLOW_SAME_in_p_FTScope15657); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1913:22: k+= DIFFERENT\n                    k=this.match(this.input,DIFFERENT,XQueryParser.FOLLOW_DIFFERENT_in_p_FTScope15663); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_FTBigUnit_in_p_FTScope15668);\n            p_FTBigUnit686=this.p_FTBigUnit();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTBigUnit686.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTBigUnit_return: (function() {\n        XQueryParser.p_FTBigUnit_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTBigUnit_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1917:1: p_FTBigUnit : (k+= SENTENCE | k+= PARAGRAPH ) ;\n    // $ANTLR start \"p_FTBigUnit\"\n    p_FTBigUnit: function() {\n        var retval = new XQueryParser.p_FTBigUnit_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1918:9: ( (k+= SENTENCE | k+= PARAGRAPH ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1918:11: (k+= SENTENCE | k+= PARAGRAPH )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1918:11: (k+= SENTENCE | k+= PARAGRAPH )\n            var alt227=2;\n            var LA227_0 = this.input.LA(1);\n\n            if ( (LA227_0==SENTENCE) ) {\n                alt227=1;\n            }\n            else if ( (LA227_0==PARAGRAPH) ) {\n                alt227=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 227, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt227) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1918:13: k+= SENTENCE\n                    k=this.match(this.input,SENTENCE,XQueryParser.FOLLOW_SENTENCE_in_p_FTBigUnit15698); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1918:27: k+= PARAGRAPH\n                    k=this.match(this.input,PARAGRAPH,XQueryParser.FOLLOW_PARAGRAPH_in_p_FTBigUnit15704); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTContent_return: (function() {\n        XQueryParser.p_FTContent_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTContent_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1922:1: p_FTContent : ( (k+= AT k+= START ) | (k+= AT k+= END ) | (k+= ENTIRE k+= CONTENT ) ) ;\n    // $ANTLR start \"p_FTContent\"\n    p_FTContent: function() {\n        var retval = new XQueryParser.p_FTContent_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:9: ( ( (k+= AT k+= START ) | (k+= AT k+= END ) | (k+= ENTIRE k+= CONTENT ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:11: ( (k+= AT k+= START ) | (k+= AT k+= END ) | (k+= ENTIRE k+= CONTENT ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:11: ( (k+= AT k+= START ) | (k+= AT k+= END ) | (k+= ENTIRE k+= CONTENT ) )\n            var alt228=3;\n            var LA228_0 = this.input.LA(1);\n\n            if ( (LA228_0==AT) ) {\n                var LA228_1 = this.input.LA(2);\n\n                if ( (LA228_1==START) ) {\n                    alt228=1;\n                }\n                else if ( (LA228_1==END) ) {\n                    alt228=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 228, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else if ( (LA228_0==ENTIRE) ) {\n                alt228=3;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 228, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt228) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:13: (k+= AT k+= START )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:13: (k+= AT k+= START )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:14: k+= AT k+= START\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTContent15739); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,START,XQueryParser.FOLLOW_START_in_p_FTContent15743); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:32: (k+= AT k+= END )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:32: (k+= AT k+= END )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:33: k+= AT k+= END\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTContent15751); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,END,XQueryParser.FOLLOW_END_in_p_FTContent15755); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:49: (k+= ENTIRE k+= CONTENT )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:49: (k+= ENTIRE k+= CONTENT )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1923:50: k+= ENTIRE k+= CONTENT\n                    k=this.match(this.input,ENTIRE,XQueryParser.FOLLOW_ENTIRE_in_p_FTContent15763); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,CONTENT,XQueryParser.FOLLOW_CONTENT_in_p_FTContent15767); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTMatchOptions_return: (function() {\n        XQueryParser.p_FTMatchOptions_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTMatchOptions_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1927:1: p_FTMatchOptions : (ku= USING p_FTMatchOption )+ ;\n    // $ANTLR start \"p_FTMatchOptions\"\n    p_FTMatchOptions: function() {\n        var retval = new XQueryParser.p_FTMatchOptions_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ku = null;\n         var p_FTMatchOption687 = null;\n\n        var ku_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1928:9: ( (ku= USING p_FTMatchOption )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1928:11: (ku= USING p_FTMatchOption )+\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1928:11: (ku= USING p_FTMatchOption )+\n            var cnt229=0;\n            loop229:\n            do {\n                var alt229=2;\n                var LA229_0 = this.input.LA(1);\n\n                if ( (LA229_0==USING) ) {\n                    alt229=1;\n                }\n\n\n                switch (alt229) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1928:12: ku= USING p_FTMatchOption\n                    ku=this.match(this.input,USING,XQueryParser.FOLLOW_USING_in_p_FTMatchOptions15801); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ku_tree = this.adaptor.create(ku);\n                    this.adaptor.addChild(root_0, ku_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(ku);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTMatchOption_in_p_FTMatchOptions15805);\n                    p_FTMatchOption687=this.p_FTMatchOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTMatchOption687.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt229 >= 1 ) {\n                        break loop229;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(229, this.input);\n                        throw eee;\n                }\n                cnt229++;\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTMatchOption_return: (function() {\n        XQueryParser.p_FTMatchOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTMatchOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1932:1: p_FTMatchOption : ( p_FTLanguageOption | p_FTWildCardOption | p_FTThesaurusOption | p_FTStemOption | p_FTCaseOption | p_FTDiacriticsOption | p_FTStopWordOption | p_FTExtensionOption );\n    // $ANTLR start \"p_FTMatchOption\"\n    p_FTMatchOption: function() {\n        var retval = new XQueryParser.p_FTMatchOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_FTLanguageOption688 = null;\n         var p_FTWildCardOption689 = null;\n         var p_FTThesaurusOption690 = null;\n         var p_FTStemOption691 = null;\n         var p_FTCaseOption692 = null;\n         var p_FTDiacriticsOption693 = null;\n         var p_FTStopWordOption694 = null;\n         var p_FTExtensionOption695 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1933:9: ( p_FTLanguageOption | p_FTWildCardOption | p_FTThesaurusOption | p_FTStemOption | p_FTCaseOption | p_FTDiacriticsOption | p_FTStopWordOption | p_FTExtensionOption )\n            var alt230=8;\n            alt230 = this.dfa230.predict(this.input);\n            switch (alt230) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1933:11: p_FTLanguageOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTLanguageOption_in_p_FTMatchOption15833);\n                    p_FTLanguageOption688=this.p_FTLanguageOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTLanguageOption688.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1934:11: p_FTWildCardOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTWildCardOption_in_p_FTMatchOption15845);\n                    p_FTWildCardOption689=this.p_FTWildCardOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTWildCardOption689.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1935:11: p_FTThesaurusOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTThesaurusOption_in_p_FTMatchOption15857);\n                    p_FTThesaurusOption690=this.p_FTThesaurusOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTThesaurusOption690.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1936:11: p_FTStemOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTStemOption_in_p_FTMatchOption15869);\n                    p_FTStemOption691=this.p_FTStemOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTStemOption691.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1937:11: p_FTCaseOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTCaseOption_in_p_FTMatchOption15881);\n                    p_FTCaseOption692=this.p_FTCaseOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTCaseOption692.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1938:11: p_FTDiacriticsOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTDiacriticsOption_in_p_FTMatchOption15893);\n                    p_FTDiacriticsOption693=this.p_FTDiacriticsOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTDiacriticsOption693.getTree());\n\n\n                    break;\n                case 7 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1939:11: p_FTStopWordOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTStopWordOption_in_p_FTMatchOption15905);\n                    p_FTStopWordOption694=this.p_FTStopWordOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTStopWordOption694.getTree());\n\n\n                    break;\n                case 8 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1940:11: p_FTExtensionOption\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTExtensionOption_in_p_FTMatchOption15917);\n                    p_FTExtensionOption695=this.p_FTExtensionOption();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTExtensionOption695.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTCaseOption_return: (function() {\n        XQueryParser.p_FTCaseOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTCaseOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1944:1: p_FTCaseOption : ( (k+= CASE k+= INSENSITIVE ) | (k+= CASE k+= SENSITIVE ) | k+= LOWERCASE | k+= UPPERCASE ) ;\n    // $ANTLR start \"p_FTCaseOption\"\n    p_FTCaseOption: function() {\n        var retval = new XQueryParser.p_FTCaseOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1945:9: ( ( (k+= CASE k+= INSENSITIVE ) | (k+= CASE k+= SENSITIVE ) | k+= LOWERCASE | k+= UPPERCASE ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1945:11: ( (k+= CASE k+= INSENSITIVE ) | (k+= CASE k+= SENSITIVE ) | k+= LOWERCASE | k+= UPPERCASE )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1945:11: ( (k+= CASE k+= INSENSITIVE ) | (k+= CASE k+= SENSITIVE ) | k+= LOWERCASE | k+= UPPERCASE )\n            var alt231=4;\n            switch ( this.input.LA(1) ) {\n            case CASE:\n                var LA231_1 = this.input.LA(2);\n\n                if ( (LA231_1==INSENSITIVE) ) {\n                    alt231=1;\n                }\n                else if ( (LA231_1==SENSITIVE) ) {\n                    alt231=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 231, 1, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case LOWERCASE:\n                alt231=3;\n                break;\n            case UPPERCASE:\n                alt231=4;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 231, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt231) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1945:13: (k+= CASE k+= INSENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1945:13: (k+= CASE k+= INSENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1945:14: k+= CASE k+= INSENSITIVE\n                    k=this.match(this.input,CASE,XQueryParser.FOLLOW_CASE_in_p_FTCaseOption15948); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,INSENSITIVE,XQueryParser.FOLLOW_INSENSITIVE_in_p_FTCaseOption15952); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1946:13: (k+= CASE k+= SENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1946:13: (k+= CASE k+= SENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1946:14: k+= CASE k+= SENSITIVE\n                    k=this.match(this.input,CASE,XQueryParser.FOLLOW_CASE_in_p_FTCaseOption15970); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,SENSITIVE,XQueryParser.FOLLOW_SENSITIVE_in_p_FTCaseOption15974); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1947:13: k+= LOWERCASE\n                    k=this.match(this.input,LOWERCASE,XQueryParser.FOLLOW_LOWERCASE_in_p_FTCaseOption15991); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1948:13: k+= UPPERCASE\n                    k=this.match(this.input,UPPERCASE,XQueryParser.FOLLOW_UPPERCASE_in_p_FTCaseOption16007); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTDiacriticsOption_return: (function() {\n        XQueryParser.p_FTDiacriticsOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTDiacriticsOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1952:1: p_FTDiacriticsOption : ( (k+= DIACRITICS k+= INSENSITIVE ) | (k+= DIACRITICS k+= SENSITIVE ) ) ;\n    // $ANTLR start \"p_FTDiacriticsOption\"\n    p_FTDiacriticsOption: function() {\n        var retval = new XQueryParser.p_FTDiacriticsOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1953:9: ( ( (k+= DIACRITICS k+= INSENSITIVE ) | (k+= DIACRITICS k+= SENSITIVE ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1953:11: ( (k+= DIACRITICS k+= INSENSITIVE ) | (k+= DIACRITICS k+= SENSITIVE ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1953:11: ( (k+= DIACRITICS k+= INSENSITIVE ) | (k+= DIACRITICS k+= SENSITIVE ) )\n            var alt232=2;\n            var LA232_0 = this.input.LA(1);\n\n            if ( (LA232_0==DIACRITICS) ) {\n                var LA232_1 = this.input.LA(2);\n\n                if ( (LA232_1==INSENSITIVE) ) {\n                    alt232=1;\n                }\n                else if ( (LA232_1==SENSITIVE) ) {\n                    alt232=2;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 232, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 232, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt232) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1953:13: (k+= DIACRITICS k+= INSENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1953:13: (k+= DIACRITICS k+= INSENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1953:14: k+= DIACRITICS k+= INSENSITIVE\n                    k=this.match(this.input,DIACRITICS,XQueryParser.FOLLOW_DIACRITICS_in_p_FTDiacriticsOption16042); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,INSENSITIVE,XQueryParser.FOLLOW_INSENSITIVE_in_p_FTDiacriticsOption16046); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1954:13: (k+= DIACRITICS k+= SENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1954:13: (k+= DIACRITICS k+= SENSITIVE )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1954:14: k+= DIACRITICS k+= SENSITIVE\n                    k=this.match(this.input,DIACRITICS,XQueryParser.FOLLOW_DIACRITICS_in_p_FTDiacriticsOption16064); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,SENSITIVE,XQueryParser.FOLLOW_SENSITIVE_in_p_FTDiacriticsOption16068); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTStemOption_return: (function() {\n        XQueryParser.p_FTStemOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTStemOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1958:1: p_FTStemOption : (k+= STEMMING | (k+= NO k+= STEMMING ) ) ;\n    // $ANTLR start \"p_FTStemOption\"\n    p_FTStemOption: function() {\n        var retval = new XQueryParser.p_FTStemOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1959:9: ( (k+= STEMMING | (k+= NO k+= STEMMING ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1959:11: (k+= STEMMING | (k+= NO k+= STEMMING ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1959:11: (k+= STEMMING | (k+= NO k+= STEMMING ) )\n            var alt233=2;\n            var LA233_0 = this.input.LA(1);\n\n            if ( (LA233_0==STEMMING) ) {\n                alt233=1;\n            }\n            else if ( (LA233_0==NO) ) {\n                alt233=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 233, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt233) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1959:13: k+= STEMMING\n                    k=this.match(this.input,STEMMING,XQueryParser.FOLLOW_STEMMING_in_p_FTStemOption16103); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1959:27: (k+= NO k+= STEMMING )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1959:27: (k+= NO k+= STEMMING )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1959:28: k+= NO k+= STEMMING\n                    k=this.match(this.input,NO,XQueryParser.FOLLOW_NO_in_p_FTStemOption16110); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,STEMMING,XQueryParser.FOLLOW_STEMMING_in_p_FTStemOption16114); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTThesaurusOption_return: (function() {\n        XQueryParser.p_FTThesaurusOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTThesaurusOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1963:1: p_FTThesaurusOption : ( (k+= THESAURUS ( p_FTThesaurusID | k+= DEFAULT ) ) | (k+= THESAURUS LPAREN ( p_FTThesaurusID | k+= DEFAULT ) ( COMMA p_FTThesaurusID )* RPAREN ) | (k+= NO k+= THESAURUS ) ) ;\n    // $ANTLR start \"p_FTThesaurusOption\"\n    p_FTThesaurusOption: function() {\n        var retval = new XQueryParser.p_FTThesaurusOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LPAREN697 = null;\n        var COMMA699 = null;\n        var RPAREN701 = null;\n        var k = null;\n        var list_k=null;\n         var p_FTThesaurusID696 = null;\n         var p_FTThesaurusID698 = null;\n         var p_FTThesaurusID700 = null;\n\n        var LPAREN697_tree=null;\n        var COMMA699_tree=null;\n        var RPAREN701_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:9: ( ( (k+= THESAURUS ( p_FTThesaurusID | k+= DEFAULT ) ) | (k+= THESAURUS LPAREN ( p_FTThesaurusID | k+= DEFAULT ) ( COMMA p_FTThesaurusID )* RPAREN ) | (k+= NO k+= THESAURUS ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:11: ( (k+= THESAURUS ( p_FTThesaurusID | k+= DEFAULT ) ) | (k+= THESAURUS LPAREN ( p_FTThesaurusID | k+= DEFAULT ) ( COMMA p_FTThesaurusID )* RPAREN ) | (k+= NO k+= THESAURUS ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:11: ( (k+= THESAURUS ( p_FTThesaurusID | k+= DEFAULT ) ) | (k+= THESAURUS LPAREN ( p_FTThesaurusID | k+= DEFAULT ) ( COMMA p_FTThesaurusID )* RPAREN ) | (k+= NO k+= THESAURUS ) )\n            var alt237=3;\n            var LA237_0 = this.input.LA(1);\n\n            if ( (LA237_0==THESAURUS) ) {\n                var LA237_1 = this.input.LA(2);\n\n                if ( (LA237_1==LPAREN) ) {\n                    alt237=2;\n                }\n                else if ( (LA237_1==AT||LA237_1==DEFAULT) ) {\n                    alt237=1;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 237, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else if ( (LA237_0==NO) ) {\n                alt237=3;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 237, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt237) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:13: (k+= THESAURUS ( p_FTThesaurusID | k+= DEFAULT ) )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:13: (k+= THESAURUS ( p_FTThesaurusID | k+= DEFAULT ) )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:14: k+= THESAURUS ( p_FTThesaurusID | k+= DEFAULT )\n                    k=this.match(this.input,THESAURUS,XQueryParser.FOLLOW_THESAURUS_in_p_FTThesaurusOption16150); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:27: ( p_FTThesaurusID | k+= DEFAULT )\n                    var alt234=2;\n                    var LA234_0 = this.input.LA(1);\n\n                    if ( (LA234_0==AT) ) {\n                        alt234=1;\n                    }\n                    else if ( (LA234_0==DEFAULT) ) {\n                        alt234=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 234, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt234) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:28: p_FTThesaurusID\n                            this.pushFollow(XQueryParser.FOLLOW_p_FTThesaurusID_in_p_FTThesaurusOption16153);\n                            p_FTThesaurusID696=this.p_FTThesaurusID();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTThesaurusID696.getTree());\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1964:46: k+= DEFAULT\n                            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_FTThesaurusOption16159); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n                            if (org.antlr.lang.isNull(list_k)) list_k = [];\n                            list_k.push(k);\n\n\n\n                            break;\n\n                    }\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:13: (k+= THESAURUS LPAREN ( p_FTThesaurusID | k+= DEFAULT ) ( COMMA p_FTThesaurusID )* RPAREN )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:13: (k+= THESAURUS LPAREN ( p_FTThesaurusID | k+= DEFAULT ) ( COMMA p_FTThesaurusID )* RPAREN )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:14: k+= THESAURUS LPAREN ( p_FTThesaurusID | k+= DEFAULT ) ( COMMA p_FTThesaurusID )* RPAREN\n                    k=this.match(this.input,THESAURUS,XQueryParser.FOLLOW_THESAURUS_in_p_FTThesaurusOption16178); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    LPAREN697=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_FTThesaurusOption16180); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LPAREN697_tree = this.adaptor.create(LPAREN697);\n                    this.adaptor.addChild(root_0, LPAREN697_tree);\n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:34: ( p_FTThesaurusID | k+= DEFAULT )\n                    var alt235=2;\n                    var LA235_0 = this.input.LA(1);\n\n                    if ( (LA235_0==AT) ) {\n                        alt235=1;\n                    }\n                    else if ( (LA235_0==DEFAULT) ) {\n                        alt235=2;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 235, 0, this.input);\n\n                        throw nvae;\n                    }\n                    switch (alt235) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:35: p_FTThesaurusID\n                            this.pushFollow(XQueryParser.FOLLOW_p_FTThesaurusID_in_p_FTThesaurusOption16183);\n                            p_FTThesaurusID698=this.p_FTThesaurusID();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTThesaurusID698.getTree());\n\n\n                            break;\n                        case 2 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:53: k+= DEFAULT\n                            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_FTThesaurusOption16189); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            k_tree = this.adaptor.create(k);\n                            this.adaptor.addChild(root_0, k_tree);\n                            }\n                            if (org.antlr.lang.isNull(list_k)) list_k = [];\n                            list_k.push(k);\n\n\n\n                            break;\n\n                    }\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:65: ( COMMA p_FTThesaurusID )*\n                    loop236:\n                    do {\n                        var alt236=2;\n                        var LA236_0 = this.input.LA(1);\n\n                        if ( (LA236_0==COMMA) ) {\n                            alt236=1;\n                        }\n\n\n                        switch (alt236) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1965:66: COMMA p_FTThesaurusID\n                            COMMA699=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_FTThesaurusOption16193); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COMMA699_tree = this.adaptor.create(COMMA699);\n                            this.adaptor.addChild(root_0, COMMA699_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_FTThesaurusID_in_p_FTThesaurusOption16195);\n                            p_FTThesaurusID700=this.p_FTThesaurusID();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTThesaurusID700.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop236;\n                        }\n                    } while (true);\n\n                    RPAREN701=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_FTThesaurusOption16199); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RPAREN701_tree = this.adaptor.create(RPAREN701);\n                    this.adaptor.addChild(root_0, RPAREN701_tree);\n                    }\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1966:13: (k+= NO k+= THESAURUS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1966:13: (k+= NO k+= THESAURUS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1966:14: k+= NO k+= THESAURUS\n                    k=this.match(this.input,NO,XQueryParser.FOLLOW_NO_in_p_FTThesaurusOption16217); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,THESAURUS,XQueryParser.FOLLOW_THESAURUS_in_p_FTThesaurusOption16221); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTThesaurusID_return: (function() {\n        XQueryParser.p_FTThesaurusID_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTThesaurusID_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1970:1: p_FTThesaurusID : k+= AT p_StringLiteral (k+= RELATIONSHIP p_StringLiteral )? ( p_FTLiteralRange k+= LEVELS )? ;\n    // $ANTLR start \"p_FTThesaurusID\"\n    p_FTThesaurusID: function() {\n        var retval = new XQueryParser.p_FTThesaurusID_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_StringLiteral702 = null;\n         var p_StringLiteral703 = null;\n         var p_FTLiteralRange704 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1971:9: (k+= AT p_StringLiteral (k+= RELATIONSHIP p_StringLiteral )? ( p_FTLiteralRange k+= LEVELS )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1971:11: k+= AT p_StringLiteral (k+= RELATIONSHIP p_StringLiteral )? ( p_FTLiteralRange k+= LEVELS )?\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTThesaurusID16254); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTThesaurusID16256);\n            p_StringLiteral702=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral702.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1971:33: (k+= RELATIONSHIP p_StringLiteral )?\n            var alt238=2;\n            var LA238_0 = this.input.LA(1);\n\n            if ( (LA238_0==RELATIONSHIP) ) {\n                alt238=1;\n            }\n            switch (alt238) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1971:34: k+= RELATIONSHIP p_StringLiteral\n                    k=this.match(this.input,RELATIONSHIP,XQueryParser.FOLLOW_RELATIONSHIP_in_p_FTThesaurusID16261); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTThesaurusID16263);\n                    p_StringLiteral703=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral703.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1971:68: ( p_FTLiteralRange k+= LEVELS )?\n            var alt239=2;\n            var LA239_0 = this.input.LA(1);\n\n            if ( ((LA239_0>=EXACTLY && LA239_0<=FROM)) ) {\n                alt239=1;\n            }\n            else if ( (LA239_0==AT) ) {\n                var LA239_2 = this.input.LA(2);\n\n                if ( (LA239_2==LEAST||LA239_2==MOST) ) {\n                    alt239=1;\n                }\n            }\n            switch (alt239) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1971:69: p_FTLiteralRange k+= LEVELS\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTLiteralRange_in_p_FTThesaurusID16268);\n                    p_FTLiteralRange704=this.p_FTLiteralRange();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTLiteralRange704.getTree());\n                    k=this.match(this.input,LEVELS,XQueryParser.FOLLOW_LEVELS_in_p_FTThesaurusID16272); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTLiteralRange_return: (function() {\n        XQueryParser.p_FTLiteralRange_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTLiteralRange_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1975:1: p_FTLiteralRange : ( (k+= EXACTLY L_IntegerLiteral ) | (k+= AT k+= LEAST L_IntegerLiteral ) | (k+= AT k+= MOST L_IntegerLiteral ) | (k+= FROM L_IntegerLiteral TO L_IntegerLiteral ) ) ;\n    // $ANTLR start \"p_FTLiteralRange\"\n    p_FTLiteralRange: function() {\n        var retval = new XQueryParser.p_FTLiteralRange_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var L_IntegerLiteral705 = null;\n        var L_IntegerLiteral706 = null;\n        var L_IntegerLiteral707 = null;\n        var L_IntegerLiteral708 = null;\n        var TO709 = null;\n        var L_IntegerLiteral710 = null;\n        var k = null;\n        var list_k=null;\n\n        var L_IntegerLiteral705_tree=null;\n        var L_IntegerLiteral706_tree=null;\n        var L_IntegerLiteral707_tree=null;\n        var L_IntegerLiteral708_tree=null;\n        var TO709_tree=null;\n        var L_IntegerLiteral710_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1976:9: ( ( (k+= EXACTLY L_IntegerLiteral ) | (k+= AT k+= LEAST L_IntegerLiteral ) | (k+= AT k+= MOST L_IntegerLiteral ) | (k+= FROM L_IntegerLiteral TO L_IntegerLiteral ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1976:11: ( (k+= EXACTLY L_IntegerLiteral ) | (k+= AT k+= LEAST L_IntegerLiteral ) | (k+= AT k+= MOST L_IntegerLiteral ) | (k+= FROM L_IntegerLiteral TO L_IntegerLiteral ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1976:11: ( (k+= EXACTLY L_IntegerLiteral ) | (k+= AT k+= LEAST L_IntegerLiteral ) | (k+= AT k+= MOST L_IntegerLiteral ) | (k+= FROM L_IntegerLiteral TO L_IntegerLiteral ) )\n            var alt240=4;\n            switch ( this.input.LA(1) ) {\n            case EXACTLY:\n                alt240=1;\n                break;\n            case AT:\n                var LA240_2 = this.input.LA(2);\n\n                if ( (LA240_2==LEAST) ) {\n                    alt240=2;\n                }\n                else if ( (LA240_2==MOST) ) {\n                    alt240=3;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 240, 2, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case FROM:\n                alt240=4;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 240, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt240) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1976:13: (k+= EXACTLY L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1976:13: (k+= EXACTLY L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1976:14: k+= EXACTLY L_IntegerLiteral\n                    k=this.match(this.input,EXACTLY,XQueryParser.FOLLOW_EXACTLY_in_p_FTLiteralRange16307); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    L_IntegerLiteral705=this.match(this.input,L_IntegerLiteral,XQueryParser.FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16309); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_IntegerLiteral705_tree = this.adaptor.create(L_IntegerLiteral705);\n                    this.adaptor.addChild(root_0, L_IntegerLiteral705_tree);\n                    }\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1977:13: (k+= AT k+= LEAST L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1977:13: (k+= AT k+= LEAST L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1977:14: k+= AT k+= LEAST L_IntegerLiteral\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTLiteralRange16327); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,LEAST,XQueryParser.FOLLOW_LEAST_in_p_FTLiteralRange16331); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    L_IntegerLiteral706=this.match(this.input,L_IntegerLiteral,XQueryParser.FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16333); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_IntegerLiteral706_tree = this.adaptor.create(L_IntegerLiteral706);\n                    this.adaptor.addChild(root_0, L_IntegerLiteral706_tree);\n                    }\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1978:13: (k+= AT k+= MOST L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1978:13: (k+= AT k+= MOST L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1978:14: k+= AT k+= MOST L_IntegerLiteral\n                    k=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTLiteralRange16351); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,MOST,XQueryParser.FOLLOW_MOST_in_p_FTLiteralRange16355); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    L_IntegerLiteral707=this.match(this.input,L_IntegerLiteral,XQueryParser.FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16357); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_IntegerLiteral707_tree = this.adaptor.create(L_IntegerLiteral707);\n                    this.adaptor.addChild(root_0, L_IntegerLiteral707_tree);\n                    }\n\n\n\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1979:13: (k+= FROM L_IntegerLiteral TO L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1979:13: (k+= FROM L_IntegerLiteral TO L_IntegerLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1979:14: k+= FROM L_IntegerLiteral TO L_IntegerLiteral\n                    k=this.match(this.input,FROM,XQueryParser.FOLLOW_FROM_in_p_FTLiteralRange16375); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    L_IntegerLiteral708=this.match(this.input,L_IntegerLiteral,XQueryParser.FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16377); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_IntegerLiteral708_tree = this.adaptor.create(L_IntegerLiteral708);\n                    this.adaptor.addChild(root_0, L_IntegerLiteral708_tree);\n                    }\n                    TO709=this.match(this.input,TO,XQueryParser.FOLLOW_TO_in_p_FTLiteralRange16379); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    TO709_tree = this.adaptor.create(TO709);\n                    this.adaptor.addChild(root_0, TO709_tree);\n                    }\n                    L_IntegerLiteral710=this.match(this.input,L_IntegerLiteral,XQueryParser.FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16381); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    L_IntegerLiteral710_tree = this.adaptor.create(L_IntegerLiteral710);\n                    this.adaptor.addChild(root_0, L_IntegerLiteral710_tree);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTStopWordOption_return: (function() {\n        XQueryParser.p_FTStopWordOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTStopWordOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1983:1: p_FTStopWordOption : ( (k+= STOP k+= WORDS p_FTStopWords ( p_FTStopWordsInclExcl )* ) | (k+= STOP k+= WORDS k+= DEFAULT ( p_FTStopWordsInclExcl )* ) | (k+= NO k+= STOP k+= WORDS ) ) ;\n    // $ANTLR start \"p_FTStopWordOption\"\n    p_FTStopWordOption: function() {\n        var retval = new XQueryParser.p_FTStopWordOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_FTStopWords711 = null;\n         var p_FTStopWordsInclExcl712 = null;\n         var p_FTStopWordsInclExcl713 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:9: ( ( (k+= STOP k+= WORDS p_FTStopWords ( p_FTStopWordsInclExcl )* ) | (k+= STOP k+= WORDS k+= DEFAULT ( p_FTStopWordsInclExcl )* ) | (k+= NO k+= STOP k+= WORDS ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:11: ( (k+= STOP k+= WORDS p_FTStopWords ( p_FTStopWordsInclExcl )* ) | (k+= STOP k+= WORDS k+= DEFAULT ( p_FTStopWordsInclExcl )* ) | (k+= NO k+= STOP k+= WORDS ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:11: ( (k+= STOP k+= WORDS p_FTStopWords ( p_FTStopWordsInclExcl )* ) | (k+= STOP k+= WORDS k+= DEFAULT ( p_FTStopWordsInclExcl )* ) | (k+= NO k+= STOP k+= WORDS ) )\n            var alt243=3;\n            var LA243_0 = this.input.LA(1);\n\n            if ( (LA243_0==STOP) ) {\n                var LA243_1 = this.input.LA(2);\n\n                if ( (LA243_1==WORDS) ) {\n                    var LA243_3 = this.input.LA(3);\n\n                    if ( (LA243_3==DEFAULT) ) {\n                        alt243=2;\n                    }\n                    else if ( (LA243_3==AT||LA243_3==LPAREN) ) {\n                        alt243=1;\n                    }\n                    else {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 243, 3, this.input);\n\n                        throw nvae;\n                    }\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 243, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else if ( (LA243_0==NO) ) {\n                alt243=3;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 243, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt243) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:13: (k+= STOP k+= WORDS p_FTStopWords ( p_FTStopWordsInclExcl )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:13: (k+= STOP k+= WORDS p_FTStopWords ( p_FTStopWordsInclExcl )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:14: k+= STOP k+= WORDS p_FTStopWords ( p_FTStopWordsInclExcl )*\n                    k=this.match(this.input,STOP,XQueryParser.FOLLOW_STOP_in_p_FTStopWordOption16417); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,WORDS,XQueryParser.FOLLOW_WORDS_in_p_FTStopWordOption16421); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_FTStopWords_in_p_FTStopWordOption16423);\n                    p_FTStopWords711=this.p_FTStopWords();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTStopWords711.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:45: ( p_FTStopWordsInclExcl )*\n                    loop241:\n                    do {\n                        var alt241=2;\n                        var LA241_0 = this.input.LA(1);\n\n                        if ( (LA241_0==EXCEPT||LA241_0==UNION) ) {\n                            alt241=1;\n                        }\n\n\n                        switch (alt241) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1984:45: p_FTStopWordsInclExcl\n                            this.pushFollow(XQueryParser.FOLLOW_p_FTStopWordsInclExcl_in_p_FTStopWordOption16425);\n                            p_FTStopWordsInclExcl712=this.p_FTStopWordsInclExcl();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTStopWordsInclExcl712.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop241;\n                        }\n                    } while (true);\n\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1985:13: (k+= STOP k+= WORDS k+= DEFAULT ( p_FTStopWordsInclExcl )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1985:13: (k+= STOP k+= WORDS k+= DEFAULT ( p_FTStopWordsInclExcl )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1985:14: k+= STOP k+= WORDS k+= DEFAULT ( p_FTStopWordsInclExcl )*\n                    k=this.match(this.input,STOP,XQueryParser.FOLLOW_STOP_in_p_FTStopWordOption16444); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,WORDS,XQueryParser.FOLLOW_WORDS_in_p_FTStopWordOption16448); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_FTStopWordOption16452); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1985:42: ( p_FTStopWordsInclExcl )*\n                    loop242:\n                    do {\n                        var alt242=2;\n                        var LA242_0 = this.input.LA(1);\n\n                        if ( (LA242_0==EXCEPT||LA242_0==UNION) ) {\n                            alt242=1;\n                        }\n\n\n                        switch (alt242) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1985:42: p_FTStopWordsInclExcl\n                            this.pushFollow(XQueryParser.FOLLOW_p_FTStopWordsInclExcl_in_p_FTStopWordOption16454);\n                            p_FTStopWordsInclExcl713=this.p_FTStopWordsInclExcl();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTStopWordsInclExcl713.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop242;\n                        }\n                    } while (true);\n\n\n\n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1986:13: (k+= NO k+= STOP k+= WORDS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1986:13: (k+= NO k+= STOP k+= WORDS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1986:14: k+= NO k+= STOP k+= WORDS\n                    k=this.match(this.input,NO,XQueryParser.FOLLOW_NO_in_p_FTStopWordOption16473); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,STOP,XQueryParser.FOLLOW_STOP_in_p_FTStopWordOption16477); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,WORDS,XQueryParser.FOLLOW_WORDS_in_p_FTStopWordOption16481); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTStopWords_return: (function() {\n        XQueryParser.p_FTStopWords_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTStopWords_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1990:1: p_FTStopWords : ( (ka= AT p_StringLiteral ) | ( LPAREN p_StringLiteral ( COMMA p_StringLiteral )* RPAREN ) );\n    // $ANTLR start \"p_FTStopWords\"\n    p_FTStopWords: function() {\n        var retval = new XQueryParser.p_FTStopWords_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ka = null;\n        var LPAREN715 = null;\n        var COMMA717 = null;\n        var RPAREN719 = null;\n         var p_StringLiteral714 = null;\n         var p_StringLiteral716 = null;\n         var p_StringLiteral718 = null;\n\n        var ka_tree=null;\n        var LPAREN715_tree=null;\n        var COMMA717_tree=null;\n        var RPAREN719_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1991:9: ( (ka= AT p_StringLiteral ) | ( LPAREN p_StringLiteral ( COMMA p_StringLiteral )* RPAREN ) )\n            var alt245=2;\n            var LA245_0 = this.input.LA(1);\n\n            if ( (LA245_0==AT) ) {\n                alt245=1;\n            }\n            else if ( (LA245_0==LPAREN) ) {\n                alt245=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 245, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt245) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1991:11: (ka= AT p_StringLiteral )\n                    root_0 = this.adaptor.nil();\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1991:11: (ka= AT p_StringLiteral )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1991:12: ka= AT p_StringLiteral\n                    ka=this.match(this.input,AT,XQueryParser.FOLLOW_AT_in_p_FTStopWords16515); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    ka_tree = this.adaptor.create(ka);\n                    this.adaptor.addChild(root_0, ka_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(ka);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTStopWords16519);\n                    p_StringLiteral714=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral714.getTree());\n\n\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1992:11: ( LPAREN p_StringLiteral ( COMMA p_StringLiteral )* RPAREN )\n                    root_0 = this.adaptor.nil();\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1992:11: ( LPAREN p_StringLiteral ( COMMA p_StringLiteral )* RPAREN )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1992:12: LPAREN p_StringLiteral ( COMMA p_StringLiteral )* RPAREN\n                    LPAREN715=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_FTStopWords16533); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    LPAREN715_tree = this.adaptor.create(LPAREN715);\n                    this.adaptor.addChild(root_0, LPAREN715_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTStopWords16535);\n                    p_StringLiteral716=this.p_StringLiteral();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral716.getTree());\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1992:35: ( COMMA p_StringLiteral )*\n                    loop244:\n                    do {\n                        var alt244=2;\n                        var LA244_0 = this.input.LA(1);\n\n                        if ( (LA244_0==COMMA) ) {\n                            alt244=1;\n                        }\n\n\n                        switch (alt244) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1992:36: COMMA p_StringLiteral\n                            COMMA717=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_FTStopWords16538); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            COMMA717_tree = this.adaptor.create(COMMA717);\n                            this.adaptor.addChild(root_0, COMMA717_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTStopWords16540);\n                            p_StringLiteral718=this.p_StringLiteral();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral718.getTree());\n\n\n                            break;\n\n                        default :\n                            break loop244;\n                        }\n                    } while (true);\n\n                    RPAREN719=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_FTStopWords16544); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    RPAREN719_tree = this.adaptor.create(RPAREN719);\n                    this.adaptor.addChild(root_0, RPAREN719_tree);\n                    }\n\n\n\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTStopWordsInclExcl_return: (function() {\n        XQueryParser.p_FTStopWordsInclExcl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTStopWordsInclExcl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1996:1: p_FTStopWordsInclExcl : ( (k+= UNION | k+= EXCEPT ) p_FTStopWords ) ;\n    // $ANTLR start \"p_FTStopWordsInclExcl\"\n    p_FTStopWordsInclExcl: function() {\n        var retval = new XQueryParser.p_FTStopWordsInclExcl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_FTStopWords720 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1997:9: ( ( (k+= UNION | k+= EXCEPT ) p_FTStopWords ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1997:11: ( (k+= UNION | k+= EXCEPT ) p_FTStopWords )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1997:11: ( (k+= UNION | k+= EXCEPT ) p_FTStopWords )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1997:13: (k+= UNION | k+= EXCEPT ) p_FTStopWords\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1997:13: (k+= UNION | k+= EXCEPT )\n            var alt246=2;\n            var LA246_0 = this.input.LA(1);\n\n            if ( (LA246_0==UNION) ) {\n                alt246=1;\n            }\n            else if ( (LA246_0==EXCEPT) ) {\n                alt246=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 246, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt246) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1997:14: k+= UNION\n                    k=this.match(this.input,UNION,XQueryParser.FOLLOW_UNION_in_p_FTStopWordsInclExcl16576); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1997:25: k+= EXCEPT\n                    k=this.match(this.input,EXCEPT,XQueryParser.FOLLOW_EXCEPT_in_p_FTStopWordsInclExcl16582); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_FTStopWords_in_p_FTStopWordsInclExcl16585);\n            p_FTStopWords720=this.p_FTStopWords();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_FTStopWords720.getTree());\n\n\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTLanguageOption_return: (function() {\n        XQueryParser.p_FTLanguageOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTLanguageOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2001:1: p_FTLanguageOption : kl= LANGUAGE p_StringLiteral ;\n    // $ANTLR start \"p_FTLanguageOption\"\n    p_FTLanguageOption: function() {\n        var retval = new XQueryParser.p_FTLanguageOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var kl = null;\n         var p_StringLiteral721 = null;\n\n        var kl_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2002:9: (kl= LANGUAGE p_StringLiteral )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2002:11: kl= LANGUAGE p_StringLiteral\n            root_0 = this.adaptor.nil();\n\n            kl=this.match(this.input,LANGUAGE,XQueryParser.FOLLOW_LANGUAGE_in_p_FTLanguageOption16617); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            kl_tree = this.adaptor.create(kl);\n            this.adaptor.addChild(root_0, kl_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(kl);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTLanguageOption16621);\n            p_StringLiteral721=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral721.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTWildCardOption_return: (function() {\n        XQueryParser.p_FTWildCardOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTWildCardOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2006:1: p_FTWildCardOption : (k+= WILDCARDS | (k+= NO k+= WILDCARDS ) ) ;\n    // $ANTLR start \"p_FTWildCardOption\"\n    p_FTWildCardOption: function() {\n        var retval = new XQueryParser.p_FTWildCardOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2007:9: ( (k+= WILDCARDS | (k+= NO k+= WILDCARDS ) ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2007:11: (k+= WILDCARDS | (k+= NO k+= WILDCARDS ) )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2007:11: (k+= WILDCARDS | (k+= NO k+= WILDCARDS ) )\n            var alt247=2;\n            var LA247_0 = this.input.LA(1);\n\n            if ( (LA247_0==WILDCARDS) ) {\n                alt247=1;\n            }\n            else if ( (LA247_0==NO) ) {\n                alt247=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 247, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt247) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2007:13: k+= WILDCARDS\n                    k=this.match(this.input,WILDCARDS,XQueryParser.FOLLOW_WILDCARDS_in_p_FTWildCardOption16651); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2007:28: (k+= NO k+= WILDCARDS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2007:28: (k+= NO k+= WILDCARDS )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2007:29: k+= NO k+= WILDCARDS\n                    k=this.match(this.input,NO,XQueryParser.FOLLOW_NO_in_p_FTWildCardOption16658); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n                    k=this.match(this.input,WILDCARDS,XQueryParser.FOLLOW_WILDCARDS_in_p_FTWildCardOption16662); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if (org.antlr.lang.isNull(list_k)) list_k = [];\n                    list_k.push(k);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTExtensionOption_return: (function() {\n        XQueryParser.p_FTExtensionOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTExtensionOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2011:1: p_FTExtensionOption : ko= OPTION p_QName p_StringLiteral ;\n    // $ANTLR start \"p_FTExtensionOption\"\n    p_FTExtensionOption: function() {\n        var retval = new XQueryParser.p_FTExtensionOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var ko = null;\n         var p_QName722 = null;\n         var p_StringLiteral723 = null;\n\n        var ko_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2012:9: (ko= OPTION p_QName p_StringLiteral )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2012:11: ko= OPTION p_QName p_StringLiteral\n            root_0 = this.adaptor.nil();\n\n            ko=this.match(this.input,OPTION,XQueryParser.FOLLOW_OPTION_in_p_FTExtensionOption16695); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            ko_tree = this.adaptor.create(ko);\n            this.adaptor.addChild(root_0, ko_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(ko);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_FTExtensionOption16699);\n            p_QName722=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName722.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_FTExtensionOption16701);\n            p_StringLiteral723=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral723.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FTIgnoreOption_return: (function() {\n        XQueryParser.p_FTIgnoreOption_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FTIgnoreOption_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2016:1: p_FTIgnoreOption : k+= WITHOUT k+= CONTENT p_UnionExpr ;\n    // $ANTLR start \"p_FTIgnoreOption\"\n    p_FTIgnoreOption: function() {\n        var retval = new XQueryParser.p_FTIgnoreOption_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var list_k=null;\n         var p_UnionExpr724 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2017:9: (k+= WITHOUT k+= CONTENT p_UnionExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2017:11: k+= WITHOUT k+= CONTENT p_UnionExpr\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,WITHOUT,XQueryParser.FOLLOW_WITHOUT_in_p_FTIgnoreOption16729); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            k=this.match(this.input,CONTENT,XQueryParser.FOLLOW_CONTENT_in_p_FTIgnoreOption16733); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if (org.antlr.lang.isNull(list_k)) list_k = [];\n            list_k.push(k);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(list_k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_UnionExpr_in_p_FTIgnoreOption16737);\n            p_UnionExpr724=this.p_UnionExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_UnionExpr724.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Program_return: (function() {\n        XQueryParser.p_Program_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Program_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2027:1: p_Program : p_StatementsAndOptionalExpr ;\n    // $ANTLR start \"p_Program\"\n    p_Program: function() {\n        var retval = new XQueryParser.p_Program_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_StatementsAndOptionalExpr725 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2028:9: ( p_StatementsAndOptionalExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2028:11: p_StatementsAndOptionalExpr\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndOptionalExpr_in_p_Program16769);\n            p_StatementsAndOptionalExpr725=this.p_StatementsAndOptionalExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndOptionalExpr725.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Statements_return: (function() {\n        XQueryParser.p_Statements_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Statements_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2032:1: p_Statements[strict] : ( p_Hybrid[$strict,true] )* ;\n    // $ANTLR start \"p_Statements\"\n    p_Statements: function(strict) {\n        var retval = new XQueryParser.p_Statements_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Hybrid726 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2033:9: ( ( p_Hybrid[$strict,true] )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2033:11: ( p_Hybrid[$strict,true] )*\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2033:11: ( p_Hybrid[$strict,true] )*\n            loop248:\n            do {\n                var alt248=2;\n                var LA248_0 = this.input.LA(1);\n\n                if ( ((LA248_0>=ANCESTOR && LA248_0<=QUOT_ER)||LA248_0==LPAREN||(LA248_0>=DOLLAR && LA248_0<=L_UNION_BRACKET)||LA248_0==LBRACKET||LA248_0==LSQUARE||LA248_0==ANN_PERCENT||(LA248_0>=STAR && LA248_0<=SMALLER)||(LA248_0>=SLASH && LA248_0<=SLASH_SLASH)||(LA248_0>=DOT && LA248_0<=DOT_DOT)||(LA248_0>=ATTR_SIGN && LA248_0<=Q)||(LA248_0>=APOS && LA248_0<=QUOT)||LA248_0==L_NCName||(LA248_0>=L_Pragma && LA248_0<=L_DoubleLiteral)) ) {\n                    alt248=1;\n                }\n\n\n                switch (alt248) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2033:11: p_Hybrid[$strict,true]\n                    this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_Statements16796);\n                    p_Hybrid726=this.p_Hybrid(strict, true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid726.getTree());\n\n\n                    break;\n\n                default :\n                    break loop248;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_StatementsAndExpr_return: (function() {\n        XQueryParser.p_StatementsAndExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_StatementsAndExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2037:1: p_StatementsAndExpr : p_Statements[false] ;\n    // $ANTLR start \"p_StatementsAndExpr\"\n    p_StatementsAndExpr: function() {\n        var retval = new XQueryParser.p_StatementsAndExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Statements727 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2038:9: ( p_Statements[false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2038:11: p_Statements[false]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_Statements_in_p_StatementsAndExpr16824);\n            p_Statements727=this.p_Statements(false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Statements727.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_StatementsAndOptionalExpr_return: (function() {\n        XQueryParser.p_StatementsAndOptionalExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_StatementsAndOptionalExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2042:1: p_StatementsAndOptionalExpr : p_Statements[false] ;\n    // $ANTLR start \"p_StatementsAndOptionalExpr\"\n    p_StatementsAndOptionalExpr: function() {\n        var retval = new XQueryParser.p_StatementsAndOptionalExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_Statements728 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2043:9: ( p_Statements[false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2043:11: p_Statements[false]\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_Statements_in_p_StatementsAndOptionalExpr16851);\n            p_Statements728=this.p_Statements(false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Statements728.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Hybrid_return: (function() {\n        XQueryParser.p_Hybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Hybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2046:1: p_Hybrid[strict, allowConcat] : ( p_HybridExprSingle[$strict,$allowConcat] | p_Statement );\n    // $ANTLR start \"p_Hybrid\"\n    p_Hybrid: function(strict, allowConcat) {\n        var retval = new XQueryParser.p_Hybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_HybridExprSingle729 = null;\n         var p_Statement730 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2047:9: ( p_HybridExprSingle[$strict,$allowConcat] | p_Statement )\n            var alt249=2;\n            alt249 = this.dfa249.predict(this.input);\n            switch (alt249) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2047:11: p_HybridExprSingle[$strict,$allowConcat]\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_HybridExprSingle_in_p_Hybrid16878);\n                    p_HybridExprSingle729=this.p_HybridExprSingle(strict, allowConcat);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_HybridExprSingle729.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2048:11: p_Statement\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_Statement_in_p_Hybrid16891);\n                    p_Statement730=this.p_Statement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Statement730.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n\n              if(re instanceof org.antlr.runtime.RecognitionException) {\n                //console.log(\"catch3\");\n                var v = this.p_StepExpr();\n                root_0 = this.adaptor.nil();\n                this.adaptor.addChild(root_0, v.getTree());\n                retval.stop = this.input.LT(-1);\n                retval.tree = this.adaptor.rulePostProcessing(root_0);\n                this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n              } else {\n                throw re;\n              }\n\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_Statement_return: (function() {\n        XQueryParser.p_Statement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_Statement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2064:1: p_Statement : ( p_AssignStatement | p_BreakStatement | p_ContinueStatement | p_ExitStatement | p_VarDeclStatement | p_WhileStatement );\n    // $ANTLR start \"p_Statement\"\n    p_Statement: function() {\n        var retval = new XQueryParser.p_Statement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_AssignStatement731 = null;\n         var p_BreakStatement732 = null;\n         var p_ContinueStatement733 = null;\n         var p_ExitStatement734 = null;\n         var p_VarDeclStatement735 = null;\n         var p_WhileStatement736 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2065:9: ( p_AssignStatement | p_BreakStatement | p_ContinueStatement | p_ExitStatement | p_VarDeclStatement | p_WhileStatement )\n            var alt250=6;\n            switch ( this.input.LA(1) ) {\n            case DOLLAR:\n                alt250=1;\n                break;\n            case BREAK:\n                alt250=2;\n                break;\n            case CONTINUE:\n                alt250=3;\n                break;\n            case EXIT:\n                alt250=4;\n                break;\n            case VARIABLE:\n            case ANN_PERCENT:\n                alt250=5;\n                break;\n            case WHILE:\n                alt250=6;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 250, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt250) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2065:11: p_AssignStatement\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_AssignStatement_in_p_Statement16922);\n                    p_AssignStatement731=this.p_AssignStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AssignStatement731.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2066:11: p_BreakStatement\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_BreakStatement_in_p_Statement16934);\n                    p_BreakStatement732=this.p_BreakStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BreakStatement732.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2067:11: p_ContinueStatement\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ContinueStatement_in_p_Statement16946);\n                    p_ContinueStatement733=this.p_ContinueStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ContinueStatement733.getTree());\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2068:11: p_ExitStatement\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExitStatement_in_p_Statement16958);\n                    p_ExitStatement734=this.p_ExitStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExitStatement734.getTree());\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2069:11: p_VarDeclStatement\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarDeclStatement_in_p_Statement16970);\n                    p_VarDeclStatement735=this.p_VarDeclStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_VarDeclStatement735.getTree());\n\n\n                    break;\n                case 6 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2070:11: p_WhileStatement\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_WhileStatement_in_p_Statement16982);\n                    p_WhileStatement736=this.p_WhileStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_WhileStatement736.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_HybridExprSingle_return: (function() {\n        XQueryParser.p_HybridExprSingle_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_HybridExprSingle_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2072:1: p_HybridExprSingle[strict, allowConcat] : e= p_Expr[$strict,$allowConcat] SEMICOLON ;\n    // $ANTLR start \"p_HybridExprSingle\"\n    p_HybridExprSingle: function(strict, allowConcat) {\n        var retval = new XQueryParser.p_HybridExprSingle_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SEMICOLON737 = null;\n         var e = null;\n\n        var SEMICOLON737_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2073:9: (e= p_Expr[$strict,$allowConcat] SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2073:11: e= p_Expr[$strict,$allowConcat] SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_HybridExprSingle17009);\n            e=this.p_Expr(strict, allowConcat);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, e.getTree());\n            if ( this.state.backtracking===0 ) {\n               if (strict || this.input.LT(1).getType() != SEMICOLON) throw new org.antlr.runtime.RecognitionException(this.input); \n            }\n            SEMICOLON737=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_HybridExprSingle17024); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON737_tree = this.adaptor.create(SEMICOLON737);\n            this.adaptor.addChild(root_0, SEMICOLON737_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n\n                if(re instanceof org.antlr.runtime.RecognitionException) {\n                  //console.log(\"catch4\");\n                  if(this.input.LT(1).getType() == COLON) {\n                    var v = this.p_PairConstructor();\n                    root_0 = this.adaptor.nil();\n                    this.adaptor.addChild(root_0, v.getTree());\n                    retval.stop = this.input.LT(-1);\n                    retval.tree = this.adaptor.rulePostProcessing(root_0);\n                    this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n                  } else {\n                    root_0 = this.adaptor.nil();\n                    this.adaptor.addChild(root_0, e.getTree());\n                    retval.stop = this.input.LT(-1);\n                    retval.tree = this.adaptor.rulePostProcessing(root_0);\n                    this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n                  }\n                } else {\n                  throw re;\n                }\n\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ApplyStatement_return: (function() {\n        XQueryParser.p_ApplyStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ApplyStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2117:1: p_ApplyStatement : p_ExprSimple SEMICOLON ;\n    // $ANTLR start \"p_ApplyStatement\"\n    p_ApplyStatement: function() {\n        var retval = new XQueryParser.p_ApplyStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var SEMICOLON739 = null;\n         var p_ExprSimple738 = null;\n\n        var SEMICOLON739_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2118:9: ( p_ExprSimple SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2118:11: p_ExprSimple SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSimple_in_p_ApplyStatement17074);\n            p_ExprSimple738=this.p_ExprSimple();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSimple738.getTree());\n            SEMICOLON739=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_ApplyStatement17076); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON739_tree = this.adaptor.create(SEMICOLON739);\n            this.adaptor.addChild(root_0, SEMICOLON739_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AssignStatement_return: (function() {\n        XQueryParser.p_AssignStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AssignStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2122:1: p_AssignStatement : d= DOLLAR v= p_VarName BIND p_ExprSingle[true] SEMICOLON ;\n    // $ANTLR start \"p_AssignStatement\"\n    p_AssignStatement: function() {\n        var retval = new XQueryParser.p_AssignStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n        var BIND740 = null;\n        var SEMICOLON742 = null;\n         var v = null;\n         var p_ExprSingle741 = null;\n\n        var d_tree=null;\n        var BIND740_tree=null;\n        var SEMICOLON742_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2123:9: (d= DOLLAR v= p_VarName BIND p_ExprSingle[true] SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2123:11: d= DOLLAR v= p_VarName BIND p_ExprSingle[true] SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_AssignStatement17104); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_AssignStatement17108);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            BIND740=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_AssignStatement17112); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            BIND740_tree = this.adaptor.create(BIND740);\n            this.adaptor.addChild(root_0, BIND740_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_AssignStatement17114);\n            p_ExprSingle741=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle741.getTree());\n            SEMICOLON742=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_AssignStatement17117); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON742_tree = this.adaptor.create(SEMICOLON742);\n            this.adaptor.addChild(root_0, SEMICOLON742_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_BlockStatement_return: (function() {\n        XQueryParser.p_BlockStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_BlockStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2127:1: p_BlockStatement : LBRACKET p_Statements[false] RBRACKET ;\n    // $ANTLR start \"p_BlockStatement\"\n    p_BlockStatement: function() {\n        var retval = new XQueryParser.p_BlockStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LBRACKET743 = null;\n        var RBRACKET745 = null;\n         var p_Statements744 = null;\n\n        var LBRACKET743_tree=null;\n        var RBRACKET745_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2128:9: ( LBRACKET p_Statements[false] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2128:11: LBRACKET p_Statements[false] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            LBRACKET743=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_BlockStatement17143); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET743_tree = this.adaptor.create(LBRACKET743);\n            this.adaptor.addChild(root_0, LBRACKET743_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Statements_in_p_BlockStatement17145);\n            p_Statements744=this.p_Statements(false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Statements744.getTree());\n            RBRACKET745=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_BlockStatement17148); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET745_tree = this.adaptor.create(RBRACKET745);\n            this.adaptor.addChild(root_0, RBRACKET745_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_BlockHybrid_return: (function() {\n        XQueryParser.p_BlockHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_BlockHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2131:1: p_BlockHybrid[strict] : LBRACKET p_Statements[$strict] RBRACKET ;\n    // $ANTLR start \"p_BlockHybrid\"\n    p_BlockHybrid: function(strict) {\n        var retval = new XQueryParser.p_BlockHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LBRACKET746 = null;\n        var RBRACKET748 = null;\n         var p_Statements747 = null;\n\n        var LBRACKET746_tree=null;\n        var RBRACKET748_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2132:9: ( LBRACKET p_Statements[$strict] RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2132:11: LBRACKET p_Statements[$strict] RBRACKET\n            root_0 = this.adaptor.nil();\n\n            LBRACKET746=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_BlockHybrid17174); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET746_tree = this.adaptor.create(LBRACKET746);\n            this.adaptor.addChild(root_0, LBRACKET746_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Statements_in_p_BlockHybrid17176);\n            p_Statements747=this.p_Statements(strict);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Statements747.getTree());\n            RBRACKET748=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_BlockHybrid17179); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET748_tree = this.adaptor.create(RBRACKET748);\n            this.adaptor.addChild(root_0, RBRACKET748_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_BreakStatement_return: (function() {\n        XQueryParser.p_BreakStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_BreakStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2136:1: p_BreakStatement : k= BREAK k= LOOP SEMICOLON ;\n    // $ANTLR start \"p_BreakStatement\"\n    p_BreakStatement: function() {\n        var retval = new XQueryParser.p_BreakStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON749 = null;\n\n        var k_tree=null;\n        var SEMICOLON749_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2137:9: (k= BREAK k= LOOP SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2137:11: k= BREAK k= LOOP SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,BREAK,XQueryParser.FOLLOW_BREAK_in_p_BreakStatement17207); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,LOOP,XQueryParser.FOLLOW_LOOP_in_p_BreakStatement17213); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            SEMICOLON749=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_BreakStatement17217); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON749_tree = this.adaptor.create(SEMICOLON749);\n            this.adaptor.addChild(root_0, SEMICOLON749_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ContinueStatement_return: (function() {\n        XQueryParser.p_ContinueStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ContinueStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2141:1: p_ContinueStatement : k= CONTINUE k= LOOP SEMICOLON ;\n    // $ANTLR start \"p_ContinueStatement\"\n    p_ContinueStatement: function() {\n        var retval = new XQueryParser.p_ContinueStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON750 = null;\n\n        var k_tree=null;\n        var SEMICOLON750_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2142:9: (k= CONTINUE k= LOOP SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2142:11: k= CONTINUE k= LOOP SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,CONTINUE,XQueryParser.FOLLOW_CONTINUE_in_p_ContinueStatement17245); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,LOOP,XQueryParser.FOLLOW_LOOP_in_p_ContinueStatement17251); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            SEMICOLON750=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_ContinueStatement17255); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON750_tree = this.adaptor.create(SEMICOLON750);\n            this.adaptor.addChild(root_0, SEMICOLON750_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ExitStatement_return: (function() {\n        XQueryParser.p_ExitStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ExitStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2146:1: p_ExitStatement : k= EXIT k= RETURNING p_ExprSingle[true] SEMICOLON ;\n    // $ANTLR start \"p_ExitStatement\"\n    p_ExitStatement: function() {\n        var retval = new XQueryParser.p_ExitStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var SEMICOLON752 = null;\n         var p_ExprSingle751 = null;\n\n        var k_tree=null;\n        var SEMICOLON752_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2147:9: (k= EXIT k= RETURNING p_ExprSingle[true] SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2147:11: k= EXIT k= RETURNING p_ExprSingle[true] SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,EXIT,XQueryParser.FOLLOW_EXIT_in_p_ExitStatement17283); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,RETURNING,XQueryParser.FOLLOW_RETURNING_in_p_ExitStatement17289); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_ExitStatement17293);\n            p_ExprSingle751=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle751.getTree());\n            SEMICOLON752=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_ExitStatement17296); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON752_tree = this.adaptor.create(SEMICOLON752);\n            this.adaptor.addChild(root_0, SEMICOLON752_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_FLWORStatement_return: (function() {\n        XQueryParser.p_FLWORStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_FLWORStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2151:1: p_FLWORStatement : p_InitialClause ( p_IntermediateClause )* p_ReturnStatement ;\n    // $ANTLR start \"p_FLWORStatement\"\n    p_FLWORStatement: function() {\n        var retval = new XQueryParser.p_FLWORStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_InitialClause753 = null;\n         var p_IntermediateClause754 = null;\n         var p_ReturnStatement755 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2152:9: ( p_InitialClause ( p_IntermediateClause )* p_ReturnStatement )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2152:11: p_InitialClause ( p_IntermediateClause )* p_ReturnStatement\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_InitialClause_in_p_FLWORStatement17322);\n            p_InitialClause753=this.p_InitialClause();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_InitialClause753.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2152:27: ( p_IntermediateClause )*\n            loop251:\n            do {\n                var alt251=2;\n                var LA251_0 = this.input.LA(1);\n\n                if ( (LA251_0==FOR||LA251_0==LET||LA251_0==ORDER||LA251_0==STABLE||LA251_0==WHERE||LA251_0==COUNT||LA251_0==GROUP) ) {\n                    alt251=1;\n                }\n\n\n                switch (alt251) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2152:27: p_IntermediateClause\n                    this.pushFollow(XQueryParser.FOLLOW_p_IntermediateClause_in_p_FLWORStatement17324);\n                    p_IntermediateClause754=this.p_IntermediateClause();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IntermediateClause754.getTree());\n\n\n                    break;\n\n                default :\n                    break loop251;\n                }\n            } while (true);\n\n            this.pushFollow(XQueryParser.FOLLOW_p_ReturnStatement_in_p_FLWORStatement17327);\n            p_ReturnStatement755=this.p_ReturnStatement();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ReturnStatement755.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ReturnStatement_return: (function() {\n        XQueryParser.p_ReturnStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ReturnStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2156:1: p_ReturnStatement : k= RETURN p_Hybrid[false,false] ;\n    // $ANTLR start \"p_ReturnStatement\"\n    p_ReturnStatement: function() {\n        var retval = new XQueryParser.p_ReturnStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_Hybrid756 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2157:9: (k= RETURN p_Hybrid[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2157:11: k= RETURN p_Hybrid[false,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_ReturnStatement17359); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_ReturnStatement17363);\n            p_Hybrid756=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid756.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IfStatement_return: (function() {\n        XQueryParser.p_IfStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IfStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2161:1: p_IfStatement : k= IF LPAREN p_Expr[true,true] RPAREN k= THEN p_Hybrid[false,false] k= ELSE p_Hybrid[false,false] ;\n    // $ANTLR start \"p_IfStatement\"\n    p_IfStatement: function() {\n        var retval = new XQueryParser.p_IfStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LPAREN757 = null;\n        var RPAREN759 = null;\n         var p_Expr758 = null;\n         var p_Hybrid760 = null;\n         var p_Hybrid761 = null;\n\n        var k_tree=null;\n        var LPAREN757_tree=null;\n        var RPAREN759_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2162:9: (k= IF LPAREN p_Expr[true,true] RPAREN k= THEN p_Hybrid[false,false] k= ELSE p_Hybrid[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2162:11: k= IF LPAREN p_Expr[true,true] RPAREN k= THEN p_Hybrid[false,false] k= ELSE p_Hybrid[false,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,IF,XQueryParser.FOLLOW_IF_in_p_IfStatement17392); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LPAREN757=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_IfStatement17396); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN757_tree = this.adaptor.create(LPAREN757);\n            this.adaptor.addChild(root_0, LPAREN757_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_IfStatement17398);\n            p_Expr758=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr758.getTree());\n            RPAREN759=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_IfStatement17401); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN759_tree = this.adaptor.create(RPAREN759);\n            this.adaptor.addChild(root_0, RPAREN759_tree);\n            }\n            k=this.match(this.input,THEN,XQueryParser.FOLLOW_THEN_in_p_IfStatement17405); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_IfStatement17409);\n            p_Hybrid760=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid760.getTree());\n            k=this.match(this.input,ELSE,XQueryParser.FOLLOW_ELSE_in_p_IfStatement17414); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_IfStatement17418);\n            p_Hybrid761=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid761.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SwitchStatement_return: (function() {\n        XQueryParser.p_SwitchStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SwitchStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2166:1: p_SwitchStatement : k= SWITCH LPAREN p_Expr[true,true] RPAREN ( p_SwitchCaseStatement )+ k= DEFAULT k= RETURN p_Hybrid[false,false] ;\n    // $ANTLR start \"p_SwitchStatement\"\n    p_SwitchStatement: function() {\n        var retval = new XQueryParser.p_SwitchStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LPAREN762 = null;\n        var RPAREN764 = null;\n         var p_Expr763 = null;\n         var p_SwitchCaseStatement765 = null;\n         var p_Hybrid766 = null;\n\n        var k_tree=null;\n        var LPAREN762_tree=null;\n        var RPAREN764_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2167:9: (k= SWITCH LPAREN p_Expr[true,true] RPAREN ( p_SwitchCaseStatement )+ k= DEFAULT k= RETURN p_Hybrid[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2167:11: k= SWITCH LPAREN p_Expr[true,true] RPAREN ( p_SwitchCaseStatement )+ k= DEFAULT k= RETURN p_Hybrid[false,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,SWITCH,XQueryParser.FOLLOW_SWITCH_in_p_SwitchStatement17447); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LPAREN762=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_SwitchStatement17451); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN762_tree = this.adaptor.create(LPAREN762);\n            this.adaptor.addChild(root_0, LPAREN762_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_SwitchStatement17453);\n            p_Expr763=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr763.getTree());\n            RPAREN764=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_SwitchStatement17456); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN764_tree = this.adaptor.create(RPAREN764);\n            this.adaptor.addChild(root_0, RPAREN764_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2167:67: ( p_SwitchCaseStatement )+\n            var cnt252=0;\n            loop252:\n            do {\n                var alt252=2;\n                var LA252_0 = this.input.LA(1);\n\n                if ( (LA252_0==CASE) ) {\n                    alt252=1;\n                }\n\n\n                switch (alt252) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2167:67: p_SwitchCaseStatement\n                    this.pushFollow(XQueryParser.FOLLOW_p_SwitchCaseStatement_in_p_SwitchStatement17458);\n                    p_SwitchCaseStatement765=this.p_SwitchCaseStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SwitchCaseStatement765.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt252 >= 1 ) {\n                        break loop252;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(252, this.input);\n                        throw eee;\n                }\n                cnt252++;\n            } while (true);\n\n            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_SwitchStatement17463); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_SwitchStatement17469); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_SwitchStatement17473);\n            p_Hybrid766=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid766.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_SwitchCaseStatement_return: (function() {\n        XQueryParser.p_SwitchCaseStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_SwitchCaseStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2171:1: p_SwitchCaseStatement : (k= CASE p_SwitchCaseOperand )+ k= RETURN p_Hybrid[false,false] ;\n    // $ANTLR start \"p_SwitchCaseStatement\"\n    p_SwitchCaseStatement: function() {\n        var retval = new XQueryParser.p_SwitchCaseStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_SwitchCaseOperand767 = null;\n         var p_Hybrid768 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2172:9: ( (k= CASE p_SwitchCaseOperand )+ k= RETURN p_Hybrid[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2172:11: (k= CASE p_SwitchCaseOperand )+ k= RETURN p_Hybrid[false,false]\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2172:11: (k= CASE p_SwitchCaseOperand )+\n            var cnt253=0;\n            loop253:\n            do {\n                var alt253=2;\n                var LA253_0 = this.input.LA(1);\n\n                if ( (LA253_0==CASE) ) {\n                    alt253=1;\n                }\n\n\n                switch (alt253) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2172:12: k= CASE p_SwitchCaseOperand\n                    k=this.match(this.input,CASE,XQueryParser.FOLLOW_CASE_in_p_SwitchCaseStatement17503); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_SwitchCaseOperand_in_p_SwitchCaseStatement17507);\n                    p_SwitchCaseOperand767=this.p_SwitchCaseOperand();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SwitchCaseOperand767.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt253 >= 1 ) {\n                        break loop253;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(253, this.input);\n                        throw eee;\n                }\n                cnt253++;\n            } while (true);\n\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_SwitchCaseStatement17513); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_SwitchCaseStatement17517);\n            p_Hybrid768=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid768.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TryCatchStatement_return: (function() {\n        XQueryParser.p_TryCatchStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TryCatchStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2176:1: p_TryCatchStatement : k= TRY p_BlockStatement (k= CATCH p_CatchErrorList p_BlockStatement )+ ;\n    // $ANTLR start \"p_TryCatchStatement\"\n    p_TryCatchStatement: function() {\n        var retval = new XQueryParser.p_TryCatchStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_BlockStatement769 = null;\n         var p_CatchErrorList770 = null;\n         var p_BlockStatement771 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2177:9: (k= TRY p_BlockStatement (k= CATCH p_CatchErrorList p_BlockStatement )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2177:11: k= TRY p_BlockStatement (k= CATCH p_CatchErrorList p_BlockStatement )+\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TRY,XQueryParser.FOLLOW_TRY_in_p_TryCatchStatement17546); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_BlockStatement_in_p_TryCatchStatement17550);\n            p_BlockStatement769=this.p_BlockStatement();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BlockStatement769.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2177:49: (k= CATCH p_CatchErrorList p_BlockStatement )+\n            var cnt254=0;\n            loop254:\n            do {\n                var alt254=2;\n                var LA254_0 = this.input.LA(1);\n\n                if ( (LA254_0==CATCH) ) {\n                    alt254=1;\n                }\n\n\n                switch (alt254) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2177:50: k= CATCH p_CatchErrorList p_BlockStatement\n                    k=this.match(this.input,CATCH,XQueryParser.FOLLOW_CATCH_in_p_TryCatchStatement17555); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_CatchErrorList_in_p_TryCatchStatement17559);\n                    p_CatchErrorList770=this.p_CatchErrorList();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CatchErrorList770.getTree());\n                    this.pushFollow(XQueryParser.FOLLOW_p_BlockStatement_in_p_TryCatchStatement17561);\n                    p_BlockStatement771=this.p_BlockStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BlockStatement771.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt254 >= 1 ) {\n                        break loop254;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(254, this.input);\n                        throw eee;\n                }\n                cnt254++;\n            } while (true);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TryCatchHybrid_return: (function() {\n        XQueryParser.p_TryCatchHybrid_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TryCatchHybrid_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2180:1: p_TryCatchHybrid[strict] : k= TRY p_BlockHybrid[$strict] (k= CATCH p_CatchErrorList p_BlockHybrid[$strict] )+ ;\n    // $ANTLR start \"p_TryCatchHybrid\"\n    p_TryCatchHybrid: function(strict) {\n        var retval = new XQueryParser.p_TryCatchHybrid_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_BlockHybrid772 = null;\n         var p_CatchErrorList773 = null;\n         var p_BlockHybrid774 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2181:9: (k= TRY p_BlockHybrid[$strict] (k= CATCH p_CatchErrorList p_BlockHybrid[$strict] )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2181:11: k= TRY p_BlockHybrid[$strict] (k= CATCH p_CatchErrorList p_BlockHybrid[$strict] )+\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TRY,XQueryParser.FOLLOW_TRY_in_p_TryCatchHybrid17593); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_BlockHybrid_in_p_TryCatchHybrid17597);\n            p_BlockHybrid772=this.p_BlockHybrid(strict);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BlockHybrid772.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2181:55: (k= CATCH p_CatchErrorList p_BlockHybrid[$strict] )+\n            var cnt255=0;\n            loop255:\n            do {\n                var alt255=2;\n                var LA255_0 = this.input.LA(1);\n\n                if ( (LA255_0==CATCH) ) {\n                    alt255=1;\n                }\n\n\n                switch (alt255) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2181:56: k= CATCH p_CatchErrorList p_BlockHybrid[$strict]\n                    k=this.match(this.input,CATCH,XQueryParser.FOLLOW_CATCH_in_p_TryCatchHybrid17603); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    k_tree = this.adaptor.create(k);\n                    this.adaptor.addChild(root_0, k_tree);\n                    }\n                    if ( this.state.backtracking===0 ) {\n                      this.ak(k);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_CatchErrorList_in_p_TryCatchHybrid17607);\n                    p_CatchErrorList773=this.p_CatchErrorList();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CatchErrorList773.getTree());\n                    this.pushFollow(XQueryParser.FOLLOW_p_BlockHybrid_in_p_TryCatchHybrid17609);\n                    p_BlockHybrid774=this.p_BlockHybrid(strict);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_BlockHybrid774.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt255 >= 1 ) {\n                        break loop255;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(255, this.input);\n                        throw eee;\n                }\n                cnt255++;\n            } while (true);\n\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_TypeswitchStatement_return: (function() {\n        XQueryParser.p_TypeswitchStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_TypeswitchStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2185:1: p_TypeswitchStatement : k= TYPESWITCH LPAREN p_Expr[true,true] RPAREN ( p_CaseStatement )+ k= DEFAULT (d= DOLLAR v= p_VarName )? k= RETURN p_Hybrid[false,false] ;\n    // $ANTLR start \"p_TypeswitchStatement\"\n    p_TypeswitchStatement: function() {\n        var retval = new XQueryParser.p_TypeswitchStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n        var LPAREN775 = null;\n        var RPAREN777 = null;\n         var v = null;\n         var p_Expr776 = null;\n         var p_CaseStatement778 = null;\n         var p_Hybrid779 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n        var LPAREN775_tree=null;\n        var RPAREN777_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2186:9: (k= TYPESWITCH LPAREN p_Expr[true,true] RPAREN ( p_CaseStatement )+ k= DEFAULT (d= DOLLAR v= p_VarName )? k= RETURN p_Hybrid[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2186:11: k= TYPESWITCH LPAREN p_Expr[true,true] RPAREN ( p_CaseStatement )+ k= DEFAULT (d= DOLLAR v= p_VarName )? k= RETURN p_Hybrid[false,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TYPESWITCH,XQueryParser.FOLLOW_TYPESWITCH_in_p_TypeswitchStatement17642); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LPAREN775=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_TypeswitchStatement17646); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN775_tree = this.adaptor.create(LPAREN775);\n            this.adaptor.addChild(root_0, LPAREN775_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_TypeswitchStatement17648);\n            p_Expr776=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr776.getTree());\n            RPAREN777=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_TypeswitchStatement17651); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN777_tree = this.adaptor.create(RPAREN777);\n            this.adaptor.addChild(root_0, RPAREN777_tree);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2186:71: ( p_CaseStatement )+\n            var cnt256=0;\n            loop256:\n            do {\n                var alt256=2;\n                var LA256_0 = this.input.LA(1);\n\n                if ( (LA256_0==CASE) ) {\n                    alt256=1;\n                }\n\n\n                switch (alt256) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2186:71: p_CaseStatement\n                    this.pushFollow(XQueryParser.FOLLOW_p_CaseStatement_in_p_TypeswitchStatement17653);\n                    p_CaseStatement778=this.p_CaseStatement();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CaseStatement778.getTree());\n\n\n                    break;\n\n                default :\n                    if ( cnt256 >= 1 ) {\n                        break loop256;\n                    }\n                    if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        var eee = new org.antlr.runtime.EarlyExitException(256, this.input);\n                        throw eee;\n                }\n                cnt256++;\n            } while (true);\n\n            k=this.match(this.input,DEFAULT,XQueryParser.FOLLOW_DEFAULT_in_p_TypeswitchStatement17658); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2186:113: (d= DOLLAR v= p_VarName )?\n            var alt257=2;\n            var LA257_0 = this.input.LA(1);\n\n            if ( (LA257_0==DOLLAR) ) {\n                alt257=1;\n            }\n            switch (alt257) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2186:114: d= DOLLAR v= p_VarName\n                    d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_TypeswitchStatement17665); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_TypeswitchStatement17669);\n                    v=this.p_VarName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.av(d, (v?v.stop:null)); \n                    }\n\n\n                    break;\n\n            }\n\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_TypeswitchStatement17677); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_TypeswitchStatement17681);\n            p_Hybrid779=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid779.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CaseStatement_return: (function() {\n        XQueryParser.p_CaseStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CaseStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2190:1: p_CaseStatement : k= CASE (d= DOLLAR v= p_VarName AS )? p_SequenceType k= RETURN p_Hybrid[false,false] ;\n    // $ANTLR start \"p_CaseStatement\"\n    p_CaseStatement: function() {\n        var retval = new XQueryParser.p_CaseStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n        var AS780 = null;\n         var v = null;\n         var p_SequenceType781 = null;\n         var p_Hybrid782 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n        var AS780_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2191:9: (k= CASE (d= DOLLAR v= p_VarName AS )? p_SequenceType k= RETURN p_Hybrid[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2191:11: k= CASE (d= DOLLAR v= p_VarName AS )? p_SequenceType k= RETURN p_Hybrid[false,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,CASE,XQueryParser.FOLLOW_CASE_in_p_CaseStatement17710); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2191:33: (d= DOLLAR v= p_VarName AS )?\n            var alt258=2;\n            var LA258_0 = this.input.LA(1);\n\n            if ( (LA258_0==DOLLAR) ) {\n                alt258=1;\n            }\n            switch (alt258) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2191:34: d= DOLLAR v= p_VarName AS\n                    d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_CaseStatement17717); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    d_tree = this.adaptor.create(d);\n                    this.adaptor.addChild(root_0, d_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_CaseStatement17721);\n                    v=this.p_VarName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.av(d, (v?v.stop:null)); \n                    }\n                    AS780=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_CaseStatement17725); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    AS780_tree = this.adaptor.create(AS780);\n                    this.adaptor.addChild(root_0, AS780_tree);\n                    }\n\n\n                    break;\n\n            }\n\n            this.pushFollow(XQueryParser.FOLLOW_p_SequenceType_in_p_CaseStatement17729);\n            p_SequenceType781=this.p_SequenceType();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_SequenceType781.getTree());\n            k=this.match(this.input,RETURN,XQueryParser.FOLLOW_RETURN_in_p_CaseStatement17733); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_CaseStatement17737);\n            p_Hybrid782=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid782.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_VarDeclStatement_return: (function() {\n        XQueryParser.p_VarDeclStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_VarDeclStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2195:1: p_VarDeclStatement : ( p_Annotation )* k= VARIABLE d= DOLLAR v= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )? ( COMMA e= DOLLAR w= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )? )* SEMICOLON ;\n    // $ANTLR start \"p_VarDeclStatement\"\n    p_VarDeclStatement: function() {\n        var retval = new XQueryParser.p_VarDeclStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n        var e = null;\n        var BIND785 = null;\n        var COMMA787 = null;\n        var BIND789 = null;\n        var SEMICOLON791 = null;\n         var v = null;\n         var w = null;\n         var p_Annotation783 = null;\n         var p_TypeDeclaration784 = null;\n         var p_ExprSingle786 = null;\n         var p_TypeDeclaration788 = null;\n         var p_ExprSingle790 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n        var e_tree=null;\n        var BIND785_tree=null;\n        var COMMA787_tree=null;\n        var BIND789_tree=null;\n        var SEMICOLON791_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:9: ( ( p_Annotation )* k= VARIABLE d= DOLLAR v= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )? ( COMMA e= DOLLAR w= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )? )* SEMICOLON )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:11: ( p_Annotation )* k= VARIABLE d= DOLLAR v= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )? ( COMMA e= DOLLAR w= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )? )* SEMICOLON\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:11: ( p_Annotation )*\n            loop259:\n            do {\n                var alt259=2;\n                var LA259_0 = this.input.LA(1);\n\n                if ( (LA259_0==ANN_PERCENT) ) {\n                    alt259=1;\n                }\n\n\n                switch (alt259) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:11: p_Annotation\n                    this.pushFollow(XQueryParser.FOLLOW_p_Annotation_in_p_VarDeclStatement17764);\n                    p_Annotation783=this.p_Annotation();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Annotation783.getTree());\n\n\n                    break;\n\n                default :\n                    break loop259;\n                }\n            } while (true);\n\n            k=this.match(this.input,VARIABLE,XQueryParser.FOLLOW_VARIABLE_in_p_VarDeclStatement17769); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_VarDeclStatement17775); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_VarDeclStatement17779);\n            v=this.p_VarName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:98: ( p_TypeDeclaration )?\n            var alt260=2;\n            var LA260_0 = this.input.LA(1);\n\n            if ( (LA260_0==AS) ) {\n                alt260=1;\n            }\n            switch (alt260) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:98: p_TypeDeclaration\n                    this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_VarDeclStatement17783);\n                    p_TypeDeclaration784=this.p_TypeDeclaration();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration784.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:117: ( BIND p_ExprSingle[true] )?\n            var alt261=2;\n            var LA261_0 = this.input.LA(1);\n\n            if ( (LA261_0==BIND) ) {\n                alt261=1;\n            }\n            switch (alt261) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2196:118: BIND p_ExprSingle[true]\n                    BIND785=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_VarDeclStatement17787); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    BIND785_tree = this.adaptor.create(BIND785);\n                    this.adaptor.addChild(root_0, BIND785_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_VarDeclStatement17789);\n                    p_ExprSingle786=this.p_ExprSingle(true);\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle786.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2197:11: ( COMMA e= DOLLAR w= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )? )*\n            loop264:\n            do {\n                var alt264=2;\n                var LA264_0 = this.input.LA(1);\n\n                if ( (LA264_0==COMMA) ) {\n                    alt264=1;\n                }\n\n\n                switch (alt264) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2197:12: COMMA e= DOLLAR w= p_VarName ( p_TypeDeclaration )? ( BIND p_ExprSingle[true] )?\n                    COMMA787=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_VarDeclStatement17805); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA787_tree = this.adaptor.create(COMMA787);\n                    this.adaptor.addChild(root_0, COMMA787_tree);\n                    }\n                    e=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_VarDeclStatement17809); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    e_tree = this.adaptor.create(e);\n                    this.adaptor.addChild(root_0, e_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_VarName_in_p_VarDeclStatement17813);\n                    w=this.p_VarName();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, w.getTree());\n                    if ( this.state.backtracking===0 ) {\n                       this.av(e, (w?w.stop:null)); \n                    }\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2197:65: ( p_TypeDeclaration )?\n                    var alt262=2;\n                    var LA262_0 = this.input.LA(1);\n\n                    if ( (LA262_0==AS) ) {\n                        alt262=1;\n                    }\n                    switch (alt262) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2197:65: p_TypeDeclaration\n                            this.pushFollow(XQueryParser.FOLLOW_p_TypeDeclaration_in_p_VarDeclStatement17817);\n                            p_TypeDeclaration788=this.p_TypeDeclaration();\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_TypeDeclaration788.getTree());\n\n\n                            break;\n\n                    }\n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2197:84: ( BIND p_ExprSingle[true] )?\n                    var alt263=2;\n                    var LA263_0 = this.input.LA(1);\n\n                    if ( (LA263_0==BIND) ) {\n                        alt263=1;\n                    }\n                    switch (alt263) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2197:85: BIND p_ExprSingle[true]\n                            BIND789=this.match(this.input,BIND,XQueryParser.FOLLOW_BIND_in_p_VarDeclStatement17821); if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) {\n                            BIND789_tree = this.adaptor.create(BIND789);\n                            this.adaptor.addChild(root_0, BIND789_tree);\n                            }\n                            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_VarDeclStatement17823);\n                            p_ExprSingle790=this.p_ExprSingle(true);\n\n                            this.state._fsp--;\n                            if (this.state.failed) return retval;\n                            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle790.getTree());\n\n\n                            break;\n\n                    }\n\n\n\n                    break;\n\n                default :\n                    break loop264;\n                }\n            } while (true);\n\n            SEMICOLON791=this.match(this.input,SEMICOLON,XQueryParser.FOLLOW_SEMICOLON_in_p_VarDeclStatement17840); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            SEMICOLON791_tree = this.adaptor.create(SEMICOLON791);\n            this.adaptor.addChild(root_0, SEMICOLON791_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_WhileStatement_return: (function() {\n        XQueryParser.p_WhileStatement_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_WhileStatement_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2202:1: p_WhileStatement : k= WHILE LPAREN p_Expr[true,true] RPAREN p_Hybrid[false,false] ;\n    // $ANTLR start \"p_WhileStatement\"\n    p_WhileStatement: function() {\n        var retval = new XQueryParser.p_WhileStatement_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var LPAREN792 = null;\n        var RPAREN794 = null;\n         var p_Expr793 = null;\n         var p_Hybrid795 = null;\n\n        var k_tree=null;\n        var LPAREN792_tree=null;\n        var RPAREN794_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2203:9: (k= WHILE LPAREN p_Expr[true,true] RPAREN p_Hybrid[false,false] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2203:11: k= WHILE LPAREN p_Expr[true,true] RPAREN p_Hybrid[false,false]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,WHILE,XQueryParser.FOLLOW_WHILE_in_p_WhileStatement17868); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            LPAREN792=this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_p_WhileStatement17872); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LPAREN792_tree = this.adaptor.create(LPAREN792);\n            this.adaptor.addChild(root_0, LPAREN792_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Expr_in_p_WhileStatement17874);\n            p_Expr793=this.p_Expr(true, true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Expr793.getTree());\n            RPAREN794=this.match(this.input,RPAREN,XQueryParser.FOLLOW_RPAREN_in_p_WhileStatement17877); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RPAREN794_tree = this.adaptor.create(RPAREN794);\n            this.adaptor.addChild(root_0, RPAREN794_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_Hybrid_in_p_WhileStatement17879);\n            p_Hybrid795=this.p_Hybrid(false, false);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_Hybrid795.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ExprSimple_return: (function() {\n        XQueryParser.p_ExprSimple_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ExprSimple_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2207:1: p_ExprSimple : ( p_QuantifiedExpr | p_OrExpr | {...}? => pg_UpdateExpr );\n    // $ANTLR start \"p_ExprSimple\"\n    p_ExprSimple: function() {\n        var retval = new XQueryParser.p_ExprSimple_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_QuantifiedExpr796 = null;\n         var p_OrExpr797 = null;\n         var pg_UpdateExpr798 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2208:9: ( p_QuantifiedExpr | p_OrExpr | {...}? => pg_UpdateExpr )\n            var alt265=3;\n            alt265 = this.dfa265.predict(this.input);\n            switch (alt265) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2208:11: p_QuantifiedExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_QuantifiedExpr_in_p_ExprSimple17906);\n                    p_QuantifiedExpr796=this.p_QuantifiedExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QuantifiedExpr796.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2209:11: p_OrExpr\n                    root_0 = this.adaptor.nil();\n\n                    this.pushFollow(XQueryParser.FOLLOW_p_OrExpr_in_p_ExprSimple17918);\n                    p_OrExpr797=this.p_OrExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OrExpr797.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2210:11: {...}? => pg_UpdateExpr\n                    root_0 = this.adaptor.nil();\n\n                    if ( !((this.lc(XQU))) ) {\n                        if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"p_ExprSimple\", \"this.lc(XQU)\");\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_pg_UpdateExpr_in_p_ExprSimple17933);\n                    pg_UpdateExpr798=this.pg_UpdateExpr();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, pg_UpdateExpr798.getTree());\n\n\n                    break;\n\n            }\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_BlockExpr_return: (function() {\n        XQueryParser.p_BlockExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_BlockExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2214:1: p_BlockExpr : LBRACKET p_StatementsAndExpr RBRACKET ;\n    // $ANTLR start \"p_BlockExpr\"\n    p_BlockExpr: function() {\n        var retval = new XQueryParser.p_BlockExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var LBRACKET799 = null;\n        var RBRACKET801 = null;\n         var p_StatementsAndExpr800 = null;\n\n        var LBRACKET799_tree=null;\n        var RBRACKET801_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2215:9: ( LBRACKET p_StatementsAndExpr RBRACKET )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2215:11: LBRACKET p_StatementsAndExpr RBRACKET\n            root_0 = this.adaptor.nil();\n\n            LBRACKET799=this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_p_BlockExpr17959); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            LBRACKET799_tree = this.adaptor.create(LBRACKET799);\n            this.adaptor.addChild(root_0, LBRACKET799_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StatementsAndExpr_in_p_BlockExpr17961);\n            p_StatementsAndExpr800=this.p_StatementsAndExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StatementsAndExpr800.getTree());\n            RBRACKET801=this.match(this.input,RBRACKET,XQueryParser.FOLLOW_RBRACKET_in_p_BlockExpr17963); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            RBRACKET801_tree = this.adaptor.create(RBRACKET801);\n            this.adaptor.addChild(root_0, RBRACKET801_tree);\n            }\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CollectionDecl_return: (function() {\n        XQueryParser.p_CollectionDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CollectionDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2222:1: p_CollectionDecl : k= COLLECTION p_QName ( p_CollectionTypeDecl )? ;\n    // $ANTLR start \"p_CollectionDecl\"\n    p_CollectionDecl: function() {\n        var retval = new XQueryParser.p_CollectionDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_QName802 = null;\n         var p_CollectionTypeDecl803 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2223:9: (k= COLLECTION p_QName ( p_CollectionTypeDecl )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2223:11: k= COLLECTION p_QName ( p_CollectionTypeDecl )?\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,COLLECTION,XQueryParser.FOLLOW_COLLECTION_in_p_CollectionDecl17994); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_CollectionDecl17998);\n            p_QName802=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName802.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2223:47: ( p_CollectionTypeDecl )?\n            var alt266=2;\n            var LA266_0 = this.input.LA(1);\n\n            if ( (LA266_0==AS) ) {\n                alt266=1;\n            }\n            switch (alt266) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2223:47: p_CollectionTypeDecl\n                    this.pushFollow(XQueryParser.FOLLOW_p_CollectionTypeDecl_in_p_CollectionDecl18000);\n                    p_CollectionTypeDecl803=this.p_CollectionTypeDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_CollectionTypeDecl803.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_CollectionTypeDecl_return: (function() {\n        XQueryParser.p_CollectionTypeDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_CollectionTypeDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2226:1: p_CollectionTypeDecl : (k= AS p_KindTest ( ( p_OccurrenceIndicator )=> p_OccurrenceIndicator )? ) ;\n    // $ANTLR start \"p_CollectionTypeDecl\"\n    p_CollectionTypeDecl: function() {\n        var retval = new XQueryParser.p_CollectionTypeDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_KindTest804 = null;\n         var p_OccurrenceIndicator805 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:9: ( (k= AS p_KindTest ( ( p_OccurrenceIndicator )=> p_OccurrenceIndicator )? ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:11: (k= AS p_KindTest ( ( p_OccurrenceIndicator )=> p_OccurrenceIndicator )? )\n            root_0 = this.adaptor.nil();\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:11: (k= AS p_KindTest ( ( p_OccurrenceIndicator )=> p_OccurrenceIndicator )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:12: k= AS p_KindTest ( ( p_OccurrenceIndicator )=> p_OccurrenceIndicator )?\n            k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_CollectionTypeDecl18029); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_KindTest_in_p_CollectionTypeDecl18033);\n            p_KindTest804=this.p_KindTest();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_KindTest804.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:43: ( ( p_OccurrenceIndicator )=> p_OccurrenceIndicator )?\n            var alt267=2;\n            var LA267_0 = this.input.LA(1);\n\n            if ( ((LA267_0>=QUESTION && LA267_0<=PLUS)) && (this.synpred15_XQueryParser())) {\n                alt267=1;\n            }\n            switch (alt267) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:44: ( p_OccurrenceIndicator )=> p_OccurrenceIndicator\n                    this.pushFollow(XQueryParser.FOLLOW_p_OccurrenceIndicator_in_p_CollectionTypeDecl18042);\n                    p_OccurrenceIndicator805=this.p_OccurrenceIndicator();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OccurrenceIndicator805.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IndexDecl_return: (function() {\n        XQueryParser.p_IndexDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IndexDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2230:1: p_IndexDecl : k= INDEX p_IndexName k= ON k= NODES p_IndexDomainExpr k= BY p_IndexKeySpec ( COMMA p_IndexKeySpec )* ;\n    // $ANTLR start \"p_IndexDecl\"\n    p_IndexDecl: function() {\n        var retval = new XQueryParser.p_IndexDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var COMMA809 = null;\n         var p_IndexName806 = null;\n         var p_IndexDomainExpr807 = null;\n         var p_IndexKeySpec808 = null;\n         var p_IndexKeySpec810 = null;\n\n        var k_tree=null;\n        var COMMA809_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2231:9: (k= INDEX p_IndexName k= ON k= NODES p_IndexDomainExpr k= BY p_IndexKeySpec ( COMMA p_IndexKeySpec )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2231:11: k= INDEX p_IndexName k= ON k= NODES p_IndexDomainExpr k= BY p_IndexKeySpec ( COMMA p_IndexKeySpec )*\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,INDEX,XQueryParser.FOLLOW_INDEX_in_p_IndexDecl18072); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_IndexName_in_p_IndexDecl18076);\n            p_IndexName806=this.p_IndexName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexName806.getTree());\n            k=this.match(this.input,ON,XQueryParser.FOLLOW_ON_in_p_IndexDecl18080); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,NODES,XQueryParser.FOLLOW_NODES_in_p_IndexDecl18086); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_IndexDomainExpr_in_p_IndexDecl18090);\n            p_IndexDomainExpr807=this.p_IndexDomainExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexDomainExpr807.getTree());\n            k=this.match(this.input,BY,XQueryParser.FOLLOW_BY_in_p_IndexDecl18094); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_IndexKeySpec_in_p_IndexDecl18098);\n            p_IndexKeySpec808=this.p_IndexKeySpec();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexKeySpec808.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2231:142: ( COMMA p_IndexKeySpec )*\n            loop268:\n            do {\n                var alt268=2;\n                var LA268_0 = this.input.LA(1);\n\n                if ( (LA268_0==COMMA) ) {\n                    alt268=1;\n                }\n\n\n                switch (alt268) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2231:143: COMMA p_IndexKeySpec\n                    COMMA809=this.match(this.input,COMMA,XQueryParser.FOLLOW_COMMA_in_p_IndexDecl18101); if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) {\n                    COMMA809_tree = this.adaptor.create(COMMA809);\n                    this.adaptor.addChild(root_0, COMMA809_tree);\n                    }\n                    this.pushFollow(XQueryParser.FOLLOW_p_IndexKeySpec_in_p_IndexDecl18103);\n                    p_IndexKeySpec810=this.p_IndexKeySpec();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexKeySpec810.getTree());\n\n\n                    break;\n\n                default :\n                    break loop268;\n                }\n            } while (true);\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IndexName_return: (function() {\n        XQueryParser.p_IndexName_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IndexName_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2234:1: p_IndexName : p_QName ;\n    // $ANTLR start \"p_IndexName\"\n    p_IndexName: function() {\n        var retval = new XQueryParser.p_IndexName_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_QName811 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2235:9: ( p_QName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2235:11: p_QName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_IndexName18130);\n            p_QName811=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName811.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IndexDomainExpr_return: (function() {\n        XQueryParser.p_IndexDomainExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IndexDomainExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2238:1: p_IndexDomainExpr : p_PathExpr ;\n    // $ANTLR start \"p_IndexDomainExpr\"\n    p_IndexDomainExpr: function() {\n        var retval = new XQueryParser.p_IndexDomainExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_PathExpr812 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2239:9: ( p_PathExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2239:11: p_PathExpr\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_PathExpr_in_p_IndexDomainExpr18155);\n            p_PathExpr812=this.p_PathExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PathExpr812.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IndexKeySpec_return: (function() {\n        XQueryParser.p_IndexKeySpec_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IndexKeySpec_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2242:1: p_IndexKeySpec : p_IndexKeyExpr ( p_IndexKeyTypeDecl )? ( p_IndexKeyCollation )? ;\n    // $ANTLR start \"p_IndexKeySpec\"\n    p_IndexKeySpec: function() {\n        var retval = new XQueryParser.p_IndexKeySpec_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_IndexKeyExpr813 = null;\n         var p_IndexKeyTypeDecl814 = null;\n         var p_IndexKeyCollation815 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2243:9: ( p_IndexKeyExpr ( p_IndexKeyTypeDecl )? ( p_IndexKeyCollation )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2243:11: p_IndexKeyExpr ( p_IndexKeyTypeDecl )? ( p_IndexKeyCollation )?\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_IndexKeyExpr_in_p_IndexKeySpec18180);\n            p_IndexKeyExpr813=this.p_IndexKeyExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexKeyExpr813.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2243:26: ( p_IndexKeyTypeDecl )?\n            var alt269=2;\n            var LA269_0 = this.input.LA(1);\n\n            if ( (LA269_0==AS) ) {\n                alt269=1;\n            }\n            switch (alt269) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2243:26: p_IndexKeyTypeDecl\n                    this.pushFollow(XQueryParser.FOLLOW_p_IndexKeyTypeDecl_in_p_IndexKeySpec18182);\n                    p_IndexKeyTypeDecl814=this.p_IndexKeyTypeDecl();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexKeyTypeDecl814.getTree());\n\n\n                    break;\n\n            }\n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2243:46: ( p_IndexKeyCollation )?\n            var alt270=2;\n            var LA270_0 = this.input.LA(1);\n\n            if ( (LA270_0==COLLATION) ) {\n                alt270=1;\n            }\n            switch (alt270) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2243:46: p_IndexKeyCollation\n                    this.pushFollow(XQueryParser.FOLLOW_p_IndexKeyCollation_in_p_IndexKeySpec18185);\n                    p_IndexKeyCollation815=this.p_IndexKeyCollation();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_IndexKeyCollation815.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IndexKeyExpr_return: (function() {\n        XQueryParser.p_IndexKeyExpr_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IndexKeyExpr_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2246:1: p_IndexKeyExpr : p_PathExpr ;\n    // $ANTLR start \"p_IndexKeyExpr\"\n    p_IndexKeyExpr: function() {\n        var retval = new XQueryParser.p_IndexKeyExpr_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_PathExpr816 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2247:9: ( p_PathExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2247:11: p_PathExpr\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_PathExpr_in_p_IndexKeyExpr18211);\n            p_PathExpr816=this.p_PathExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PathExpr816.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IndexKeyTypeDecl_return: (function() {\n        XQueryParser.p_IndexKeyTypeDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IndexKeyTypeDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2250:1: p_IndexKeyTypeDecl : k= AS p_AtomicType ( p_OccurrenceIndicator )? ;\n    // $ANTLR start \"p_IndexKeyTypeDecl\"\n    p_IndexKeyTypeDecl: function() {\n        var retval = new XQueryParser.p_IndexKeyTypeDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_AtomicType817 = null;\n         var p_OccurrenceIndicator818 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2251:9: (k= AS p_AtomicType ( p_OccurrenceIndicator )? )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2251:11: k= AS p_AtomicType ( p_OccurrenceIndicator )?\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,AS,XQueryParser.FOLLOW_AS_in_p_IndexKeyTypeDecl18238); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_AtomicType_in_p_IndexKeyTypeDecl18242);\n            p_AtomicType817=this.p_AtomicType();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_AtomicType817.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2251:44: ( p_OccurrenceIndicator )?\n            var alt271=2;\n            var LA271_0 = this.input.LA(1);\n\n            if ( ((LA271_0>=QUESTION && LA271_0<=PLUS)) ) {\n                alt271=1;\n            }\n            switch (alt271) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2251:44: p_OccurrenceIndicator\n                    this.pushFollow(XQueryParser.FOLLOW_p_OccurrenceIndicator_in_p_IndexKeyTypeDecl18244);\n                    p_OccurrenceIndicator818=this.p_OccurrenceIndicator();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_OccurrenceIndicator818.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_AtomicType_return: (function() {\n        XQueryParser.p_AtomicType_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_AtomicType_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2254:1: p_AtomicType : p_QName ;\n    // $ANTLR start \"p_AtomicType\"\n    p_AtomicType: function() {\n        var retval = new XQueryParser.p_AtomicType_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n         var p_QName819 = null;\n\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2255:9: ( p_QName )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2255:11: p_QName\n            root_0 = this.adaptor.nil();\n\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_AtomicType18270);\n            p_QName819=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName819.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_IndexKeyCollation_return: (function() {\n        XQueryParser.p_IndexKeyCollation_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_IndexKeyCollation_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2258:1: p_IndexKeyCollation : k= COLLATION p_StringLiteral ;\n    // $ANTLR start \"p_IndexKeyCollation\"\n    p_IndexKeyCollation: function() {\n        var retval = new XQueryParser.p_IndexKeyCollation_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_StringLiteral820 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2259:9: (k= COLLATION p_StringLiteral )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2259:11: k= COLLATION p_StringLiteral\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,COLLATION,XQueryParser.FOLLOW_COLLATION_in_p_IndexKeyCollation18297); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_StringLiteral_in_p_IndexKeyCollation18301);\n            p_StringLiteral820=this.p_StringLiteral();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_StringLiteral820.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICDecl_return: (function() {\n        XQueryParser.p_ICDecl_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICDecl_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2262:1: p_ICDecl : k= INTEGRITY k= CONSTRAINT p_QName ( p_ICCollection | p_ICForeignKey ) ;\n    // $ANTLR start \"p_ICDecl\"\n    p_ICDecl: function() {\n        var retval = new XQueryParser.p_ICDecl_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_QName821 = null;\n         var p_ICCollection822 = null;\n         var p_ICForeignKey823 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2263:9: (k= INTEGRITY k= CONSTRAINT p_QName ( p_ICCollection | p_ICForeignKey ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2263:11: k= INTEGRITY k= CONSTRAINT p_QName ( p_ICCollection | p_ICForeignKey )\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,INTEGRITY,XQueryParser.FOLLOW_INTEGRITY_in_p_ICDecl18328); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,CONSTRAINT,XQueryParser.FOLLOW_CONSTRAINT_in_p_ICDecl18334); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_ICDecl18338);\n            p_QName821=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName821.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2263:74: ( p_ICCollection | p_ICForeignKey )\n            var alt272=2;\n            var LA272_0 = this.input.LA(1);\n\n            if ( (LA272_0==ON) ) {\n                alt272=1;\n            }\n            else if ( (LA272_0==FOREIGN) ) {\n                alt272=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 272, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt272) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2263:75: p_ICCollection\n                    this.pushFollow(XQueryParser.FOLLOW_p_ICCollection_in_p_ICDecl18341);\n                    p_ICCollection822=this.p_ICCollection();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICCollection822.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2263:92: p_ICForeignKey\n                    this.pushFollow(XQueryParser.FOLLOW_p_ICForeignKey_in_p_ICDecl18345);\n                    p_ICForeignKey823=this.p_ICForeignKey();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICForeignKey823.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICCollection_return: (function() {\n        XQueryParser.p_ICCollection_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICCollection_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2266:1: p_ICCollection : k= ON k= COLLECTION p_QName ( p_ICCollSequence | p_ICCollSequenceUnique | p_ICCollNode ) ;\n    // $ANTLR start \"p_ICCollection\"\n    p_ICCollection: function() {\n        var retval = new XQueryParser.p_ICCollection_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_QName824 = null;\n         var p_ICCollSequence825 = null;\n         var p_ICCollSequenceUnique826 = null;\n         var p_ICCollNode827 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2267:9: (k= ON k= COLLECTION p_QName ( p_ICCollSequence | p_ICCollSequenceUnique | p_ICCollNode ) )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2267:11: k= ON k= COLLECTION p_QName ( p_ICCollSequence | p_ICCollSequenceUnique | p_ICCollNode )\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,ON,XQueryParser.FOLLOW_ON_in_p_ICCollection18373); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,COLLECTION,XQueryParser.FOLLOW_COLLECTION_in_p_ICCollection18379); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_ICCollection18383);\n            p_QName824=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName824.getTree());\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2267:67: ( p_ICCollSequence | p_ICCollSequenceUnique | p_ICCollNode )\n            var alt273=3;\n            switch ( this.input.LA(1) ) {\n            case DOLLAR:\n                alt273=1;\n                break;\n            case NODE:\n                alt273=2;\n                break;\n            case FOREACH:\n                alt273=3;\n                break;\n            default:\n                if (this.state.backtracking>0) {this.state.failed=true; return retval;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 273, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt273) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2267:68: p_ICCollSequence\n                    this.pushFollow(XQueryParser.FOLLOW_p_ICCollSequence_in_p_ICCollection18386);\n                    p_ICCollSequence825=this.p_ICCollSequence();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICCollSequence825.getTree());\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2267:87: p_ICCollSequenceUnique\n                    this.pushFollow(XQueryParser.FOLLOW_p_ICCollSequenceUnique_in_p_ICCollection18390);\n                    p_ICCollSequenceUnique826=this.p_ICCollSequenceUnique();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICCollSequenceUnique826.getTree());\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2267:112: p_ICCollNode\n                    this.pushFollow(XQueryParser.FOLLOW_p_ICCollNode_in_p_ICCollection18394);\n                    p_ICCollNode827=this.p_ICCollNode();\n\n                    this.state._fsp--;\n                    if (this.state.failed) return retval;\n                    if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICCollNode827.getTree());\n\n\n                    break;\n\n            }\n\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICCollSequence_return: (function() {\n        XQueryParser.p_ICCollSequence_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICCollSequence_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2270:1: p_ICCollSequence : d= DOLLAR v= p_QName k= CHECK p_ExprSingle[true] ;\n    // $ANTLR start \"p_ICCollSequence\"\n    p_ICCollSequence: function() {\n        var retval = new XQueryParser.p_ICCollSequence_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var d = null;\n        var k = null;\n         var v = null;\n         var p_ExprSingle828 = null;\n\n        var d_tree=null;\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2271:9: (d= DOLLAR v= p_QName k= CHECK p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2271:11: d= DOLLAR v= p_QName k= CHECK p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_ICCollSequence18422); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_ICCollSequence18426);\n            v=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            k=this.match(this.input,CHECK,XQueryParser.FOLLOW_CHECK_in_p_ICCollSequence18432); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_ICCollSequence18436);\n            p_ExprSingle828=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle828.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICCollSequenceUnique_return: (function() {\n        XQueryParser.p_ICCollSequenceUnique_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICCollSequenceUnique_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2274:1: p_ICCollSequenceUnique : k= NODE d= DOLLAR v= p_QName k= CHECK k= UNIQUE k= KEY p_PathExpr ;\n    // $ANTLR start \"p_ICCollSequenceUnique\"\n    p_ICCollSequenceUnique: function() {\n        var retval = new XQueryParser.p_ICCollSequenceUnique_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n         var p_PathExpr829 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2275:9: (k= NODE d= DOLLAR v= p_QName k= CHECK k= UNIQUE k= KEY p_PathExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2275:11: k= NODE d= DOLLAR v= p_QName k= CHECK k= UNIQUE k= KEY p_PathExpr\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_ICCollSequenceUnique18464); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_ICCollSequenceUnique18470); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_ICCollSequenceUnique18474);\n            v=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            k=this.match(this.input,CHECK,XQueryParser.FOLLOW_CHECK_in_p_ICCollSequenceUnique18480); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,UNIQUE,XQueryParser.FOLLOW_UNIQUE_in_p_ICCollSequenceUnique18486); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,KEY,XQueryParser.FOLLOW_KEY_in_p_ICCollSequenceUnique18492); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_PathExpr_in_p_ICCollSequenceUnique18496);\n            p_PathExpr829=this.p_PathExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PathExpr829.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICCollNode_return: (function() {\n        XQueryParser.p_ICCollNode_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICCollNode_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2278:1: p_ICCollNode : k= FOREACH k= NODE d= DOLLAR v= p_QName k= CHECK p_ExprSingle[true] ;\n    // $ANTLR start \"p_ICCollNode\"\n    p_ICCollNode: function() {\n        var retval = new XQueryParser.p_ICCollNode_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n         var p_ExprSingle830 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2279:9: (k= FOREACH k= NODE d= DOLLAR v= p_QName k= CHECK p_ExprSingle[true] )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2279:11: k= FOREACH k= NODE d= DOLLAR v= p_QName k= CHECK p_ExprSingle[true]\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,FOREACH,XQueryParser.FOLLOW_FOREACH_in_p_ICCollNode18523); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_ICCollNode18529); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_ICCollNode18535); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_ICCollNode18539);\n            v=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            k=this.match(this.input,CHECK,XQueryParser.FOLLOW_CHECK_in_p_ICCollNode18545); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ExprSingle_in_p_ICCollNode18549);\n            p_ExprSingle830=this.p_ExprSingle(true);\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ExprSingle830.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICForeignKey_return: (function() {\n        XQueryParser.p_ICForeignKey_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICForeignKey_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2282:1: p_ICForeignKey : k= FOREIGN k= KEY p_ICForeignKeySource p_ICForeignKeyTarget ;\n    // $ANTLR start \"p_ICForeignKey\"\n    p_ICForeignKey: function() {\n        var retval = new XQueryParser.p_ICForeignKey_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_ICForeignKeySource831 = null;\n         var p_ICForeignKeyTarget832 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2283:9: (k= FOREIGN k= KEY p_ICForeignKeySource p_ICForeignKeyTarget )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2283:11: k= FOREIGN k= KEY p_ICForeignKeySource p_ICForeignKeyTarget\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,FOREIGN,XQueryParser.FOLLOW_FOREIGN_in_p_ICForeignKey18577); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            k=this.match(this.input,KEY,XQueryParser.FOLLOW_KEY_in_p_ICForeignKey18583); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ICForeignKeySource_in_p_ICForeignKey18587);\n            p_ICForeignKeySource831=this.p_ICForeignKeySource();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICForeignKeySource831.getTree());\n            this.pushFollow(XQueryParser.FOLLOW_p_ICForeignKeyTarget_in_p_ICForeignKey18589);\n            p_ICForeignKeyTarget832=this.p_ICForeignKeyTarget();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICForeignKeyTarget832.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICForeignKeySource_return: (function() {\n        XQueryParser.p_ICForeignKeySource_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICForeignKeySource_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2286:1: p_ICForeignKeySource : k= FROM p_ICForeignKeyValues ;\n    // $ANTLR start \"p_ICForeignKeySource\"\n    p_ICForeignKeySource: function() {\n        var retval = new XQueryParser.p_ICForeignKeySource_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_ICForeignKeyValues833 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2287:9: (k= FROM p_ICForeignKeyValues )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2287:11: k= FROM p_ICForeignKeyValues\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,FROM,XQueryParser.FOLLOW_FROM_in_p_ICForeignKeySource18616); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ICForeignKeyValues_in_p_ICForeignKeySource18620);\n            p_ICForeignKeyValues833=this.p_ICForeignKeyValues();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICForeignKeyValues833.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICForeignKeyTarget_return: (function() {\n        XQueryParser.p_ICForeignKeyTarget_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICForeignKeyTarget_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2290:1: p_ICForeignKeyTarget : k= TO p_ICForeignKeyValues ;\n    // $ANTLR start \"p_ICForeignKeyTarget\"\n    p_ICForeignKeyTarget: function() {\n        var retval = new XQueryParser.p_ICForeignKeyTarget_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n         var p_ICForeignKeyValues834 = null;\n\n        var k_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2291:9: (k= TO p_ICForeignKeyValues )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2291:11: k= TO p_ICForeignKeyValues\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,TO,XQueryParser.FOLLOW_TO_in_p_ICForeignKeyTarget18647); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_ICForeignKeyValues_in_p_ICForeignKeyTarget18651);\n            p_ICForeignKeyValues834=this.p_ICForeignKeyValues();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_ICForeignKeyValues834.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // inline static return class\n    p_ICForeignKeyValues_return: (function() {\n        XQueryParser.p_ICForeignKeyValues_return = function(){};\n        org.antlr.lang.extend(XQueryParser.p_ICForeignKeyValues_return,\n                          org.antlr.runtime.ParserRuleReturnScope,\n        {\n            getTree: function() { return this.tree; }\n        });\n        return;\n    })(),\n\n    // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2294:1: p_ICForeignKeyValues : k= COLLECTION p_QName k= NODE d= DOLLAR v= p_QName k= KEY p_PathExpr ;\n    // $ANTLR start \"p_ICForeignKeyValues\"\n    p_ICForeignKeyValues: function() {\n        var retval = new XQueryParser.p_ICForeignKeyValues_return();\n        retval.start = this.input.LT(1);\n\n        var root_0 = null;\n\n        var k = null;\n        var d = null;\n         var v = null;\n         var p_QName835 = null;\n         var p_PathExpr836 = null;\n\n        var k_tree=null;\n        var d_tree=null;\n\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2295:9: (k= COLLECTION p_QName k= NODE d= DOLLAR v= p_QName k= KEY p_PathExpr )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2295:11: k= COLLECTION p_QName k= NODE d= DOLLAR v= p_QName k= KEY p_PathExpr\n            root_0 = this.adaptor.nil();\n\n            k=this.match(this.input,COLLECTION,XQueryParser.FOLLOW_COLLECTION_in_p_ICForeignKeyValues18678); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_ICForeignKeyValues18682);\n            p_QName835=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_QName835.getTree());\n            k=this.match(this.input,NODE,XQueryParser.FOLLOW_NODE_in_p_ICForeignKeyValues18686); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            d=this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_p_ICForeignKeyValues18692); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            d_tree = this.adaptor.create(d);\n            this.adaptor.addChild(root_0, d_tree);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_QName_in_p_ICForeignKeyValues18696);\n            v=this.p_QName();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, v.getTree());\n            if ( this.state.backtracking===0 ) {\n               this.av(d, (v?v.stop:null)); \n            }\n            k=this.match(this.input,KEY,XQueryParser.FOLLOW_KEY_in_p_ICForeignKeyValues18702); if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) {\n            k_tree = this.adaptor.create(k);\n            this.adaptor.addChild(root_0, k_tree);\n            }\n            if ( this.state.backtracking===0 ) {\n              this.ak(k);\n            }\n            this.pushFollow(XQueryParser.FOLLOW_p_PathExpr_in_p_ICForeignKeyValues18706);\n            p_PathExpr836=this.p_PathExpr();\n\n            this.state._fsp--;\n            if (this.state.failed) return retval;\n            if ( this.state.backtracking===0 ) this.adaptor.addChild(root_0, p_PathExpr836.getTree());\n\n\n\n            retval.stop = this.input.LT(-1);\n\n            if ( this.state.backtracking===0 ) {\n\n            retval.tree = this.adaptor.rulePostProcessing(root_0);\n            this.adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);\n            }\n        }\n        catch (re) {\n            if (re instanceof org.antlr.runtime.RecognitionException) {\n                this.reportError(re);\n                this.recover(this.input,re);\n                retval.tree = this.adaptor.errorNode(this.input, retval.start, this.input.LT(-1), re);\n            } else {\n                throw re;\n            }\n        }\n        finally {\n        }\n        return retval;\n    },\n\n    // $ANTLR start \"synpred1_XQueryParser\"\n    synpred1_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:11: ( ( ( FOR | LET ) DOLLAR ) | ( FOR ( TUMBLING | SLIDING ) ) )\n        var alt274=2;\n        var LA274_0 = this.input.LA(1);\n\n        if ( (LA274_0==FOR) ) {\n            var LA274_1 = this.input.LA(2);\n\n            if ( (LA274_1==DOLLAR) ) {\n                alt274=1;\n            }\n            else if ( (LA274_1==SLIDING||LA274_1==TUMBLING) ) {\n                alt274=2;\n            }\n            else {\n                if (this.state.backtracking>0) {this.state.failed=true; return ;}\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 274, 1, this.input);\n\n                throw nvae;\n            }\n        }\n        else if ( (LA274_0==LET) ) {\n            alt274=1;\n        }\n        else {\n            if (this.state.backtracking>0) {this.state.failed=true; return ;}\n            var nvae =\n                new org.antlr.runtime.NoViableAltException(\"\", 274, 0, this.input);\n\n            throw nvae;\n        }\n        switch (alt274) {\n            case 1 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:12: ( ( FOR | LET ) DOLLAR )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:12: ( ( FOR | LET ) DOLLAR )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:13: ( FOR | LET ) DOLLAR\n                if ( this.input.LA(1)==FOR||this.input.LA(1)==LET ) {\n                    this.input.consume();\n                    this.state.errorRecovery=false;this.state.failed=false;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return ;}\n                    var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                    throw mse;\n                }\n\n                this.match(this.input,DOLLAR,XQueryParser.FOLLOW_DOLLAR_in_synpred1_XQueryParser3539); if (this.state.failed) return ;\n\n\n\n\n\n                break;\n            case 2 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:35: ( FOR ( TUMBLING | SLIDING ) )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:35: ( FOR ( TUMBLING | SLIDING ) )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:571:36: FOR ( TUMBLING | SLIDING )\n                this.match(this.input,FOR,XQueryParser.FOLLOW_FOR_in_synpred1_XQueryParser3545); if (this.state.failed) return ;\n                if ( this.input.LA(1)==SLIDING||this.input.LA(1)==TUMBLING ) {\n                    this.input.consume();\n                    this.state.errorRecovery=false;this.state.failed=false;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return ;}\n                    var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                    throw mse;\n                }\n\n\n\n\n\n\n                break;\n\n        }},\n    // $ANTLR end \"synpred1_XQueryParser\",\n\n    // $ANTLR start \"synpred2_XQueryParser\"\n    synpred2_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:572:11: ( IF LPAREN )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:572:12: IF LPAREN\n        this.match(this.input,IF,XQueryParser.FOLLOW_IF_in_synpred2_XQueryParser3573); if (this.state.failed) return ;\n        this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_synpred2_XQueryParser3575); if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred2_XQueryParser\",\n\n    // $ANTLR start \"synpred3_XQueryParser\"\n    synpred3_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:573:11: ( SWITCH LPAREN )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:573:12: SWITCH LPAREN\n        this.match(this.input,SWITCH,XQueryParser.FOLLOW_SWITCH_in_synpred3_XQueryParser3603); if (this.state.failed) return ;\n        this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_synpred3_XQueryParser3605); if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred3_XQueryParser\",\n\n    // $ANTLR start \"synpred4_XQueryParser\"\n    synpred4_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:574:11: ( TYPESWITCH LPAREN )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:574:12: TYPESWITCH LPAREN\n        this.match(this.input,TYPESWITCH,XQueryParser.FOLLOW_TYPESWITCH_in_synpred4_XQueryParser3629); if (this.state.failed) return ;\n        this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_synpred4_XQueryParser3631); if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred4_XQueryParser\",\n\n    // $ANTLR start \"synpred5_XQueryParser\"\n    synpred5_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:575:11: ( TRY LBRACKET )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:575:12: TRY LBRACKET\n        this.match(this.input,TRY,XQueryParser.FOLLOW_TRY_in_synpred5_XQueryParser3651); if (this.state.failed) return ;\n        this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_synpred5_XQueryParser3653); if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred5_XQueryParser\",\n\n    // $ANTLR start \"synpred6_XQueryParser\"\n    synpred6_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:864:11: ( VALIDATE ( p_ValidationMode | TYPE )? )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:864:12: VALIDATE ( p_ValidationMode | TYPE )?\n        this.match(this.input,VALIDATE,XQueryParser.FOLLOW_VALIDATE_in_synpred6_XQueryParser6204); if (this.state.failed) return ;\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:864:21: ( p_ValidationMode | TYPE )?\n        var alt275=3;\n        var LA275_0 = this.input.LA(1);\n\n        if ( (LA275_0==LAX||LA275_0==STRICT) ) {\n            alt275=1;\n        }\n        else if ( (LA275_0==TYPE) ) {\n            alt275=2;\n        }\n        switch (alt275) {\n            case 1 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:864:23: p_ValidationMode\n                this.pushFollow(XQueryParser.FOLLOW_p_ValidationMode_in_synpred6_XQueryParser6208);\n                this.p_ValidationMode();\n\n                this.state._fsp--;\n                if (this.state.failed) return ;\n\n\n                break;\n            case 2 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:864:42: TYPE\n                this.match(this.input,TYPE,XQueryParser.FOLLOW_TYPE_in_synpred6_XQueryParser6212); if (this.state.failed) return ;\n\n\n                break;\n\n        }\n\n\n\n    },\n    // $ANTLR end \"synpred6_XQueryParser\",\n\n    // $ANTLR start \"synpred7_XQueryParser\"\n    synpred7_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:913:11: ( SLASH p_RelativePathExpr )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:913:12: SLASH p_RelativePathExpr\n        this.match(this.input,SLASH,XQueryParser.FOLLOW_SLASH_in_synpred7_XQueryParser6600); if (this.state.failed) return ;\n        this.pushFollow(XQueryParser.FOLLOW_p_RelativePathExpr_in_synpred7_XQueryParser6602);\n        this.p_RelativePathExpr();\n\n        this.state._fsp--;\n        if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred7_XQueryParser\",\n\n    // $ANTLR start \"synpred8_XQueryParser\"\n    synpred8_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:926:11: ( LBRACKET | LPAREN | SMALLER | QUOT | APOS | DOLLAR )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:\n        if ( this.input.LA(1)==LPAREN||this.input.LA(1)==DOLLAR||this.input.LA(1)==LBRACKET||this.input.LA(1)==SMALLER||(this.input.LA(1)>=APOS && this.input.LA(1)<=QUOT) ) {\n            this.input.consume();\n            this.state.errorRecovery=false;this.state.failed=false;\n        }\n        else {\n            if (this.state.backtracking>0) {this.state.failed=true; return ;}\n            var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n            throw mse;\n        }\n\n\n\n    },\n    // $ANTLR end \"synpred8_XQueryParser\",\n\n    // $ANTLR start \"synpred9_XQueryParser\"\n    synpred9_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:927:11: ( ( ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET ) | ( ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET ) | ( ( DOCUMENT | TEXT | COMMENT ) LBRACKET ) )\n        var alt278=3;\n        switch ( this.input.LA(1) ) {\n        case ATTRIBUTE:\n        case ELEMENT:\n            alt278=1;\n            break;\n        case NAMESPACE:\n        case PROCESSING_INSTRUCTION:\n            alt278=2;\n            break;\n        case COMMENT:\n        case DOCUMENT:\n        case TEXT:\n            alt278=3;\n            break;\n        default:\n            if (this.state.backtracking>0) {this.state.failed=true; return ;}\n            var nvae =\n                new org.antlr.runtime.NoViableAltException(\"\", 278, 0, this.input);\n\n            throw nvae;\n        }\n\n        switch (alt278) {\n            case 1 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:928:13: ( ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:928:13: ( ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:928:14: ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET\n                if ( this.input.LA(1)==ATTRIBUTE||this.input.LA(1)==ELEMENT ) {\n                    this.input.consume();\n                    this.state.errorRecovery=false;this.state.failed=false;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return ;}\n                    var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                    throw mse;\n                }\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:928:36: ( p_EQName )?\n                var alt276=2;\n                var LA276_0 = this.input.LA(1);\n\n                if ( ((LA276_0>=ANCESTOR && LA276_0<=SKIP)||(LA276_0>=VALUE && LA276_0<=QUOT_ER)||LA276_0==Q||LA276_0==L_NCName) ) {\n                    alt276=1;\n                }\n                switch (alt276) {\n                    case 1 :\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:928:36: p_EQName\n                        this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_synpred9_XQueryParser6777);\n                        this.p_EQName();\n\n                        this.state._fsp--;\n                        if (this.state.failed) return ;\n\n\n                        break;\n\n                }\n\n                this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_synpred9_XQueryParser6780); if (this.state.failed) return ;\n\n\n\n\n\n                break;\n            case 2 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:929:13: ( ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:929:13: ( ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:929:14: ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET\n                if ( this.input.LA(1)==NAMESPACE||this.input.LA(1)==PROCESSING_INSTRUCTION ) {\n                    this.input.consume();\n                    this.state.errorRecovery=false;this.state.failed=false;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return ;}\n                    var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                    throw mse;\n                }\n\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:929:51: ( p_NCName )?\n                var alt277=2;\n                var LA277_0 = this.input.LA(1);\n\n                if ( ((LA277_0>=ANCESTOR && LA277_0<=SKIP)||(LA277_0>=VALUE && LA277_0<=QUOT_ER)||LA277_0==L_NCName) ) {\n                    alt277=1;\n                }\n                switch (alt277) {\n                    case 1 :\n                        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:929:51: p_NCName\n                        this.pushFollow(XQueryParser.FOLLOW_p_NCName_in_synpred9_XQueryParser6806);\n                        this.p_NCName();\n\n                        this.state._fsp--;\n                        if (this.state.failed) return ;\n\n\n                        break;\n\n                }\n\n                this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_synpred9_XQueryParser6809); if (this.state.failed) return ;\n\n\n\n\n\n                break;\n            case 3 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:930:13: ( ( DOCUMENT | TEXT | COMMENT ) LBRACKET )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:930:13: ( ( DOCUMENT | TEXT | COMMENT ) LBRACKET )\n                // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:930:14: ( DOCUMENT | TEXT | COMMENT ) LBRACKET\n                if ( this.input.LA(1)==COMMENT||this.input.LA(1)==DOCUMENT||this.input.LA(1)==TEXT ) {\n                    this.input.consume();\n                    this.state.errorRecovery=false;this.state.failed=false;\n                }\n                else {\n                    if (this.state.backtracking>0) {this.state.failed=true; return ;}\n                    var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                    throw mse;\n                }\n\n                this.match(this.input,LBRACKET,XQueryParser.FOLLOW_LBRACKET_in_synpred9_XQueryParser6839); if (this.state.failed) return ;\n\n\n\n\n\n                break;\n\n        }},\n    // $ANTLR end \"synpred9_XQueryParser\",\n\n    // $ANTLR start \"synpred10_XQueryParser\"\n    synpred10_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:932:11: ( p_KindTest )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:932:12: p_KindTest\n        this.pushFollow(XQueryParser.FOLLOW_p_KindTest_in_synpred10_XQueryParser6869);\n        this.p_KindTest();\n\n        this.state._fsp--;\n        if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred10_XQueryParser\",\n\n    // $ANTLR start \"synpred11_XQueryParser\"\n    synpred11_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:933:11: ( p_EQName LPAREN )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:933:12: p_EQName LPAREN\n        this.pushFollow(XQueryParser.FOLLOW_p_EQName_in_synpred11_XQueryParser6888);\n        this.p_EQName();\n\n        this.state._fsp--;\n        if (this.state.failed) return ;\n        this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_synpred11_XQueryParser6890); if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred11_XQueryParser\",\n\n    // $ANTLR start \"synpred12_XQueryParser\"\n    synpred12_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:934:11: ( p_PrimaryExpr )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:934:12: p_PrimaryExpr\n        this.pushFollow(XQueryParser.FOLLOW_p_PrimaryExpr_in_synpred12_XQueryParser6908);\n        this.p_PrimaryExpr();\n\n        this.state._fsp--;\n        if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred12_XQueryParser\",\n\n    // $ANTLR start \"synpred13_XQueryParser\"\n    synpred13_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1029:11: ( LPAREN )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1029:12: LPAREN\n        this.match(this.input,LPAREN,XQueryParser.FOLLOW_LPAREN_in_synpred13_XQueryParser7593); if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred13_XQueryParser\",\n\n    // $ANTLR start \"synpred14_XQueryParser\"\n    synpred14_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1327:26: ( p_OccurrenceIndicator )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:1327:27: p_OccurrenceIndicator\n        this.pushFollow(XQueryParser.FOLLOW_p_OccurrenceIndicator_in_synpred14_XQueryParser9871);\n        this.p_OccurrenceIndicator();\n\n        this.state._fsp--;\n        if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred14_XQueryParser\",\n\n    // $ANTLR start \"synpred15_XQueryParser\"\n    synpred15_XQueryParser_fragment: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:44: ( p_OccurrenceIndicator )\n        // /Users/wcandillon/28msec/xquery.js/xquery/XQueryParser.g:2227:45: p_OccurrenceIndicator\n        this.pushFollow(XQueryParser.FOLLOW_p_OccurrenceIndicator_in_synpred15_XQueryParser18037);\n        this.p_OccurrenceIndicator();\n\n        this.state._fsp--;\n        if (this.state.failed) return ;\n\n\n    },\n    // $ANTLR end \"synpred15_XQueryParser\"\n\n    // Delegated rules\n\n\n\n    synpred3_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred3_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred15_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred15_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred7_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred7_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred9_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred9_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred10_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred10_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred5_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred5_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred12_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred12_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred14_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred14_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred6_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred6_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred8_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred8_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred4_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred4_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred11_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred11_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred13_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred13_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred1_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred1_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    },\n    synpred2_XQueryParser: function() {\n        this.state.backtracking++;\n        var start = this.input.mark();\n        try {\n            this.synpred2_XQueryParser_fragment(); // can never throw exception\n        } catch (re) {\n            alert(\"impossible: \"+re.toString());\n        }\n        var success = !this.state.failed;\n        this.input.rewind(start);\n        this.state.backtracking--;\n        this.state.failed=false;\n        return success;\n    }\n\n}, true); // important to pass true to overwrite default implementations\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA1_eotS:\n        \"\\u000a\\uffff\",\n    DFA1_eofS:\n        \"\\u0001\\u0005\\u0001\\u0009\\u0008\\uffff\",\n    DFA1_minS:\n        \"\\u0001\\u0010\\u0001\\u0012\\u0008\\uffff\",\n    DFA1_maxS:\n        \"\\u0001\\u0122\\u0001\\u0107\\u0008\\uffff\",\n    DFA1_acceptS:\n        \"\\u0002\\uffff\\u0004\\u0002\\u0001\\u0001\\u0003\\u0002\",\n    DFA1_specialS:\n        \"\\u0001\\u0000\\u0001\\u0001\\u0008\\uffff}>\",\n    DFA1_transitionS: [\n            \"\\u0002\\u0002\\u0004\\u0004\\u0001\\u0002\\u0006\\u0004\\u0001\\u0002\"+\n            \"\\u0001\\u0004\\u0001\\u0002\\u0002\\u0004\\u0001\\u0002\\u0001\\u0004\"+\n            \"\\u0002\\u0002\\u0002\\u0004\\u0003\\u0002\\u0005\\u0004\\u0001\\u0002\"+\n            \"\\u0002\\u0004\\u0003\\u0002\\u0005\\u0004\\u0002\\u0002\\u0009\\u0004\"+\n            \"\\u0001\\u0002\\u0002\\u0004\\u0002\\u0002\\u0003\\u0004\\u0001\\u0002\"+\n            \"\\u0005\\u0004\\u0001\\u0002\\u0001\\u0004\\u0003\\u0002\\u0001\\u0004\"+\n            \"\\u0001\\u0002\\u0007\\u0004\\u0004\\u0002\\u0003\\u0004\\u0001\\u0002\"+\n            \"\\u0003\\u0004\\u0001\\u0002\\u0001\\u0004\\u0003\\u0002\\u0002\\u0004\"+\n            \"\\u0001\\u0001\\u000c\\u0004\\u0001\\u0002\\u0009\\u0004\\u0002\\u0002\"+\n            \"\\u0007\\u0004\\u0002\\u0002\\u0001\\u0004\\u0001\\u0002\\u0002\\u0004\"+\n            \"\\u0001\\u0002\\u0003\\u0004\\u0002\\u0002\\u0002\\u0004\\u0001\\u0002\"+\n            \"\\u002c\\u0004\\u0003\\u0002\\u0002\\u0004\\u0001\\u0002\\u000d\\u0004\"+\n            \"\\u0001\\uffff\\u0001\\u0002\\u0001\\uffff\\u0002\\u0002\\u0001\\uffff\"+\n            \"\\u0001\\u0002\\u0001\\uffff\\u0001\\u0002\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0004\\u0002\\u0005\\uffff\\u0002\\u0002\\u0001\\uffff\"+\n            \"\\u0002\\u0002\\u000c\\uffff\\u0002\\u0002\\u0002\\uffff\\u0002\\u0002\"+\n            \"\\u0002\\uffff\\u0001\\u0004\\u0006\\uffff\\u0006\\u0002\",\n            \"\\u0001\\u0007\\u0008\\uffff\\u0002\\u0007\\u000a\\uffff\\u0001\\u0007\"+\n            \"\\u0006\\uffff\\u0001\\u0006\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0005\\uffff\\u0001\\u0007\\u0001\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\\u0001\\u0007\\u0018\\uffff\"+\n            \"\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0003\\uffff\\u0001\\u0006\"+\n            \"\\u0034\\uffff\\u0001\\u0007\\u003a\\uffff\\u0002\\u0007\\u0006\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u000c\\u0007\\u0002\\uffff\\u0001\\u0007\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\u0007\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA1_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA1_eotS),\n    DFA1_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA1_eofS),\n    DFA1_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA1_minS),\n    DFA1_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA1_maxS),\n    DFA1_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA1_acceptS),\n    DFA1_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA1_specialS),\n    DFA1_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA1_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA1_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA1 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 1;\n    this.eot = XQueryParser.DFA1_eot;\n    this.eof = XQueryParser.DFA1_eof;\n    this.min = XQueryParser.DFA1_min;\n    this.max = XQueryParser.DFA1_max;\n    this.accept = XQueryParser.DFA1_accept;\n    this.special = XQueryParser.DFA1_special;\n    this.transition = XQueryParser.DFA1_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA1, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"293:13: (vd= p_VersionDecl )?\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA1_0 = input.LA(1);\n\n                             \n                            var index1_0 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA1_0==XQUERY) ) {s = 1;}\n\n                            else if ( ((LA1_0>=ANCESTOR && LA1_0<=ANCESTOR_OR_SELF)||LA1_0==ATTRIBUTE||LA1_0==CHILD||LA1_0==COMMENT||LA1_0==DECLARE||(LA1_0>=DESCENDANT && LA1_0<=DESCENDANT_OR_SELF)||(LA1_0>=DOCUMENT && LA1_0<=ELEMENT)||LA1_0==EVERY||(LA1_0>=FOLLOWING && LA1_0<=FOR)||(LA1_0>=IF && LA1_0<=IMPORT)||LA1_0==LET||(LA1_0>=MODULE && LA1_0<=NAMESPACE)||LA1_0==NODE||LA1_0==ORDERED||(LA1_0>=PARENT && LA1_0<=PRECEDING_SIBLING)||LA1_0==PROCESSING_INSTRUCTION||(LA1_0>=SCHEMA_ATTRIBUTE && LA1_0<=SOME)||LA1_0==TEXT||LA1_0==TYPESWITCH||(LA1_0>=UNORDERED && LA1_0<=VARIABLE)||LA1_0==NAMESPACE_NODE||(LA1_0>=SWITCH && LA1_0<=TRY)||(LA1_0>=COPY && LA1_0<=DELETE)||LA1_0==INSERT||LA1_0==APPEND||(LA1_0>=RENAME && LA1_0<=REPLACE)||LA1_0==UPDATING||(LA1_0>=BREAK && LA1_0<=EXIT)||LA1_0==WHILE||LA1_0==LPAREN||(LA1_0>=DOLLAR && LA1_0<=L_UNION_BRACKET)||LA1_0==LBRACKET||LA1_0==LSQUARE||(LA1_0>=STAR && LA1_0<=SMALLER)||(LA1_0>=SLASH && LA1_0<=SLASH_SLASH)||(LA1_0>=DOT && LA1_0<=DOT_DOT)||(LA1_0>=ATTR_SIGN && LA1_0<=Q)||(LA1_0>=APOS && LA1_0<=QUOT)||(LA1_0>=L_Pragma && LA1_0<=L_DoubleLiteral)) ) {s = 2;}\n\n                            else if ( (LA1_0==ANN_PERCENT) && ((this.lc(XQS)))) {s = 3;}\n\n                            else if ( ((LA1_0>=AND && LA1_0<=AT)||(LA1_0>=BASE_URI && LA1_0<=CASTABLE)||LA1_0==COLLATION||(LA1_0>=CONSTRUCTION && LA1_0<=COPY_NAMESPACES)||LA1_0==DEFAULT||(LA1_0>=DESCENDING && LA1_0<=DIV)||(LA1_0>=ELSE && LA1_0<=EQ)||(LA1_0>=EXCEPT && LA1_0<=EXTERNAL)||(LA1_0>=FUNCTION && LA1_0<=IDIV)||(LA1_0>=IN && LA1_0<=LEAST)||(LA1_0>=LT && LA1_0<=MOD)||(LA1_0>=NE && LA1_0<=NO_PRESERVE)||(LA1_0>=JSON && LA1_0<=ORDER)||LA1_0==ORDERING||LA1_0==PRESERVE||(LA1_0>=STRUCTURED_ITEM && LA1_0<=SCHEMA)||(LA1_0>=STABLE && LA1_0<=STRIP)||(LA1_0>=THEN && LA1_0<=TREAT)||LA1_0==UNION||(LA1_0>=VERSION && LA1_0<=WHERE)||(LA1_0>=ALLOWING && LA1_0<=MINUS_SIGN)||(LA1_0>=NAN && LA1_0<=START)||(LA1_0>=TUMBLING && LA1_0<=BEFORE)||LA1_0==FIRST||(LA1_0>=INTO && LA1_0<=POSITION)||(LA1_0>=LAST && LA1_0<=NODES)||(LA1_0>=REVALIDATION && LA1_0<=SKIP)||(LA1_0>=VALUE && LA1_0<=WORDS)||(LA1_0>=LOOP && LA1_0<=RETURNING)||(LA1_0>=CHECK && LA1_0<=QUOT_ER)||LA1_0==L_NCName) ) {s = 4;}\n\n                            else if ( (LA1_0==EOF) && ((this.lc(XQS)))) {s = 5;}\n\n                             \n                            input.seek(index1_0);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA1_1 = input.LA(1);\n\n                             \n                            var index1_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA1_1==ENCODING||LA1_1==VERSION) ) {s = 6;}\n\n                            else if ( (LA1_1==AND||(LA1_1>=CAST && LA1_1<=CASTABLE)||LA1_1==DIV||LA1_1==EQ||LA1_1==EXCEPT||LA1_1==GE||(LA1_1>=GT && LA1_1<=IDIV)||(LA1_1>=INSTANCE && LA1_1<=IS)||LA1_1==LE||(LA1_1>=LT && LA1_1<=MOD)||LA1_1==NE||LA1_1==OR||(LA1_1>=TO && LA1_1<=TREAT)||LA1_1==UNION||LA1_1==CONTAINS||(LA1_1>=CONCAT && LA1_1<=LPAREN)||LA1_1==LSQUARE||LA1_1==EQUAL||LA1_1==NOTEQUAL||LA1_1==HASH||LA1_1==COMMA||(LA1_1>=STAR && LA1_1<=BANG)||LA1_1==COLON||LA1_1==VBAR) ) {s = 7;}\n\n                            else if ( (LA1_1==SEMICOLON) && ((this.lc(XQS)))) {s = 8;}\n\n                            else if ( (LA1_1==EOF) ) {s = 9;}\n\n                             \n                            input.seek(index1_1);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 1, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA2_eotS:\n        \"\\u000a\\uffff\",\n    DFA2_eofS:\n        \"\\u0001\\u0005\\u0001\\u0009\\u0008\\uffff\",\n    DFA2_minS:\n        \"\\u0001\\u0010\\u0001\\u0012\\u0008\\uffff\",\n    DFA2_maxS:\n        \"\\u0001\\u0122\\u0001\\u0107\\u0008\\uffff\",\n    DFA2_acceptS:\n        \"\\u0002\\uffff\\u0004\\u0002\\u0001\\u0001\\u0003\\u0002\",\n    DFA2_specialS:\n        \"\\u0001\\u0001\\u0001\\u0000\\u0008\\uffff}>\",\n    DFA2_transitionS: [\n            \"\\u0002\\u0002\\u0004\\u0004\\u0001\\u0002\\u0006\\u0004\\u0001\\u0002\"+\n            \"\\u0001\\u0004\\u0001\\u0002\\u0002\\u0004\\u0001\\u0002\\u0001\\u0004\"+\n            \"\\u0002\\u0002\\u0002\\u0004\\u0003\\u0002\\u0005\\u0004\\u0001\\u0002\"+\n            \"\\u0002\\u0004\\u0003\\u0002\\u0005\\u0004\\u0002\\u0002\\u0009\\u0004\"+\n            \"\\u0001\\u0002\\u0002\\u0004\\u0001\\u0001\\u0001\\u0002\\u0003\\u0004\"+\n            \"\\u0001\\u0002\\u0005\\u0004\\u0001\\u0002\\u0001\\u0004\\u0003\\u0002\"+\n            \"\\u0001\\u0004\\u0001\\u0002\\u0007\\u0004\\u0004\\u0002\\u0003\\u0004\"+\n            \"\\u0001\\u0002\\u0003\\u0004\\u0001\\u0002\\u0001\\u0004\\u0003\\u0002\"+\n            \"\\u000f\\u0004\\u0001\\u0002\\u0009\\u0004\\u0002\\u0002\\u0007\\u0004\"+\n            \"\\u0002\\u0002\\u0001\\u0004\\u0001\\u0002\\u0002\\u0004\\u0001\\u0002\"+\n            \"\\u0003\\u0004\\u0002\\u0002\\u0002\\u0004\\u0001\\u0002\\u002c\\u0004\"+\n            \"\\u0003\\u0002\\u0002\\u0004\\u0001\\u0002\\u000d\\u0004\\u0001\\uffff\"+\n            \"\\u0001\\u0002\\u0001\\uffff\\u0002\\u0002\\u0001\\uffff\\u0001\\u0002\"+\n            \"\\u0001\\uffff\\u0001\\u0002\\u0004\\uffff\\u0001\\u0003\\u0004\\uffff\"+\n            \"\\u0004\\u0002\\u0005\\uffff\\u0002\\u0002\\u0001\\uffff\\u0002\\u0002\"+\n            \"\\u000c\\uffff\\u0002\\u0002\\u0002\\uffff\\u0002\\u0002\\u0002\\uffff\"+\n            \"\\u0001\\u0004\\u0006\\uffff\\u0006\\u0002\",\n            \"\\u0001\\u0007\\u0008\\uffff\\u0002\\u0007\\u000a\\uffff\\u0001\\u0007\"+\n            \"\\u0007\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0005\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0002\\u0007\\u0004\\uffff\\u0003\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\\u0001\\uffff\"+\n            \"\\u0001\\u0006\\u0001\\u0007\\u0006\\uffff\\u0001\\u0007\\u0018\\uffff\"+\n            \"\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0038\\uffff\\u0001\\u0007\"+\n            \"\\u003a\\uffff\\u0002\\u0007\\u0006\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u000c\\u0007\\u0002\\uffff\"+\n            \"\\u0001\\u0007\\u0003\\uffff\\u0001\\u0008\\u0001\\u0007\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA2_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA2_eotS),\n    DFA2_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA2_eofS),\n    DFA2_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA2_minS),\n    DFA2_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA2_maxS),\n    DFA2_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA2_acceptS),\n    DFA2_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA2_specialS),\n    DFA2_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA2_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA2_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA2 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 2;\n    this.eot = XQueryParser.DFA2_eot;\n    this.eof = XQueryParser.DFA2_eof;\n    this.min = XQueryParser.DFA2_min;\n    this.max = XQueryParser.DFA2_max;\n    this.accept = XQueryParser.DFA2_accept;\n    this.special = XQueryParser.DFA2_special;\n    this.transition = XQueryParser.DFA2_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA2, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"294:13: (lm= p_LibraryModule[$vd.tree] -> | mm= p_MainModule[$vd.tree] ->)\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA2_1 = input.LA(1);\n\n                             \n                            var index2_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA2_1==NAMESPACE) ) {s = 6;}\n\n                            else if ( (LA2_1==AND||(LA2_1>=CAST && LA2_1<=CASTABLE)||LA2_1==DIV||LA2_1==EQ||LA2_1==EXCEPT||LA2_1==GE||(LA2_1>=GT && LA2_1<=IDIV)||(LA2_1>=INSTANCE && LA2_1<=IS)||LA2_1==LE||(LA2_1>=LT && LA2_1<=MOD)||LA2_1==NE||LA2_1==OR||(LA2_1>=TO && LA2_1<=TREAT)||LA2_1==UNION||LA2_1==CONTAINS||(LA2_1>=CONCAT && LA2_1<=LPAREN)||LA2_1==LSQUARE||LA2_1==EQUAL||LA2_1==NOTEQUAL||LA2_1==HASH||LA2_1==COMMA||(LA2_1>=STAR && LA2_1<=BANG)||LA2_1==COLON||LA2_1==VBAR) ) {s = 7;}\n\n                            else if ( (LA2_1==SEMICOLON) && ((this.lc(XQS)))) {s = 8;}\n\n                            else if ( (LA2_1==EOF) ) {s = 9;}\n\n                             \n                            input.seek(index2_1);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA2_0 = input.LA(1);\n\n                             \n                            var index2_0 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA2_0==MODULE) ) {s = 1;}\n\n                            else if ( ((LA2_0>=ANCESTOR && LA2_0<=ANCESTOR_OR_SELF)||LA2_0==ATTRIBUTE||LA2_0==CHILD||LA2_0==COMMENT||LA2_0==DECLARE||(LA2_0>=DESCENDANT && LA2_0<=DESCENDANT_OR_SELF)||(LA2_0>=DOCUMENT && LA2_0<=ELEMENT)||LA2_0==EVERY||(LA2_0>=FOLLOWING && LA2_0<=FOR)||(LA2_0>=IF && LA2_0<=IMPORT)||LA2_0==LET||LA2_0==NAMESPACE||LA2_0==NODE||LA2_0==ORDERED||(LA2_0>=PARENT && LA2_0<=PRECEDING_SIBLING)||LA2_0==PROCESSING_INSTRUCTION||(LA2_0>=SCHEMA_ATTRIBUTE && LA2_0<=SOME)||LA2_0==TEXT||LA2_0==TYPESWITCH||(LA2_0>=UNORDERED && LA2_0<=VARIABLE)||LA2_0==NAMESPACE_NODE||(LA2_0>=SWITCH && LA2_0<=TRY)||(LA2_0>=COPY && LA2_0<=DELETE)||LA2_0==INSERT||LA2_0==APPEND||(LA2_0>=RENAME && LA2_0<=REPLACE)||LA2_0==UPDATING||(LA2_0>=BREAK && LA2_0<=EXIT)||LA2_0==WHILE||LA2_0==LPAREN||(LA2_0>=DOLLAR && LA2_0<=L_UNION_BRACKET)||LA2_0==LBRACKET||LA2_0==LSQUARE||(LA2_0>=STAR && LA2_0<=SMALLER)||(LA2_0>=SLASH && LA2_0<=SLASH_SLASH)||(LA2_0>=DOT && LA2_0<=DOT_DOT)||(LA2_0>=ATTR_SIGN && LA2_0<=Q)||(LA2_0>=APOS && LA2_0<=QUOT)||(LA2_0>=L_Pragma && LA2_0<=L_DoubleLiteral)) ) {s = 2;}\n\n                            else if ( (LA2_0==ANN_PERCENT) && ((this.lc(XQS)))) {s = 3;}\n\n                            else if ( ((LA2_0>=AND && LA2_0<=AT)||(LA2_0>=BASE_URI && LA2_0<=CASTABLE)||LA2_0==COLLATION||(LA2_0>=CONSTRUCTION && LA2_0<=COPY_NAMESPACES)||LA2_0==DEFAULT||(LA2_0>=DESCENDING && LA2_0<=DIV)||(LA2_0>=ELSE && LA2_0<=EQ)||(LA2_0>=EXCEPT && LA2_0<=EXTERNAL)||(LA2_0>=FUNCTION && LA2_0<=IDIV)||(LA2_0>=IN && LA2_0<=LEAST)||(LA2_0>=LT && LA2_0<=MOD)||(LA2_0>=NE && LA2_0<=NO_PRESERVE)||(LA2_0>=JSON && LA2_0<=ORDER)||LA2_0==ORDERING||LA2_0==PRESERVE||(LA2_0>=STRUCTURED_ITEM && LA2_0<=SCHEMA)||(LA2_0>=STABLE && LA2_0<=STRIP)||(LA2_0>=THEN && LA2_0<=TREAT)||LA2_0==UNION||(LA2_0>=VERSION && LA2_0<=MINUS_SIGN)||(LA2_0>=NAN && LA2_0<=START)||(LA2_0>=TUMBLING && LA2_0<=BEFORE)||LA2_0==FIRST||(LA2_0>=INTO && LA2_0<=POSITION)||(LA2_0>=LAST && LA2_0<=NODES)||(LA2_0>=REVALIDATION && LA2_0<=SKIP)||(LA2_0>=VALUE && LA2_0<=WORDS)||(LA2_0>=LOOP && LA2_0<=RETURNING)||(LA2_0>=CHECK && LA2_0<=QUOT_ER)||LA2_0==L_NCName) ) {s = 4;}\n\n                            else if ( (LA2_0==EOF) && ((this.lc(XQS)))) {s = 5;}\n\n                             \n                            input.seek(index2_0);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 2, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA6_eotS:\n        \"\\u000a\\uffff\",\n    DFA6_eofS:\n        \"\\u0001\\u0005\\u0001\\u0009\\u0002\\uffff\\u0001\\u0009\\u0005\\uffff\",\n    DFA6_minS:\n        \"\\u0001\\u0010\\u0001\\u0012\\u0002\\uffff\\u0001\\u0012\\u0005\\uffff\",\n    DFA6_maxS:\n        \"\\u0001\\u0122\\u0001\\u0107\\u0002\\uffff\\u0001\\u0107\\u0005\\uffff\",\n    DFA6_acceptS:\n        \"\\u0002\\uffff\\u0002\\u0002\\u0001\\uffff\\u0001\\u0002\\u0002\\u0001\\u0002\"+\n    \"\\u0002\",\n    DFA6_specialS:\n        \"\\u0001\\u0000\\u0001\\u0002\\u0002\\uffff\\u0001\\u0001\\u0005\\uffff}>\",\n    DFA6_transitionS: [\n            \"\\u0002\\u0002\\u0004\\u0005\\u0001\\u0002\\u0006\\u0005\\u0001\\u0002\"+\n            \"\\u0001\\u0005\\u0001\\u0002\\u0002\\u0005\\u0001\\u0001\\u0001\\u0005\"+\n            \"\\u0002\\u0002\\u0002\\u0005\\u0003\\u0002\\u0005\\u0005\\u0001\\u0002\"+\n            \"\\u0002\\u0005\\u0003\\u0002\\u0005\\u0005\\u0001\\u0002\\u0001\\u0004\"+\n            \"\\u0009\\u0005\\u0001\\u0002\\u0003\\u0005\\u0001\\u0002\\u0003\\u0005\"+\n            \"\\u0001\\u0002\\u0005\\u0005\\u0001\\u0002\\u0001\\u0005\\u0003\\u0002\"+\n            \"\\u0001\\u0005\\u0001\\u0002\\u0007\\u0005\\u0004\\u0002\\u0003\\u0005\"+\n            \"\\u0001\\u0002\\u0003\\u0005\\u0001\\u0002\\u0001\\u0005\\u0003\\u0002\"+\n            \"\\u000f\\u0005\\u0001\\u0002\\u0009\\u0005\\u0002\\u0002\\u0007\\u0005\"+\n            \"\\u0002\\u0002\\u0001\\u0005\\u0001\\u0002\\u0002\\u0005\\u0001\\u0002\"+\n            \"\\u0003\\u0005\\u0002\\u0002\\u0002\\u0005\\u0001\\u0002\\u002c\\u0005\"+\n            \"\\u0003\\u0002\\u0002\\u0005\\u0001\\u0002\\u000d\\u0005\\u0001\\uffff\"+\n            \"\\u0001\\u0002\\u0001\\uffff\\u0002\\u0002\\u0001\\uffff\\u0001\\u0002\"+\n            \"\\u0001\\uffff\\u0001\\u0002\\u0004\\uffff\\u0001\\u0003\\u0004\\uffff\"+\n            \"\\u0004\\u0002\\u0005\\uffff\\u0002\\u0002\\u0001\\uffff\\u0002\\u0002\"+\n            \"\\u000c\\uffff\\u0002\\u0002\\u0002\\uffff\\u0002\\u0002\\u0002\\uffff\"+\n            \"\\u0001\\u0005\\u0006\\uffff\\u0006\\u0002\",\n            \"\\u0001\\u0005\\u0004\\uffff\\u0002\\u0007\\u0002\\uffff\\u0002\\u0005\"+\n            \"\\u0003\\uffff\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0003\\uffff\"+\n            \"\\u0001\\u0005\\u0007\\uffff\\u0001\\u0005\\u0001\\uffff\\u0001\\u0005\"+\n            \"\\u0004\\uffff\\u0002\\u0005\\u0001\\uffff\\u0002\\u0005\\u0004\\uffff\"+\n            \"\\u0003\\u0005\\u0002\\uffff\\u0001\\u0005\\u0002\\uffff\\u0002\\u0005\"+\n            \"\\u0001\\uffff\\u0001\\u0007\\u0001\\u0005\\u0005\\uffff\\u0002\\u0005\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u0015\\uffff\\u0002\\u0005\\u0001\\uffff\"+\n            \"\\u0001\\u0005\\u0002\\uffff\\u0001\\u0005\\u0005\\uffff\\u0001\\u0005\"+\n            \"\\u0001\\uffff\\u0001\\u0007\\u0026\\uffff\\u0001\\u0006\\u0001\\uffff\"+\n            \"\\u0001\\u0005\\u0004\\uffff\\u0001\\u0005\\u0007\\uffff\\u0001\\u0007\"+\n            \"\\u0026\\uffff\\u0001\\u0005\\u0003\\uffff\\u0002\\u0005\\u0006\\uffff\"+\n            \"\\u0002\\u0005\\u0006\\uffff\\u0001\\u0005\\u0001\\uffff\\u0001\\u0005\"+\n            \"\\u0001\\uffff\\u0003\\u0005\\u0001\\uffff\\u0001\\u0005\\u0001\\uffff\"+\n            \"\\u000c\\u0005\\u0002\\uffff\\u0001\\u0005\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\u0005\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0009\\u0008\\uffff\\u0002\\u0009\\u000a\\uffff\\u0001\\u0009\"+\n            \"\\u0007\\uffff\\u0001\\u0009\\u0001\\uffff\\u0001\\u0009\\u0005\\uffff\"+\n            \"\\u0001\\u0009\\u0001\\uffff\\u0002\\u0009\\u0004\\uffff\\u0003\\u0009\"+\n            \"\\u0002\\uffff\\u0001\\u0009\\u0002\\uffff\\u0002\\u0009\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0001\\u0009\\u0006\\uffff\\u0001\\u0009\\u000e\\uffff\"+\n            \"\\u0001\\u0007\\u0009\\uffff\\u0002\\u0009\\u0001\\uffff\\u0001\\u0009\"+\n            \"\\u0038\\uffff\\u0001\\u0009\\u003a\\uffff\\u0002\\u0009\\u0006\\uffff\"+\n            \"\\u0001\\u0009\\u0001\\uffff\\u0001\\u0009\\u0001\\uffff\\u0001\\u0009\"+\n            \"\\u0001\\uffff\\u0001\\u0009\\u0001\\uffff\\u0001\\u0009\\u0001\\uffff\"+\n            \"\\u000c\\u0009\\u0002\\uffff\\u0001\\u0009\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\u0009\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA6_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA6_eotS),\n    DFA6_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA6_eofS),\n    DFA6_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA6_minS),\n    DFA6_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA6_maxS),\n    DFA6_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA6_acceptS),\n    DFA6_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA6_specialS),\n    DFA6_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA6_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA6_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA6 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 6;\n    this.eot = XQueryParser.DFA6_eot;\n    this.eof = XQueryParser.DFA6_eof;\n    this.min = XQueryParser.DFA6_min;\n    this.max = XQueryParser.DFA6_max;\n    this.accept = XQueryParser.DFA6_accept;\n    this.special = XQueryParser.DFA6_special;\n    this.transition = XQueryParser.DFA6_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA6, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"()* loopback of 329:11: ( (dnd+= pm_DefaultNamespaceDecl | s+= p_Setter | nd+= pm_NamespaceDecl | i+= p_Import | fto+= pm_FTOptionDecl ) )*\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA6_0 = input.LA(1);\n\n                             \n                            var index6_0 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA6_0==DECLARE) ) {s = 1;}\n\n                            else if ( ((LA6_0>=ANCESTOR && LA6_0<=ANCESTOR_OR_SELF)||LA6_0==ATTRIBUTE||LA6_0==CHILD||LA6_0==COMMENT||(LA6_0>=DESCENDANT && LA6_0<=DESCENDANT_OR_SELF)||(LA6_0>=DOCUMENT && LA6_0<=ELEMENT)||LA6_0==EVERY||(LA6_0>=FOLLOWING && LA6_0<=FOR)||LA6_0==IF||LA6_0==LET||LA6_0==NAMESPACE||LA6_0==NODE||LA6_0==ORDERED||(LA6_0>=PARENT && LA6_0<=PRECEDING_SIBLING)||LA6_0==PROCESSING_INSTRUCTION||(LA6_0>=SCHEMA_ATTRIBUTE && LA6_0<=SOME)||LA6_0==TEXT||LA6_0==TYPESWITCH||(LA6_0>=UNORDERED && LA6_0<=VARIABLE)||LA6_0==NAMESPACE_NODE||(LA6_0>=SWITCH && LA6_0<=TRY)||(LA6_0>=COPY && LA6_0<=DELETE)||LA6_0==INSERT||LA6_0==APPEND||(LA6_0>=RENAME && LA6_0<=REPLACE)||LA6_0==UPDATING||(LA6_0>=BREAK && LA6_0<=EXIT)||LA6_0==WHILE||LA6_0==LPAREN||(LA6_0>=DOLLAR && LA6_0<=L_UNION_BRACKET)||LA6_0==LBRACKET||LA6_0==LSQUARE||(LA6_0>=STAR && LA6_0<=SMALLER)||(LA6_0>=SLASH && LA6_0<=SLASH_SLASH)||(LA6_0>=DOT && LA6_0<=DOT_DOT)||(LA6_0>=ATTR_SIGN && LA6_0<=Q)||(LA6_0>=APOS && LA6_0<=QUOT)||(LA6_0>=L_Pragma && LA6_0<=L_DoubleLiteral)) ) {s = 2;}\n\n                            else if ( (LA6_0==ANN_PERCENT) && ((this.lc(XQS)))) {s = 3;}\n\n                            else if ( (LA6_0==IMPORT) ) {s = 4;}\n\n                            else if ( (LA6_0==EOF||(LA6_0>=AND && LA6_0<=AT)||(LA6_0>=BASE_URI && LA6_0<=CASTABLE)||LA6_0==COLLATION||(LA6_0>=CONSTRUCTION && LA6_0<=COPY_NAMESPACES)||LA6_0==DEFAULT||(LA6_0>=DESCENDING && LA6_0<=DIV)||(LA6_0>=ELSE && LA6_0<=EQ)||(LA6_0>=EXCEPT && LA6_0<=EXTERNAL)||(LA6_0>=FUNCTION && LA6_0<=IDIV)||(LA6_0>=IN && LA6_0<=LEAST)||(LA6_0>=LT && LA6_0<=MODULE)||(LA6_0>=NE && LA6_0<=NO_PRESERVE)||(LA6_0>=JSON && LA6_0<=ORDER)||LA6_0==ORDERING||LA6_0==PRESERVE||(LA6_0>=STRUCTURED_ITEM && LA6_0<=SCHEMA)||(LA6_0>=STABLE && LA6_0<=STRIP)||(LA6_0>=THEN && LA6_0<=TREAT)||LA6_0==UNION||(LA6_0>=VERSION && LA6_0<=MINUS_SIGN)||(LA6_0>=NAN && LA6_0<=START)||(LA6_0>=TUMBLING && LA6_0<=BEFORE)||LA6_0==FIRST||(LA6_0>=INTO && LA6_0<=POSITION)||(LA6_0>=LAST && LA6_0<=NODES)||(LA6_0>=REVALIDATION && LA6_0<=SKIP)||(LA6_0>=VALUE && LA6_0<=WORDS)||(LA6_0>=LOOP && LA6_0<=RETURNING)||(LA6_0>=CHECK && LA6_0<=QUOT_ER)||LA6_0==L_NCName) ) {s = 5;}\n\n                             \n                            input.seek(index6_0);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA6_4 = input.LA(1);\n\n                             \n                            var index6_4 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA6_4==EOF||LA6_4==AND||(LA6_4>=CAST && LA6_4<=CASTABLE)||LA6_4==DIV||LA6_4==EQ||LA6_4==EXCEPT||LA6_4==GE||(LA6_4>=GT && LA6_4<=IDIV)||(LA6_4>=INSTANCE && LA6_4<=IS)||LA6_4==LE||(LA6_4>=LT && LA6_4<=MOD)||LA6_4==NE||LA6_4==OR||(LA6_4>=TO && LA6_4<=TREAT)||LA6_4==UNION||LA6_4==CONTAINS||(LA6_4>=CONCAT && LA6_4<=LPAREN)||LA6_4==LSQUARE||LA6_4==EQUAL||LA6_4==NOTEQUAL||LA6_4==HASH||LA6_4==COMMA||(LA6_4>=STAR && LA6_4<=BANG)||LA6_4==COLON||LA6_4==VBAR) ) {s = 9;}\n\n                            else if ( (LA6_4==SEMICOLON) && ((this.lc(XQS)))) {s = 8;}\n\n                            else if ( (LA6_4==MODULE||LA6_4==SCHEMA) ) {s = 7;}\n\n                             \n                            input.seek(index6_4);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA6_1 = input.LA(1);\n\n                             \n                            var index6_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA6_1==REVALIDATION) && ((this.lc(XQU)))) {s = 6;}\n\n                            else if ( ((LA6_1>=BASE_URI && LA6_1<=BOUNDARY_SPACE)||(LA6_1>=CONSTRUCTION && LA6_1<=COPY_NAMESPACES)||LA6_1==DEFAULT||LA6_1==NAMESPACE||LA6_1==ORDERING||LA6_1==DECIMAL_FORMAT||LA6_1==FT_OPTION) ) {s = 7;}\n\n                            else if ( (LA6_1==AND||(LA6_1>=CAST && LA6_1<=CASTABLE)||LA6_1==DIV||LA6_1==EQ||LA6_1==EXCEPT||(LA6_1>=FUNCTION && LA6_1<=GE)||(LA6_1>=GT && LA6_1<=IDIV)||(LA6_1>=INSTANCE && LA6_1<=IS)||LA6_1==LE||(LA6_1>=LT && LA6_1<=MOD)||LA6_1==NE||(LA6_1>=OPTION && LA6_1<=OR)||(LA6_1>=TO && LA6_1<=TREAT)||LA6_1==UNION||LA6_1==VARIABLE||LA6_1==CONTEXT||LA6_1==UPDATING||LA6_1==CONTAINS||LA6_1==COLLECTION||(LA6_1>=INDEX && LA6_1<=INTEGRITY)||(LA6_1>=CONCAT && LA6_1<=LPAREN)||LA6_1==LSQUARE||LA6_1==EQUAL||(LA6_1>=NOTEQUAL && LA6_1<=HASH)||LA6_1==COMMA||(LA6_1>=STAR && LA6_1<=BANG)||LA6_1==COLON||LA6_1==VBAR) ) {s = 5;}\n\n                            else if ( (LA6_1==SEMICOLON) && ((this.lc(XQS)))) {s = 8;}\n\n                            else if ( (LA6_1==EOF) ) {s = 9;}\n\n                             \n                            input.seek(index6_1);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 6, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA9_eotS:\n        \"\\u000c\\uffff\",\n    DFA9_eofS:\n        \"\\u000c\\uffff\",\n    DFA9_minS:\n        \"\\u0001\\u0022\\u0001\\u0017\\u0002\\uffff\\u0001\\u001e\\u0007\\uffff\",\n    DFA9_maxS:\n        \"\\u0001\\u0022\\u0001\\u00a0\\u0002\\uffff\\u0001\\u0079\\u0007\\uffff\",\n    DFA9_acceptS:\n        \"\\u0002\\uffff\\u0001\\u0007\\u0001\\u0001\\u0001\\uffff\\u0001\\u0003\\u0001\"+\n    \"\\u0004\\u0001\\u0005\\u0001\\u0008\\u0001\\u0009\\u0001\\u0002\\u0001\\u0006\",\n    DFA9_specialS:\n        \"\\u0001\\uffff\\u0001\\u0000\\u000a\\uffff}>\",\n    DFA9_transitionS: [\n            \"\\u0001\\u0001\",\n            \"\\u0001\\u0005\\u0001\\u0003\\u0007\\uffff\\u0001\\u0006\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0004\\u0031\\uffff\\u0001\\u0007\\u0023\\uffff\"+\n            \"\\u0001\\u0009\\u0026\\uffff\\u0001\\u0002\",\n            \"\",\n            \"\",\n            \"\\u0001\\u000a\\u0034\\uffff\\u0001\\u000b\\u0025\\uffff\\u0001\\u0009\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA9_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA9_eotS),\n    DFA9_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA9_eofS),\n    DFA9_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA9_minS),\n    DFA9_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA9_maxS),\n    DFA9_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA9_acceptS),\n    DFA9_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA9_specialS),\n    DFA9_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA9_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA9_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA9 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 9;\n    this.eot = XQueryParser.DFA9_eot;\n    this.eof = XQueryParser.DFA9_eof;\n    this.min = XQueryParser.DFA9_min;\n    this.max = XQueryParser.DFA9_max;\n    this.accept = XQueryParser.DFA9_accept;\n    this.special = XQueryParser.DFA9_special;\n    this.transition = XQueryParser.DFA9_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA9, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"355:1: p_Setter : ( pm_BoundarySpaceDecl | pm_DefaultCollationDecl | pm_BaseURIDecl | pm_ConstructionDecl | pm_OrderingModeDecl | pm_EmptyOrderDecl | {...}? => pm_RevalidationDecl | pm_CopyNamespacesDecl | pm_DecimalFormatDecl );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA9_1 = input.LA(1);\n\n                             \n                            var index9_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA9_1==REVALIDATION) && ((this.lc(XQU)))) {s = 2;}\n\n                            else if ( (LA9_1==BOUNDARY_SPACE) ) {s = 3;}\n\n                            else if ( (LA9_1==DEFAULT) ) {s = 4;}\n\n                            else if ( (LA9_1==BASE_URI) ) {s = 5;}\n\n                            else if ( (LA9_1==CONSTRUCTION) ) {s = 6;}\n\n                            else if ( (LA9_1==ORDERING) ) {s = 7;}\n\n                            else if ( (LA9_1==COPY_NAMESPACES) ) {s = 8;}\n\n                            else if ( (LA9_1==DECIMAL_FORMAT) ) {s = 9;}\n\n                             \n                            input.seek(index9_1);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 9, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA44_eotS:\n        \"\\u004b\\uffff\",\n    DFA44_eofS:\n        \"\\u0001\\u0046\\u004a\\uffff\",\n    DFA44_minS:\n        \"\\u0001\\u0010\\u0045\\u0000\\u0001\\uffff\\u0002\\u0000\\u0002\\uffff\",\n    DFA44_maxS:\n        \"\\u0001\\u0122\\u0045\\u0000\\u0001\\uffff\\u0002\\u0000\\u0002\\uffff\",\n    DFA44_acceptS:\n        \"\\u0046\\uffff\\u0001\\u0001\\u0003\\uffff\\u0001\\u0002\",\n    DFA44_specialS:\n        \"\\u0001\\u0000\\u0001\\u0001\\u0001\\u0002\\u0001\\u0003\\u0001\\u0004\\u0001\"+\n    \"\\u0005\\u0001\\u0006\\u0001\\u0007\\u0001\\u0008\\u0001\\u0009\\u0001\\u000a\\u0001\"+\n    \"\\u000b\\u0001\\u000c\\u0001\\u000d\\u0001\\u000e\\u0001\\u000f\\u0001\\u0010\\u0001\"+\n    \"\\u0011\\u0001\\u0012\\u0001\\u0013\\u0001\\u0014\\u0001\\u0015\\u0001\\u0016\\u0001\"+\n    \"\\u0017\\u0001\\u0018\\u0001\\u0019\\u0001\\u001a\\u0001\\u001b\\u0001\\u001c\\u0001\"+\n    \"\\u001d\\u0001\\u001e\\u0001\\u001f\\u0001\\u0020\\u0001\\u0021\\u0001\\u0022\\u0001\"+\n    \"\\u0023\\u0001\\u0024\\u0001\\u0025\\u0001\\u0026\\u0001\\u0027\\u0001\\u0028\\u0001\"+\n    \"\\u0029\\u0001\\u002a\\u0001\\u002b\\u0001\\u002c\\u0001\\u002d\\u0001\\u002e\\u0001\"+\n    \"\\u002f\\u0001\\u0030\\u0001\\u0031\\u0001\\u0032\\u0001\\u0033\\u0001\\u0034\\u0001\"+\n    \"\\u0035\\u0001\\u0036\\u0001\\u0037\\u0001\\u0038\\u0001\\u0039\\u0001\\u003a\\u0001\"+\n    \"\\u003b\\u0001\\u003c\\u0001\\u003d\\u0001\\u003e\\u0001\\u003f\\u0001\\u0040\\u0001\"+\n    \"\\u0041\\u0001\\u0042\\u0001\\u0043\\u0001\\u0044\\u0001\\u0045\\u0001\\uffff\\u0001\"+\n    \"\\u0046\\u0001\\u0047\\u0002\\uffff}>\",\n    DFA44_transitionS: [\n            \"\\u0001\\u0029\\u0001\\u002c\\u0004\\u0047\\u0001\\u001f\\u0006\\u0047\"+\n            \"\\u0001\\u002d\\u0001\\u0047\\u0001\\u0022\\u0004\\u0047\\u0001\\u002f\"+\n            \"\\u0001\\u0031\\u0002\\u0047\\u0001\\u001a\\u0001\\u0024\\u0001\\u0017\"+\n            \"\\u0002\\u0047\\u0001\\u0048\\u0002\\u0047\\u0001\\u0008\\u0002\\u0047\"+\n            \"\\u0001\\u0033\\u0001\\u0032\\u0001\\u0001\\u0005\\u0047\\u0001\\u0003\"+\n            \"\\u0006\\u0047\\u0001\\u0048\\u0003\\u0047\\u0001\\u0002\\u0003\\u0047\"+\n            \"\\u0001\\u001e\\u0003\\u0047\\u0001\\u0039\\u0005\\u0047\\u0001\\u0016\"+\n            \"\\u0001\\u0047\\u0001\\u0021\\u0001\\u002b\\u0001\\u002a\\u0001\\u0047\"+\n            \"\\u0001\\u0023\\u0004\\u0048\\u0003\\u0047\\u0001\\u0037\\u0001\\u0036\"+\n            \"\\u0001\\u0030\\u0001\\u0007\\u0003\\u0047\\u0001\\u0020\\u0003\\u0047\"+\n            \"\\u0001\\u0005\\u0001\\u0047\\u0001\\u0019\\u0001\\u000b\\u0001\\u0045\"+\n            \"\\u000f\\u0047\\u0001\\u0038\\u0009\\u0047\\u0001\\u0004\\u0001\\u0006\"+\n            \"\\u0007\\u0047\\u0001\\u0040\\u0001\\u003d\\u0001\\u0047\\u0001\\u0034\"+\n            \"\\u0002\\u0047\\u0001\\u0041\\u0003\\u0047\\u0001\\u003e\\u0001\\u003f\"+\n            \"\\u0002\\u0047\\u0001\\u0018\\u002c\\u0047\\u0001\\u0042\\u0001\\u0043\"+\n            \"\\u0001\\u0044\\u0002\\u0047\\u0001\\u003a\\u000d\\u0047\\u0001\\uffff\"+\n            \"\\u0001\\u000e\\u0001\\uffff\\u0001\\u0014\\u0001\\u0028\\u0001\\uffff\"+\n            \"\\u0001\\u0025\\u0001\\uffff\\u0001\\u0027\\u0004\\uffff\\u0001\\u0046\"+\n            \"\\u0004\\uffff\\u0001\\u003b\\u0001\\u0009\\u0001\\u000a\\u0001\\u001b\"+\n            \"\\u0005\\uffff\\u0001\\u000c\\u0001\\u000d\\u0001\\uffff\\u0001\\u0015\"+\n            \"\\u0001\\u002e\\u000c\\uffff\\u0001\\u0035\\u0001\\u0026\\u0002\\uffff\"+\n            \"\\u0001\\u0013\\u0001\\u0012\\u0002\\uffff\\u0001\\u0047\\u0006\\uffff\"+\n            \"\\u0001\\u003c\\u0001\\u001c\\u0001\\u001d\\u0001\\u000f\\u0001\\u0010\"+\n            \"\\u0001\\u0011\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA44_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA44_eotS),\n    DFA44_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA44_eofS),\n    DFA44_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA44_minS),\n    DFA44_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA44_maxS),\n    DFA44_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA44_acceptS),\n    DFA44_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA44_specialS),\n    DFA44_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA44_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA44_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA44 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 44;\n    this.eot = XQueryParser.DFA44_eot;\n    this.eof = XQueryParser.DFA44_eof;\n    this.min = XQueryParser.DFA44_min;\n    this.max = XQueryParser.DFA44_max;\n    this.accept = XQueryParser.DFA44_accept;\n    this.special = XQueryParser.DFA44_special;\n    this.transition = XQueryParser.DFA44_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA44, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"534:1: pm_QueryBody : ({...}? => p_Program | p_Expr[true,true] );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA44_0 = input.LA(1);\n\n                             \n                            var index44_0 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA44_0==FOR) ) {s = 1;}\n\n                            else if ( (LA44_0==LET) ) {s = 2;}\n\n                            else if ( (LA44_0==IF) ) {s = 3;}\n\n                            else if ( (LA44_0==SWITCH) ) {s = 4;}\n\n                            else if ( (LA44_0==TYPESWITCH) ) {s = 5;}\n\n                            else if ( (LA44_0==TRY) ) {s = 6;}\n\n                            else if ( (LA44_0==SOME) ) {s = 7;}\n\n                            else if ( (LA44_0==EVERY) ) {s = 8;}\n\n                            else if ( (LA44_0==PLUS) ) {s = 9;}\n\n                            else if ( (LA44_0==MINUS) ) {s = 10;}\n\n                            else if ( (LA44_0==VALIDATE) ) {s = 11;}\n\n                            else if ( (LA44_0==SLASH) ) {s = 12;}\n\n                            else if ( (LA44_0==SLASH_SLASH) ) {s = 13;}\n\n                            else if ( (LA44_0==LPAREN) ) {s = 14;}\n\n                            else if ( (LA44_0==L_IntegerLiteral) ) {s = 15;}\n\n                            else if ( (LA44_0==L_DecimalLiteral) ) {s = 16;}\n\n                            else if ( (LA44_0==L_DoubleLiteral) ) {s = 17;}\n\n                            else if ( (LA44_0==QUOT) ) {s = 18;}\n\n                            else if ( (LA44_0==APOS) ) {s = 19;}\n\n                            else if ( (LA44_0==DOLLAR) ) {s = 20;}\n\n                            else if ( (LA44_0==DOT) ) {s = 21;}\n\n                            else if ( (LA44_0==ORDERED) ) {s = 22;}\n\n                            else if ( (LA44_0==ELEMENT) ) {s = 23;}\n\n                            else if ( (LA44_0==UPDATING) ) {s = 24;}\n\n                            else if ( (LA44_0==UNORDERED) ) {s = 25;}\n\n                            else if ( (LA44_0==DOCUMENT) ) {s = 26;}\n\n                            else if ( (LA44_0==SMALLER) ) {s = 27;}\n\n                            else if ( (LA44_0==L_DirCommentConstructor) ) {s = 28;}\n\n                            else if ( (LA44_0==L_DirPIConstructor) ) {s = 29;}\n\n                            else if ( (LA44_0==NAMESPACE) ) {s = 30;}\n\n                            else if ( (LA44_0==ATTRIBUTE) ) {s = 31;}\n\n                            else if ( (LA44_0==TEXT) ) {s = 32;}\n\n                            else if ( (LA44_0==PARENT) ) {s = 33;}\n\n                            else if ( (LA44_0==COMMENT) ) {s = 34;}\n\n                            else if ( (LA44_0==PROCESSING_INSTRUCTION) ) {s = 35;}\n\n                            else if ( (LA44_0==DOCUMENT_NODE) ) {s = 36;}\n\n                            else if ( (LA44_0==LBRACKET) ) {s = 37;}\n\n                            else if ( (LA44_0==Q) ) {s = 38;}\n\n                            else if ( (LA44_0==LSQUARE) ) {s = 39;}\n\n                            else if ( (LA44_0==L_UNION_BRACKET) ) {s = 40;}\n\n                            else if ( (LA44_0==ANCESTOR) ) {s = 41;}\n\n                            else if ( (LA44_0==PRECEDING_SIBLING) ) {s = 42;}\n\n                            else if ( (LA44_0==PRECEDING) ) {s = 43;}\n\n                            else if ( (LA44_0==ANCESTOR_OR_SELF) ) {s = 44;}\n\n                            else if ( (LA44_0==CHILD) ) {s = 45;}\n\n                            else if ( (LA44_0==DOT_DOT) ) {s = 46;}\n\n                            else if ( (LA44_0==DESCENDANT) ) {s = 47;}\n\n                            else if ( (LA44_0==SELF) ) {s = 48;}\n\n                            else if ( (LA44_0==DESCENDANT_OR_SELF) ) {s = 49;}\n\n                            else if ( (LA44_0==FOLLOWING_SIBLING) ) {s = 50;}\n\n                            else if ( (LA44_0==FOLLOWING) ) {s = 51;}\n\n                            else if ( (LA44_0==INSERT) ) {s = 52;}\n\n                            else if ( (LA44_0==ATTR_SIGN) ) {s = 53;}\n\n                            else if ( (LA44_0==SCHEMA_ELEMENT) ) {s = 54;}\n\n                            else if ( (LA44_0==SCHEMA_ATTRIBUTE) ) {s = 55;}\n\n                            else if ( (LA44_0==NAMESPACE_NODE) ) {s = 56;}\n\n                            else if ( (LA44_0==NODE) ) {s = 57;}\n\n                            else if ( (LA44_0==WHILE) ) {s = 58;}\n\n                            else if ( (LA44_0==STAR) ) {s = 59;}\n\n                            else if ( (LA44_0==L_Pragma) ) {s = 60;}\n\n                            else if ( (LA44_0==DELETE) ) {s = 61;}\n\n                            else if ( (LA44_0==RENAME) ) {s = 62;}\n\n                            else if ( (LA44_0==REPLACE) ) {s = 63;}\n\n                            else if ( (LA44_0==COPY) ) {s = 64;}\n\n                            else if ( (LA44_0==APPEND) ) {s = 65;}\n\n                            else if ( (LA44_0==BREAK) ) {s = 66;}\n\n                            else if ( (LA44_0==CONTINUE) ) {s = 67;}\n\n                            else if ( (LA44_0==EXIT) ) {s = 68;}\n\n                            else if ( (LA44_0==VARIABLE) ) {s = 69;}\n\n                            else if ( (LA44_0==EOF||LA44_0==ANN_PERCENT) && ((this.lc(XQS)))) {s = 70;}\n\n                            else if ( ((LA44_0>=AND && LA44_0<=AT)||(LA44_0>=BASE_URI && LA44_0<=CASTABLE)||LA44_0==COLLATION||(LA44_0>=CONSTRUCTION && LA44_0<=DEFAULT)||(LA44_0>=DESCENDING && LA44_0<=DIV)||(LA44_0>=ELSE && LA44_0<=EMPTY)||(LA44_0>=ENCODING && LA44_0<=EQ)||(LA44_0>=EXCEPT && LA44_0<=EXTERNAL)||(LA44_0>=FUNCTION && LA44_0<=IDIV)||(LA44_0>=IMPORT && LA44_0<=IS)||(LA44_0>=LAX && LA44_0<=LEAST)||(LA44_0>=LT && LA44_0<=MODULE)||(LA44_0>=NE && LA44_0<=NO_PRESERVE)||(LA44_0>=JSON && LA44_0<=ORDER)||LA44_0==ORDERING||LA44_0==PRESERVE||(LA44_0>=RETURN && LA44_0<=SCHEMA)||(LA44_0>=STABLE && LA44_0<=STRIP)||(LA44_0>=THEN && LA44_0<=TREAT)||LA44_0==UNION||(LA44_0>=VERSION && LA44_0<=MINUS_SIGN)||(LA44_0>=NAN && LA44_0<=START)||(LA44_0>=TUMBLING && LA44_0<=BEFORE)||LA44_0==FIRST||(LA44_0>=INTO && LA44_0<=POSITION)||(LA44_0>=LAST && LA44_0<=NODES)||(LA44_0>=REVALIDATION && LA44_0<=SKIP)||(LA44_0>=VALUE && LA44_0<=WORDS)||(LA44_0>=LOOP && LA44_0<=RETURNING)||(LA44_0>=CHECK && LA44_0<=QUOT_ER)||LA44_0==L_NCName) ) {s = 71;}\n\n                            else if ( (LA44_0==EMPTY_SEQUENCE||LA44_0==ITEM||(LA44_0>=STRUCTURED_ITEM && LA44_0<=ARRAY)) ) {s = 72;}\n\n                             \n                            input.seek(index44_0);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA44_1 = input.LA(1);\n\n                             \n                            var index44_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_1);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA44_2 = input.LA(1);\n\n                             \n                            var index44_2 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_2);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 3 : \n                            var LA44_3 = input.LA(1);\n\n                             \n                            var index44_3 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_3);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 4 : \n                            var LA44_4 = input.LA(1);\n\n                             \n                            var index44_4 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_4);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 5 : \n                            var LA44_5 = input.LA(1);\n\n                             \n                            var index44_5 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_5);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 6 : \n                            var LA44_6 = input.LA(1);\n\n                             \n                            var index44_6 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_6);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 7 : \n                            var LA44_7 = input.LA(1);\n\n                             \n                            var index44_7 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_7);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 8 : \n                            var LA44_8 = input.LA(1);\n\n                             \n                            var index44_8 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_8);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 9 : \n                            var LA44_9 = input.LA(1);\n\n                             \n                            var index44_9 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_9);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 10 : \n                            var LA44_10 = input.LA(1);\n\n                             \n                            var index44_10 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_10);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 11 : \n                            var LA44_11 = input.LA(1);\n\n                             \n                            var index44_11 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_11);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 12 : \n                            var LA44_12 = input.LA(1);\n\n                             \n                            var index44_12 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_12);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 13 : \n                            var LA44_13 = input.LA(1);\n\n                             \n                            var index44_13 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_13);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 14 : \n                            var LA44_14 = input.LA(1);\n\n                             \n                            var index44_14 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_14);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 15 : \n                            var LA44_15 = input.LA(1);\n\n                             \n                            var index44_15 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_15);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 16 : \n                            var LA44_16 = input.LA(1);\n\n                             \n                            var index44_16 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_16);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 17 : \n                            var LA44_17 = input.LA(1);\n\n                             \n                            var index44_17 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_17);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 18 : \n                            var LA44_18 = input.LA(1);\n\n                             \n                            var index44_18 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_18);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 19 : \n                            var LA44_19 = input.LA(1);\n\n                             \n                            var index44_19 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_19);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 20 : \n                            var LA44_20 = input.LA(1);\n\n                             \n                            var index44_20 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_20);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 21 : \n                            var LA44_21 = input.LA(1);\n\n                             \n                            var index44_21 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_21);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 22 : \n                            var LA44_22 = input.LA(1);\n\n                             \n                            var index44_22 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_22);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 23 : \n                            var LA44_23 = input.LA(1);\n\n                             \n                            var index44_23 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_23);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 24 : \n                            var LA44_24 = input.LA(1);\n\n                             \n                            var index44_24 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_24);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 25 : \n                            var LA44_25 = input.LA(1);\n\n                             \n                            var index44_25 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_25);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 26 : \n                            var LA44_26 = input.LA(1);\n\n                             \n                            var index44_26 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_26);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 27 : \n                            var LA44_27 = input.LA(1);\n\n                             \n                            var index44_27 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_27);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 28 : \n                            var LA44_28 = input.LA(1);\n\n                             \n                            var index44_28 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_28);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 29 : \n                            var LA44_29 = input.LA(1);\n\n                             \n                            var index44_29 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_29);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 30 : \n                            var LA44_30 = input.LA(1);\n\n                             \n                            var index44_30 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_30);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 31 : \n                            var LA44_31 = input.LA(1);\n\n                             \n                            var index44_31 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_31);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 32 : \n                            var LA44_32 = input.LA(1);\n\n                             \n                            var index44_32 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_32);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 33 : \n                            var LA44_33 = input.LA(1);\n\n                             \n                            var index44_33 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_33);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 34 : \n                            var LA44_34 = input.LA(1);\n\n                             \n                            var index44_34 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_34);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 35 : \n                            var LA44_35 = input.LA(1);\n\n                             \n                            var index44_35 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_35);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 36 : \n                            var LA44_36 = input.LA(1);\n\n                             \n                            var index44_36 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_36);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 37 : \n                            var LA44_37 = input.LA(1);\n\n                             \n                            var index44_37 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_37);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 38 : \n                            var LA44_38 = input.LA(1);\n\n                             \n                            var index44_38 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_38);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 39 : \n                            var LA44_39 = input.LA(1);\n\n                             \n                            var index44_39 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_39);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 40 : \n                            var LA44_40 = input.LA(1);\n\n                             \n                            var index44_40 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_40);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 41 : \n                            var LA44_41 = input.LA(1);\n\n                             \n                            var index44_41 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_41);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 42 : \n                            var LA44_42 = input.LA(1);\n\n                             \n                            var index44_42 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_42);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 43 : \n                            var LA44_43 = input.LA(1);\n\n                             \n                            var index44_43 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_43);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 44 : \n                            var LA44_44 = input.LA(1);\n\n                             \n                            var index44_44 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_44);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 45 : \n                            var LA44_45 = input.LA(1);\n\n                             \n                            var index44_45 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_45);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 46 : \n                            var LA44_46 = input.LA(1);\n\n                             \n                            var index44_46 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_46);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 47 : \n                            var LA44_47 = input.LA(1);\n\n                             \n                            var index44_47 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_47);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 48 : \n                            var LA44_48 = input.LA(1);\n\n                             \n                            var index44_48 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_48);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 49 : \n                            var LA44_49 = input.LA(1);\n\n                             \n                            var index44_49 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_49);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 50 : \n                            var LA44_50 = input.LA(1);\n\n                             \n                            var index44_50 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_50);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 51 : \n                            var LA44_51 = input.LA(1);\n\n                             \n                            var index44_51 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_51);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 52 : \n                            var LA44_52 = input.LA(1);\n\n                             \n                            var index44_52 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (((this.lc(XQS))||((this.lc(XQS))&&(this.lc(XQU))))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_52);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 53 : \n                            var LA44_53 = input.LA(1);\n\n                             \n                            var index44_53 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_53);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 54 : \n                            var LA44_54 = input.LA(1);\n\n                             \n                            var index44_54 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_54);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 55 : \n                            var LA44_55 = input.LA(1);\n\n                             \n                            var index44_55 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_55);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 56 : \n                            var LA44_56 = input.LA(1);\n\n                             \n                            var index44_56 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_56);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 57 : \n                            var LA44_57 = input.LA(1);\n\n                             \n                            var index44_57 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_57);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 58 : \n                            var LA44_58 = input.LA(1);\n\n                             \n                            var index44_58 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_58);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 59 : \n                            var LA44_59 = input.LA(1);\n\n                             \n                            var index44_59 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_59);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 60 : \n                            var LA44_60 = input.LA(1);\n\n                             \n                            var index44_60 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_60);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 61 : \n                            var LA44_61 = input.LA(1);\n\n                             \n                            var index44_61 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (((this.lc(XQS))||((this.lc(XQS))&&(this.lc(XQU))))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_61);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 62 : \n                            var LA44_62 = input.LA(1);\n\n                             \n                            var index44_62 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (((this.lc(XQS))||((this.lc(XQS))&&(this.lc(XQU))))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_62);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 63 : \n                            var LA44_63 = input.LA(1);\n\n                             \n                            var index44_63 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (((this.lc(XQS))||((this.lc(XQS))&&(this.lc(XQU))))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_63);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 64 : \n                            var LA44_64 = input.LA(1);\n\n                             \n                            var index44_64 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (((this.lc(XQS))||((this.lc(XQS))&&(this.lc(XQU))))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_64);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 65 : \n                            var LA44_65 = input.LA(1);\n\n                             \n                            var index44_65 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (((this.lc(XQS))||((this.lc(XQS))&&(this.lc(XQU))))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_65);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 66 : \n                            var LA44_66 = input.LA(1);\n\n                             \n                            var index44_66 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_66);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 67 : \n                            var LA44_67 = input.LA(1);\n\n                             \n                            var index44_67 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_67);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 68 : \n                            var LA44_68 = input.LA(1);\n\n                             \n                            var index44_68 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_68);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 69 : \n                            var LA44_69 = input.LA(1);\n\n                             \n                            var index44_69 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_69);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 70 : \n                            var LA44_71 = input.LA(1);\n\n                             \n                            var index44_71 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_71);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 71 : \n                            var LA44_72 = input.LA(1);\n\n                             \n                            var index44_72 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((this.lc(XQS))) ) {s = 70;}\n\n                            else if ( (true) ) {s = 74;}\n\n                             \n                            input.seek(index44_72);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 44, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA46_eotS:\n        \"\\u0011\\uffff\",\n    DFA46_eofS:\n        \"\\u0001\\uffff\\u0006\\u0007\\u000a\\uffff\",\n    DFA46_minS:\n        \"\\u0001\\u0010\\u0006\\u0012\\u000a\\uffff\",\n    DFA46_maxS:\n        \"\\u0001\\u0122\\u0006\\u0107\\u000a\\uffff\",\n    DFA46_acceptS:\n        \"\\u0007\\uffff\\u0001\\u0006\\u0005\\u0001\\u0001\\u0002\\u0001\\u0003\\u0001\"+\n    \"\\u0004\\u0001\\u0005\",\n    DFA46_specialS:\n        \"\\u0001\\uffff\\u0001\\u0002\\u0001\\u0005\\u0001\\u0004\\u0001\\u0001\\u0001\"+\n    \"\\u0003\\u0001\\u0000\\u000a\\uffff}>\",\n    DFA46_transitionS: [\n            \"\\u0025\\u0007\\u0001\\u0001\\u0005\\u0007\\u0001\\u0003\\u000a\\u0007\"+\n            \"\\u0001\\u0002\\u0026\\u0007\\u0001\\u0005\\u001d\\u0007\\u0001\\u0004\"+\n            \"\\u0001\\u0006\\u0055\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0009\\uffff\\u0004\\u0007\\u0005\\uffff\\u0002\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u000c\\uffff\\u0002\\u0007\\u0002\\uffff\\u0002\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\\u0006\\u0007\",\n            \"\\u0004\\u0007\\u0004\\uffff\\u0003\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0003\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\"+\n            \"\\u0002\\u0007\\u000b\\uffff\\u0002\\u0007\\u0005\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\"+\n            \"\\u0006\\uffff\\u0001\\u0007\\u0004\\uffff\\u0001\\u000a\\u0001\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0009\\u0004\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0003\\uffff\\u0001\\u0007\\u0007\\uffff\\u0001\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u003a\\uffff\\u0003\\u0007\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0004\\u0007\\u0001\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u000c\\u0007\\u0002\\uffff\\u0001\\u0007\\u0003\\uffff\"+\n            \"\\u0002\\u0007\",\n            \"\\u0004\\u0007\\u0004\\uffff\\u0003\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0003\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\"+\n            \"\\u0002\\u0007\\u000b\\uffff\\u0002\\u0007\\u0005\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\"+\n            \"\\u0006\\uffff\\u0001\\u0007\\u0005\\uffff\\u0001\\u0007\\u0007\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0001\\u0007\"+\n            \"\\u0007\\uffff\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u0018\\uffff\"+\n            \"\\u0001\\u000c\\u0021\\uffff\\u0003\\u0007\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0004\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u000c\\u0007\\u0002\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\",\n            \"\\u0004\\u0007\\u0004\\uffff\\u0003\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0003\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\"+\n            \"\\u0002\\u0007\\u000b\\uffff\\u0002\\u0007\\u0005\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\"+\n            \"\\u0006\\uffff\\u0001\\u0007\\u0005\\uffff\\u0001\\u0007\\u0007\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0001\\u0007\"+\n            \"\\u0007\\uffff\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u003a\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\u000d\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0004\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u000c\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\",\n            \"\\u0004\\u0007\\u0004\\uffff\\u0003\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0003\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\"+\n            \"\\u0002\\u0007\\u000b\\uffff\\u0002\\u0007\\u0005\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\"+\n            \"\\u0006\\uffff\\u0001\\u0007\\u0005\\uffff\\u0001\\u0007\\u0007\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0001\\u0007\"+\n            \"\\u0007\\uffff\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u003a\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\u000e\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0004\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u000c\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\",\n            \"\\u0004\\u0007\\u0004\\uffff\\u0003\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0003\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\"+\n            \"\\u0002\\u0007\\u000b\\uffff\\u0002\\u0007\\u0005\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\"+\n            \"\\u0006\\uffff\\u0001\\u0007\\u0005\\uffff\\u0001\\u0007\\u0007\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0001\\u0007\"+\n            \"\\u0007\\uffff\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u003a\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\u000f\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0004\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u000c\\u0007\"+\n            \"\\u0002\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\",\n            \"\\u0004\\u0007\\u0004\\uffff\\u0003\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0001\\u0007\\u0002\\uffff\\u0002\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0003\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\uffff\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0006\\uffff\"+\n            \"\\u0002\\u0007\\u000b\\uffff\\u0002\\u0007\\u0005\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0002\\u0007\\u0001\\uffff\\u0001\\u0007\\u0004\\uffff\"+\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0002\\u0007\"+\n            \"\\u0006\\uffff\\u0001\\u0007\\u0005\\uffff\\u0001\\u0007\\u0007\\uffff\"+\n            \"\\u0002\\u0007\\u0004\\uffff\\u0001\\u0007\\u0003\\uffff\\u0001\\u0007\"+\n            \"\\u0007\\uffff\\u0001\\u0007\\u0002\\uffff\\u0001\\u0007\\u003a\\uffff\"+\n            \"\\u0003\\u0007\\u0002\\uffff\\u0001\\u0007\\u0001\\u0010\\u0004\\u0007\"+\n            \"\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\\u0001\\u0007\\u0001\\uffff\"+\n            \"\\u0001\\u0007\\u0001\\uffff\\u000c\\u0007\\u0002\\uffff\\u0001\\u0007\"+\n            \"\\u0003\\uffff\\u0002\\u0007\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA46_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA46_eotS),\n    DFA46_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA46_eofS),\n    DFA46_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA46_minS),\n    DFA46_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA46_maxS),\n    DFA46_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA46_acceptS),\n    DFA46_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA46_specialS),\n    DFA46_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA46_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA46_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA46 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 46;\n    this.eot = XQueryParser.DFA46_eot;\n    this.eof = XQueryParser.DFA46_eof;\n    this.min = XQueryParser.DFA46_min;\n    this.max = XQueryParser.DFA46_max;\n    this.accept = XQueryParser.DFA46_accept;\n    this.special = XQueryParser.DFA46_special;\n    this.transition = XQueryParser.DFA46_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA46, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"570:1: p_ExprSingle[strict] : ( ( ( ( FOR | LET ) DOLLAR ) | ( FOR ( TUMBLING | SLIDING ) ) )=> p_FLWORHybrid[$strict] | ( IF LPAREN )=> p_IfHybrid[$strict] | ( SWITCH LPAREN )=> p_SwitchHybrid[$strict] | ( TYPESWITCH LPAREN )=> p_TypeswitchHybrid[$strict] | ( TRY LBRACKET )=> p_TryCatchHybrid[$strict] | p_ExprSimple );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA46_6 = input.LA(1);\n\n                             \n                            var index46_6 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA46_6==LBRACKET) && (this.synpred5_XQueryParser())) {s = 16;}\n\n                            else if ( (LA46_6==EOF||(LA46_6>=AND && LA46_6<=AT)||(LA46_6>=CASE && LA46_6<=CASTABLE)||LA46_6==COLLATION||LA46_6==DEFAULT||(LA46_6>=DESCENDING && LA46_6<=DIV)||LA46_6==EMPTY||LA46_6==EQ||LA46_6==EXCEPT||LA46_6==FOR||LA46_6==GE||(LA46_6>=GT && LA46_6<=IDIV)||(LA46_6>=INSTANCE && LA46_6<=IS)||LA46_6==LE||(LA46_6>=LET && LA46_6<=MOD)||LA46_6==NE||(LA46_6>=OR && LA46_6<=ORDER)||(LA46_6>=RETURN && LA46_6<=SATISFIES)||LA46_6==STABLE||(LA46_6>=TO && LA46_6<=TREAT)||LA46_6==UNION||LA46_6==WHERE||LA46_6==COUNT||(LA46_6>=END && LA46_6<=GROUP)||LA46_6==ONLY||LA46_6==START||(LA46_6>=AFTER && LA46_6<=BEFORE)||LA46_6==INTO||LA46_6==MODIFY||LA46_6==WITH||LA46_6==CONTAINS||(LA46_6>=CONCAT && LA46_6<=RPAREN)||LA46_6==R_UNION_BRACKET||(LA46_6>=RBRACKET && LA46_6<=EQUAL)||LA46_6==NOTEQUAL||LA46_6==HASH||LA46_6==COMMA||(LA46_6>=STAR && LA46_6<=BANG)||LA46_6==COLON||(LA46_6>=SEMICOLON && LA46_6<=VBAR)) ) {s = 7;}\n\n                             \n                            input.seek(index46_6);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA46_4 = input.LA(1);\n\n                             \n                            var index46_4 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA46_4==LPAREN) && (this.synpred3_XQueryParser())) {s = 14;}\n\n                            else if ( (LA46_4==EOF||(LA46_4>=AND && LA46_4<=AT)||(LA46_4>=CASE && LA46_4<=CASTABLE)||LA46_4==COLLATION||LA46_4==DEFAULT||(LA46_4>=DESCENDING && LA46_4<=DIV)||LA46_4==EMPTY||LA46_4==EQ||LA46_4==EXCEPT||LA46_4==FOR||LA46_4==GE||(LA46_4>=GT && LA46_4<=IDIV)||(LA46_4>=INSTANCE && LA46_4<=IS)||LA46_4==LE||(LA46_4>=LET && LA46_4<=MOD)||LA46_4==NE||(LA46_4>=OR && LA46_4<=ORDER)||(LA46_4>=RETURN && LA46_4<=SATISFIES)||LA46_4==STABLE||(LA46_4>=TO && LA46_4<=TREAT)||LA46_4==UNION||LA46_4==WHERE||LA46_4==COUNT||(LA46_4>=END && LA46_4<=GROUP)||LA46_4==ONLY||LA46_4==START||(LA46_4>=AFTER && LA46_4<=BEFORE)||LA46_4==INTO||LA46_4==MODIFY||LA46_4==WITH||LA46_4==CONTAINS||LA46_4==CONCAT||LA46_4==RPAREN||LA46_4==R_UNION_BRACKET||(LA46_4>=RBRACKET && LA46_4<=EQUAL)||LA46_4==NOTEQUAL||LA46_4==HASH||LA46_4==COMMA||(LA46_4>=STAR && LA46_4<=BANG)||LA46_4==COLON||(LA46_4>=SEMICOLON && LA46_4<=VBAR)) ) {s = 7;}\n\n                             \n                            input.seek(index46_4);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA46_1 = input.LA(1);\n\n                             \n                            var index46_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA46_1==DOLLAR) && (this.synpred1_XQueryParser())) {s = 8;}\n\n                            else if ( (LA46_1==TUMBLING) && (this.synpred1_XQueryParser())) {s = 9;}\n\n                            else if ( (LA46_1==SLIDING) && (this.synpred1_XQueryParser())) {s = 10;}\n\n                            else if ( (LA46_1==EOF||(LA46_1>=AND && LA46_1<=AT)||(LA46_1>=CASE && LA46_1<=CASTABLE)||LA46_1==COLLATION||LA46_1==DEFAULT||(LA46_1>=DESCENDING && LA46_1<=DIV)||LA46_1==EMPTY||LA46_1==EQ||LA46_1==EXCEPT||LA46_1==FOR||LA46_1==GE||(LA46_1>=GT && LA46_1<=IDIV)||(LA46_1>=INSTANCE && LA46_1<=IS)||LA46_1==LE||(LA46_1>=LET && LA46_1<=MOD)||LA46_1==NE||(LA46_1>=OR && LA46_1<=ORDER)||(LA46_1>=RETURN && LA46_1<=SATISFIES)||LA46_1==STABLE||(LA46_1>=TO && LA46_1<=TREAT)||LA46_1==UNION||LA46_1==WHERE||LA46_1==COUNT||(LA46_1>=END && LA46_1<=GROUP)||LA46_1==ONLY||LA46_1==START||(LA46_1>=AFTER && LA46_1<=BEFORE)||LA46_1==INTO||LA46_1==MODIFY||LA46_1==WITH||LA46_1==CONTAINS||(LA46_1>=CONCAT && LA46_1<=RPAREN)||LA46_1==R_UNION_BRACKET||(LA46_1>=RBRACKET && LA46_1<=EQUAL)||LA46_1==NOTEQUAL||LA46_1==HASH||LA46_1==COMMA||(LA46_1>=STAR && LA46_1<=BANG)||LA46_1==COLON||(LA46_1>=SEMICOLON && LA46_1<=VBAR)) ) {s = 7;}\n\n                             \n                            input.seek(index46_1);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 3 : \n                            var LA46_5 = input.LA(1);\n\n                             \n                            var index46_5 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA46_5==LPAREN) && (this.synpred4_XQueryParser())) {s = 15;}\n\n                            else if ( (LA46_5==EOF||(LA46_5>=AND && LA46_5<=AT)||(LA46_5>=CASE && LA46_5<=CASTABLE)||LA46_5==COLLATION||LA46_5==DEFAULT||(LA46_5>=DESCENDING && LA46_5<=DIV)||LA46_5==EMPTY||LA46_5==EQ||LA46_5==EXCEPT||LA46_5==FOR||LA46_5==GE||(LA46_5>=GT && LA46_5<=IDIV)||(LA46_5>=INSTANCE && LA46_5<=IS)||LA46_5==LE||(LA46_5>=LET && LA46_5<=MOD)||LA46_5==NE||(LA46_5>=OR && LA46_5<=ORDER)||(LA46_5>=RETURN && LA46_5<=SATISFIES)||LA46_5==STABLE||(LA46_5>=TO && LA46_5<=TREAT)||LA46_5==UNION||LA46_5==WHERE||LA46_5==COUNT||(LA46_5>=END && LA46_5<=GROUP)||LA46_5==ONLY||LA46_5==START||(LA46_5>=AFTER && LA46_5<=BEFORE)||LA46_5==INTO||LA46_5==MODIFY||LA46_5==WITH||LA46_5==CONTAINS||LA46_5==CONCAT||LA46_5==RPAREN||LA46_5==R_UNION_BRACKET||(LA46_5>=RBRACKET && LA46_5<=EQUAL)||LA46_5==NOTEQUAL||LA46_5==HASH||LA46_5==COMMA||(LA46_5>=STAR && LA46_5<=BANG)||LA46_5==COLON||(LA46_5>=SEMICOLON && LA46_5<=VBAR)) ) {s = 7;}\n\n                             \n                            input.seek(index46_5);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 4 : \n                            var LA46_3 = input.LA(1);\n\n                             \n                            var index46_3 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA46_3==LPAREN) && (this.synpred2_XQueryParser())) {s = 13;}\n\n                            else if ( (LA46_3==EOF||(LA46_3>=AND && LA46_3<=AT)||(LA46_3>=CASE && LA46_3<=CASTABLE)||LA46_3==COLLATION||LA46_3==DEFAULT||(LA46_3>=DESCENDING && LA46_3<=DIV)||LA46_3==EMPTY||LA46_3==EQ||LA46_3==EXCEPT||LA46_3==FOR||LA46_3==GE||(LA46_3>=GT && LA46_3<=IDIV)||(LA46_3>=INSTANCE && LA46_3<=IS)||LA46_3==LE||(LA46_3>=LET && LA46_3<=MOD)||LA46_3==NE||(LA46_3>=OR && LA46_3<=ORDER)||(LA46_3>=RETURN && LA46_3<=SATISFIES)||LA46_3==STABLE||(LA46_3>=TO && LA46_3<=TREAT)||LA46_3==UNION||LA46_3==WHERE||LA46_3==COUNT||(LA46_3>=END && LA46_3<=GROUP)||LA46_3==ONLY||LA46_3==START||(LA46_3>=AFTER && LA46_3<=BEFORE)||LA46_3==INTO||LA46_3==MODIFY||LA46_3==WITH||LA46_3==CONTAINS||LA46_3==CONCAT||LA46_3==RPAREN||LA46_3==R_UNION_BRACKET||(LA46_3>=RBRACKET && LA46_3<=EQUAL)||LA46_3==NOTEQUAL||LA46_3==HASH||LA46_3==COMMA||(LA46_3>=STAR && LA46_3<=BANG)||LA46_3==COLON||(LA46_3>=SEMICOLON && LA46_3<=VBAR)) ) {s = 7;}\n\n                             \n                            input.seek(index46_3);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 5 : \n                            var LA46_2 = input.LA(1);\n\n                             \n                            var index46_2 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA46_2==DOLLAR) && (this.synpred1_XQueryParser())) {s = 11;}\n\n                            else if ( (LA46_2==SCORE) && (this.synpred1_XQueryParser())) {s = 12;}\n\n                            else if ( (LA46_2==EOF||(LA46_2>=AND && LA46_2<=AT)||(LA46_2>=CASE && LA46_2<=CASTABLE)||LA46_2==COLLATION||LA46_2==DEFAULT||(LA46_2>=DESCENDING && LA46_2<=DIV)||LA46_2==EMPTY||LA46_2==EQ||LA46_2==EXCEPT||LA46_2==FOR||LA46_2==GE||(LA46_2>=GT && LA46_2<=IDIV)||(LA46_2>=INSTANCE && LA46_2<=IS)||LA46_2==LE||(LA46_2>=LET && LA46_2<=MOD)||LA46_2==NE||(LA46_2>=OR && LA46_2<=ORDER)||(LA46_2>=RETURN && LA46_2<=SATISFIES)||LA46_2==STABLE||(LA46_2>=TO && LA46_2<=TREAT)||LA46_2==UNION||LA46_2==WHERE||LA46_2==COUNT||(LA46_2>=END && LA46_2<=GROUP)||LA46_2==ONLY||LA46_2==START||(LA46_2>=AFTER && LA46_2<=BEFORE)||LA46_2==INTO||LA46_2==MODIFY||LA46_2==WITH||LA46_2==CONTAINS||(LA46_2>=CONCAT && LA46_2<=RPAREN)||LA46_2==R_UNION_BRACKET||(LA46_2>=RBRACKET && LA46_2<=EQUAL)||LA46_2==NOTEQUAL||LA46_2==HASH||LA46_2==COMMA||(LA46_2>=STAR && LA46_2<=BANG)||LA46_2==COLON||(LA46_2>=SEMICOLON && LA46_2<=VBAR)) ) {s = 7;}\n\n                             \n                            input.seek(index46_2);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 46, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA119_eotS:\n        \"\\u0033\\uffff\",\n    DFA119_eofS:\n        \"\\u0033\\uffff\",\n    DFA119_minS:\n        \"\\u0001\\u0010\\u0001\\u0000\\u0031\\uffff\",\n    DFA119_maxS:\n        \"\\u0001\\u0122\\u0001\\u0000\\u0031\\uffff\",\n    DFA119_acceptS:\n        \"\\u0002\\uffff\\u0001\\u0003\\u0001\\u0004\\u002d\\uffff\\u0001\\u0001\\u0001\"+\n    \"\\u0002\",\n    DFA119_specialS:\n        \"\\u0001\\uffff\\u0001\\u0000\\u0031\\uffff}>\",\n    DFA119_transitionS: [\n            \"\\u00d2\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0002\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0009\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0005\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\u0002\\u0001\\uffff\\u0002\\u0003\\u000c\\uffff\\u0002\\u0003\"+\n            \"\\u0002\\uffff\\u0002\\u0003\\u0002\\uffff\\u0001\\u0003\\u0007\\uffff\"+\n            \"\\u0005\\u0003\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA119_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA119_eotS),\n    DFA119_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA119_eofS),\n    DFA119_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA119_minS),\n    DFA119_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA119_maxS),\n    DFA119_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA119_acceptS),\n    DFA119_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA119_specialS),\n    DFA119_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA119_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA119_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA119 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 119;\n    this.eot = XQueryParser.DFA119_eot;\n    this.eof = XQueryParser.DFA119_eof;\n    this.min = XQueryParser.DFA119_min;\n    this.max = XQueryParser.DFA119_max;\n    this.accept = XQueryParser.DFA119_accept;\n    this.special = XQueryParser.DFA119_special;\n    this.transition = XQueryParser.DFA119_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA119, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"912:1: p_PathExpr : ( ( SLASH p_RelativePathExpr )=> ( SLASH p_RelativePathExpr ) | SLASH | SLASH_SLASH p_RelativePathExpr | p_RelativePathExpr );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA119_1 = input.LA(1);\n\n                             \n                            var index119_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred7_XQueryParser()) ) {s = 49;}\n\n                            else if ( (true) ) {s = 50;}\n\n                             \n                            input.seek(index119_1);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 119, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA121_eotS:\n        \"\\u0035\\uffff\",\n    DFA121_eofS:\n        \"\\u0035\\uffff\",\n    DFA121_minS:\n        \"\\u0001\\u0010\\u002e\\u0000\\u0006\\uffff\",\n    DFA121_maxS:\n        \"\\u0001\\u0122\\u002e\\u0000\\u0006\\uffff\",\n    DFA121_acceptS:\n        \"\\u002f\\uffff\\u0001\\u0001\\u0001\\u0002\\u0001\\u0004\\u0001\\u0005\\u0001\"+\n    \"\\u0003\\u0001\\u0006\",\n    DFA121_specialS:\n        \"\\u0001\\uffff\\u0001\\u0000\\u0001\\u0001\\u0001\\u0002\\u0001\\u0003\\u0001\"+\n    \"\\u0004\\u0001\\u0005\\u0001\\u0006\\u0001\\u0007\\u0001\\u0008\\u0001\\u0009\\u0001\"+\n    \"\\u000a\\u0001\\u000b\\u0001\\u000c\\u0001\\u000d\\u0001\\u000e\\u0001\\u000f\\u0001\"+\n    \"\\u0010\\u0001\\u0011\\u0001\\u0012\\u0001\\u0013\\u0001\\u0014\\u0001\\u0015\\u0001\"+\n    \"\\u0016\\u0001\\u0017\\u0001\\u0018\\u0001\\u0019\\u0001\\u001a\\u0001\\u001b\\u0001\"+\n    \"\\u001c\\u0001\\u001d\\u0001\\u001e\\u0001\\u001f\\u0001\\u0020\\u0001\\u0021\\u0001\"+\n    \"\\u0022\\u0001\\u0023\\u0001\\u0024\\u0001\\u0025\\u0001\\u0026\\u0001\\u0027\\u0001\"+\n    \"\\u0028\\u0001\\u0029\\u0001\\u002a\\u0001\\u002b\\u0001\\u002c\\u0001\\u002d\\u0006\"+\n    \"\\uffff}>\",\n    DFA121_transitionS: [\n            \"\\u0001\\u001c\\u0001\\u001f\\u0004\\u0027\\u0001\\u0012\\u0006\\u0027\"+\n            \"\\u0001\\u0020\\u0001\\u0027\\u0001\\u0015\\u0004\\u0027\\u0001\\u0022\"+\n            \"\\u0001\\u0024\\u0002\\u0027\\u0001\\u000d\\u0001\\u0017\\u0001\\u000a\"+\n            \"\\u0002\\u0027\\u0001\\u002d\\u0005\\u0027\\u0001\\u0026\\u0001\\u0025\"+\n            \"\\u0006\\u0027\\u0001\\u002d\\u0006\\u0027\\u0001\\u002d\\u0007\\u0027\"+\n            \"\\u0001\\u0011\\u0003\\u0027\\u0001\\u002c\\u0005\\u0027\\u0001\\u0009\"+\n            \"\\u0001\\u0027\\u0001\\u0014\\u0001\\u001e\\u0001\\u001d\\u0001\\u0027\"+\n            \"\\u0001\\u0016\\u0004\\u002d\\u0003\\u0027\\u0001\\u002a\\u0001\\u0029\"+\n            \"\\u0001\\u0023\\u0004\\u0027\\u0001\\u0013\\u0003\\u0027\\u0001\\u002d\"+\n            \"\\u0001\\u0027\\u0001\\u000c\\u0011\\u0027\\u0001\\u002b\\u0009\\u0027\"+\n            \"\\u0001\\u002d\\u0016\\u0027\\u0001\\u000b\\u0031\\u0027\\u0001\\u002d\"+\n            \"\\u000d\\u0027\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0001\\u001b\\u0001\\uffff\\u0001\\u0018\\u0001\\uffff\\u0001\\u001a\"+\n            \"\\u0009\\uffff\\u0001\\u002e\\u0002\\uffff\\u0001\\u000e\\u0008\\uffff\"+\n            \"\\u0001\\u0008\\u0001\\u0021\\u000c\\uffff\\u0001\\u0028\\u0001\\u0019\"+\n            \"\\u0002\\uffff\\u0001\\u0006\\u0001\\u0005\\u0002\\uffff\\u0001\\u0027\"+\n            \"\\u0007\\uffff\\u0001\\u000f\\u0001\\u0010\\u0001\\u0002\\u0001\\u0003\"+\n            \"\\u0001\\u0004\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA121_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA121_eotS),\n    DFA121_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA121_eofS),\n    DFA121_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA121_minS),\n    DFA121_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA121_maxS),\n    DFA121_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA121_acceptS),\n    DFA121_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA121_specialS),\n    DFA121_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA121_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA121_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA121 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 121;\n    this.eot = XQueryParser.DFA121_eot;\n    this.eof = XQueryParser.DFA121_eof;\n    this.min = XQueryParser.DFA121_min;\n    this.max = XQueryParser.DFA121_max;\n    this.accept = XQueryParser.DFA121_accept;\n    this.special = XQueryParser.DFA121_special;\n    this.transition = XQueryParser.DFA121_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA121, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"925:1: p_StepExpr : ( ( LBRACKET | LPAREN | SMALLER | QUOT | APOS | DOLLAR )=> p_PostfixExpr | ( ( ( ELEMENT | ATTRIBUTE ) ( p_EQName )? LBRACKET ) | ( ( NAMESPACE | PROCESSING_INSTRUCTION ) ( p_NCName )? LBRACKET ) | ( ( DOCUMENT | TEXT | COMMENT ) LBRACKET ) )=> p_PostfixExpr | ( p_KindTest )=> p_AxisStep | ( p_EQName LPAREN )=> p_PostfixExpr | ( p_PrimaryExpr )=> p_PostfixExpr | p_AxisStep );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA121_1 = input.LA(1);\n\n                             \n                            var index121_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_1);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA121_2 = input.LA(1);\n\n                             \n                            var index121_2 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_2);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA121_3 = input.LA(1);\n\n                             \n                            var index121_3 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_3);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 3 : \n                            var LA121_4 = input.LA(1);\n\n                             \n                            var index121_4 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_4);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 4 : \n                            var LA121_5 = input.LA(1);\n\n                             \n                            var index121_5 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_5);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 5 : \n                            var LA121_6 = input.LA(1);\n\n                             \n                            var index121_6 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_6);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 6 : \n                            var LA121_7 = input.LA(1);\n\n                             \n                            var index121_7 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_7);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 7 : \n                            var LA121_8 = input.LA(1);\n\n                             \n                            var index121_8 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_8);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 8 : \n                            var LA121_9 = input.LA(1);\n\n                             \n                            var index121_9 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_9);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 9 : \n                            var LA121_10 = input.LA(1);\n\n                             \n                            var index121_10 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_10);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 10 : \n                            var LA121_11 = input.LA(1);\n\n                             \n                            var index121_11 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_11);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 11 : \n                            var LA121_12 = input.LA(1);\n\n                             \n                            var index121_12 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_12);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 12 : \n                            var LA121_13 = input.LA(1);\n\n                             \n                            var index121_13 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_13);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 13 : \n                            var LA121_14 = input.LA(1);\n\n                             \n                            var index121_14 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_14);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 14 : \n                            var LA121_15 = input.LA(1);\n\n                             \n                            var index121_15 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_15);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 15 : \n                            var LA121_16 = input.LA(1);\n\n                             \n                            var index121_16 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_16);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 16 : \n                            var LA121_17 = input.LA(1);\n\n                             \n                            var index121_17 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_17);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 17 : \n                            var LA121_18 = input.LA(1);\n\n                             \n                            var index121_18 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_18);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 18 : \n                            var LA121_19 = input.LA(1);\n\n                             \n                            var index121_19 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_19);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 19 : \n                            var LA121_20 = input.LA(1);\n\n                             \n                            var index121_20 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_20);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 20 : \n                            var LA121_21 = input.LA(1);\n\n                             \n                            var index121_21 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_21);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 21 : \n                            var LA121_22 = input.LA(1);\n\n                             \n                            var index121_22 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_22);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 22 : \n                            var LA121_23 = input.LA(1);\n\n                             \n                            var index121_23 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_23);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 23 : \n                            var LA121_24 = input.LA(1);\n\n                             \n                            var index121_24 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_24);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 24 : \n                            var LA121_25 = input.LA(1);\n\n                             \n                            var index121_25 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_25);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 25 : \n                            var LA121_26 = input.LA(1);\n\n                             \n                            var index121_26 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_26);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 26 : \n                            var LA121_27 = input.LA(1);\n\n                             \n                            var index121_27 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                             \n                            input.seek(index121_27);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 27 : \n                            var LA121_28 = input.LA(1);\n\n                             \n                            var index121_28 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_28);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 28 : \n                            var LA121_29 = input.LA(1);\n\n                             \n                            var index121_29 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_29);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 29 : \n                            var LA121_30 = input.LA(1);\n\n                             \n                            var index121_30 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_30);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 30 : \n                            var LA121_31 = input.LA(1);\n\n                             \n                            var index121_31 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_31);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 31 : \n                            var LA121_32 = input.LA(1);\n\n                             \n                            var index121_32 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_32);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 32 : \n                            var LA121_33 = input.LA(1);\n\n                             \n                            var index121_33 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_33);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 33 : \n                            var LA121_34 = input.LA(1);\n\n                             \n                            var index121_34 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_34);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 34 : \n                            var LA121_35 = input.LA(1);\n\n                             \n                            var index121_35 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_35);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 35 : \n                            var LA121_36 = input.LA(1);\n\n                             \n                            var index121_36 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_36);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 36 : \n                            var LA121_37 = input.LA(1);\n\n                             \n                            var index121_37 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_37);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 37 : \n                            var LA121_38 = input.LA(1);\n\n                             \n                            var index121_38 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_38);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 38 : \n                            var LA121_39 = input.LA(1);\n\n                             \n                            var index121_39 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_39);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 39 : \n                            var LA121_40 = input.LA(1);\n\n                             \n                            var index121_40 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_40);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 40 : \n                            var LA121_41 = input.LA(1);\n\n                             \n                            var index121_41 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_41);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 41 : \n                            var LA121_42 = input.LA(1);\n\n                             \n                            var index121_42 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_42);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 42 : \n                            var LA121_43 = input.LA(1);\n\n                             \n                            var index121_43 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_43);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 43 : \n                            var LA121_44 = input.LA(1);\n\n                             \n                            var index121_44 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_44);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 44 : \n                            var LA121_45 = input.LA(1);\n\n                             \n                            var index121_45 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred8_XQueryParser()) ) {s = 47;}\n\n                            else if ( (this.synpred9_XQueryParser()) ) {s = 48;}\n\n                            else if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (this.synpred11_XQueryParser()) ) {s = 49;}\n\n                            else if ( (this.synpred12_XQueryParser()) ) {s = 50;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_45);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 45 : \n                            var LA121_46 = input.LA(1);\n\n                             \n                            var index121_46 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (this.synpred10_XQueryParser()) ) {s = 51;}\n\n                            else if ( (true) ) {s = 52;}\n\n                             \n                            input.seek(index121_46);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 121, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA123_eotS:\n        \"\\u000a\\uffff\",\n    DFA123_eofS:\n        \"\\u0001\\uffff\\u0007\\u0008\\u0002\\uffff\",\n    DFA123_minS:\n        \"\\u0001\\u0010\\u0007\\u0012\\u0002\\uffff\",\n    DFA123_maxS:\n        \"\\u0001\\u0116\\u0007\\u0107\\u0002\\uffff\",\n    DFA123_acceptS:\n        \"\\u0008\\uffff\\u0001\\u0002\\u0001\\u0001\",\n    DFA123_specialS:\n        \"\\u000a\\uffff}>\",\n    DFA123_transitionS: [\n            \"\\u0006\\u0008\\u0001\\u0003\\u0006\\u0008\\u0001\\u0001\\u0006\\u0008\"+\n            \"\\u0001\\u0002\\u0001\\u0005\\u000d\\u0008\\u0001\\u0007\\u0001\\u0006\"+\n            \"\\u002f\\u0008\\u0001\\u0004\\u003d\\u0008\\u0001\\uffff\\u003f\\u0008\"+\n            \"\\u0012\\uffff\\u0001\\u0008\\u0019\\uffff\\u0002\\u0008\\u0006\\uffff\"+\n            \"\\u0001\\u0008\",\n            \"\\u0004\\u0008\\u0003\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0001\\u0008\\u0002\\uffff\\u0002\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\\u0006\\uffff\"+\n            \"\\u0002\\u0008\\u000b\\uffff\\u0002\\u0008\\u0005\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0002\\u0008\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0002\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0005\\uffff\\u0001\\u0008\\u0007\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0007\\uffff\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0014\\uffff\"+\n            \"\\u0001\\u0008\\u0006\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0013\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0004\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u000c\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\u0009\\u0002\\uffff\"+\n            \"\\u0002\\u0008\",\n            \"\\u0004\\u0008\\u0003\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0001\\u0008\\u0002\\uffff\\u0002\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\\u0006\\uffff\"+\n            \"\\u0002\\u0008\\u000b\\uffff\\u0002\\u0008\\u0005\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0002\\u0008\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0002\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0005\\uffff\\u0001\\u0008\\u0007\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0007\\uffff\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0014\\uffff\"+\n            \"\\u0001\\u0008\\u0006\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0013\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0004\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u000c\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\u0009\\u0002\\uffff\"+\n            \"\\u0002\\u0008\",\n            \"\\u0004\\u0008\\u0003\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0001\\u0008\\u0002\\uffff\\u0002\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\\u0006\\uffff\"+\n            \"\\u0002\\u0008\\u000b\\uffff\\u0002\\u0008\\u0005\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0002\\u0008\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0002\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0005\\uffff\\u0001\\u0008\\u0007\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0007\\uffff\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0014\\uffff\"+\n            \"\\u0001\\u0008\\u0006\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0013\\uffff\\u0003\\u0008\\u0002\\uffff\"+\n            \"\\u0001\\u0008\\u0001\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u000c\\u0008\\u0002\\uffff\"+\n            \"\\u0001\\u0008\\u0001\\u0009\\u0002\\uffff\\u0002\\u0008\",\n            \"\\u0004\\u0008\\u0003\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0001\\u0008\\u0002\\uffff\\u0002\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\\u0006\\uffff\"+\n            \"\\u0002\\u0008\\u000b\\uffff\\u0002\\u0008\\u0005\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0002\\u0008\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0002\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0005\\uffff\\u0001\\u0008\\u0007\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0007\\uffff\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0014\\uffff\"+\n            \"\\u0001\\u0008\\u0006\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0013\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0004\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u000c\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\u0009\\u0002\\uffff\"+\n            \"\\u0002\\u0008\",\n            \"\\u0004\\u0008\\u0003\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0001\\u0008\\u0002\\uffff\\u0002\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\\u0006\\uffff\"+\n            \"\\u0002\\u0008\\u000b\\uffff\\u0002\\u0008\\u0005\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0002\\u0008\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0002\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0005\\uffff\\u0001\\u0008\\u0007\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0007\\uffff\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0014\\uffff\"+\n            \"\\u0001\\u0008\\u0006\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0013\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0004\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u000c\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\u0009\\u0002\\uffff\"+\n            \"\\u0002\\u0008\",\n            \"\\u0004\\u0008\\u0003\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0001\\u0008\\u0002\\uffff\\u0002\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\\u0006\\uffff\"+\n            \"\\u0002\\u0008\\u000b\\uffff\\u0002\\u0008\\u0005\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0002\\u0008\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0002\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0005\\uffff\\u0001\\u0008\\u0007\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0007\\uffff\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0014\\uffff\"+\n            \"\\u0001\\u0008\\u0006\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0013\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0004\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u000c\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\u0009\\u0002\\uffff\"+\n            \"\\u0002\\u0008\",\n            \"\\u0004\\u0008\\u0003\\uffff\\u0004\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0001\\u0008\\u0002\\uffff\\u0002\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\"+\n            \"\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\"+\n            \"\\u0001\\uffff\\u0003\\u0008\\u0002\\uffff\\u0001\\u0008\\u0006\\uffff\"+\n            \"\\u0002\\u0008\\u000b\\uffff\\u0002\\u0008\\u0005\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0002\\u0008\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\"+\n            \"\\u0001\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0002\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0005\\uffff\\u0001\\u0008\\u0007\\uffff\"+\n            \"\\u0002\\u0008\\u0004\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0007\\uffff\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0014\\uffff\"+\n            \"\\u0001\\u0008\\u0006\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\"+\n            \"\\u0006\\uffff\\u0001\\u0008\\u0013\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u0001\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\uffff\\u0004\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u0008\\u0003\\uffff\\u0001\\u0008\\u0001\\uffff\"+\n            \"\\u000c\\u0008\\u0002\\uffff\\u0001\\u0008\\u0001\\u0009\\u0002\\uffff\"+\n            \"\\u0002\\u0008\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA123_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA123_eotS),\n    DFA123_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA123_eofS),\n    DFA123_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA123_minS),\n    DFA123_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA123_maxS),\n    DFA123_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA123_acceptS),\n    DFA123_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA123_specialS),\n    DFA123_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA123_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA123_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA123 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 123;\n    this.eot = XQueryParser.DFA123_eot;\n    this.eof = XQueryParser.DFA123_eof;\n    this.min = XQueryParser.DFA123_min;\n    this.max = XQueryParser.DFA123_max;\n    this.accept = XQueryParser.DFA123_accept;\n    this.special = XQueryParser.DFA123_special;\n    this.transition = XQueryParser.DFA123_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA123, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"944:1: p_ForwardStep : ( p_ForwardAxis p_NodeTest | p_AbbrevForwardStep );\";\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA128_eotS:\n        \"\\u000d\\uffff\",\n    DFA128_eofS:\n        \"\\u0001\\uffff\\u000a\\u000b\\u0002\\uffff\",\n    DFA128_minS:\n        \"\\u0001\\u0010\\u000a\\u0012\\u0002\\uffff\",\n    DFA128_maxS:\n        \"\\u0001\\u0116\\u000a\\u0107\\u0002\\uffff\",\n    DFA128_acceptS:\n        \"\\u000b\\uffff\\u0001\\u0002\\u0001\\u0001\",\n    DFA128_specialS:\n        \"\\u000d\\uffff}>\",\n    DFA128_transitionS: [\n            \"\\u0006\\u000b\\u0001\\u0003\\u0008\\u000b\\u0001\\u0007\\u0009\\u000b\"+\n            \"\\u0001\\u0001\\u0001\\u0002\\u0023\\u000b\\u0001\\u000a\\u000b\\u000b\"+\n            \"\\u0001\\u0006\\u0007\\u000b\\u0001\\u0005\\u0001\\u0004\\u0005\\u000b\"+\n            \"\\u0001\\u0008\\u0017\\u000b\\u0001\\u0009\\u0020\\u000b\\u0001\\uffff\"+\n            \"\\u003f\\u000b\\u0012\\uffff\\u0001\\u000b\\u001a\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\\u0004\\u000b\\u0003\\uffff\\u0004\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0001\\u000b\\u0002\\uffff\\u0002\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\"+\n            \"\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\"+\n            \"\\u0001\\uffff\\u0003\\u000b\\u0002\\uffff\\u0001\\u000b\\u0006\\uffff\"+\n            \"\\u0002\\u000b\\u000b\\uffff\\u0002\\u000b\\u0005\\uffff\\u0001\\u000b\"+\n            \"\\u0004\\uffff\\u0002\\u000b\\u0001\\uffff\\u0001\\u000b\\u0004\\uffff\"+\n            \"\\u0001\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0005\\uffff\\u0001\\u000b\\u0007\\uffff\"+\n            \"\\u0002\\u000b\\u0004\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0007\\uffff\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0014\\uffff\"+\n            \"\\u0001\\u000b\\u0006\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\"+\n            \"\\u0006\\uffff\\u0001\\u000b\\u0013\\uffff\\u0001\\u000b\\u0001\\u000c\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0001\\u000b\\u0001\\uffff\\u0004\\u000b\"+\n            \"\\u0001\\uffff\\u0001\\u000b\\u0003\\uffff\\u0001\\u000b\\u0001\\uffff\"+\n            \"\\u000c\\u000b\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u000b\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA128_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA128_eotS),\n    DFA128_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA128_eofS),\n    DFA128_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA128_minS),\n    DFA128_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA128_maxS),\n    DFA128_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA128_acceptS),\n    DFA128_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA128_specialS),\n    DFA128_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA128_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA128_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA128 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 128;\n    this.eot = XQueryParser.DFA128_eot;\n    this.eof = XQueryParser.DFA128_eof;\n    this.min = XQueryParser.DFA128_min;\n    this.max = XQueryParser.DFA128_max;\n    this.accept = XQueryParser.DFA128_accept;\n    this.special = XQueryParser.DFA128_special;\n    this.transition = XQueryParser.DFA128_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA128, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"986:1: p_NodeTest : ( p_KindTest | p_NameTest );\";\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA129_eotS:\n        \"\\u0009\\uffff\",\n    DFA129_eofS:\n        \"\\u0001\\uffff\\u0001\\u0005\\u0007\\uffff\",\n    DFA129_minS:\n        \"\\u0001\\u0010\\u0001\\u0012\\u0001\\u00e8\\u0001\\uffff\\u0001\\u0010\\u0001\"+\n    \"\\uffff\\u0002\\u0004\\u0001\\u0010\",\n    DFA129_maxS:\n        \"\\u0001\\u0116\\u0001\\u0107\\u0001\\u00e8\\u0001\\uffff\\u0001\\u0116\\u0001\"+\n    \"\\uffff\\u0002\\u015c\\u0001\\u0116\",\n    DFA129_acceptS:\n        \"\\u0003\\uffff\\u0001\\u0002\\u0001\\uffff\\u0001\\u0001\\u0003\\uffff\",\n    DFA129_specialS:\n        \"\\u0009\\uffff}>\",\n    DFA129_transitionS: [\n            \"\\u0092\\u0001\\u0001\\uffff\\u003f\\u0001\\u0012\\uffff\\u0001\\u0003\"+\n            \"\\u001a\\uffff\\u0001\\u0002\\u0006\\uffff\\u0001\\u0001\",\n            \"\\u0004\\u0005\\u0003\\uffff\\u0004\\u0005\\u0001\\uffff\\u0001\\u0005\"+\n            \"\\u0004\\uffff\\u0001\\u0005\\u0002\\uffff\\u0002\\u0005\\u0004\\uffff\"+\n            \"\\u0001\\u0005\\u0002\\uffff\\u0001\\u0005\\u0001\\uffff\\u0001\\u0005\"+\n            \"\\u0003\\uffff\\u0001\\u0005\\u0001\\uffff\\u0001\\u0005\\u0001\\uffff\"+\n            \"\\u0002\\u0005\\u0004\\uffff\\u0003\\u0005\\u0002\\uffff\\u0001\\u0005\"+\n            \"\\u0001\\uffff\\u0003\\u0005\\u0002\\uffff\\u0001\\u0005\\u0006\\uffff\"+\n            \"\\u0002\\u0005\\u000b\\uffff\\u0002\\u0005\\u0005\\uffff\\u0001\\u0005\"+\n            \"\\u0004\\uffff\\u0002\\u0005\\u0001\\uffff\\u0001\\u0005\\u0004\\uffff\"+\n            \"\\u0001\\u0005\\u0004\\uffff\\u0001\\u0005\\u0003\\uffff\\u0002\\u0005\"+\n            \"\\u0006\\uffff\\u0001\\u0005\\u0005\\uffff\\u0001\\u0005\\u0007\\uffff\"+\n            \"\\u0002\\u0005\\u0004\\uffff\\u0001\\u0005\\u0003\\uffff\\u0001\\u0005\"+\n            \"\\u0007\\uffff\\u0001\\u0005\\u0002\\uffff\\u0001\\u0005\\u0014\\uffff\"+\n            \"\\u0001\\u0005\\u0006\\uffff\\u0001\\u0005\\u0003\\uffff\\u0001\\u0005\"+\n            \"\\u0006\\uffff\\u0001\\u0005\\u0013\\uffff\\u0001\\u0005\\u0001\\uffff\"+\n            \"\\u0001\\u0005\\u0002\\uffff\\u0006\\u0005\\u0001\\uffff\\u0001\\u0005\"+\n            \"\\u0003\\uffff\\u0001\\u0005\\u0001\\uffff\\u000c\\u0005\\u0002\\uffff\"+\n            \"\\u0001\\u0004\\u0003\\uffff\\u0002\\u0005\",\n            \"\\u0001\\u0006\",\n            \"\",\n            \"\\u0092\\u0005\\u0001\\uffff\\u003f\\u0005\\u0012\\uffff\\u0001\\u0003\"+\n            \"\\u0021\\uffff\\u0001\\u0005\",\n            \"\",\n            \"\\u00e4\\u0007\\u0001\\uffff\\u0001\\u0008\\u0007\\u0007\\u0001\\uffff\"+\n            \"\\u006b\\u0007\",\n            \"\\u00e4\\u0007\\u0001\\uffff\\u0001\\u0008\\u0007\\u0007\\u0001\\uffff\"+\n            \"\\u006b\\u0007\",\n            \"\\u0092\\u0005\\u0001\\uffff\\u003f\\u0005\\u0012\\uffff\\u0001\\u0003\"+\n            \"\\u0021\\uffff\\u0001\\u0005\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA129_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA129_eotS),\n    DFA129_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA129_eofS),\n    DFA129_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA129_minS),\n    DFA129_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA129_maxS),\n    DFA129_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA129_acceptS),\n    DFA129_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA129_specialS),\n    DFA129_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA129_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA129_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA129 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 129;\n    this.eot = XQueryParser.DFA129_eot;\n    this.eof = XQueryParser.DFA129_eof;\n    this.min = XQueryParser.DFA129_min;\n    this.max = XQueryParser.DFA129_max;\n    this.accept = XQueryParser.DFA129_accept;\n    this.special = XQueryParser.DFA129_special;\n    this.transition = XQueryParser.DFA129_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA129, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"991:1: p_NameTest : ( p_EQName | p_Wildcard );\";\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA136_eotS:\n        \"\\u001a\\uffff\",\n    DFA136_eofS:\n        \"\\u001a\\uffff\",\n    DFA136_minS:\n        \"\\u0001\\u0010\\u0004\\uffff\\u0001\\u00e3\\u0001\\u0010\\u0001\\uffff\\u0002\"+\n    \"\\u00e3\\u0001\\uffff\\u0002\\u0010\\u0001\\u00e8\\u0001\\u00e3\\u0001\\u00e8\\u0001\"+\n    \"\\u0010\\u0001\\u00f0\\u0004\\uffff\\u0001\\u0010\\u0002\\uffff\\u0001\\u00e3\",\n    DFA136_maxS:\n        \"\\u0001\\u0122\\u0004\\uffff\\u0001\\u0102\\u0001\\u0116\\u0001\\uffff\\u0002\"+\n    \"\\u0102\\u0001\\uffff\\u0002\\u0116\\u0003\\u0102\\u0001\\u0116\\u0001\\u0102\\u0004\"+\n    \"\\uffff\\u0001\\u0116\\u0002\\uffff\\u0001\\u00f0\",\n    DFA136_acceptS:\n        \"\\u0001\\uffff\\u0001\\u0001\\u0001\\u0002\\u0001\\u0003\\u0001\\u0004\\u0002\"+\n    \"\\uffff\\u0001\\u0005\\u0002\\uffff\\u0001\\u0008\\u0007\\uffff\\u0001\\u0009\\u0001\"+\n    \"\\u000a\\u0001\\u000b\\u0001\\u000c\\u0001\\uffff\\u0001\\u0006\\u0001\\u0007\\u0001\"+\n    \"\\uffff\",\n    DFA136_specialS:\n        \"\\u0001\\u0000\\u0019\\uffff}>\",\n    DFA136_transitionS: [\n            \"\\u0006\\u000e\\u0001\\u000c\\u0008\\u000e\\u0001\\u000f\\u0008\\u000e\"+\n            \"\\u0001\\u0009\\u0001\\u0011\\u0001\\u0006\\u0002\\u000e\\u0001\\u0011\"+\n            \"\\u000d\\u000e\\u0001\\u0011\\u0006\\u000e\\u0001\\u0011\\u0007\\u000e\"+\n            \"\\u0001\\u000b\\u0003\\u000e\\u0001\\u0011\\u0005\\u000e\\u0001\\u0005\"+\n            \"\\u0005\\u000e\\u0001\\u0010\\u0004\\u0011\\u0003\\u000e\\u0002\\u0011\"+\n            \"\\u0005\\u000e\\u0001\\u000d\\u0003\\u000e\\u0001\\u0011\\u0001\\u000e\"+\n            \"\\u0001\\u0008\\u0011\\u000e\\u0001\\u0011\\u0009\\u000e\\u0001\\u0011\"+\n            \"\\u0016\\u000e\\u0001\\u0007\\u0031\\u000e\\u0001\\u0011\\u000d\\u000e\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0003\\u0001\\u0015\"+\n            \"\\u0001\\uffff\\u0001\\u0012\\u0001\\uffff\\u0001\\u0014\\u000c\\uffff\"+\n            \"\\u0001\\u000a\\u0008\\uffff\\u0001\\u0004\\u000e\\uffff\\u0001\\u0013\"+\n            \"\\u0002\\uffff\\u0002\\u0002\\u0002\\uffff\\u0001\\u000e\\u0007\\uffff\"+\n            \"\\u0002\\u000a\\u0003\\u0002\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0017\\u0007\\uffff\\u0001\\u0013\"+\n            \"\\u0011\\uffff\\u0001\\u0016\",\n            \"\\u0092\\u000a\\u0001\\uffff\\u003f\\u000a\\u0006\\uffff\\u0001\\u000a\"+\n            \"\\u0007\\uffff\\u0001\\u0013\\u0011\\uffff\\u0001\\u0016\\u000c\\uffff\"+\n            \"\\u0001\\u000a\\u0006\\uffff\\u0001\\u000a\",\n            \"\",\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u0018\\u0007\\uffff\\u0001\\u0013\"+\n            \"\\u0011\\uffff\\u0001\\u0016\",\n            \"\\u0001\\u0007\\u0004\\uffff\\u0001\\u000a\\u0007\\uffff\\u0001\\u0013\"+\n            \"\\u0011\\uffff\\u0001\\u0016\",\n            \"\",\n            \"\\u0092\\u000a\\u0001\\uffff\\u003f\\u000a\\u0001\\uffff\\u0001\\u0007\"+\n            \"\\u0004\\uffff\\u0001\\u000a\\u0007\\uffff\\u0001\\u0013\\u0011\\uffff\"+\n            \"\\u0001\\u0016\\u0013\\uffff\\u0001\\u000a\",\n            \"\\u0092\\u000a\\u0001\\uffff\\u003f\\u000a\\u0006\\uffff\\u0001\\u000a\"+\n            \"\\u0007\\uffff\\u0001\\u0013\\u0011\\uffff\\u0001\\u0016\\u000c\\uffff\"+\n            \"\\u0001\\u000a\\u0006\\uffff\\u0001\\u000a\",\n            \"\\u0001\\u000a\\u0007\\uffff\\u0001\\u0013\\u0011\\uffff\\u0001\\u0016\",\n            \"\\u0001\\u0007\\u000c\\uffff\\u0001\\u0013\\u0011\\uffff\\u0001\\u0016\",\n            \"\\u0001\\u000a\\u0007\\uffff\\u0001\\u0013\\u0011\\uffff\\u0001\\u0016\",\n            \"\\u0092\\u000a\\u0001\\uffff\\u003f\\u000a\\u0006\\uffff\\u0001\\u000a\"+\n            \"\\u0007\\uffff\\u0001\\u0013\\u0011\\uffff\\u0001\\u0016\\u0013\\uffff\"+\n            \"\\u0001\\u000a\",\n            \"\\u0001\\u0013\\u0011\\uffff\\u0001\\u0016\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0092\\u0019\\u0001\\uffff\\u003f\\u0019\\u0034\\uffff\\u0001\\u0019\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0007\\u000c\\uffff\\u0001\\u0013\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA136_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA136_eotS),\n    DFA136_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA136_eofS),\n    DFA136_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA136_minS),\n    DFA136_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA136_maxS),\n    DFA136_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA136_acceptS),\n    DFA136_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA136_specialS),\n    DFA136_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA136_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA136_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA136 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 136;\n    this.eot = XQueryParser.DFA136_eot;\n    this.eof = XQueryParser.DFA136_eof;\n    this.min = XQueryParser.DFA136_min;\n    this.max = XQueryParser.DFA136_max;\n    this.accept = XQueryParser.DFA136_accept;\n    this.special = XQueryParser.DFA136_special;\n    this.transition = XQueryParser.DFA136_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA136, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"1028:1: p_PrimaryExpr : ( ( LPAREN )=> p_ParenthesizedExpr | p_Literal | p_VarRef | p_ContextItemExpr | p_FunctionCall | p_OrderedExpr | p_UnorderedExpr | p_Constructor | p_BlockExpr | p_FunctionItemExpr | p_ArrayConstructor | p_SimpleObjectUnion );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA136_0 = input.LA(1);\n\n                             \n                            var index136_0 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA136_0==LPAREN) && (this.synpred13_XQueryParser())) {s = 1;}\n\n                            else if ( ((LA136_0>=APOS && LA136_0<=QUOT)||(LA136_0>=L_IntegerLiteral && LA136_0<=L_DoubleLiteral)) ) {s = 2;}\n\n                            else if ( (LA136_0==DOLLAR) ) {s = 3;}\n\n                            else if ( (LA136_0==DOT) ) {s = 4;}\n\n                            else if ( (LA136_0==ORDERED) ) {s = 5;}\n\n                            else if ( (LA136_0==ELEMENT) ) {s = 6;}\n\n                            else if ( (LA136_0==UPDATING) ) {s = 7;}\n\n                            else if ( (LA136_0==UNORDERED) ) {s = 8;}\n\n                            else if ( (LA136_0==DOCUMENT) ) {s = 9;}\n\n                            else if ( (LA136_0==SMALLER||(LA136_0>=L_DirCommentConstructor && LA136_0<=L_DirPIConstructor)) ) {s = 10;}\n\n                            else if ( (LA136_0==NAMESPACE) ) {s = 11;}\n\n                            else if ( (LA136_0==ATTRIBUTE) ) {s = 12;}\n\n                            else if ( (LA136_0==TEXT) ) {s = 13;}\n\n                            else if ( ((LA136_0>=ANCESTOR && LA136_0<=AT)||(LA136_0>=BASE_URI && LA136_0<=COLLATION)||(LA136_0>=CONSTRUCTION && LA136_0<=DIV)||(LA136_0>=ELSE && LA136_0<=EMPTY)||(LA136_0>=ENCODING && LA136_0<=IDIV)||(LA136_0>=IMPORT && LA136_0<=IS)||(LA136_0>=LAX && LA136_0<=MODULE)||(LA136_0>=NE && LA136_0<=NO_PRESERVE)||(LA136_0>=JSON && LA136_0<=ORDER)||(LA136_0>=ORDERING && LA136_0<=PRESERVE)||(LA136_0>=RETURN && LA136_0<=SCHEMA)||(LA136_0>=SELF && LA136_0<=STRIP)||(LA136_0>=THEN && LA136_0<=TREAT)||LA136_0==UNION||(LA136_0>=VALIDATE && LA136_0<=MINUS_SIGN)||(LA136_0>=NAN && LA136_0<=START)||(LA136_0>=TRY && LA136_0<=SKIP)||(LA136_0>=VALUE && LA136_0<=RETURNING)||(LA136_0>=CHECK && LA136_0<=QUOT_ER)||LA136_0==L_NCName) ) {s = 14;}\n\n                            else if ( (LA136_0==COMMENT) ) {s = 15;}\n\n                            else if ( (LA136_0==PROCESSING_INSTRUCTION) ) {s = 16;}\n\n                            else if ( (LA136_0==DOCUMENT_NODE||LA136_0==EMPTY_SEQUENCE||LA136_0==IF||LA136_0==ITEM||LA136_0==NODE||(LA136_0>=STRUCTURED_ITEM && LA136_0<=ARRAY)||(LA136_0>=SCHEMA_ATTRIBUTE && LA136_0<=SCHEMA_ELEMENT)||LA136_0==TYPESWITCH||LA136_0==NAMESPACE_NODE||LA136_0==SWITCH||LA136_0==WHILE) ) {s = 17;}\n\n                            else if ( (LA136_0==LBRACKET) ) {s = 18;}\n\n                            else if ( (LA136_0==Q) ) {s = 19;}\n\n                            else if ( (LA136_0==LSQUARE) ) {s = 20;}\n\n                            else if ( (LA136_0==L_UNION_BRACKET) ) {s = 21;}\n\n                             \n                            input.seek(index136_0);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 136, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA172_eotS:\n        \"\\u0018\\uffff\",\n    DFA172_eofS:\n        \"\\u0001\\uffff\\u000b\\u000f\\u0001\\uffff\\u0002\\u000f\\u0002\\uffff\\u0003\"+\n    \"\\u000f\\u0004\\uffff\",\n    DFA172_minS:\n        \"\\u0001\\u0010\\u000b\\u0012\\u0001\\uffff\\u0002\\u0012\\u0002\\uffff\\u0003\"+\n    \"\\u0012\\u0004\\uffff\",\n    DFA172_maxS:\n        \"\\u0001\\u0116\\u000b\\u0107\\u0001\\uffff\\u0002\\u0107\\u0002\\uffff\\u0003\"+\n    \"\\u0107\\u0004\\uffff\",\n    DFA172_acceptS:\n        \"\\u000c\\uffff\\u0001\\u0003\\u0002\\uffff\\u0001\\u0004\\u0001\\u0005\\u0003\"+\n    \"\\uffff\\u0001\\u0001\\u0001\\u0002\\u0001\\u0006\\u0001\\u0007\",\n    DFA172_specialS:\n        \"\\u0018\\uffff}>\",\n    DFA172_transitionS: [\n            \"\\u0006\\u000f\\u0001\\u0003\\u0008\\u000f\\u0001\\u0007\\u0009\\u000f\"+\n            \"\\u0001\\u0001\\u0001\\u0002\\u000b\\u000f\\u0001\\u000d\\u000b\\u000f\"+\n            \"\\u0001\\u000b\\u000b\\u000f\\u0001\\u000a\\u000b\\u000f\\u0001\\u0006\"+\n            \"\\u0001\\u0013\\u0001\\u000e\\u0001\\u0011\\u0001\\u0012\\u0003\\u000f\"+\n            \"\\u0001\\u0005\\u0001\\u0004\\u0005\\u000f\\u0001\\u0008\\u0017\\u000f\"+\n            \"\\u0001\\u0009\\u0020\\u000f\\u0001\\uffff\\u003f\\u000f\\u0001\\uffff\"+\n            \"\\u0001\\u0010\\u000b\\uffff\\u0001\\u000c\\u001f\\uffff\\u0001\\u000f\"+\n            \"\\u0006\\uffff\\u0001\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0014\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0015\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u000c\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0016\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\",\n            \"\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0016\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0016\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\\u0004\\u000f\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\\u0002\\u000f\\u0004\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0002\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\\u0001\\uffff\"+\n            \"\\u0002\\u000f\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0001\\uffff\\u0003\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0002\\u000f\\u000b\\uffff\\u0002\\u000f\"+\n            \"\\u0005\\uffff\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0002\\uffff\"+\n            \"\\u0001\\u000f\\u0004\\uffff\\u0001\\u000f\\u0001\\uffff\\u0001\\u000f\"+\n            \"\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\\u0002\\u000f\\u0006\\uffff\"+\n            \"\\u0001\\u000f\\u0005\\uffff\\u0001\\u000f\\u0007\\uffff\\u0002\\u000f\"+\n            \"\\u0004\\uffff\\u0001\\u000f\\u0003\\uffff\\u0001\\u000f\\u0007\\uffff\"+\n            \"\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0014\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0001\\u000f\\u0002\\uffff\\u0001\\u000f\\u0003\\uffff\"+\n            \"\\u0001\\u000f\\u0006\\uffff\\u0001\\u000f\\u0013\\uffff\\u0001\\u000f\"+\n            \"\\u0001\\u0017\\u0001\\u000f\\u0002\\uffff\\u0003\\u000f\\u0001\\uffff\"+\n            \"\\u0004\\u000f\\u0003\\uffff\\u000b\\u000f\\u0005\\uffff\\u0001\\u000f\"+\n            \"\\u0003\\uffff\\u0002\\u000f\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA172_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA172_eotS),\n    DFA172_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA172_eofS),\n    DFA172_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA172_minS),\n    DFA172_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA172_maxS),\n    DFA172_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA172_acceptS),\n    DFA172_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA172_specialS),\n    DFA172_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA172_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA172_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA172 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 172;\n    this.eot = XQueryParser.DFA172_eot;\n    this.eof = XQueryParser.DFA172_eof;\n    this.min = XQueryParser.DFA172_min;\n    this.max = XQueryParser.DFA172_max;\n    this.accept = XQueryParser.DFA172_accept;\n    this.special = XQueryParser.DFA172_special;\n    this.transition = XQueryParser.DFA172_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA172, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"1337:1: p_ItemType : ( p_KindTest -> ^( KindTest p_KindTest ) | ( ITEM LPAREN RPAREN ) -> ^( ItemTest ITEM LPAREN RPAREN ) | p_FunctionTest -> ^( FunctionTest p_FunctionTest ) | p_AtomicOrUnionType | p_ParenthesizedItemType | p_JSONTest | p_StructuredItemTest );\";\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA195_eotS:\n        \"\\u000f\\uffff\",\n    DFA195_eofS:\n        \"\\u000f\\uffff\",\n    DFA195_minS:\n        \"\\u0001\\u0094\\u0004\\u004e\\u000a\\uffff\",\n    DFA195_maxS:\n        \"\\u0001\\u009f\\u0002\\u009d\\u0001\\u004f\\u0001\\u00a3\\u000a\\uffff\",\n    DFA195_acceptS:\n        \"\\u0005\\uffff\\u0001\\u0005\\u0001\\u000a\\u0001\\u0007\\u0001\\u0001\\u0001\"+\n    \"\\u0006\\u0001\\u0002\\u0001\\u0003\\u0001\\u0008\\u0001\\u0009\\u0001\\u0004\",\n    DFA195_specialS:\n        \"\\u000f\\uffff}>\",\n    DFA195_transitionS: [\n            \"\\u0001\\u0005\\u0001\\u0002\\u0001\\uffff\\u0001\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0006\\u0003\\uffff\\u0001\\u0003\\u0001\\u0004\",\n            \"\\u0001\\u0008\\u0001\\u0007\\u004d\\uffff\\u0001\\u0008\",\n            \"\\u0001\\u000a\\u0001\\u0009\\u004d\\uffff\\u0001\\u000a\",\n            \"\\u0001\\u000b\\u0001\\u000c\",\n            \"\\u0001\\u000e\\u0001\\u000d\\u0053\\uffff\\u0001\\u000e\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA195_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA195_eotS),\n    DFA195_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA195_eofS),\n    DFA195_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA195_minS),\n    DFA195_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA195_maxS),\n    DFA195_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA195_acceptS),\n    DFA195_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA195_specialS),\n    DFA195_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA195_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA195_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA195 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 195;\n    this.eot = XQueryParser.DFA195_eot;\n    this.eof = XQueryParser.DFA195_eof;\n    this.min = XQueryParser.DFA195_min;\n    this.max = XQueryParser.DFA195_max;\n    this.accept = XQueryParser.DFA195_accept;\n    this.special = XQueryParser.DFA195_special;\n    this.transition = XQueryParser.DFA195_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA195, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"1697:1: pg_UpdateExpr : ( p_InsertExpr | p_DeleteExpr | p_RenameExpr | p_ReplaceExpr | p_TransformExpr | p_JSONDeleteExpr | p_JSONInsertExpr | p_JSONRenameExpr | p_JSONReplaceExpr | p_JSONAppendExpr );\";\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA230_eotS:\n        \"\\u000a\\uffff\",\n    DFA230_eofS:\n        \"\\u000a\\uffff\",\n    DFA230_minS:\n        \"\\u0001\\u001a\\u0002\\uffff\\u0001\\u00c4\\u0006\\uffff\",\n    DFA230_maxS:\n        \"\\u0001\\u00cb\\u0002\\uffff\\u0001\\u00cb\\u0006\\uffff\",\n    DFA230_acceptS:\n        \"\\u0001\\uffff\\u0001\\u0001\\u0001\\u0002\\u0001\\uffff\\u0001\\u0003\\u0001\"+\n    \"\\u0004\\u0001\\u0005\\u0001\\u0006\\u0001\\u0007\\u0001\\u0008\",\n    DFA230_specialS:\n        \"\\u000a\\uffff}>\",\n    DFA230_transitionS: [\n            \"\\u0001\\u0006\\u0036\\uffff\\u0001\\u0009\\u0057\\uffff\\u0001\\u0007\"+\n            \"\\u000a\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0006\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u000b\\uffff\\u0001\\u0005\\u0001\\u0008\\u0001\\u0004\"+\n            \"\\u0001\\uffff\\u0001\\u0006\\u0002\\uffff\\u0001\\u0002\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0005\\u0001\\u0008\\u0001\\u0004\\u0004\\uffff\\u0001\\u0002\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA230_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA230_eotS),\n    DFA230_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA230_eofS),\n    DFA230_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA230_minS),\n    DFA230_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA230_maxS),\n    DFA230_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA230_acceptS),\n    DFA230_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA230_specialS),\n    DFA230_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA230_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA230_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA230 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 230;\n    this.eot = XQueryParser.DFA230_eot;\n    this.eof = XQueryParser.DFA230_eof;\n    this.min = XQueryParser.DFA230_min;\n    this.max = XQueryParser.DFA230_max;\n    this.accept = XQueryParser.DFA230_accept;\n    this.special = XQueryParser.DFA230_special;\n    this.transition = XQueryParser.DFA230_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA230, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"1932:1: p_FTMatchOption : ( p_FTLanguageOption | p_FTWildCardOption | p_FTThesaurusOption | p_FTStemOption | p_FTCaseOption | p_FTDiacriticsOption | p_FTStopWordOption | p_FTExtensionOption );\";\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA249_eotS:\n        \"\\u0011\\uffff\",\n    DFA249_eofS:\n        \"\\u0011\\uffff\",\n    DFA249_minS:\n        \"\\u0001\\u0010\\u0001\\uffff\\u0001\\u0010\\u0005\\u0012\\u0001\\uffff\\u0001\"+\n    \"\\u0012\\u0001\\u00e8\\u0001\\u0010\\u0001\\u0004\\u0001\\u0012\\u0001\\u0004\\u0001\"+\n    \"\\u0010\\u0001\\u0012\",\n    DFA249_maxS:\n        \"\\u0001\\u0122\\u0001\\uffff\\u0001\\u0116\\u0005\\u0107\\u0001\\uffff\\u0001\"+\n    \"\\u0107\\u0001\\u00e8\\u0001\\u0116\\u0001\\u015c\\u0001\\u0107\\u0001\\u015c\\u0001\"+\n    \"\\u0116\\u0001\\u0107\",\n    DFA249_acceptS:\n        \"\\u0001\\uffff\\u0001\\u0001\\u0006\\uffff\\u0001\\u0002\\u0008\\uffff\",\n    DFA249_specialS:\n        \"\\u0011\\uffff}>\",\n    DFA249_transitionS: [\n            \"\\u0061\\u0001\\u0001\\u0007\\u005d\\u0001\\u0001\\u0004\\u0001\\u0005\"+\n            \"\\u0001\\u0006\\u0002\\u0001\\u0001\\u0003\\u000d\\u0001\\u0001\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0001\\u0002\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0004\\uffff\\u0001\\u0008\"+\n            \"\\u0004\\uffff\\u0004\\u0001\\u0005\\uffff\\u0002\\u0001\\u0001\\uffff\"+\n            \"\\u0002\\u0001\\u000c\\uffff\\u0002\\u0001\\u0002\\uffff\\u0002\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0006\\uffff\\u0006\\u0001\",\n            \"\",\n            \"\\u0092\\u0009\\u0001\\uffff\\u003f\\u0009\\u002d\\uffff\\u0001\\u000a\"+\n            \"\\u0006\\uffff\\u0001\\u0009\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u003a\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\u0008\\u0006\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u000c\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0003\\uffff\\u0002\\u0001\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u002a\\uffff\"+\n            \"\\u0001\\u0008\\u000f\\uffff\\u0002\\u0001\\u0006\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u000c\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0003\\uffff\\u0002\\u0001\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u002a\\uffff\"+\n            \"\\u0001\\u0008\\u000f\\uffff\\u0002\\u0001\\u0006\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u000c\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0003\\uffff\\u0002\\u0001\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u002b\\uffff\"+\n            \"\\u0001\\u0008\\u000e\\uffff\\u0002\\u0001\\u0006\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u000c\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0003\\uffff\\u0002\\u0001\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u003a\\uffff\"+\n            \"\\u0002\\u0001\\u0001\\uffff\\u0001\\u0008\\u0004\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u000c\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0003\\uffff\\u0002\\u0001\",\n            \"\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u003a\\uffff\"+\n            \"\\u0002\\u0001\\u0006\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\u0008\\u0001\\u0001\\u0003\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u000c\\u0001\\u0002\\uffff\\u0001\\u000b\\u0003\\uffff\\u0002\\u0001\",\n            \"\\u0001\\u000c\",\n            \"\\u0092\\u000d\\u0001\\uffff\\u003f\\u000d\\u0034\\uffff\\u0001\\u000d\",\n            \"\\u00e4\\u000e\\u0001\\uffff\\u0001\\u000f\\u0007\\u000e\\u0001\\uffff\"+\n            \"\\u006b\\u000e\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u003a\\uffff\"+\n            \"\\u0002\\u0001\\u0006\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\u0008\\u0001\\u0001\\u0003\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u000c\\u0001\\u0006\\uffff\\u0002\\u0001\",\n            \"\\u00e4\\u000e\\u0001\\uffff\\u0001\\u000f\\u0007\\u000e\\u0001\\uffff\"+\n            \"\\u006b\\u000e\",\n            \"\\u0092\\u0010\\u0001\\uffff\\u003f\\u0010\\u0034\\uffff\\u0001\\u0010\",\n            \"\\u0001\\u0001\\u0008\\uffff\\u0002\\u0001\\u000a\\uffff\\u0001\\u0001\"+\n            \"\\u0007\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\\u0005\\uffff\"+\n            \"\\u0001\\u0001\\u0001\\uffff\\u0002\\u0001\\u0004\\uffff\\u0003\\u0001\"+\n            \"\\u0002\\uffff\\u0001\\u0001\\u0002\\uffff\\u0002\\u0001\\u0002\\uffff\"+\n            \"\\u0001\\u0001\\u0006\\uffff\\u0001\\u0001\\u0018\\uffff\\u0002\\u0001\"+\n            \"\\u0001\\uffff\\u0001\\u0001\\u0038\\uffff\\u0001\\u0001\\u003a\\uffff\"+\n            \"\\u0002\\u0001\\u0006\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\\u0001\"+\n            \"\\u0001\\u0008\\u0001\\u0001\\u0003\\uffff\\u0001\\u0001\\u0001\\uffff\"+\n            \"\\u000c\\u0001\\u0006\\uffff\\u0002\\u0001\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA249_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA249_eotS),\n    DFA249_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA249_eofS),\n    DFA249_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA249_minS),\n    DFA249_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA249_maxS),\n    DFA249_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA249_acceptS),\n    DFA249_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA249_specialS),\n    DFA249_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA249_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA249_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA249 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 249;\n    this.eot = XQueryParser.DFA249_eot;\n    this.eof = XQueryParser.DFA249_eof;\n    this.min = XQueryParser.DFA249_min;\n    this.max = XQueryParser.DFA249_max;\n    this.accept = XQueryParser.DFA249_accept;\n    this.special = XQueryParser.DFA249_special;\n    this.transition = XQueryParser.DFA249_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA249, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"2046:1: p_Hybrid[strict, allowConcat] : ( p_HybridExprSingle[$strict,$allowConcat] | p_Statement );\";\n    },\n    dummy: null\n});\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA265_eotS:\n        \"\\u000c\\uffff\",\n    DFA265_eofS:\n        \"\\u0001\\uffff\\u0002\\u0003\\u0001\\uffff\\u0006\\u0003\\u0002\\uffff\",\n    DFA265_minS:\n        \"\\u0001\\u0010\\u0002\\u0012\\u0001\\uffff\\u0006\\u0012\\u0002\\uffff\",\n    DFA265_maxS:\n        \"\\u0001\\u0122\\u0002\\u0107\\u0001\\uffff\\u0006\\u0107\\u0002\\uffff\",\n    DFA265_acceptS:\n        \"\\u0003\\uffff\\u0001\\u0002\\u0006\\uffff\\u0001\\u0001\\u0001\\u0003\",\n    DFA265_specialS:\n        \"\\u0004\\uffff\\u0001\\u0002\\u0001\\u0004\\u0001\\u0005\\u0001\\u0001\\u0001\"+\n    \"\\u0003\\u0001\\u0000\\u0002\\uffff}>\",\n    DFA265_transitionS: [\n            \"\\u0020\\u0003\\u0001\\u0002\\u0034\\u0003\\u0001\\u0001\\u002e\\u0003\"+\n            \"\\u0001\\u0008\\u0001\\u0005\\u0001\\u0003\\u0001\\u0004\\u0002\\u0003\"+\n            \"\\u0001\\u0009\\u0003\\u0003\\u0001\\u0006\\u0001\\u0007\\u0042\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0002\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0009\\uffff\\u0004\\u0003\"+\n            \"\\u0005\\uffff\\u0002\\u0003\\u0001\\uffff\\u0002\\u0003\\u000c\\uffff\"+\n            \"\\u0002\\u0003\\u0002\\uffff\\u0002\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0006\\uffff\\u0006\\u0003\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0006\\uffff\"+\n            \"\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\\u0005\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\\u0001\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\"+\n            \"\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\\u0001\\u0003\\u0007\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\\u0003\\uffff\\u0001\\u0003\"+\n            \"\\u0007\\uffff\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u003a\\uffff\"+\n            \"\\u0003\\u0003\\u0001\\u000a\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u000c\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0006\\uffff\"+\n            \"\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\\u0005\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\\u0001\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\"+\n            \"\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\\u0001\\u0003\\u0007\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\\u0003\\uffff\\u0001\\u0003\"+\n            \"\\u0007\\uffff\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u003a\\uffff\"+\n            \"\\u0003\\u0003\\u0001\\u000a\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u000c\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0002\\uffff\"+\n            \"\\u0002\\u000b\\u0002\\uffff\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\"+\n            \"\\u0005\\uffff\\u0001\\u0003\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0002\\u0003\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\"+\n            \"\\u0001\\u0003\\u0007\\uffff\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\u000b\\u0006\\uffff\\u0001\\u0003\"+\n            \"\\u0002\\uffff\\u0001\\u0003\\u003a\\uffff\\u0003\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u0001\\uffff\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u000c\\u0003\\u0002\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0002\\uffff\"+\n            \"\\u0002\\u000b\\u0002\\uffff\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\"+\n            \"\\u0005\\uffff\\u0001\\u0003\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0002\\u0003\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\"+\n            \"\\u0001\\u0003\\u0007\\uffff\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\u000b\\u0006\\uffff\\u0001\\u0003\"+\n            \"\\u0002\\uffff\\u0001\\u0003\\u003a\\uffff\\u0003\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u0001\\uffff\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u000c\\u0003\\u0002\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0002\\uffff\"+\n            \"\\u0002\\u000b\\u0002\\uffff\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\"+\n            \"\\u0005\\uffff\\u0001\\u0003\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0002\\u0003\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\"+\n            \"\\u0001\\u0003\\u0007\\uffff\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0007\\uffff\\u0001\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u003a\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u000c\\u0003\"+\n            \"\\u0002\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0002\\uffff\"+\n            \"\\u0002\\u000b\\u0002\\uffff\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\"+\n            \"\\u0005\\uffff\\u0001\\u0003\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0002\\u0003\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\"+\n            \"\\u0001\\u0003\\u0007\\uffff\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0006\\uffff\\u0001\\u000b\\u0001\\u0003\"+\n            \"\\u0002\\uffff\\u0001\\u0003\\u003a\\uffff\\u0003\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u0001\\uffff\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u000c\\u0003\\u0002\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0006\\uffff\"+\n            \"\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\\u0005\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\\u0001\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\"+\n            \"\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\\u0001\\u0003\\u0007\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\\u0003\\uffff\\u0001\\u0003\"+\n            \"\\u0007\\uffff\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u003a\\uffff\"+\n            \"\\u0003\\u0003\\u0001\\u000b\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u000c\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\\u0004\\u0003\\u0004\\uffff\\u0003\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0004\\uffff\\u0001\\u0003\\u0002\\uffff\\u0002\\u0003\\u0004\\uffff\"+\n            \"\\u0001\\u0003\\u0002\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0002\\u0003\\u0004\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\\u0003\\uffff\"+\n            \"\\u0001\\u000b\\u0002\\uffff\\u0002\\u0003\\u000b\\uffff\\u0002\\u0003\"+\n            \"\\u0005\\uffff\\u0001\\u0003\\u0004\\uffff\\u0002\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0002\\u0003\\u0006\\uffff\\u0001\\u0003\\u0005\\uffff\"+\n            \"\\u0001\\u0003\\u0007\\uffff\\u0002\\u0003\\u0004\\uffff\\u0001\\u0003\"+\n            \"\\u0003\\uffff\\u0001\\u0003\\u0007\\uffff\\u0001\\u0003\\u0002\\uffff\"+\n            \"\\u0001\\u0003\\u003a\\uffff\\u0003\\u0003\\u0002\\uffff\\u0001\\u0003\"+\n            \"\\u0001\\uffff\\u0004\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\"+\n            \"\\u0001\\u0003\\u0001\\uffff\\u0001\\u0003\\u0001\\uffff\\u000c\\u0003\"+\n            \"\\u0002\\uffff\\u0001\\u0003\\u0003\\uffff\\u0002\\u0003\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XQueryParser, {\n    DFA265_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA265_eotS),\n    DFA265_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA265_eofS),\n    DFA265_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA265_minS),\n    DFA265_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XQueryParser.DFA265_maxS),\n    DFA265_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA265_acceptS),\n    DFA265_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA265_specialS),\n    DFA265_transition: (function() {\n        var a = [],\n            i,\n            numStates = XQueryParser.DFA265_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XQueryParser.DFA265_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXQueryParser.DFA265 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 265;\n    this.eot = XQueryParser.DFA265_eot;\n    this.eof = XQueryParser.DFA265_eof;\n    this.min = XQueryParser.DFA265_min;\n    this.max = XQueryParser.DFA265_max;\n    this.accept = XQueryParser.DFA265_accept;\n    this.special = XQueryParser.DFA265_special;\n    this.transition = XQueryParser.DFA265_transition;\n};\n\norg.antlr.lang.extend(XQueryParser.DFA265, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"2207:1: p_ExprSimple : ( p_QuantifiedExpr | p_OrExpr | {...}? => pg_UpdateExpr );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA265_9 = input.LA(1);\n\n                             \n                            var index265_9 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA265_9==JSON) && ((this.lc(XQU)))) {s = 11;}\n\n                            else if ( (LA265_9==EOF||(LA265_9>=AND && LA265_9<=AT)||(LA265_9>=CASE && LA265_9<=CASTABLE)||LA265_9==COLLATION||LA265_9==DEFAULT||(LA265_9>=DESCENDING && LA265_9<=DIV)||LA265_9==EMPTY||LA265_9==EQ||LA265_9==EXCEPT||LA265_9==FOR||LA265_9==GE||(LA265_9>=GT && LA265_9<=IDIV)||(LA265_9>=INSTANCE && LA265_9<=IS)||LA265_9==LE||(LA265_9>=LET && LA265_9<=MOD)||LA265_9==NE||(LA265_9>=OR && LA265_9<=ORDER)||(LA265_9>=RETURN && LA265_9<=SATISFIES)||LA265_9==STABLE||(LA265_9>=TO && LA265_9<=TREAT)||LA265_9==UNION||LA265_9==WHERE||LA265_9==COUNT||(LA265_9>=END && LA265_9<=GROUP)||LA265_9==ONLY||LA265_9==START||(LA265_9>=AFTER && LA265_9<=BEFORE)||LA265_9==INTO||LA265_9==MODIFY||LA265_9==WITH||LA265_9==CONTAINS||(LA265_9>=CONCAT && LA265_9<=RPAREN)||LA265_9==R_UNION_BRACKET||(LA265_9>=RBRACKET && LA265_9<=EQUAL)||LA265_9==NOTEQUAL||LA265_9==HASH||LA265_9==COMMA||(LA265_9>=STAR && LA265_9<=BANG)||LA265_9==COLON||(LA265_9>=SEMICOLON && LA265_9<=VBAR)) ) {s = 3;}\n\n                             \n                            input.seek(index265_9);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA265_7 = input.LA(1);\n\n                             \n                            var index265_7 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA265_7>=NODE && LA265_7<=JSON)||LA265_7==VALUE) && ((this.lc(XQU)))) {s = 11;}\n\n                            else if ( (LA265_7==EOF||(LA265_7>=AND && LA265_7<=AT)||(LA265_7>=CASE && LA265_7<=CASTABLE)||LA265_7==COLLATION||LA265_7==DEFAULT||(LA265_7>=DESCENDING && LA265_7<=DIV)||LA265_7==EMPTY||LA265_7==EQ||LA265_7==EXCEPT||LA265_7==FOR||LA265_7==GE||(LA265_7>=GT && LA265_7<=IDIV)||(LA265_7>=INSTANCE && LA265_7<=IS)||LA265_7==LE||(LA265_7>=LET && LA265_7<=MOD)||LA265_7==NE||(LA265_7>=OR && LA265_7<=ORDER)||(LA265_7>=RETURN && LA265_7<=SATISFIES)||LA265_7==STABLE||(LA265_7>=TO && LA265_7<=TREAT)||LA265_7==UNION||LA265_7==WHERE||LA265_7==COUNT||(LA265_7>=END && LA265_7<=GROUP)||LA265_7==ONLY||LA265_7==START||(LA265_7>=AFTER && LA265_7<=BEFORE)||LA265_7==INTO||LA265_7==MODIFY||LA265_7==WITH||LA265_7==CONTAINS||(LA265_7>=CONCAT && LA265_7<=RPAREN)||LA265_7==R_UNION_BRACKET||(LA265_7>=RBRACKET && LA265_7<=EQUAL)||LA265_7==NOTEQUAL||LA265_7==HASH||LA265_7==COMMA||(LA265_7>=STAR && LA265_7<=BANG)||LA265_7==COLON||(LA265_7>=SEMICOLON && LA265_7<=VBAR)) ) {s = 3;}\n\n                             \n                            input.seek(index265_7);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA265_4 = input.LA(1);\n\n                             \n                            var index265_4 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA265_4>=NODE && LA265_4<=JSON)||LA265_4==NODES) && ((this.lc(XQU)))) {s = 11;}\n\n                            else if ( (LA265_4==EOF||(LA265_4>=AND && LA265_4<=AT)||(LA265_4>=CASE && LA265_4<=CASTABLE)||LA265_4==COLLATION||LA265_4==DEFAULT||(LA265_4>=DESCENDING && LA265_4<=DIV)||LA265_4==EMPTY||LA265_4==EQ||LA265_4==EXCEPT||LA265_4==FOR||LA265_4==GE||(LA265_4>=GT && LA265_4<=IDIV)||(LA265_4>=INSTANCE && LA265_4<=IS)||LA265_4==LE||(LA265_4>=LET && LA265_4<=MOD)||LA265_4==NE||(LA265_4>=OR && LA265_4<=ORDER)||(LA265_4>=RETURN && LA265_4<=SATISFIES)||LA265_4==STABLE||(LA265_4>=TO && LA265_4<=TREAT)||LA265_4==UNION||LA265_4==WHERE||LA265_4==COUNT||(LA265_4>=END && LA265_4<=GROUP)||LA265_4==ONLY||LA265_4==START||(LA265_4>=AFTER && LA265_4<=BEFORE)||LA265_4==INTO||LA265_4==MODIFY||LA265_4==WITH||LA265_4==CONTAINS||(LA265_4>=CONCAT && LA265_4<=RPAREN)||LA265_4==R_UNION_BRACKET||(LA265_4>=RBRACKET && LA265_4<=EQUAL)||LA265_4==NOTEQUAL||LA265_4==HASH||LA265_4==COMMA||(LA265_4>=STAR && LA265_4<=BANG)||LA265_4==COLON||(LA265_4>=SEMICOLON && LA265_4<=VBAR)) ) {s = 3;}\n\n                             \n                            input.seek(index265_4);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 3 : \n                            var LA265_8 = input.LA(1);\n\n                             \n                            var index265_8 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA265_8==DOLLAR) && ((this.lc(XQU)))) {s = 11;}\n\n                            else if ( (LA265_8==EOF||(LA265_8>=AND && LA265_8<=AT)||(LA265_8>=CASE && LA265_8<=CASTABLE)||LA265_8==COLLATION||LA265_8==DEFAULT||(LA265_8>=DESCENDING && LA265_8<=DIV)||LA265_8==EMPTY||LA265_8==EQ||LA265_8==EXCEPT||LA265_8==FOR||LA265_8==GE||(LA265_8>=GT && LA265_8<=IDIV)||(LA265_8>=INSTANCE && LA265_8<=IS)||LA265_8==LE||(LA265_8>=LET && LA265_8<=MOD)||LA265_8==NE||(LA265_8>=OR && LA265_8<=ORDER)||(LA265_8>=RETURN && LA265_8<=SATISFIES)||LA265_8==STABLE||(LA265_8>=TO && LA265_8<=TREAT)||LA265_8==UNION||LA265_8==WHERE||LA265_8==COUNT||(LA265_8>=END && LA265_8<=GROUP)||LA265_8==ONLY||LA265_8==START||(LA265_8>=AFTER && LA265_8<=BEFORE)||LA265_8==INTO||LA265_8==MODIFY||LA265_8==WITH||LA265_8==CONTAINS||(LA265_8>=CONCAT && LA265_8<=RPAREN)||LA265_8==R_UNION_BRACKET||(LA265_8>=RBRACKET && LA265_8<=EQUAL)||LA265_8==NOTEQUAL||LA265_8==HASH||LA265_8==COMMA||(LA265_8>=STAR && LA265_8<=BANG)||LA265_8==COLON||(LA265_8>=SEMICOLON && LA265_8<=VBAR)) ) {s = 3;}\n\n                             \n                            input.seek(index265_8);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 4 : \n                            var LA265_5 = input.LA(1);\n\n                             \n                            var index265_5 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA265_5>=NODE && LA265_5<=JSON)||LA265_5==NODES) && ((this.lc(XQU)))) {s = 11;}\n\n                            else if ( (LA265_5==EOF||(LA265_5>=AND && LA265_5<=AT)||(LA265_5>=CASE && LA265_5<=CASTABLE)||LA265_5==COLLATION||LA265_5==DEFAULT||(LA265_5>=DESCENDING && LA265_5<=DIV)||LA265_5==EMPTY||LA265_5==EQ||LA265_5==EXCEPT||LA265_5==FOR||LA265_5==GE||(LA265_5>=GT && LA265_5<=IDIV)||(LA265_5>=INSTANCE && LA265_5<=IS)||LA265_5==LE||(LA265_5>=LET && LA265_5<=MOD)||LA265_5==NE||(LA265_5>=OR && LA265_5<=ORDER)||(LA265_5>=RETURN && LA265_5<=SATISFIES)||LA265_5==STABLE||(LA265_5>=TO && LA265_5<=TREAT)||LA265_5==UNION||LA265_5==WHERE||LA265_5==COUNT||(LA265_5>=END && LA265_5<=GROUP)||LA265_5==ONLY||LA265_5==START||(LA265_5>=AFTER && LA265_5<=BEFORE)||LA265_5==INTO||LA265_5==MODIFY||LA265_5==WITH||LA265_5==CONTAINS||(LA265_5>=CONCAT && LA265_5<=RPAREN)||LA265_5==R_UNION_BRACKET||(LA265_5>=RBRACKET && LA265_5<=EQUAL)||LA265_5==NOTEQUAL||LA265_5==HASH||LA265_5==COMMA||(LA265_5>=STAR && LA265_5<=BANG)||LA265_5==COLON||(LA265_5>=SEMICOLON && LA265_5<=VBAR)) ) {s = 3;}\n\n                             \n                            input.seek(index265_5);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 5 : \n                            var LA265_6 = input.LA(1);\n\n                             \n                            var index265_6 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA265_6>=NODE && LA265_6<=JSON)) && ((this.lc(XQU)))) {s = 11;}\n\n                            else if ( (LA265_6==EOF||(LA265_6>=AND && LA265_6<=AT)||(LA265_6>=CASE && LA265_6<=CASTABLE)||LA265_6==COLLATION||LA265_6==DEFAULT||(LA265_6>=DESCENDING && LA265_6<=DIV)||LA265_6==EMPTY||LA265_6==EQ||LA265_6==EXCEPT||LA265_6==FOR||LA265_6==GE||(LA265_6>=GT && LA265_6<=IDIV)||(LA265_6>=INSTANCE && LA265_6<=IS)||LA265_6==LE||(LA265_6>=LET && LA265_6<=MOD)||LA265_6==NE||(LA265_6>=OR && LA265_6<=ORDER)||(LA265_6>=RETURN && LA265_6<=SATISFIES)||LA265_6==STABLE||(LA265_6>=TO && LA265_6<=TREAT)||LA265_6==UNION||LA265_6==WHERE||LA265_6==COUNT||(LA265_6>=END && LA265_6<=GROUP)||LA265_6==ONLY||LA265_6==START||(LA265_6>=AFTER && LA265_6<=BEFORE)||LA265_6==INTO||LA265_6==MODIFY||LA265_6==WITH||LA265_6==CONTAINS||(LA265_6>=CONCAT && LA265_6<=RPAREN)||LA265_6==R_UNION_BRACKET||(LA265_6>=RBRACKET && LA265_6<=EQUAL)||LA265_6==NOTEQUAL||LA265_6==HASH||LA265_6==COMMA||(LA265_6>=STAR && LA265_6<=BANG)||LA265_6==COLON||(LA265_6>=SEMICOLON && LA265_6<=VBAR)) ) {s = 3;}\n\n                             \n                            input.seek(index265_6);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        if (this.recognizer.state.backtracking>0) {this.recognizer.state.failed=true; return -1;}\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 265, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\n \n\n// public class variables\norg.antlr.lang.augmentObject(XQueryParser, {\n    tokenNames: [\"<invalid>\", \"<EOR>\", \"<DOWN>\", \"<UP>\", \"L_QuotAttrContentChar\", \"L_AposAttrContentChar\", \"L_ElementContentChar\", \"L_CDataSection\", \"L_PredefinedEntityRef\", \"L_CharRef\", \"ESCAPE_LBRACKET\", \"ESCAPE_RBRACKET\", \"ESCAPE_APOS\", \"ESCAPE_QUOT\", \"CDATA_START\", \"CDATA_END\", \"ANCESTOR\", \"ANCESTOR_OR_SELF\", \"AND\", \"AS\", \"ASCENDING\", \"AT\", \"ATTRIBUTE\", \"BASE_URI\", \"BOUNDARY_SPACE\", \"BY\", \"CASE\", \"CAST\", \"CASTABLE\", \"CHILD\", \"COLLATION\", \"COMMENT\", \"CONSTRUCTION\", \"COPY_NAMESPACES\", \"DECLARE\", \"DEFAULT\", \"DESCENDANT\", \"DESCENDANT_OR_SELF\", \"DESCENDING\", \"DIV\", \"DOCUMENT\", \"DOCUMENT_NODE\", \"ELEMENT\", \"ELSE\", \"EMPTY\", \"EMPTY_SEQUENCE\", \"ENCODING\", \"EQ\", \"EVERY\", \"EXCEPT\", \"EXTERNAL\", \"FOLLOWING\", \"FOLLOWING_SIBLING\", \"FOR\", \"FUNCTION\", \"GE\", \"GREATEST\", \"GT\", \"IDIV\", \"IF\", \"IMPORT\", \"IN\", \"INHERIT\", \"INSTANCE\", \"INTERSECT\", \"IS\", \"ITEM\", \"LAX\", \"LE\", \"LEAST\", \"LET\", \"LT\", \"MOD\", \"MODULE\", \"NAMESPACE\", \"NE\", \"NO_INHERIT\", \"NO_PRESERVE\", \"NODE\", \"JSON\", \"OF\", \"OPTION\", \"OR\", \"ORDER\", \"ORDERED\", \"ORDERING\", \"PARENT\", \"PRECEDING\", \"PRECEDING_SIBLING\", \"PRESERVE\", \"PROCESSING_INSTRUCTION\", \"STRUCTURED_ITEM\", \"JSON_ITEM\", \"OBJECT\", \"ARRAY\", \"RETURN\", \"SATISFIES\", \"SCHEMA\", \"SCHEMA_ATTRIBUTE\", \"SCHEMA_ELEMENT\", \"SELF\", \"SOME\", \"STABLE\", \"STRICT\", \"STRIP\", \"TEXT\", \"THEN\", \"TO\", \"TREAT\", \"TYPESWITCH\", \"UNION\", \"UNORDERED\", \"VALIDATE\", \"VARIABLE\", \"VERSION\", \"WHERE\", \"XQUERY\", \"ALLOWING\", \"CATCH\", \"CONTEXT\", \"COUNT\", \"DECIMAL_FORMAT\", \"DECIMAL_SEPARATOR\", \"DIGIT\", \"END\", \"GROUP\", \"GROUPING_SEPARATOR\", \"INFINITY\", \"MINUS_SIGN\", \"NAMESPACE_NODE\", \"NAN\", \"NEXT\", \"ONLY\", \"PATTERN_SEPARATOR\", \"PERCENT\", \"PER_MILLE\", \"PREVIOUS\", \"SLIDING\", \"START\", \"SWITCH\", \"TRY\", \"TUMBLING\", \"TYPE\", \"WHEN\", \"WINDOW\", \"ZERO_DIGIT\", \"AFTER\", \"BEFORE\", \"COPY\", \"DELETE\", \"FIRST\", \"INSERT\", \"INTO\", \"POSITION\", \"APPEND\", \"LAST\", \"MODIFY\", \"NODES\", \"RENAME\", \"REPLACE\", \"REVALIDATION\", \"SKIP\", \"UPDATING\", \"VALUE\", \"WITH\", \"ALL\", \"ANY\", \"CONTAINS\", \"CONTENT\", \"DIACRITICS\", \"DIFFERENT\", \"DISTANCE\", \"ENTIRE\", \"EXACTLY\", \"FROM\", \"FT_OPTION\", \"FTAND\", \"FTNOT\", \"FTOR\", \"INSENSITIVE\", \"LANGUAGE\", \"LEVELS\", \"LOWERCASE\", \"MOST\", \"NO\", \"NOT\", \"OCCURS\", \"PARAGRAPH\", \"PARAGRAPHS\", \"PHRASE\", \"RELATIONSHIP\", \"SAME\", \"SCORE\", \"SENSITIVE\", \"SENTENCE\", \"SENTENCES\", \"STEMMING\", \"STOP\", \"THESAURUS\", \"TIMES\", \"UPPERCASE\", \"USING\", \"WEIGHT\", \"WILDCARDS\", \"WITHOUT\", \"WORD\", \"WORDS\", \"BREAK\", \"CONTINUE\", \"EXIT\", \"LOOP\", \"RETURNING\", \"WHILE\", \"CHECK\", \"COLLECTION\", \"CONSTRAINT\", \"FOREACH\", \"FOREIGN\", \"INDEX\", \"INTEGRITY\", \"KEY\", \"ON\", \"UNIQUE\", \"AMP_ER\", \"APOS_ER\", \"QUOT_ER\", \"CONCAT\", \"LPAREN\", \"RPAREN\", \"DOLLAR\", \"L_UNION_BRACKET\", \"R_UNION_BRACKET\", \"LBRACKET\", \"RBRACKET\", \"LSQUARE\", \"RSQUARE\", \"EQUAL\", \"BIND\", \"NOTEQUAL\", \"ANN_PERCENT\", \"HASH\", \"AMP\", \"COMMA\", \"QUESTION\", \"STAR\", \"PLUS\", \"MINUS\", \"SMALLER\", \"GREATER\", \"SMALLEREQ\", \"GREATEREQ\", \"SMALLER_SMALLER\", \"GREATER_GREATER\", \"SLASH\", \"SLASH_SLASH\", \"BANG\", \"DOT\", \"DOT_DOT\", \"COLON\", \"COLON_COLON\", \"EMPTY_CLOSE_TAG\", \"CLOSE_TAG\", \"SEMICOLON\", \"VBAR\", \"PRAGMA_START\", \"PRAGMA_END\", \"XML_COMMENT_START\", \"XML_COMMENT_END\", \"PI_START\", \"PI_END\", \"ATTR_SIGN\", \"Q\", \"CHARREF_DEC\", \"CHARREF_HEX\", \"APOS\", \"QUOT\", \"NCNameStartChar\", \"NCNameChar\", \"L_NCName\", \"Letter\", \"HexLetter\", \"Digit\", \"Digits\", \"S\", \"SU\", \"L_Pragma\", \"L_DirCommentConstructor\", \"L_DirPIConstructor\", \"L_IntegerLiteral\", \"L_DecimalLiteral\", \"L_DoubleLiteral\", \"L_Comment\", \"L_AnyChar\", \"L_QuotStringLiteralChar\", \"L_AposStringLiteralChar\", \"LibraryModule\", \"MainModule\", \"VersionDecl\", \"VersionDeclEncoding\", \"VersionDeclVersion\", \"ModuleDecl\", \"Prolog\", \"DefaultNamespaceDecls\", \"DefaultNamespaceDecl\", \"Setters\", \"Setter\", \"NamespaceDecls\", \"NamespaceDecl\", \"Imports\", \"FTOptionDecls\", \"SchemaImport\", \"SchemaPrefix\", \"NamespaceName\", \"DefaultElementNamespace\", \"AtHints\", \"ModuleImport\", \"BaseURIDecl\", \"OrderedDecls\", \"VarDecl\", \"VarType\", \"VarValue\", \"VarDefaultValue\", \"VarVariableDecl\", \"FunctionDecl\", \"ParamList\", \"ReturnType\", \"OptionDecl\", \"TypeDeclaration\", \"Param\", \"EnclosedExpr\", \"QueryBody\", \"UnaryExpr\", \"DirElemConstructor\", \"DirAttributeList\", \"DirAttributeValue\", \"DirElemContent\", \"CommonContent\", \"SequenceType\", \"EmptySequenceTest\", \"KindTest\", \"ItemTest\", \"FunctionTest\", \"AtomicType\", \"AtomicOrUnionType\", \"StringLiteral\", \"ElementContentChar\", \"AttributeValueChar\", \"QName\", \"BlockExpr\"],\n    FOLLOW_p_VersionDecl_in_p_Module503: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_LibraryModule_in_p_Module536: new org.antlr.runtime.BitSet([0x00000000, 0x00000000]),\n    FOLLOW_p_MainModule_in_p_Module559: new org.antlr.runtime.BitSet([0x00000000, 0x00000000]),\n    FOLLOW_EOF_in_p_Module583: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_XQUERY_in_p_VersionDecl611: new org.antlr.runtime.BitSet([0x00000000, 0x00004000,0x00000000, 0x00040000]),\n    FOLLOW_ENCODING_in_p_VersionDecl619: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_VersionDecl625: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_VERSION_in_p_VersionDecl646: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_VersionDecl652: new org.antlr.runtime.BitSet([0x00000000, 0x00004000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_ENCODING_in_p_VersionDecl657: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_VersionDecl663: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_VersionDecl669: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_Prolog_in_p_MainModule735: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_pm_QueryBody_in_p_MainModule737: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ModuleDecl_in_p_LibraryModule793: new org.antlr.runtime.BitSet([0x00000000, 0x10000004]),\n    FOLLOW_pm_Prolog_in_p_LibraryModule795: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_MODULE_in_p_ModuleDecl851: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_NAMESPACE_in_p_ModuleDecl855: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_p_ModuleDecl859: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00001000]),\n    FOLLOW_EQUAL_in_p_ModuleDecl861: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_ModuleDecl863: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_ModuleDecl865: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_DefaultNamespaceDecl_in_pm_Prolog924: new org.antlr.runtime.BitSet([0x00000002, 0x10000004]),\n    FOLLOW_p_Setter_in_pm_Prolog930: new org.antlr.runtime.BitSet([0x00000002, 0x10000004]),\n    FOLLOW_pm_NamespaceDecl_in_pm_Prolog936: new org.antlr.runtime.BitSet([0x00000002, 0x10000004]),\n    FOLLOW_p_Import_in_pm_Prolog942: new org.antlr.runtime.BitSet([0x00000002, 0x10000004]),\n    FOLLOW_pm_FTOptionDecl_in_pm_Prolog948: new org.antlr.runtime.BitSet([0x00000002, 0x10000004]),\n    FOLLOW_pg_OrderedDecl_in_pm_Prolog955: new org.antlr.runtime.BitSet([0x00000002, 0x00000004]),\n    FOLLOW_pm_ContextItemDecl_in_pg_OrderedDecl1270: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_AnnotatedDecl_in_pg_OrderedDecl1282: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_OptionDecl_in_pg_OrderedDecl1294: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_BoundarySpaceDecl_in_p_Setter1324: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_DefaultCollationDecl_in_p_Setter1336: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_BaseURIDecl_in_p_Setter1348: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_ConstructionDecl_in_p_Setter1360: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_OrderingModeDecl_in_p_Setter1372: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_EmptyOrderDecl_in_p_Setter1384: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_RevalidationDecl_in_p_Setter1399: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CopyNamespacesDecl_in_p_Setter1411: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_DecimalFormatDecl_in_p_Setter1423: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_BoundarySpaceDecl1455: new org.antlr.runtime.BitSet([0x01000000, 0x00000000]),\n    FOLLOW_BOUNDARY_SPACE_in_pm_BoundarySpaceDecl1461: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x02000000, 0x00000100]),\n    FOLLOW_PRESERVE_in_pm_BoundarySpaceDecl1470: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_STRIP_in_pm_BoundarySpaceDecl1480: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_BoundarySpaceDecl1487: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_DefaultCollationDecl1515: new org.antlr.runtime.BitSet([0x00000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_pm_DefaultCollationDecl1521: new org.antlr.runtime.BitSet([0x40000000, 0x00000000]),\n    FOLLOW_COLLATION_in_pm_DefaultCollationDecl1527: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_DefaultCollationDecl1531: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_DefaultCollationDecl1533: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_BaseURIDecl1569: new org.antlr.runtime.BitSet([0x00800000, 0x00000000]),\n    FOLLOW_BASE_URI_in_pm_BaseURIDecl1575: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_BaseURIDecl1581: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_BaseURIDecl1583: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_ConstructionDecl1636: new org.antlr.runtime.BitSet([0x00000000, 0x00000001]),\n    FOLLOW_CONSTRUCTION_in_pm_ConstructionDecl1642: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x02000000, 0x00000100]),\n    FOLLOW_STRIP_in_pm_ConstructionDecl1651: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_PRESERVE_in_pm_ConstructionDecl1657: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_ConstructionDecl1664: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_OrderingModeDecl1692: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00200000, 0x00000000]),\n    FOLLOW_ORDERING_in_pm_OrderingModeDecl1698: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00100000, 0x00008000]),\n    FOLLOW_ORDERED_in_pm_OrderingModeDecl1707: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_UNORDERED_in_pm_OrderingModeDecl1713: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_OrderingModeDecl1720: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_EmptyOrderDecl1748: new org.antlr.runtime.BitSet([0x00000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_pm_EmptyOrderDecl1754: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00080000, 0x00000000]),\n    FOLLOW_ORDER_in_pm_EmptyOrderDecl1760: new org.antlr.runtime.BitSet([0x00000000, 0x00001000]),\n    FOLLOW_EMPTY_in_pm_EmptyOrderDecl1766: new org.antlr.runtime.BitSet([0x00000000, 0x01000000,0x00000020, 0x00000000]),\n    FOLLOW_GREATEST_in_pm_EmptyOrderDecl1775: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_LEAST_in_pm_EmptyOrderDecl1781: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_EmptyOrderDecl1788: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_CopyNamespacesDecl1816: new org.antlr.runtime.BitSet([0x00000000, 0x00000002]),\n    FOLLOW_COPY_NAMESPACES_in_pm_CopyNamespacesDecl1822: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x02002000, 0x00000000]),\n    FOLLOW_p_PreserveMode_in_pm_CopyNamespacesDecl1826: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_pm_CopyNamespacesDecl1828: new org.antlr.runtime.BitSet([0x00000000, 0x40000000,0x00001000, 0x00000000]),\n    FOLLOW_p_InheritMode_in_pm_CopyNamespacesDecl1830: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_CopyNamespacesDecl1832: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PRESERVE_in_p_PreserveMode1861: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NO_PRESERVE_in_p_PreserveMode1867: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_INHERIT_in_p_InheritMode1899: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NO_INHERIT_in_p_InheritMode1905: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_DecimalFormatDecl1944: new org.antlr.runtime.BitSet([0x00000000, 0x00000008,0x00000000, 0x02000000]),\n    FOLLOW_DECIMAL_FORMAT_in_pm_DecimalFormatDecl1952: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_pm_DecimalFormatDecl1956: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0xCC000000,0x000200E5, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_DEFAULT_in_pm_DecimalFormatDecl1964: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x02000000]),\n    FOLLOW_DECIMAL_FORMAT_in_pm_DecimalFormatDecl1970: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0xCC000000,0x000200E5, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_p_DFPropertyName_in_pm_DecimalFormatDecl1977: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00001000]),\n    FOLLOW_EQUAL_in_pm_DecimalFormatDecl1979: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_DecimalFormatDecl1981: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0xCC000000,0x000200E5, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_DecimalFormatDecl1985: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECIMAL_SEPARATOR_in_p_DFPropertyName2014: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GROUPING_SEPARATOR_in_p_DFPropertyName2020: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_INFINITY_in_p_DFPropertyName2026: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_MINUS_SIGN_in_p_DFPropertyName2032: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NAN_in_p_DFPropertyName2038: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PERCENT_in_p_DFPropertyName2044: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PER_MILLE_in_p_DFPropertyName2050: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ZERO_DIGIT_in_p_DFPropertyName2056: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DIGIT_in_p_DFPropertyName2062: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PATTERN_SEPARATOR_in_p_DFPropertyName2068: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_SchemaImport_in_p_Import2097: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_ModuleImport_in_p_Import2101: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_IMPORT_in_pm_SchemaImport2137: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000002]),\n    FOLLOW_SCHEMA_in_pm_SchemaImport2143: new org.antlr.runtime.BitSet([0x00000000, 0x00000008,0x00000400, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_SchemaPrefix_in_pm_SchemaImport2149: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_SchemaImport2154: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_AT_in_pm_SchemaImport2159: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_SchemaImport2165: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000,0x00000040, 0x00000000]),\n    FOLLOW_COMMA_in_pm_SchemaImport2168: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_SchemaImport2172: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_SchemaImport2178: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NAMESPACE_in_p_SchemaPrefix2248: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_p_SchemaPrefix2254: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00001000]),\n    FOLLOW_EQUAL_in_p_SchemaPrefix2256: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DEFAULT_in_p_SchemaPrefix2295: new org.antlr.runtime.BitSet([0x00000000, 0x00000400]),\n    FOLLOW_ELEMENT_in_p_SchemaPrefix2301: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_NAMESPACE_in_p_SchemaPrefix2307: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_IMPORT_in_pm_ModuleImport2357: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000200, 0x00000000]),\n    FOLLOW_MODULE_in_pm_ModuleImport2363: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000400, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_NAMESPACE_in_pm_ModuleImport2370: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_pm_ModuleImport2376: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00001000]),\n    FOLLOW_EQUAL_in_pm_ModuleImport2378: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_ModuleImport2384: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_AT_in_pm_ModuleImport2389: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_ModuleImport2395: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000,0x00000040, 0x00000000]),\n    FOLLOW_COMMA_in_pm_ModuleImport2398: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_ModuleImport2402: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_ModuleImport2408: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_NamespaceDecl2477: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_NAMESPACE_in_pm_NamespaceDecl2483: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_pm_NamespaceDecl2489: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00001000]),\n    FOLLOW_EQUAL_in_pm_NamespaceDecl2491: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_NamespaceDecl2495: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_NamespaceDecl2497: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_DefaultNamespaceDecl2554: new org.antlr.runtime.BitSet([0x00000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_pm_DefaultNamespaceDecl2560: new org.antlr.runtime.BitSet([0x00000000, 0x00400400]),\n    FOLLOW_ELEMENT_in_pm_DefaultNamespaceDecl2567: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_FUNCTION_in_pm_DefaultNamespaceDecl2573: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_NAMESPACE_in_pm_DefaultNamespaceDecl2580: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_DefaultNamespaceDecl2584: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_DefaultNamespaceDecl2586: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_AnnotatedDecl2614: new org.antlr.runtime.BitSet([0x00000000, 0x00400000,0x00000000, 0x00020000,0x00000000, 0x00000004,0x0C400000, 0x00008000]),\n    FOLLOW_p_Annotation_in_pm_AnnotatedDecl2618: new org.antlr.runtime.BitSet([0x00000000, 0x00400000,0x00000000, 0x00020000,0x00000000, 0x00000004,0x0C400000, 0x00008000]),\n    FOLLOW_pg_AnnotatedDecl_in_pm_AnnotatedDecl2621: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_AnnotatedDecl2623: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_VarDecl_in_pg_AnnotatedDecl2647: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_FunctionDecl_in_pg_AnnotatedDecl2659: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CollectionDecl_in_pg_AnnotatedDecl2674: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_IndexDecl_in_pg_AnnotatedDecl2689: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ICDecl_in_pg_AnnotatedDecl2704: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ANN_PERCENT_in_p_Annotation2730: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_p_Annotation2732: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_Annotation2735: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_Literal_in_p_Annotation2737: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_COMMA_in_p_Annotation2740: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_Literal_in_p_Annotation2742: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_RPAREN_in_p_Annotation2746: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_VARIABLE_in_p_VarDecl2776: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_VarDecl2782: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_p_VarDecl2786: new org.antlr.runtime.BitSet([0x00080000, 0x00040000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_p_TypeDeclaration_in_p_VarDecl2792: new org.antlr.runtime.BitSet([0x00000000, 0x00040000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_p_VarDecl2797: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_VarValue_in_p_VarDecl2801: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_EXTERNAL_in_p_VarDecl2809: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_p_VarDecl2814: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_VarDefaultValue_in_p_VarDecl2818: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_VarValue2897: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_VarDefaultValue2924: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_ContextItemDecl2953: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00800000]),\n    FOLLOW_CONTEXT_in_pm_ContextItemDecl2959: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000004, 0x00000000]),\n    FOLLOW_ITEM_in_pm_ContextItemDecl2965: new org.antlr.runtime.BitSet([0x00080000, 0x00040000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_AS_in_pm_ContextItemDecl2972: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_ItemType_in_pm_ContextItemDecl2976: new org.antlr.runtime.BitSet([0x00000000, 0x00040000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_pm_ContextItemDecl2982: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_VarValue_in_pm_ContextItemDecl2984: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_EXTERNAL_in_pm_ContextItemDecl2992: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000,0x00000040, 0x00000000]),\n    FOLLOW_BIND_in_pm_ContextItemDecl2997: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_VarDefaultValue_in_pm_ContextItemDecl2999: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_ContextItemDecl3005: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_UPDATING_in_pm_FunctionDecl3038: new org.antlr.runtime.BitSet([0x00000000, 0x00400000]),\n    FOLLOW_FUNCTION_in_pm_FunctionDecl3046: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_pg_FQName_in_pm_FunctionDecl3052: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_pm_FunctionDecl3054: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000030]),\n    FOLLOW_p_ParamList_in_pm_FunctionDecl3058: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_pm_FunctionDecl3061: new org.antlr.runtime.BitSet([0x00080000, 0x00040000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_AS_in_pm_FunctionDecl3066: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_pm_FunctionDecl3072: new org.antlr.runtime.BitSet([0x00000000, 0x00040000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_FunctionDecl3077: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_pm_FunctionDecl3081: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_FunctionDecl3083: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_EXTERNAL_in_pm_FunctionDecl3089: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Param_in_p_ParamList3166: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_ParamList3169: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_p_Param_in_p_ParamList3173: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_DOLLAR_in_p_Param3233: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_p_Param3237: new org.antlr.runtime.BitSet([0x00080002, 0x00000000]),\n    FOLLOW_p_TypeDeclaration_in_p_Param3243: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EnclosedExpr_in_pm_FunctionBody3299: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LBRACKET_in_p_EnclosedExpr3326: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_EnclosedExpr3328: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_EnclosedExpr3331: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_OptionDecl3383: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00020000, 0x00000000]),\n    FOLLOW_OPTION_in_pm_OptionDecl3389: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_pm_OptionDecl3393: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_pm_OptionDecl3395: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_OptionDecl3397: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Program_in_pm_QueryBody3426: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Expr_in_pm_QueryBody3438: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_Expr3474: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_Expr3490: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_Expr3492: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_p_FLWORHybrid_in_p_ExprSingle3559: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_IfHybrid_in_p_ExprSingle3589: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_SwitchHybrid_in_p_ExprSingle3615: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_TypeswitchHybrid_in_p_ExprSingle3637: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_TryCatchHybrid_in_p_ExprSingle3664: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSimple_in_p_ExprSingle3677: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_InitialClause_in_p_FLWORHybrid3704: new org.antlr.runtime.BitSet([0x00000000, 0x00200000,0x80080040, 0x21080040]),\n    FOLLOW_p_IntermediateClause_in_p_FLWORHybrid3706: new org.antlr.runtime.BitSet([0x00000000, 0x00200000,0x80080040, 0x21080040]),\n    FOLLOW_p_ReturnHybrid_in_p_FLWORHybrid3709: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ForClause_in_p_InitialClause3736: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_LetClause_in_p_InitialClause3740: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_WindowClause_in_p_InitialClause3744: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_InitialClause_in_p_IntermediateClause3770: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_WhereClause_in_p_IntermediateClause3774: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_GroupByClause_in_p_IntermediateClause3778: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_OrderByClause_in_p_IntermediateClause3782: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CountClause_in_p_IntermediateClause3786: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_RangeExpr_in_p_StringConcatExpr3807: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000004]),\n    FOLLOW_CONCAT_in_p_StringConcatExpr3813: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_RangeExpr_in_p_StringConcatExpr3817: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000004]),\n    FOLLOW_FOR_in_p_ForClause3844: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_p_ForBinding_in_p_ForClause3848: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_ForClause3851: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_p_ForBinding_in_p_ForClause3853: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_DOLLAR_in_p_ForBinding3883: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_ForBinding3887: new org.antlr.runtime.BitSet([0x00280000, 0x20000000,0x00000000, 0x00200000,0x00000000, 0x00000000,0x00000001, 0x00000000]),\n    FOLLOW_p_TypeDeclaration_in_p_ForBinding3891: new org.antlr.runtime.BitSet([0x00200000, 0x20000000,0x00000000, 0x00200000,0x00000000, 0x00000000,0x00000001, 0x00000000]),\n    FOLLOW_p_AllowingEmpty_in_p_ForBinding3894: new org.antlr.runtime.BitSet([0x00200000, 0x20000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000001, 0x00000000]),\n    FOLLOW_p_PositionalVar_in_p_ForBinding3897: new org.antlr.runtime.BitSet([0x00000000, 0x20000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000001, 0x00000000]),\n    FOLLOW_p_FTScoreVar_in_p_ForBinding3900: new org.antlr.runtime.BitSet([0x00000000, 0x20000000]),\n    FOLLOW_IN_in_p_ForBinding3905: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_ForBinding3909: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ALLOWING_in_p_AllowingEmpty3938: new org.antlr.runtime.BitSet([0x00000000, 0x00001000]),\n    FOLLOW_EMPTY_in_p_AllowingEmpty3944: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_PositionalVar3974: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_PositionalVar3980: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_PositionalVar3984: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LET_in_p_LetClause4014: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000001, 0x00000020]),\n    FOLLOW_p_LetBinding_in_p_LetClause4018: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_LetClause4021: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000001, 0x00000020]),\n    FOLLOW_p_LetBinding_in_p_LetClause4023: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_DOLLAR_in_p_LetBinding4057: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_LetBinding4061: new org.antlr.runtime.BitSet([0x00080000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_p_TypeDeclaration_in_p_LetBinding4065: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_p_FTScoreVar_in_p_LetBinding4071: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_p_LetBinding4075: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_LetBinding4077: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FOR_in_p_WindowClause4106: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00002200, 0x00000000]),\n    FOLLOW_p_TumblingWindowClause_in_p_WindowClause4111: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_SlidingWindowClause_in_p_WindowClause4115: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TUMBLING_in_p_TumblingWindowClause4152: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00010000, 0x00000000]),\n    FOLLOW_WINDOW_in_p_TumblingWindowClause4158: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_TumblingWindowClause4164: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_TumblingWindowClause4168: new org.antlr.runtime.BitSet([0x00080000, 0x20000000]),\n    FOLLOW_p_TypeDeclaration_in_p_TumblingWindowClause4172: new org.antlr.runtime.BitSet([0x00000000, 0x20000000]),\n    FOLLOW_IN_in_p_TumblingWindowClause4177: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_TumblingWindowClause4181: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_p_WindowStartCondition_in_p_TumblingWindowClause4184: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x10000000,0x00000010, 0x00000000]),\n    FOLLOW_p_WindowEndCondition_in_p_TumblingWindowClause4186: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SLIDING_in_p_SlidingWindowClause4215: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00010000, 0x00000000]),\n    FOLLOW_WINDOW_in_p_SlidingWindowClause4221: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_SlidingWindowClause4227: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_SlidingWindowClause4231: new org.antlr.runtime.BitSet([0x00080000, 0x20000000]),\n    FOLLOW_p_TypeDeclaration_in_p_SlidingWindowClause4235: new org.antlr.runtime.BitSet([0x00000000, 0x20000000]),\n    FOLLOW_IN_in_p_SlidingWindowClause4240: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_SlidingWindowClause4244: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_p_WindowStartCondition_in_p_SlidingWindowClause4247: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x10000000,0x00000010, 0x00000000]),\n    FOLLOW_p_WindowEndCondition_in_p_SlidingWindowClause4249: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_START_in_p_WindowStartCondition4278: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00008108, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_p_WindowVars_in_p_WindowStartCondition4282: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00008000, 0x00000000]),\n    FOLLOW_WHEN_in_p_WindowStartCondition4286: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_WindowStartCondition4290: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ONLY_in_p_WindowEndCondition4320: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x10000000]),\n    FOLLOW_END_in_p_WindowEndCondition4328: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00008108, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_p_WindowVars_in_p_WindowEndCondition4332: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00008000, 0x00000000]),\n    FOLLOW_WHEN_in_p_WindowEndCondition4336: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_WindowEndCondition4340: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOLLAR_in_p_WindowVars4370: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_CurrentItem_in_p_WindowVars4374: new org.antlr.runtime.BitSet([0x00200002, 0x00000000,0x00000000, 0x00000000,0x00000108, 0x00000000]),\n    FOLLOW_p_PositionalVar_in_p_WindowVars4380: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000108, 0x00000000]),\n    FOLLOW_PREVIOUS_in_p_WindowVars4386: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_WindowVars4390: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_PreviousItem_in_p_WindowVars4392: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_NEXT_in_p_WindowVars4399: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_WindowVars4403: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_NextItem_in_p_WindowVars4405: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_CurrentItem4433: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_PreviousItem4459: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_NextItem4485: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COUNT_in_p_CountClause4513: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_CountClause4519: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_CountClause4523: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_WHERE_in_p_WhereClause4561: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_WhereClause4565: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GROUP_in_p_GroupByClause4594: new org.antlr.runtime.BitSet([0x02000000, 0x00000000]),\n    FOLLOW_BY_in_p_GroupByClause4600: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_p_GroupingSpecList_in_p_GroupByClause4604: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_GroupingSpec_in_p_GroupingSpecList4630: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_GroupingSpecList4633: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_p_GroupingSpec_in_p_GroupingSpecList4635: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_p_GroupingVariable_in_p_GroupingSpec4663: new org.antlr.runtime.BitSet([0x40080002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_p_TypeDeclaration_in_p_GroupingSpec4666: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_p_GroupingSpec4669: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_GroupingSpec4671: new org.antlr.runtime.BitSet([0x40000002, 0x00000000]),\n    FOLLOW_COLLATION_in_p_GroupingSpec4679: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_GroupingSpec4683: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOLLAR_in_p_GroupingVariable4712: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_GroupingVariable4716: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ORDER_in_p_OrderByClause4748: new org.antlr.runtime.BitSet([0x02000000, 0x00000000]),\n    FOLLOW_BY_in_p_OrderByClause4752: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_STABLE_in_p_OrderByClause4760: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00080000, 0x00000000]),\n    FOLLOW_ORDER_in_p_OrderByClause4764: new org.antlr.runtime.BitSet([0x02000000, 0x00000000]),\n    FOLLOW_BY_in_p_OrderByClause4768: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_OrderSpecList_in_p_OrderByClause4774: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_OrderSpec_in_p_OrderSpecList4800: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_OrderSpecList4803: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_OrderSpec_in_p_OrderSpecList4805: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_p_ExprSingle_in_p_OrderSpec4833: new org.antlr.runtime.BitSet([0x40100000, 0x00001040]),\n    FOLLOW_p_OrderModifier_in_p_OrderSpec4836: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ASCENDING_in_p_OrderModifier4865: new org.antlr.runtime.BitSet([0x40000002, 0x00001000]),\n    FOLLOW_DESCENDING_in_p_OrderModifier4871: new org.antlr.runtime.BitSet([0x40000002, 0x00001000]),\n    FOLLOW_EMPTY_in_p_OrderModifier4878: new org.antlr.runtime.BitSet([0x00000000, 0x01000000,0x00000020, 0x00000000]),\n    FOLLOW_GREATEST_in_p_OrderModifier4883: new org.antlr.runtime.BitSet([0x40000002, 0x00000000]),\n    FOLLOW_LEAST_in_p_OrderModifier4889: new org.antlr.runtime.BitSet([0x40000002, 0x00000000]),\n    FOLLOW_COLLATION_in_p_OrderModifier4897: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_OrderModifier4899: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_RETURN_in_p_ReturnHybrid4932: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_ReturnHybrid4936: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SOME_in_p_QuantifiedExpr4966: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_EVERY_in_p_QuantifiedExpr4972: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_QuantifiedExpr4979: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_QuantifiedExpr4983: new org.antlr.runtime.BitSet([0x00080000, 0x20000000]),\n    FOLLOW_p_TypeDeclaration_in_p_QuantifiedExpr4987: new org.antlr.runtime.BitSet([0x00000000, 0x20000000]),\n    FOLLOW_IN_in_p_QuantifiedExpr4992: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_QuantifiedExpr4996: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000001,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_QuantifiedExpr5000: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_QuantifiedExpr5004: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_p_QuantifiedExpr5008: new org.antlr.runtime.BitSet([0x00080000, 0x20000000]),\n    FOLLOW_p_TypeDeclaration_in_p_QuantifiedExpr5012: new org.antlr.runtime.BitSet([0x00000000, 0x20000000]),\n    FOLLOW_IN_in_p_QuantifiedExpr5017: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_QuantifiedExpr5021: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000001,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_SATISFIES_in_p_QuantifiedExpr5028: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_QuantifiedExpr5032: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SWITCH_in_p_SwitchHybrid5062: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_SwitchHybrid5066: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_SwitchHybrid5068: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_SwitchHybrid5071: new org.antlr.runtime.BitSet([0x04000000, 0x00000000]),\n    FOLLOW_p_SwitchCaseHybrid_in_p_SwitchHybrid5073: new org.antlr.runtime.BitSet([0x04000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_p_SwitchHybrid5079: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_SwitchHybrid5085: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_SwitchHybrid5089: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CASE_in_p_SwitchCaseHybrid5120: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_SwitchCaseOperand_in_p_SwitchCaseHybrid5124: new org.antlr.runtime.BitSet([0x04000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_SwitchCaseHybrid5130: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_SwitchCaseHybrid5134: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_SwitchCaseOperand5161: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TYPESWITCH_in_p_TypeswitchHybrid5191: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_TypeswitchHybrid5195: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_TypeswitchHybrid5197: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_TypeswitchHybrid5200: new org.antlr.runtime.BitSet([0x04000000, 0x00000000]),\n    FOLLOW_p_CaseHybrid_in_p_TypeswitchHybrid5202: new org.antlr.runtime.BitSet([0x04000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_p_TypeswitchHybrid5208: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_TypeswitchHybrid5215: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_TypeswitchHybrid5219: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_TypeswitchHybrid5227: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_TypeswitchHybrid5231: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CASE_in_p_CaseHybrid5261: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000802B,0x00408000, 0x00000000]),\n    FOLLOW_DOLLAR_in_p_CaseHybrid5268: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_CaseHybrid5272: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_CaseHybrid5278: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000802B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceTypeUnion_in_p_CaseHybrid5284: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_CaseHybrid5288: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_CaseHybrid5292: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_SequenceTypeUnion5319: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000080, 0x00000000]),\n    FOLLOW_VBAR_in_p_SequenceTypeUnion5322: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_SequenceTypeUnion5324: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000080, 0x00000000]),\n    FOLLOW_IF_in_p_IfHybrid5355: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_IfHybrid5359: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_IfHybrid5361: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_IfHybrid5364: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000400]),\n    FOLLOW_THEN_in_p_IfHybrid5368: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_IfHybrid5372: new org.antlr.runtime.BitSet([0x00000000, 0x00000800]),\n    FOLLOW_ELSE_in_p_IfHybrid5377: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_IfHybrid5381: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_TryClause_in_p_TryCatchExpr5408: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00400000]),\n    FOLLOW_p_CatchClause_in_p_TryCatchExpr5410: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00400000]),\n    FOLLOW_TRY_in_p_TryClause5439: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_TryClause5443: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TryTargetExpr_in_p_TryClause5445: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_TryClause5447: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Expr_in_p_TryTargetExpr5473: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CATCH_in_p_CatchClause5502: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100003,0x0040C002, 0x00000000]),\n    FOLLOW_p_CatchErrorList_in_p_CatchClause5506: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_CatchClause5508: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_CatchClause5510: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_CatchClause5513: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NameTest_in_p_CatchErrorList5539: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000080, 0x00000000]),\n    FOLLOW_VBAR_in_p_CatchErrorList5542: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100003,0x0040C002, 0x00000000]),\n    FOLLOW_p_NameTest_in_p_CatchErrorList5544: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000080, 0x00000000]),\n    FOLLOW_p_AndExpr_in_p_OrExpr5572: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00040000, 0x00000000]),\n    FOLLOW_OR_in_p_OrExpr5578: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AndExpr_in_p_OrExpr5582: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00040000, 0x00000000]),\n    FOLLOW_p_ComparisonExpr_in_p_AndExpr5611: new org.antlr.runtime.BitSet([0x00040002, 0x00000000]),\n    FOLLOW_AND_in_p_AndExpr5617: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ComparisonExpr_in_p_AndExpr5621: new org.antlr.runtime.BitSet([0x00040002, 0x00000000]),\n    FOLLOW_p_FTContainsExpr_in_p_ComparisonExpr5651: new org.antlr.runtime.BitSet([0x00000002, 0x02808000,0x00000892, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x1F805000]),\n    FOLLOW_p_ValueComp_in_p_ComparisonExpr5656: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_GeneralComp_in_p_ComparisonExpr5660: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_NodeComp_in_p_ComparisonExpr5664: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_FTContainsExpr_in_p_ComparisonExpr5667: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AdditiveExpr_in_p_RangeExpr5696: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_TO_in_p_RangeExpr5702: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AdditiveExpr_in_p_RangeExpr5706: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_MultiplicativeExpr_in_p_AdditiveExpr5735: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00600000]),\n    FOLLOW_PLUS_in_p_AdditiveExpr5742: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_MINUS_in_p_AdditiveExpr5750: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_MultiplicativeExpr_in_p_AdditiveExpr5755: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00600000]),\n    FOLLOW_p_UnionExpr_in_p_MultiplicativeExpr5784: new org.antlr.runtime.BitSet([0x00000002, 0x04000080,0x00000100, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00100000]),\n    FOLLOW_STAR_in_p_MultiplicativeExpr5791: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_DIV_in_p_MultiplicativeExpr5800: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_IDIV_in_p_MultiplicativeExpr5806: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_MOD_in_p_MultiplicativeExpr5812: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_UnionExpr_in_p_MultiplicativeExpr5818: new org.antlr.runtime.BitSet([0x00000002, 0x04000080,0x00000100, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00100000]),\n    FOLLOW_p_IntersectExceptExpr_in_p_UnionExpr5847: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00004000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000080, 0x00000000]),\n    FOLLOW_UNION_in_p_UnionExpr5854: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_VBAR_in_p_UnionExpr5860: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_IntersectExceptExpr_in_p_UnionExpr5863: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00004000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000080, 0x00000000]),\n    FOLLOW_p_InstanceofExpr_in_p_IntersectExceptExpr5892: new org.antlr.runtime.BitSet([0x00000002, 0x00020000,0x00000001, 0x00000000]),\n    FOLLOW_INTERSECT_in_p_IntersectExceptExpr5899: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_EXCEPT_in_p_IntersectExceptExpr5905: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_InstanceofExpr_in_p_IntersectExceptExpr5910: new org.antlr.runtime.BitSet([0x00000002, 0x00020000,0x00000001, 0x00000000]),\n    FOLLOW_p_TreatExpr_in_p_InstanceofExpr5939: new org.antlr.runtime.BitSet([0x00000002, 0x80000000]),\n    FOLLOW_INSTANCE_in_p_InstanceofExpr5945: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00010000, 0x00000000]),\n    FOLLOW_OF_in_p_InstanceofExpr5951: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_InstanceofExpr5955: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CastableExpr_in_p_TreatExpr5983: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00001000]),\n    FOLLOW_TREAT_in_p_TreatExpr5989: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_TreatExpr5995: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_TreatExpr5999: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CastExpr_in_p_CastableExpr6036: new org.antlr.runtime.BitSet([0x10000002, 0x00000000]),\n    FOLLOW_CASTABLE_in_p_CastableExpr6042: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_CastableExpr6048: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_SingleType_in_p_CastableExpr6052: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_UnaryExpr_in_p_CastExpr6089: new org.antlr.runtime.BitSet([0x08000002, 0x00000000]),\n    FOLLOW_CAST_in_p_CastExpr6095: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_CastExpr6101: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_SingleType_in_p_CastExpr6105: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PLUS_in_p_UnaryExpr6137: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_MINUS_in_p_UnaryExpr6145: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ValueExpr_in_p_UnaryExpr6150: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ValidateExpr_in_p_ValueExpr6220: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_SimpleMapExpr_in_p_ValueExpr6232: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExtensionExpr_in_p_ValueExpr6244: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PathExpr_in_p_SimpleMapExpr6269: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x80000000]),\n    FOLLOW_BANG_in_p_SimpleMapExpr6272: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_PathExpr_in_p_SimpleMapExpr6274: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x80000000]),\n    FOLLOW_EQUAL_in_p_GeneralComp6305: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NOTEQUAL_in_p_GeneralComp6311: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SMALLER_in_p_GeneralComp6317: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SMALLEREQ_in_p_GeneralComp6323: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GREATER_in_p_GeneralComp6329: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GREATEREQ_in_p_GeneralComp6335: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_EQ_in_p_ValueComp6367: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NE_in_p_ValueComp6373: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LT_in_p_ValueComp6379: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LE_in_p_ValueComp6385: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GT_in_p_ValueComp6391: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GE_in_p_ValueComp6397: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_IS_in_p_NodeComp6428: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SMALLER_SMALLER_in_p_NodeComp6434: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GREATER_GREATER_in_p_NodeComp6438: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_VALIDATE_in_p_ValidateExpr6466: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000008, 0x00000080,0x00004000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_p_ValidationMode_in_p_ValidateExpr6472: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_TYPE_in_p_ValidateExpr6478: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_TypeName_in_p_ValidateExpr6482: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_ValidateExpr6487: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_ValidateExpr6489: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_ValidateExpr6492: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LAX_in_p_ValidationMode6521: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_STRICT_in_p_ValidationMode6527: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_Pragma_in_p_ExtensionExpr6556: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x20000000, 0x00000000]),\n    FOLLOW_LBRACKET_in_p_ExtensionExpr6559: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0076B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_ExtensionExpr6561: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_ExtensionExpr6565: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SLASH_in_p_PathExpr6608: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_RelativePathExpr_in_p_PathExpr6610: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SLASH_in_p_PathExpr6623: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SLASH_SLASH_in_p_PathExpr6635: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_RelativePathExpr_in_p_PathExpr6637: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_RelativePathExpr_in_p_PathExpr6649: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_StepExpr_in_p_RelativePathExpr6677: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x60000000]),\n    FOLLOW_set_in_p_RelativePathExpr6680: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_StepExpr_in_p_RelativePathExpr6688: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x60000000]),\n    FOLLOW_p_PostfixExpr_in_p_StepExpr6742: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PostfixExpr_in_p_StepExpr6856: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AxisStep_in_p_StepExpr6874: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PostfixExpr_in_p_StepExpr6895: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PostfixExpr_in_p_StepExpr6913: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AxisStep_in_p_StepExpr6925: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ReverseStep_in_p_AxisStep6952: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000400]),\n    FOLLOW_p_ForwardStep_in_p_AxisStep6956: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000400]),\n    FOLLOW_p_PredicateList_in_p_AxisStep6959: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ForwardAxis_in_p_ForwardStep6985: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100003,0x0040C002, 0x00000000]),\n    FOLLOW_p_NodeTest_in_p_ForwardStep6987: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AbbrevForwardStep_in_p_ForwardStep6999: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CHILD_in_p_ForwardAxis7025: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ForwardAxis7027: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DESCENDANT_in_p_ForwardAxis7039: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ForwardAxis7041: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ATTRIBUTE_in_p_ForwardAxis7053: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ForwardAxis7055: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SELF_in_p_ForwardAxis7067: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ForwardAxis7069: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DESCENDANT_OR_SELF_in_p_ForwardAxis7081: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ForwardAxis7083: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FOLLOWING_SIBLING_in_p_ForwardAxis7095: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ForwardAxis7097: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FOLLOWING_in_p_ForwardAxis7109: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ForwardAxis7111: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ATTR_SIGN_in_p_AbbrevForwardStep7137: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100003,0x0040C002, 0x00000000]),\n    FOLLOW_p_NodeTest_in_p_AbbrevForwardStep7140: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ReverseAxis_in_p_ReverseStep7166: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100003,0x0040C002, 0x00000000]),\n    FOLLOW_p_NodeTest_in_p_ReverseStep7168: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AbbrevReverseStep_in_p_ReverseStep7180: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PARENT_in_p_ReverseAxis7206: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ReverseAxis7208: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ANCESTOR_in_p_ReverseAxis7220: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ReverseAxis7222: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PRECEDING_SIBLING_in_p_ReverseAxis7234: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ReverseAxis7236: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PRECEDING_in_p_ReverseAxis7248: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ReverseAxis7250: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ANCESTOR_OR_SELF_in_p_ReverseAxis7262: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000008, 0x00000000]),\n    FOLLOW_COLON_COLON_in_p_ReverseAxis7264: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOT_DOT_in_p_AbbrevReverseStep7290: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_KindTest_in_p_NodeTest7316: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NameTest_in_p_NodeTest7320: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_NameTest7346: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Wildcard_in_p_NameTest7350: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_STAR_in_p_Wildcard7383: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000004, 0x00000000]),\n    FOLLOW_COLON_in_p_Wildcard7386: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_p_Wildcard7388: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NCName_in_p_Wildcard7402: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000004, 0x00000000]),\n    FOLLOW_COLON_in_p_Wildcard7404: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00100000]),\n    FOLLOW_STAR_in_p_Wildcard7406: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_BracedURILiteral_in_p_Wildcard7418: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00100000]),\n    FOLLOW_STAR_in_p_Wildcard7420: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PrimaryExpr_in_p_PostfixExpr7458: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000408]),\n    FOLLOW_p_Predicate_in_p_PostfixExpr7461: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000408]),\n    FOLLOW_p_ArgumentList_in_p_PostfixExpr7465: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000408]),\n    FOLLOW_LPAREN_in_p_ArgumentList7493: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F8057B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Argument_in_p_ArgumentList7496: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_COMMA_in_p_ArgumentList7499: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F8056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Argument_in_p_ArgumentList7501: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_RPAREN_in_p_ArgumentList7507: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Predicate_in_p_PredicateList7533: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000400]),\n    FOLLOW_LSQUARE_in_p_Predicate7560: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_Predicate7562: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_RSQUARE_in_p_Predicate7565: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ParenthesizedExpr_in_p_PrimaryExpr7598: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Literal_in_p_PrimaryExpr7610: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_VarRef_in_p_PrimaryExpr7622: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ContextItemExpr_in_p_PrimaryExpr7634: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FunctionCall_in_p_PrimaryExpr7646: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_OrderedExpr_in_p_PrimaryExpr7659: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_UnorderedExpr_in_p_PrimaryExpr7671: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Constructor_in_p_PrimaryExpr7683: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_BlockExpr_in_p_PrimaryExpr7696: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FunctionItemExpr_in_p_PrimaryExpr7708: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ArrayConstructor_in_p_PrimaryExpr7721: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_SimpleObjectUnion_in_p_PrimaryExpr7733: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_UNION_BRACKET_in_p_SimpleObjectUnion7769: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F005EB,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_SimpleObjectUnion7771: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000080]),\n    FOLLOW_R_UNION_BRACKET_in_p_SimpleObjectUnion7775: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COLON_in_p_PairConstructor7817: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_PairConstructor7819: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_PairConstructor7823: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_PairConstructor7825: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_LSQUARE_in_p_ArrayConstructor7856: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F00D6B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_ArrayConstructor7858: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_RSQUARE_in_p_ArrayConstructor7862: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NumericLiteral_in_p_Literal7888: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_StringLiteral_in_p_Literal7892: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_IntegerLiteral_in_p_NumericLiteral7920: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_DecimalLiteral_in_p_NumericLiteral7928: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_DoubleLiteral_in_p_NumericLiteral7936: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOLLAR_in_p_VarRef7974: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_VarRef7978: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_VarName8006: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LPAREN_in_p_ParenthesizedExpr8032: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0057B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_ParenthesizedExpr8034: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_ParenthesizedExpr8038: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOT_in_p_ContextItemExpr8064: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ORDERED_in_p_OrderedExpr8092: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_OrderedExpr8096: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_OrderedExpr8098: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_OrderedExpr8101: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_UNORDERED_in_p_UnorderedExpr8129: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_UnorderedExpr8133: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_UnorderedExpr8135: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_UnorderedExpr8138: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pg_FQName_in_p_FunctionCall8167: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000408]),\n    FOLLOW_p_ArgumentList_in_p_FunctionCall8172: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_Argument8198: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ArgumentPlaceholder_in_p_Argument8203: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_QUESTION_in_p_ArgumentPlaceholder8229: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_DirectConstructor_in_p_Constructor8255: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ComputedConstructor_in_p_Constructor8267: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_DirElemConstructor_in_p_DirectConstructor8293: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_DirCommentConstructor_in_p_DirectConstructor8305: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_DirPIConstructor_in_p_DirectConstructor8317: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SMALLER_in_p_DirElemConstructor8344: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_DirElemConstructor8360: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x01000000,0x08000010, 0x00000000]),\n    FOLLOW_p_DirAttributeList_in_p_DirElemConstructor8365: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x01000000,0x00000010, 0x00000000]),\n    FOLLOW_EMPTY_CLOSE_TAG_in_p_DirElemConstructor8379: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_GREATER_in_p_DirElemConstructor8384: new org.antlr.runtime.BitSet([0x00000FC0, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00800100,0xC0000020, 0x00000000]),\n    FOLLOW_pm_DirElemContent_in_p_DirElemConstructor8386: new org.antlr.runtime.BitSet([0x00000FC0, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00800100,0xC0000020, 0x00000000]),\n    FOLLOW_CLOSE_TAG_in_p_DirElemConstructor8389: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_DirElemConstructor8393: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x01000000,0x08000000, 0x00000000]),\n    FOLLOW_S_in_p_DirElemConstructor8397: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x01000000]),\n    FOLLOW_GREATER_in_p_DirElemConstructor8400: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_S_in_p_DirAttributeList8477: new org.antlr.runtime.BitSet([0xFFFF0002, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x08400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_DirAttributeList8482: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00001000,0x08000000, 0x00000000]),\n    FOLLOW_S_in_p_DirAttributeList8486: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00001000]),\n    FOLLOW_EQUAL_in_p_DirAttributeList8489: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x080C0000, 0x00000000]),\n    FOLLOW_S_in_p_DirAttributeList8491: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x080C0000, 0x00000000]),\n    FOLLOW_p_DirAttributeValue_in_p_DirAttributeList8496: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x08000000, 0x00000000]),\n    FOLLOW_QUOT_in_p_DirAttributeValue8530: new org.antlr.runtime.BitSet([0x00002F10, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_ESCAPE_QUOT_in_p_DirAttributeValue8537: new org.antlr.runtime.BitSet([0x00002F10, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_APOS_in_p_DirAttributeValue8543: new org.antlr.runtime.BitSet([0x00002F10, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_p_QuotAttrValueContent_in_p_DirAttributeValue8547: new org.antlr.runtime.BitSet([0x00002F10, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_QUOT_in_p_DirAttributeValue8553: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_APOS_in_p_DirAttributeValue8598: new org.antlr.runtime.BitSet([0x00001F20, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_ESCAPE_APOS_in_p_DirAttributeValue8605: new org.antlr.runtime.BitSet([0x00001F20, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_QUOT_in_p_DirAttributeValue8611: new org.antlr.runtime.BitSet([0x00001F20, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_p_AposAttrValueContent_in_p_DirAttributeValue8615: new org.antlr.runtime.BitSet([0x00001F20, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x000C0000, 0x00000000]),\n    FOLLOW_APOS_in_p_DirAttributeValue8621: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_QuotAttrContentChar_in_p_QuotAttrValueContent8679: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CommonContent_in_p_QuotAttrValueContent8685: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AposAttrContentChar_in_p_AposAttrValueContent8713: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CommonContent_in_p_AposAttrValueContent8719: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_DirectConstructor_in_pm_DirElemContent8745: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CDataSection_in_pm_DirElemContent8757: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CommonContent_in_pm_DirElemContent8769: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ElementContentChar_in_pm_DirElemContent8781: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_PredefinedEntityRef_in_pm_CommonContent8809: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_CharRef_in_pm_CommonContent8821: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ESCAPE_LBRACKET_in_pm_CommonContent8835: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ESCAPE_RBRACKET_in_pm_CommonContent8851: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pg_EnclosedExprXml_in_pm_CommonContent8865: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LBRACKET_in_pg_EnclosedExprXml8897: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_pg_EnclosedExprXml8913: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pg_EnclosedExprXml8927: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_DirCommentConstructor_in_p_DirCommentConstructor8958: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_DirPIConstructor_in_p_DirPIConstructor8994: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_CDataSection_in_p_CDataSection9031: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CompDocConstructor_in_p_ComputedConstructor9065: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CompElemConstructor_in_p_ComputedConstructor9077: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CompAttrConstructor_in_p_ComputedConstructor9089: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CompNamespaceConstructor_in_p_ComputedConstructor9101: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CompTextConstructor_in_p_ComputedConstructor9113: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CompCommentConstructor_in_p_ComputedConstructor9125: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pm_CompPIConstructor_in_p_ComputedConstructor9137: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOCUMENT_in_pm_CompDocConstructor9166: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompDocConstructor9170: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompDocConstructor9172: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompDocConstructor9174: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ELEMENT_in_pm_CompElemConstructor9210: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000103,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_pm_CompElemConstructor9215: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompElemConstructor9220: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_pm_CompElemConstructor9222: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompElemConstructor9225: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompElemConstructor9229: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_pm_ContentExpr_in_pm_CompElemConstructor9231: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompElemConstructor9233: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_pm_ContentExpr9260: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ATTRIBUTE_in_pm_CompAttrConstructor9289: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000103,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_pm_CompAttrConstructor9294: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompAttrConstructor9299: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_pm_CompAttrConstructor9301: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompAttrConstructor9304: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompAttrConstructor9308: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompAttrConstructor9310: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompAttrConstructor9312: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NAMESPACE_in_p_CompNamespaceConstructor9340: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000103,0x00400000, 0x00000000]),\n    FOLLOW_p_Prefix_in_p_CompNamespaceConstructor9345: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_CompNamespaceConstructor9350: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_PrefixExpr_in_p_CompNamespaceConstructor9352: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_CompNamespaceConstructor9354: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_CompNamespaceConstructor9358: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0076B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_URIExpr_in_p_CompNamespaceConstructor9360: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_CompNamespaceConstructor9363: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NCName_in_p_Prefix9389: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Expr_in_p_PrefixExpr9415: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Expr_in_p_URIExpr9442: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TEXT_in_p_CompTextConstructor9471: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_CompTextConstructor9475: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_CompTextConstructor9477: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_CompTextConstructor9480: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COMMENT_in_pm_CompCommentConstructor9509: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompCommentConstructor9513: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompCommentConstructor9515: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompCommentConstructor9517: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PROCESSING_INSTRUCTION_in_pm_CompPIConstructor9546: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000103,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_pm_CompPIConstructor9551: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompPIConstructor9556: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_pm_CompPIConstructor9558: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompPIConstructor9561: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_pm_CompPIConstructor9565: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_pm_CompPIConstructor9567: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_pm_CompPIConstructor9569: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_LiteralFunctionItem_in_p_FunctionItemExpr9595: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_LiteralFunctionItem9622: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00010000]),\n    FOLLOW_HASH_in_p_LiteralFunctionItem9624: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000001]),\n    FOLLOW_L_IntegerLiteral_in_p_LiteralFunctionItem9626: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Annotation_in_p_InlineFunction9661: new org.antlr.runtime.BitSet([0x00000000, 0x00400000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00008000]),\n    FOLLOW_FUNCTION_in_p_InlineFunction9666: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_InlineFunction9670: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000030]),\n    FOLLOW_p_ParamList_in_p_InlineFunction9672: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_InlineFunction9675: new org.antlr.runtime.BitSet([0x00080000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_AS_in_p_InlineFunction9680: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_InlineFunction9684: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_InlineFunction9688: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_p_InlineFunction9690: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_InlineFunction9692: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AtomicOrUnionType_in_p_SingleType9718: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00080000]),\n    FOLLOW_QUESTION_in_p_SingleType9720: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AS_in_p_TypeDeclaration9749: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_TypeDeclaration9755: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_EMPTY_SEQUENCE_in_p_SequenceType9808: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_SequenceType9814: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_SequenceType9818: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ItemType_in_p_SequenceType9867: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00380000]),\n    FOLLOW_p_OccurrenceIndicator_in_p_SequenceType9878: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_p_OccurrenceIndicator0: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_KindTest_in_p_ItemType9980: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ITEM_in_p_ItemType10017: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_ItemType10019: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_ItemType10021: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FunctionTest_in_p_ItemType10062: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AtomicOrUnionType_in_p_ItemType10098: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ParenthesizedItemType_in_p_ItemType10110: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONTest_in_p_ItemType10122: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_StructuredItemTest_in_p_ItemType10134: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONItemTest_in_p_JSONTest10159: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONObjectTest_in_p_JSONTest10171: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONArrayTest_in_p_JSONTest10183: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_STRUCTURED_ITEM_in_p_StructuredItemTest10208: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_StructuredItemTest10210: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_StructuredItemTest10212: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_JSON_ITEM_in_p_JSONItemTest10237: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_JSONItemTest10239: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_JSONItemTest10241: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_OBJECT_in_p_JSONObjectTest10266: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_JSONObjectTest10268: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_JSONObjectTest10270: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ARRAY_in_p_JSONArrayTest10295: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_JSONArrayTest10297: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_JSONArrayTest10299: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_AtomicOrUnionType10325: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_DocumentTest_in_p_KindTest10375: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ElementTest_in_p_KindTest10387: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AttributeTest_in_p_KindTest10399: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_SchemaElementTest_in_p_KindTest10411: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_SchemaAttributeTest_in_p_KindTest10423: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PITest_in_p_KindTest10435: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_CommentTest_in_p_KindTest10447: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_TextTest_in_p_KindTest10459: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NamespaceNodeTest_in_p_KindTest10471: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AnyKindTest_in_p_KindTest10483: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NODE_in_p_AnyKindTest10509: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_AnyKindTest10511: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_AnyKindTest10513: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOCUMENT_NODE_in_p_DocumentTest10539: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_DocumentTest10541: new org.antlr.runtime.BitSet([0x00000000, 0x00000400,0x00000000, 0x00000008,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_p_ElementTest_in_p_DocumentTest10544: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_p_SchemaElementTest_in_p_DocumentTest10548: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_DocumentTest10552: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TEXT_in_p_TextTest10578: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_TextTest10580: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_TextTest10582: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COMMENT_in_p_CommentTest10608: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_CommentTest10610: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_CommentTest10612: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NAMESPACE_NODE_in_p_NamespaceNodeTest10638: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_NamespaceNodeTest10640: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_NamespaceNodeTest10642: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PROCESSING_INSTRUCTION_in_p_PITest10668: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_PITest10670: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000013,0x004C0000, 0x00000007]),\n    FOLLOW_p_NCName_in_p_PITest10673: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_p_StringLiteral_in_p_PITest10677: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_PITest10681: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ATTRIBUTE_in_p_AttributeTest10707: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_AttributeTest10709: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100013,0x00408000, 0x00000000]),\n    FOLLOW_p_AttribNameOrWildcard_in_p_AttributeTest10712: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_COMMA_in_p_AttributeTest10715: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_TypeName_in_p_AttributeTest10717: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_AttributeTest10723: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AttributeName_in_p_AttribNameOrWildcard10751: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_STAR_in_p_AttribNameOrWildcard10755: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SCHEMA_ATTRIBUTE_in_p_SchemaAttributeTest10781: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_SchemaAttributeTest10783: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_AttributeDeclaration_in_p_SchemaAttributeTest10785: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_SchemaAttributeTest10787: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AttributeName_in_p_AttributeDeclaration10813: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ELEMENT_in_p_ElementTest10839: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_ElementTest10841: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100013,0x00408000, 0x00000000]),\n    FOLLOW_p_ElementNameOrWildcard_in_p_ElementTest10844: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_COMMA_in_p_ElementTest10847: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_TypeName_in_p_ElementTest10849: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00080010]),\n    FOLLOW_QUESTION_in_p_ElementTest10851: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_ElementTest10858: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_ElementNameOrWildcard10884: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_STAR_in_p_ElementNameOrWildcard10888: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SCHEMA_ELEMENT_in_p_SchemaElementTest10906: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_SchemaElementTest10908: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_ElementDeclaration_in_p_SchemaElementTest10910: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_SchemaElementTest10912: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ElementName_in_p_ElementDeclaration10938: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_AttributeName10964: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_ElementName10990: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_p_TypeName11016: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Annotation_in_p_FunctionTest11042: new org.antlr.runtime.BitSet([0x00000000, 0x00400000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00008000]),\n    FOLLOW_p_AnyFunctionTest_in_p_FunctionTest11046: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_TypedFunctionTest_in_p_FunctionTest11050: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FUNCTION_in_p_AnyFunctionTest11077: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_AnyFunctionTest11079: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00100000]),\n    FOLLOW_STAR_in_p_AnyFunctionTest11081: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_AnyFunctionTest11083: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FUNCTION_in_p_TypedFunctionTest11109: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_TypedFunctionTest11111: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000801B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_TypedFunctionTest11114: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_COMMA_in_p_TypedFunctionTest11117: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_TypedFunctionTest11119: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_RPAREN_in_p_TypedFunctionTest11125: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_TypedFunctionTest11127: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_TypedFunctionTest11129: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LPAREN_in_p_ParenthesizedItemType11155: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_ItemType_in_p_ParenthesizedItemType11157: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_ParenthesizedItemType11159: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_QUOT_in_p_StringLiteral11210: new org.antlr.runtime.BitSet([0xFFFFFFF0, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFDFFFF,0xFFFFFFFF, 0xFFFFFFFF,0x1FFFFFFF, 0x00000000]),\n    FOLLOW_pg_QuotStringLiteralContent_in_p_StringLiteral11214: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00080000, 0x00000000]),\n    FOLLOW_QUOT_in_p_StringLiteral11216: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_APOS_in_p_StringLiteral11255: new org.antlr.runtime.BitSet([0xFFFFFFF0, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFDFFFF,0xFFFFFFFF, 0xFFFFFFFF,0x1FFFFFFF, 0x00000000]),\n    FOLLOW_pg_AposStringLiteralContent_in_p_StringLiteral11259: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00040000, 0x00000000]),\n    FOLLOW_APOS_in_p_StringLiteral11261: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_pg_QuotStringLiteralContent11327: new org.antlr.runtime.BitSet([0xFFFFFFF2, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFDFFFF,0xFFF7FFFF, 0xFFFFFFFF,0x1FFFFFFF, 0x00000000]),\n    FOLLOW_set_in_pg_AposStringLiteralContent11378: new org.antlr.runtime.BitSet([0xFFFFFFF2, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFDFFFF,0xFFFBFFFF, 0xFFFFFFFF,0x1FFFFFFF, 0x00000000]),\n    FOLLOW_L_ElementContentChar_in_p_ElementContentChar11436: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_QuotAttrContentChar_in_p_QuotAttrContentChar11462: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_AposAttrContentChar_in_p_AposAttrContentChar11512: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_QName_in_p_EQName11581: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_URIQualifiedName_in_p_EQName11593: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_BracedURILiteral_in_p_URIQualifiedName11618: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_p_URIQualifiedName11620: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_Q_in_p_BracedURILiteral11645: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_BracedURILiteral11647: new org.antlr.runtime.BitSet([0xFFFFFFF0, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFDFEFF,0xFFFFFFFF, 0xFFFFFFFF,0x1FFFFFFF, 0x00000000]),\n    FOLLOW_set_in_p_BracedURILiteral11649: new org.antlr.runtime.BitSet([0xFFFFFFF0, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFDFEFF,0xFFFFFFFF, 0xFFFFFFFF,0x1FFFFFFF, 0x00000000]),\n    FOLLOW_RBRACKET_in_p_BracedURILiteral11673: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pg_QName_in_p_QName11715: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NCName_in_p_QName11727: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pg_QName_in_pg_FQName11788: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FNCName_in_pg_FQName11800: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_NCName_in_pg_QName11844: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000004, 0x00000000]),\n    FOLLOW_COLON_in_pg_QName11846: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_pg_QName11850: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_p_NCName0: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_p_FNCName0: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_InsertExpr_in_pg_UpdateExpr13847: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_DeleteExpr_in_pg_UpdateExpr13859: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_RenameExpr_in_pg_UpdateExpr13871: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ReplaceExpr_in_pg_UpdateExpr13883: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_TransformExpr_in_pg_UpdateExpr13895: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONDeleteExpr_in_pg_UpdateExpr13907: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONInsertExpr_in_pg_UpdateExpr13919: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONRenameExpr_in_pg_UpdateExpr13931: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONReplaceExpr_in_pg_UpdateExpr13943: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_JSONAppendExpr_in_pg_UpdateExpr13955: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DELETE_in_p_JSONDeleteExpr13982: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00008000, 0x00000000]),\n    FOLLOW_JSON_in_p_JSONDeleteExpr13986: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TargetExpr_in_p_JSONDeleteExpr13990: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_INSERT_in_p_JSONInsertExpr14017: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00008000, 0x00000000]),\n    FOLLOW_JSON_in_p_JSONInsertExpr14021: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_SourceExpr_in_p_JSONInsertExpr14023: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x01000000, 0x00000000]),\n    FOLLOW_INTO_in_p_JSONInsertExpr14027: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TargetExpr_in_p_JSONInsertExpr14029: new org.antlr.runtime.BitSet([0x00200002, 0x00000000]),\n    FOLLOW_AT_in_p_JSONInsertExpr14034: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x02000000, 0x00000000]),\n    FOLLOW_POSITION_in_p_JSONInsertExpr14038: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_JSONInsertExpr14040: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_RENAME_in_p_JSONRenameExpr14076: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00008000, 0x00000000]),\n    FOLLOW_JSON_in_p_JSONRenameExpr14080: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TargetExpr_in_p_JSONRenameExpr14082: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_JSONRenameExpr14086: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_JSONRenameExpr14090: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_REPLACE_in_p_JSONReplaceExpr14120: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00008000, 0x00000000]),\n    FOLLOW_JSON_in_p_JSONReplaceExpr14124: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_VALUE_in_p_JSONReplaceExpr14128: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00010000, 0x00000000]),\n    FOLLOW_OF_in_p_JSONReplaceExpr14132: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TargetExpr_in_p_JSONReplaceExpr14134: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_WITH_in_p_JSONReplaceExpr14138: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_JSONReplaceExpr14140: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_APPEND_in_p_JSONAppendExpr14171: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00008000, 0x00000000]),\n    FOLLOW_JSON_in_p_JSONAppendExpr14175: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000400]),\n    FOLLOW_LSQUARE_in_p_JSONAppendExpr14177: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_JSONAppendExpr14179: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_RSQUARE_in_p_JSONAppendExpr14182: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_TO_in_p_JSONAppendExpr14186: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_JSONAppendExpr14188: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_RevalidationDecl14219: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000001]),\n    FOLLOW_REVALIDATION_in_pm_RevalidationDecl14223: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000008, 0x00000080,0x00000000, 0x00000002]),\n    FOLLOW_STRICT_in_pm_RevalidationDecl14228: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_LAX_in_pm_RevalidationDecl14234: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SKIP_in_pm_RevalidationDecl14240: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_RevalidationDecl14245: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AS_in_p_InsertExprTargetChoice14275: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x08400000, 0x00000000]),\n    FOLLOW_FIRST_in_p_InsertExprTargetChoice14280: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x01000000, 0x00000000]),\n    FOLLOW_LAST_in_p_InsertExprTargetChoice14286: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x01000000, 0x00000000]),\n    FOLLOW_INTO_in_p_InsertExprTargetChoice14293: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AFTER_in_p_InsertExprTargetChoice14310: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_BEFORE_in_p_InsertExprTargetChoice14326: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_INSERT_in_p_InsertExpr14356: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000,0x20000000, 0x00000000]),\n    FOLLOW_NODE_in_p_InsertExpr14361: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_NODES_in_p_InsertExpr14367: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_SourceExpr_in_p_InsertExpr14370: new org.antlr.runtime.BitSet([0x00080000, 0x00000000,0x00000000, 0x00000000,0x010C0000, 0x00000000]),\n    FOLLOW_p_InsertExprTargetChoice_in_p_InsertExpr14372: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TargetExpr_in_p_InsertExpr14374: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DELETE_in_p_DeleteExpr14404: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000,0x20000000, 0x00000000]),\n    FOLLOW_NODE_in_p_DeleteExpr14409: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_NODES_in_p_DeleteExpr14415: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TargetExpr_in_p_DeleteExpr14418: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_REPLACE_in_p_ReplaceExpr14448: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_VALUE_in_p_ReplaceExpr14453: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00010000, 0x00000000]),\n    FOLLOW_OF_in_p_ReplaceExpr14457: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_NODE_in_p_ReplaceExpr14463: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_ReplaceExpr14465: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_WITH_in_p_ReplaceExpr14470: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_ReplaceExpr14472: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_RENAME_in_p_RenameExpr14503: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_NODE_in_p_RenameExpr14507: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_TargetExpr_in_p_RenameExpr14509: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_RenameExpr14513: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_NewNameExpr_in_p_RenameExpr14515: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_SourceExpr14543: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_TargetExpr14570: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSingle_in_p_NewNameExpr14597: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COPY_in_p_TransformExpr14626: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_TransformExpr14630: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_TransformExpr14634: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_p_TransformExpr14638: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_TransformExpr14640: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x10000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_TransformExpr14644: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_TransformExpr14648: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_TransformExpr14652: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_p_TransformExpr14656: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_TransformExpr14658: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x10000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_MODIFY_in_p_TransformExpr14665: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_TransformExpr14667: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_TransformExpr14672: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_TransformExpr14674: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DECLARE_in_pm_FTOptionDecl14712: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00008000]),\n    FOLLOW_FT_OPTION_in_pm_FTOptionDecl14716: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000200, 0x00000000]),\n    FOLLOW_p_FTMatchOptions_in_pm_FTOptionDecl14718: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_pm_FTOptionDecl14720: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SCORE_in_p_FTScoreVar14750: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_FTScoreVar14756: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_FTScoreVar14760: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_StringConcatExpr_in_p_FTContainsExpr14788: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000080]),\n    FOLLOW_CONTAINS_in_p_FTContainsExpr14794: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_TEXT_in_p_FTContainsExpr14798: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000108,0x200C0000, 0x00000007]),\n    FOLLOW_p_FTSelection_in_p_FTContainsExpr14802: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00001000, 0x00000000]),\n    FOLLOW_p_FTIgnoreOption_in_p_FTContainsExpr14804: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTOr_in_p_FTSelection14834: new org.antlr.runtime.BitSet([0x00200002, 0x00000000,0x00100000, 0x00000000,0x00010000, 0x80001C00]),\n    FOLLOW_p_FTPosFilter_in_p_FTSelection14836: new org.antlr.runtime.BitSet([0x00200002, 0x00000000,0x00100000, 0x00000000,0x00010000, 0x80001C00]),\n    FOLLOW_WEIGHT_in_p_FTWeight14865: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_p_FTWeight14869: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_FTWeight14871: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_FTWeight14874: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTAnd_in_p_FTOr14900: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_FTOR_in_p_FTOr14906: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000108,0x200C0000, 0x00000007]),\n    FOLLOW_p_FTAnd_in_p_FTOr14910: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_p_FTMildNot_in_p_FTAnd14939: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00010000]),\n    FOLLOW_FTAND_in_p_FTAnd14945: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000108,0x200C0000, 0x00000007]),\n    FOLLOW_p_FTMildNot_in_p_FTAnd14949: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00010000]),\n    FOLLOW_p_FTUnaryNot_in_p_FTMildNot14978: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x02000000]),\n    FOLLOW_NOT_in_p_FTMildNot14984: new org.antlr.runtime.BitSet([0x00000000, 0x20000000]),\n    FOLLOW_IN_in_p_FTMildNot14988: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000108,0x200C0000, 0x00000007]),\n    FOLLOW_p_FTUnaryNot_in_p_FTMildNot14992: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x02000000]),\n    FOLLOW_FTNOT_in_p_FTUnaryNot15025: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000108,0x200C0000, 0x00000007]),\n    FOLLOW_p_FTPrimaryWithOptions_in_p_FTUnaryNot15032: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTPrimary_in_p_FTPrimaryWithOptions15058: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000600, 0x00000000]),\n    FOLLOW_p_FTMatchOptions_in_p_FTPrimaryWithOptions15060: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_p_FTWeight_in_p_FTPrimaryWithOptions15063: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTWords_in_p_FTPrimary15094: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x04000000]),\n    FOLLOW_p_FTTimes_in_p_FTPrimary15096: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LPAREN_in_p_FTPrimary15111: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000108,0x200C0000, 0x00000007]),\n    FOLLOW_p_FTSelection_in_p_FTPrimary15113: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_FTPrimary15115: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTExtensionSelection_in_p_FTPrimary15128: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTWordsValue_in_p_FTWords15154: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x20000060]),\n    FOLLOW_p_FTAnyallOption_in_p_FTWords15156: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_StringLiteral_in_p_FTWordsValue15183: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LBRACKET_in_p_FTWordsValue15196: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_FTWordsValue15198: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_FTWordsValue15201: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_L_Pragma_in_p_FTExtensionSelection15228: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100,0x20000000, 0x00000000]),\n    FOLLOW_LBRACKET_in_p_FTExtensionSelection15231: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000308,0x200C0000, 0x00000007]),\n    FOLLOW_p_FTSelection_in_p_FTExtensionSelection15233: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_FTExtensionSelection15236: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ANY_in_p_FTAnyallOption15267: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00002000, 0x00000000]),\n    FOLLOW_WORD_in_p_FTAnyallOption15271: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ALL_in_p_FTAnyallOption15280: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_WORDS_in_p_FTAnyallOption15282: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PHRASE_in_p_FTAnyallOption15290: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_OCCURS_in_p_FTTimes15322: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00006000]),\n    FOLLOW_p_FTRange_in_p_FTTimes15324: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000080, 0x00000000]),\n    FOLLOW_TIMES_in_p_FTTimes15328: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_EXACTLY_in_p_FTRange15361: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AdditiveExpr_in_p_FTRange15363: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTRange15381: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000020, 0x00000000]),\n    FOLLOW_LEAST_in_p_FTRange15385: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AdditiveExpr_in_p_FTRange15387: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTRange15405: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00800000]),\n    FOLLOW_MOST_in_p_FTRange15409: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AdditiveExpr_in_p_FTRange15411: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FROM_in_p_FTRange15429: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AdditiveExpr_in_p_FTRange15431: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_TO_in_p_FTRange15435: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AdditiveExpr_in_p_FTRange15437: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTOrder_in_p_FTPosFilter15468: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTWindow_in_p_FTPosFilter15472: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTDistance_in_p_FTPosFilter15476: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTScope_in_p_FTPosFilter15480: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTContent_in_p_FTPosFilter15484: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ORDERED_in_p_FTOrder15512: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_WINDOW_in_p_FTWindow15542: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_AdditiveExpr_in_p_FTWindow15546: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x10000000,0x00004008, 0x00000000]),\n    FOLLOW_p_FTUnit_in_p_FTWindow15548: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DISTANCE_in_p_FTDistance15576: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00006000]),\n    FOLLOW_p_FTRange_in_p_FTDistance15580: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x10000000,0x00004008, 0x00000000]),\n    FOLLOW_p_FTUnit_in_p_FTDistance15582: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_WORDS_in_p_FTUnit15612: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SENTENCES_in_p_FTUnit15618: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PARAGRAPHS_in_p_FTUnit15624: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SAME_in_p_FTScope15657: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x08000000,0x00000004, 0x00000000]),\n    FOLLOW_DIFFERENT_in_p_FTScope15663: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x08000000,0x00000004, 0x00000000]),\n    FOLLOW_p_FTBigUnit_in_p_FTScope15668: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SENTENCE_in_p_FTBigUnit15698: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_PARAGRAPH_in_p_FTBigUnit15704: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTContent15739: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000400, 0x00000000]),\n    FOLLOW_START_in_p_FTContent15743: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTContent15751: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x10000000]),\n    FOLLOW_END_in_p_FTContent15755: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ENTIRE_in_p_FTContent15763: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_CONTENT_in_p_FTContent15767: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_USING_in_p_FTMatchOptions15801: new org.antlr.runtime.BitSet([0x04000000, 0x00000000,0x00020000, 0x00000000,0x00000000, 0x01500200,0x00000970, 0x00000000]),\n    FOLLOW_p_FTMatchOption_in_p_FTMatchOptions15805: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000200, 0x00000000]),\n    FOLLOW_p_FTLanguageOption_in_p_FTMatchOption15833: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTWildCardOption_in_p_FTMatchOption15845: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTThesaurusOption_in_p_FTMatchOption15857: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTStemOption_in_p_FTMatchOption15869: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTCaseOption_in_p_FTMatchOption15881: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTDiacriticsOption_in_p_FTMatchOption15893: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTStopWordOption_in_p_FTMatchOption15905: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_FTExtensionOption_in_p_FTMatchOption15917: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CASE_in_p_FTCaseOption15948: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00080000]),\n    FOLLOW_INSENSITIVE_in_p_FTCaseOption15952: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CASE_in_p_FTCaseOption15970: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000002, 0x00000000]),\n    FOLLOW_SENSITIVE_in_p_FTCaseOption15974: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LOWERCASE_in_p_FTCaseOption15991: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_UPPERCASE_in_p_FTCaseOption16007: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DIACRITICS_in_p_FTDiacriticsOption16042: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00080000]),\n    FOLLOW_INSENSITIVE_in_p_FTDiacriticsOption16046: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DIACRITICS_in_p_FTDiacriticsOption16064: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000002, 0x00000000]),\n    FOLLOW_SENSITIVE_in_p_FTDiacriticsOption16068: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_STEMMING_in_p_FTStemOption16103: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NO_in_p_FTStemOption16110: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000010, 0x00000000]),\n    FOLLOW_STEMMING_in_p_FTStemOption16114: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_THESAURUS_in_p_FTThesaurusOption16150: new org.antlr.runtime.BitSet([0x00200000, 0x00000008]),\n    FOLLOW_p_FTThesaurusID_in_p_FTThesaurusOption16153: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DEFAULT_in_p_FTThesaurusOption16159: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_THESAURUS_in_p_FTThesaurusOption16178: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_FTThesaurusOption16180: new org.antlr.runtime.BitSet([0x00200000, 0x00000008]),\n    FOLLOW_p_FTThesaurusID_in_p_FTThesaurusOption16183: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_DEFAULT_in_p_FTThesaurusOption16189: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_COMMA_in_p_FTThesaurusOption16193: new org.antlr.runtime.BitSet([0x00200000, 0x00000000]),\n    FOLLOW_p_FTThesaurusID_in_p_FTThesaurusOption16195: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_RPAREN_in_p_FTThesaurusOption16199: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NO_in_p_FTThesaurusOption16217: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_THESAURUS_in_p_FTThesaurusOption16221: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTThesaurusID16254: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_FTThesaurusID16256: new org.antlr.runtime.BitSet([0x00200002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x40006000]),\n    FOLLOW_RELATIONSHIP_in_p_FTThesaurusID16261: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_FTThesaurusID16263: new org.antlr.runtime.BitSet([0x00200002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00006000]),\n    FOLLOW_p_FTLiteralRange_in_p_FTThesaurusID16268: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00200000]),\n    FOLLOW_LEVELS_in_p_FTThesaurusID16272: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_EXACTLY_in_p_FTLiteralRange16307: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000001]),\n    FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16309: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTLiteralRange16327: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000020, 0x00000000]),\n    FOLLOW_LEAST_in_p_FTLiteralRange16331: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000001]),\n    FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16333: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTLiteralRange16351: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00800000]),\n    FOLLOW_MOST_in_p_FTLiteralRange16355: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000001]),\n    FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16357: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FROM_in_p_FTLiteralRange16375: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000001]),\n    FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16377: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_TO_in_p_FTLiteralRange16379: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000001]),\n    FOLLOW_L_IntegerLiteral_in_p_FTLiteralRange16381: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_STOP_in_p_FTStopWordOption16417: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_WORDS_in_p_FTStopWordOption16421: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_p_FTStopWords_in_p_FTStopWordOption16423: new org.antlr.runtime.BitSet([0x00000002, 0x00020000,0x00000000, 0x00004000]),\n    FOLLOW_p_FTStopWordsInclExcl_in_p_FTStopWordOption16425: new org.antlr.runtime.BitSet([0x00000002, 0x00020000,0x00000000, 0x00004000]),\n    FOLLOW_STOP_in_p_FTStopWordOption16444: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_WORDS_in_p_FTStopWordOption16448: new org.antlr.runtime.BitSet([0x00000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_p_FTStopWordOption16452: new org.antlr.runtime.BitSet([0x00000002, 0x00020000,0x00000000, 0x00004000]),\n    FOLLOW_p_FTStopWordsInclExcl_in_p_FTStopWordOption16454: new org.antlr.runtime.BitSet([0x00000002, 0x00020000,0x00000000, 0x00004000]),\n    FOLLOW_NO_in_p_FTStopWordOption16473: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000020, 0x00000000]),\n    FOLLOW_STOP_in_p_FTStopWordOption16477: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_WORDS_in_p_FTStopWordOption16481: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AT_in_p_FTStopWords16515: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_FTStopWords16519: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LPAREN_in_p_FTStopWords16533: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_FTStopWords16535: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_COMMA_in_p_FTStopWords16538: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_FTStopWords16540: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040010]),\n    FOLLOW_RPAREN_in_p_FTStopWords16544: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_UNION_in_p_FTStopWordsInclExcl16576: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_EXCEPT_in_p_FTStopWordsInclExcl16582: new org.antlr.runtime.BitSet([0x00200000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_p_FTStopWords_in_p_FTStopWordsInclExcl16585: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LANGUAGE_in_p_FTLanguageOption16617: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_FTLanguageOption16621: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_WILDCARDS_in_p_FTWildCardOption16651: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NO_in_p_FTWildCardOption16658: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000800, 0x00000000]),\n    FOLLOW_WILDCARDS_in_p_FTWildCardOption16662: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_OPTION_in_p_FTExtensionOption16695: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_FTExtensionOption16699: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_FTExtensionOption16701: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_WITHOUT_in_p_FTIgnoreOption16729: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_CONTENT_in_p_FTIgnoreOption16733: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_UnionExpr_in_p_FTIgnoreOption16737: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_StatementsAndOptionalExpr_in_p_Program16769: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Hybrid_in_p_Statements16796: new org.antlr.runtime.BitSet([0xFFFF0002, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Statements_in_p_StatementsAndExpr16824: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Statements_in_p_StatementsAndOptionalExpr16851: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_HybridExprSingle_in_p_Hybrid16878: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Statement_in_p_Hybrid16891: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_AssignStatement_in_p_Statement16922: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_BreakStatement_in_p_Statement16934: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ContinueStatement_in_p_Statement16946: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExitStatement_in_p_Statement16958: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_VarDeclStatement_in_p_Statement16970: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_WhileStatement_in_p_Statement16982: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Expr_in_p_HybridExprSingle17009: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_HybridExprSingle17024: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ExprSimple_in_p_ApplyStatement17074: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_ApplyStatement17076: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOLLAR_in_p_AssignStatement17104: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_AssignStatement17108: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00002000]),\n    FOLLOW_BIND_in_p_AssignStatement17112: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_AssignStatement17114: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_AssignStatement17117: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LBRACKET_in_p_BlockStatement17143: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0876B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Statements_in_p_BlockStatement17145: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_BlockStatement17148: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LBRACKET_in_p_BlockHybrid17174: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0876B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Statements_in_p_BlockHybrid17176: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_BlockHybrid17179: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_BREAK_in_p_BreakStatement17207: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00040000, 0x00000000]),\n    FOLLOW_LOOP_in_p_BreakStatement17213: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_BreakStatement17217: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CONTINUE_in_p_ContinueStatement17245: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00040000, 0x00000000]),\n    FOLLOW_LOOP_in_p_ContinueStatement17251: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_ContinueStatement17255: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_EXIT_in_p_ExitStatement17283: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00080000, 0x00000000]),\n    FOLLOW_RETURNING_in_p_ExitStatement17289: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_ExitStatement17293: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_ExitStatement17296: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_InitialClause_in_p_FLWORStatement17322: new org.antlr.runtime.BitSet([0x00000000, 0x00200000,0x80080040, 0x21080040]),\n    FOLLOW_p_IntermediateClause_in_p_FLWORStatement17324: new org.antlr.runtime.BitSet([0x00000000, 0x00200000,0x80080040, 0x21080040]),\n    FOLLOW_p_ReturnStatement_in_p_FLWORStatement17327: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_RETURN_in_p_ReturnStatement17359: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_ReturnStatement17363: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_IF_in_p_IfStatement17392: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_IfStatement17396: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_IfStatement17398: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_IfStatement17401: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000400]),\n    FOLLOW_THEN_in_p_IfStatement17405: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_IfStatement17409: new org.antlr.runtime.BitSet([0x00000000, 0x00000800]),\n    FOLLOW_ELSE_in_p_IfStatement17414: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_IfStatement17418: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SWITCH_in_p_SwitchStatement17447: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_SwitchStatement17451: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_SwitchStatement17453: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_SwitchStatement17456: new org.antlr.runtime.BitSet([0x04000000, 0x00000000]),\n    FOLLOW_p_SwitchCaseStatement_in_p_SwitchStatement17458: new org.antlr.runtime.BitSet([0x04000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_p_SwitchStatement17463: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_SwitchStatement17469: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_SwitchStatement17473: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CASE_in_p_SwitchCaseStatement17503: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_SwitchCaseOperand_in_p_SwitchCaseStatement17507: new org.antlr.runtime.BitSet([0x04000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_SwitchCaseStatement17513: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_SwitchCaseStatement17517: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TRY_in_p_TryCatchStatement17546: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_p_BlockStatement_in_p_TryCatchStatement17550: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00400000]),\n    FOLLOW_CATCH_in_p_TryCatchStatement17555: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100003,0x0040C002, 0x00000000]),\n    FOLLOW_p_CatchErrorList_in_p_TryCatchStatement17559: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_p_BlockStatement_in_p_TryCatchStatement17561: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00400000]),\n    FOLLOW_TRY_in_p_TryCatchHybrid17593: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_p_BlockHybrid_in_p_TryCatchHybrid17597: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00400000]),\n    FOLLOW_CATCH_in_p_TryCatchHybrid17603: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00100003,0x0040C002, 0x00000000]),\n    FOLLOW_p_CatchErrorList_in_p_TryCatchHybrid17607: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_p_BlockHybrid_in_p_TryCatchHybrid17609: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00400000]),\n    FOLLOW_TYPESWITCH_in_p_TypeswitchStatement17642: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_TypeswitchStatement17646: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_TypeswitchStatement17648: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_TypeswitchStatement17651: new org.antlr.runtime.BitSet([0x04000000, 0x00000000]),\n    FOLLOW_p_CaseStatement_in_p_TypeswitchStatement17653: new org.antlr.runtime.BitSet([0x04000000, 0x00000008]),\n    FOLLOW_DEFAULT_in_p_TypeswitchStatement17658: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_TypeswitchStatement17665: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_TypeswitchStatement17669: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_TypeswitchStatement17677: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_TypeswitchStatement17681: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_CASE_in_p_CaseStatement17710: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000802B,0x00408000, 0x00000000]),\n    FOLLOW_DOLLAR_in_p_CaseStatement17717: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_CaseStatement17721: new org.antlr.runtime.BitSet([0x00080000, 0x00000000]),\n    FOLLOW_AS_in_p_CaseStatement17725: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x0000800B,0x00408000, 0x00000000]),\n    FOLLOW_p_SequenceType_in_p_CaseStatement17729: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x80000000, 0x00000000]),\n    FOLLOW_RETURN_in_p_CaseStatement17733: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_CaseStatement17737: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_Annotation_in_p_VarDeclStatement17764: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00020000,0x00000000, 0x00000000,0x00000000, 0x00008000]),\n    FOLLOW_VARIABLE_in_p_VarDeclStatement17769: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_VarDeclStatement17775: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_VarDeclStatement17779: new org.antlr.runtime.BitSet([0x00080000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00042000,0x00000040, 0x00000000]),\n    FOLLOW_p_TypeDeclaration_in_p_VarDeclStatement17783: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00042000,0x00000040, 0x00000000]),\n    FOLLOW_BIND_in_p_VarDeclStatement17787: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_VarDeclStatement17789: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000,0x00000040, 0x00000000]),\n    FOLLOW_COMMA_in_p_VarDeclStatement17805: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_VarDeclStatement17809: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00408000, 0x00000000]),\n    FOLLOW_p_VarName_in_p_VarDeclStatement17813: new org.antlr.runtime.BitSet([0x00080000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00042000,0x00000040, 0x00000000]),\n    FOLLOW_p_TypeDeclaration_in_p_VarDeclStatement17817: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00042000,0x00000040, 0x00000000]),\n    FOLLOW_BIND_in_p_VarDeclStatement17821: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_VarDeclStatement17823: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000,0x00000040, 0x00000000]),\n    FOLLOW_SEMICOLON_in_p_VarDeclStatement17840: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_WHILE_in_p_WhileStatement17868: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_p_WhileStatement17872: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Expr_in_p_WhileStatement17874: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000010]),\n    FOLLOW_RPAREN_in_p_WhileStatement17877: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_Hybrid_in_p_WhileStatement17879: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_QuantifiedExpr_in_p_ExprSimple17906: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_OrExpr_in_p_ExprSimple17918: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_pg_UpdateExpr_in_p_ExprSimple17933: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LBRACKET_in_p_BlockExpr17959: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0856B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_StatementsAndExpr_in_p_BlockExpr17961: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000200]),\n    FOLLOW_RBRACKET_in_p_BlockExpr17963: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COLLECTION_in_p_CollectionDecl17994: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_CollectionDecl17998: new org.antlr.runtime.BitSet([0x00080002, 0x00000000]),\n    FOLLOW_p_CollectionTypeDecl_in_p_CollectionDecl18000: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AS_in_p_CollectionTypeDecl18029: new org.antlr.runtime.BitSet([0x80400000, 0x00000600,0x04004000, 0x0000020C,0x00000002, 0x00000000]),\n    FOLLOW_p_KindTest_in_p_CollectionTypeDecl18033: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00380000]),\n    FOLLOW_p_OccurrenceIndicator_in_p_CollectionTypeDecl18042: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_INDEX_in_p_IndexDecl18072: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_IndexName_in_p_IndexDecl18076: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x20000000, 0x00000000]),\n    FOLLOW_ON_in_p_IndexDecl18080: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x20000000, 0x00000000]),\n    FOLLOW_NODES_in_p_IndexDecl18086: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_IndexDomainExpr_in_p_IndexDecl18090: new org.antlr.runtime.BitSet([0x02000000, 0x00000000]),\n    FOLLOW_BY_in_p_IndexDecl18094: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_IndexKeySpec_in_p_IndexDecl18098: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_COMMA_in_p_IndexDecl18101: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_IndexKeySpec_in_p_IndexDecl18103: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00040000]),\n    FOLLOW_p_QName_in_p_IndexName18130: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PathExpr_in_p_IndexDomainExpr18155: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_IndexKeyExpr_in_p_IndexKeySpec18180: new org.antlr.runtime.BitSet([0x40080002, 0x00000000]),\n    FOLLOW_p_IndexKeyTypeDecl_in_p_IndexKeySpec18182: new org.antlr.runtime.BitSet([0x40000002, 0x00000000]),\n    FOLLOW_p_IndexKeyCollation_in_p_IndexKeySpec18185: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PathExpr_in_p_IndexKeyExpr18211: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_AS_in_p_IndexKeyTypeDecl18238: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_AtomicType_in_p_IndexKeyTypeDecl18242: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00380000]),\n    FOLLOW_p_OccurrenceIndicator_in_p_IndexKeyTypeDecl18244: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_QName_in_p_AtomicType18270: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COLLATION_in_p_IndexKeyCollation18297: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x000C0000, 0x00000007]),\n    FOLLOW_p_StringLiteral_in_p_IndexKeyCollation18301: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_INTEGRITY_in_p_ICDecl18328: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00800000, 0x00000000]),\n    FOLLOW_CONSTRAINT_in_p_ICDecl18334: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_ICDecl18338: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x22000000, 0x00000000]),\n    FOLLOW_p_ICCollection_in_p_ICDecl18341: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ICForeignKey_in_p_ICDecl18345: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_ON_in_p_ICCollection18373: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00400000, 0x00000000]),\n    FOLLOW_COLLECTION_in_p_ICCollection18379: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_ICCollection18383: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000,0x00000000, 0x00000000,0x01000000, 0x00000020]),\n    FOLLOW_p_ICCollSequence_in_p_ICCollection18386: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ICCollSequenceUnique_in_p_ICCollection18390: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_ICCollNode_in_p_ICCollection18394: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_DOLLAR_in_p_ICCollSequence18422: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_ICCollSequence18426: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00200000, 0x00000000]),\n    FOLLOW_CHECK_in_p_ICCollSequence18432: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_ICCollSequence18436: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_NODE_in_p_ICCollSequenceUnique18464: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_ICCollSequenceUnique18470: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_ICCollSequenceUnique18474: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00200000, 0x00000000]),\n    FOLLOW_CHECK_in_p_ICCollSequenceUnique18480: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x40000000, 0x00000000]),\n    FOLLOW_UNIQUE_in_p_ICCollSequenceUnique18486: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x10000000, 0x00000000]),\n    FOLLOW_KEY_in_p_ICCollSequenceUnique18492: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_PathExpr_in_p_ICCollSequenceUnique18496: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FOREACH_in_p_ICCollNode18523: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_NODE_in_p_ICCollNode18529: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_ICCollNode18535: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_ICCollNode18539: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00200000, 0x00000000]),\n    FOLLOW_CHECK_in_p_ICCollNode18545: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x60F0056B,0xE04CC003, 0x00000007]),\n    FOLLOW_p_ExprSingle_in_p_ICCollNode18549: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FOREIGN_in_p_ICForeignKey18577: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x10000000, 0x00000000]),\n    FOLLOW_KEY_in_p_ICForeignKey18583: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00004000]),\n    FOLLOW_p_ICForeignKeySource_in_p_ICForeignKey18587: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000800]),\n    FOLLOW_p_ICForeignKeyTarget_in_p_ICForeignKey18589: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FROM_in_p_ICForeignKeySource18616: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00400000, 0x00000000]),\n    FOLLOW_p_ICForeignKeyValues_in_p_ICForeignKeySource18620: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TO_in_p_ICForeignKeyTarget18647: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00400000, 0x00000000]),\n    FOLLOW_p_ICForeignKeyValues_in_p_ICForeignKeyTarget18651: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_COLLECTION_in_p_ICForeignKeyValues18678: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_ICForeignKeyValues18682: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00004000, 0x00000000]),\n    FOLLOW_NODE_in_p_ICForeignKeyValues18686: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_p_ICForeignKeyValues18692: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000003,0x00400000, 0x00000000]),\n    FOLLOW_p_QName_in_p_ICForeignKeyValues18696: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x10000000, 0x00000000]),\n    FOLLOW_KEY_in_p_ICForeignKeyValues18702: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_PathExpr_in_p_ICForeignKeyValues18706: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_synpred1_XQueryParser3531: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000020]),\n    FOLLOW_DOLLAR_in_synpred1_XQueryParser3539: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_FOR_in_synpred1_XQueryParser3545: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00002200, 0x00000000]),\n    FOLLOW_set_in_synpred1_XQueryParser3547: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_IF_in_synpred2_XQueryParser3573: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_synpred2_XQueryParser3575: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SWITCH_in_synpred3_XQueryParser3603: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_synpred3_XQueryParser3605: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TYPESWITCH_in_synpred4_XQueryParser3629: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_synpred4_XQueryParser3631: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TRY_in_synpred5_XQueryParser3651: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_synpred5_XQueryParser3653: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_VALIDATE_in_synpred6_XQueryParser6204: new org.antlr.runtime.BitSet([0x00000002, 0x00000000,0x00000008, 0x00000080,0x00004000, 0x00000000]),\n    FOLLOW_p_ValidationMode_in_synpred6_XQueryParser6208: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_TYPE_in_synpred6_XQueryParser6212: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_SLASH_in_synpred7_XQueryParser6600: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0x6090056B,0xC04CC003, 0x00000007]),\n    FOLLOW_p_RelativePathExpr_in_synpred7_XQueryParser6602: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_synpred8_XQueryParser6716: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_synpred9_XQueryParser6769: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000103,0x00408000, 0x00000000]),\n    FOLLOW_p_EQName_in_synpred9_XQueryParser6777: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_synpred9_XQueryParser6780: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_synpred9_XQueryParser6798: new org.antlr.runtime.BitSet([0xFFFF0000, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFB,0xFFFFFFFF, 0x00000103,0x00400000, 0x00000000]),\n    FOLLOW_p_NCName_in_synpred9_XQueryParser6806: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_synpred9_XQueryParser6809: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_set_in_synpred9_XQueryParser6827: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000100]),\n    FOLLOW_LBRACKET_in_synpred9_XQueryParser6839: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_KindTest_in_synpred10_XQueryParser6869: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_EQName_in_synpred11_XQueryParser6888: new org.antlr.runtime.BitSet([0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000000,0x00000000, 0x00000008]),\n    FOLLOW_LPAREN_in_synpred11_XQueryParser6890: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_PrimaryExpr_in_synpred12_XQueryParser6908: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_LPAREN_in_synpred13_XQueryParser7593: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_OccurrenceIndicator_in_synpred14_XQueryParser9871: new org.antlr.runtime.BitSet([0x00000002, 0x00000000]),\n    FOLLOW_p_OccurrenceIndicator_in_synpred15_XQueryParser18037: new org.antlr.runtime.BitSet([0x00000002, 0x00000000])\n});\n\n})();\nexports.XQueryParser = XQueryParser; });\ndefine('ace/mode/xquery/StringLexer', ['require', 'exports', 'module' , 'ace/mode/xquery/antlr3-all', 'ace/mode/xquery/XQDTLexer'], function(require, exports, module) {// $ANTLR 3.3 Nov 30, 2010 12:50:56 /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g 2012-09-05 10:41:39\n\n/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n  var org =  require(\"./antlr3-all\").org;\n  var XQDTLexer = require(\"./XQDTLexer\").XQDTLexer;\n\n\nvar StringLexer = function(input, state) {\n// alternate constructor @todo\n// public StringLexer(CharStream input)\n// public StringLexer(CharStream input, RecognizerSharedState state) {\n    if (!state) {\n        state = new org.antlr.runtime.RecognizerSharedState();\n    }\n\n    (function(){\n\n\n        this.inQuotStr = false;\n        this.inAposStr = false;\n\n        //boolean inQuotStr = false;\n        //boolean inAposStr = false;\n\n        //public StringLexer(CharStream input, boolean isAposStr) {\n        //\tthis(input, new RecognizerSharedState());\n        //\tthis.inAposStr = isAposStr;\n        //\tthis.inQuotStr = !isAposStr;\n        //\tsetIsWsExplicit(true);\n        //}\n\n    }).call(this);\n\n    this.dfa8 = new StringLexer.DFA8(this);\n    StringLexer.superclass.constructor.call(this, input, state);\n\n\n};\n\norg.antlr.lang.augmentObject(StringLexer, {\n    EOF: -1,\n    L_QuotAttrContentChar: 4,\n    L_AposAttrContentChar: 5,\n    L_ElementContentChar: 6,\n    L_CDataSection: 7,\n    L_PredefinedEntityRef: 8,\n    L_CharRef: 9,\n    ESCAPE_LBRACKET: 10,\n    ESCAPE_RBRACKET: 11,\n    ESCAPE_APOS: 12,\n    ESCAPE_QUOT: 13,\n    CDATA_START: 14,\n    CDATA_END: 15,\n    ANCESTOR: 16,\n    ANCESTOR_OR_SELF: 17,\n    AND: 18,\n    AS: 19,\n    ASCENDING: 20,\n    AT: 21,\n    ATTRIBUTE: 22,\n    BASE_URI: 23,\n    BOUNDARY_SPACE: 24,\n    BY: 25,\n    CASE: 26,\n    CAST: 27,\n    CASTABLE: 28,\n    CHILD: 29,\n    COLLATION: 30,\n    COMMENT: 31,\n    CONSTRUCTION: 32,\n    COPY_NAMESPACES: 33,\n    DECLARE: 34,\n    DEFAULT: 35,\n    DESCENDANT: 36,\n    DESCENDANT_OR_SELF: 37,\n    DESCENDING: 38,\n    DIV: 39,\n    DOCUMENT: 40,\n    DOCUMENT_NODE: 41,\n    ELEMENT: 42,\n    ELSE: 43,\n    EMPTY: 44,\n    EMPTY_SEQUENCE: 45,\n    ENCODING: 46,\n    EQ: 47,\n    EVERY: 48,\n    EXCEPT: 49,\n    EXTERNAL: 50,\n    FOLLOWING: 51,\n    FOLLOWING_SIBLING: 52,\n    FOR: 53,\n    FUNCTION: 54,\n    GE: 55,\n    GREATEST: 56,\n    GT: 57,\n    IDIV: 58,\n    IF: 59,\n    IMPORT: 60,\n    IN: 61,\n    INHERIT: 62,\n    INSTANCE: 63,\n    INTERSECT: 64,\n    IS: 65,\n    ITEM: 66,\n    LAX: 67,\n    LE: 68,\n    LEAST: 69,\n    LET: 70,\n    LT: 71,\n    MOD: 72,\n    MODULE: 73,\n    NAMESPACE: 74,\n    NE: 75,\n    NO_INHERIT: 76,\n    NO_PRESERVE: 77,\n    NODE: 78,\n    JSON: 79,\n    OF: 80,\n    OPTION: 81,\n    OR: 82,\n    ORDER: 83,\n    ORDERED: 84,\n    ORDERING: 85,\n    PARENT: 86,\n    PRECEDING: 87,\n    PRECEDING_SIBLING: 88,\n    PRESERVE: 89,\n    PROCESSING_INSTRUCTION: 90,\n    STRUCTURED_ITEM: 91,\n    JSON_ITEM: 92,\n    OBJECT: 93,\n    ARRAY: 94,\n    RETURN: 95,\n    SATISFIES: 96,\n    SCHEMA: 97,\n    SCHEMA_ATTRIBUTE: 98,\n    SCHEMA_ELEMENT: 99,\n    SELF: 100,\n    SOME: 101,\n    STABLE: 102,\n    STRICT: 103,\n    STRIP: 104,\n    TEXT: 105,\n    THEN: 106,\n    TO: 107,\n    TREAT: 108,\n    TYPESWITCH: 109,\n    UNION: 110,\n    UNORDERED: 111,\n    VALIDATE: 112,\n    VARIABLE: 113,\n    VERSION: 114,\n    WHERE: 115,\n    XQUERY: 116,\n    ALLOWING: 117,\n    CATCH: 118,\n    CONTEXT: 119,\n    COUNT: 120,\n    DECIMAL_FORMAT: 121,\n    DECIMAL_SEPARATOR: 122,\n    DIGIT: 123,\n    END: 124,\n    GROUP: 125,\n    GROUPING_SEPARATOR: 126,\n    INFINITY: 127,\n    MINUS_SIGN: 128,\n    NAMESPACE_NODE: 129,\n    NAN: 130,\n    NEXT: 131,\n    ONLY: 132,\n    PATTERN_SEPARATOR: 133,\n    PERCENT: 134,\n    PER_MILLE: 135,\n    PREVIOUS: 136,\n    SLIDING: 137,\n    START: 138,\n    SWITCH: 139,\n    TRY: 140,\n    TUMBLING: 141,\n    TYPE: 142,\n    WHEN: 143,\n    WINDOW: 144,\n    ZERO_DIGIT: 145,\n    AFTER: 146,\n    BEFORE: 147,\n    COPY: 148,\n    DELETE: 149,\n    FIRST: 150,\n    INSERT: 151,\n    INTO: 152,\n    POSITION: 153,\n    APPEND: 154,\n    LAST: 155,\n    MODIFY: 156,\n    NODES: 157,\n    RENAME: 158,\n    REPLACE: 159,\n    REVALIDATION: 160,\n    SKIP: 161,\n    UPDATING: 162,\n    VALUE: 163,\n    WITH: 164,\n    ALL: 165,\n    ANY: 166,\n    CONTAINS: 167,\n    CONTENT: 168,\n    DIACRITICS: 169,\n    DIFFERENT: 170,\n    DISTANCE: 171,\n    ENTIRE: 172,\n    EXACTLY: 173,\n    FROM: 174,\n    FT_OPTION: 175,\n    FTAND: 176,\n    FTNOT: 177,\n    FTOR: 178,\n    INSENSITIVE: 179,\n    LANGUAGE: 180,\n    LEVELS: 181,\n    LOWERCASE: 182,\n    MOST: 183,\n    NO: 184,\n    NOT: 185,\n    OCCURS: 186,\n    PARAGRAPH: 187,\n    PARAGRAPHS: 188,\n    PHRASE: 189,\n    RELATIONSHIP: 190,\n    SAME: 191,\n    SCORE: 192,\n    SENSITIVE: 193,\n    SENTENCE: 194,\n    SENTENCES: 195,\n    STEMMING: 196,\n    STOP: 197,\n    THESAURUS: 198,\n    TIMES: 199,\n    UPPERCASE: 200,\n    USING: 201,\n    WEIGHT: 202,\n    WILDCARDS: 203,\n    WITHOUT: 204,\n    WORD: 205,\n    WORDS: 206,\n    BREAK: 207,\n    CONTINUE: 208,\n    EXIT: 209,\n    LOOP: 210,\n    RETURNING: 211,\n    WHILE: 212,\n    CHECK: 213,\n    COLLECTION: 214,\n    CONSTRAINT: 215,\n    FOREACH: 216,\n    FOREIGN: 217,\n    INDEX: 218,\n    INTEGRITY: 219,\n    KEY: 220,\n    ON: 221,\n    UNIQUE: 222,\n    AMP_ER: 223,\n    APOS_ER: 224,\n    QUOT_ER: 225,\n    CONCAT: 226,\n    LPAREN: 227,\n    RPAREN: 228,\n    DOLLAR: 229,\n    L_UNION_BRACKET: 230,\n    R_UNION_BRACKET: 231,\n    LBRACKET: 232,\n    RBRACKET: 233,\n    LSQUARE: 234,\n    RSQUARE: 235,\n    EQUAL: 236,\n    BIND: 237,\n    NOTEQUAL: 238,\n    ANN_PERCENT: 239,\n    HASH: 240,\n    AMP: 241,\n    COMMA: 242,\n    QUESTION: 243,\n    STAR: 244,\n    PLUS: 245,\n    MINUS: 246,\n    SMALLER: 247,\n    GREATER: 248,\n    SMALLEREQ: 249,\n    GREATEREQ: 250,\n    SMALLER_SMALLER: 251,\n    GREATER_GREATER: 252,\n    SLASH: 253,\n    SLASH_SLASH: 254,\n    BANG: 255,\n    DOT: 256,\n    DOT_DOT: 257,\n    COLON: 258,\n    COLON_COLON: 259,\n    EMPTY_CLOSE_TAG: 260,\n    CLOSE_TAG: 261,\n    SEMICOLON: 262,\n    VBAR: 263,\n    PRAGMA_START: 264,\n    PRAGMA_END: 265,\n    XML_COMMENT_START: 266,\n    XML_COMMENT_END: 267,\n    PI_START: 268,\n    PI_END: 269,\n    ATTR_SIGN: 270,\n    Q: 271,\n    CHARREF_DEC: 272,\n    CHARREF_HEX: 273,\n    APOS: 274,\n    QUOT: 275,\n    NCNameStartChar: 276,\n    NCNameChar: 277,\n    L_NCName: 278,\n    Letter: 279,\n    HexLetter: 280,\n    Digit: 281,\n    Digits: 282,\n    S: 283,\n    SU: 284,\n    L_Pragma: 285,\n    L_DirCommentConstructor: 286,\n    L_DirPIConstructor: 287,\n    L_IntegerLiteral: 288,\n    L_DecimalLiteral: 289,\n    L_DoubleLiteral: 290,\n    L_Comment: 291,\n    L_AnyChar: 292,\n    L_QuotStringLiteralChar: 293,\n    L_AposStringLiteralChar: 294\n});\n\n(function(){\nvar HIDDEN = org.antlr.runtime.Token.HIDDEN_CHANNEL,\n    EOF = org.antlr.runtime.Token.EOF;\norg.antlr.lang.extend(StringLexer, XQDTLexer, {\n    EOF : -1,\n    L_QuotAttrContentChar : 4,\n    L_AposAttrContentChar : 5,\n    L_ElementContentChar : 6,\n    L_CDataSection : 7,\n    L_PredefinedEntityRef : 8,\n    L_CharRef : 9,\n    ESCAPE_LBRACKET : 10,\n    ESCAPE_RBRACKET : 11,\n    ESCAPE_APOS : 12,\n    ESCAPE_QUOT : 13,\n    CDATA_START : 14,\n    CDATA_END : 15,\n    ANCESTOR : 16,\n    ANCESTOR_OR_SELF : 17,\n    AND : 18,\n    AS : 19,\n    ASCENDING : 20,\n    AT : 21,\n    ATTRIBUTE : 22,\n    BASE_URI : 23,\n    BOUNDARY_SPACE : 24,\n    BY : 25,\n    CASE : 26,\n    CAST : 27,\n    CASTABLE : 28,\n    CHILD : 29,\n    COLLATION : 30,\n    COMMENT : 31,\n    CONSTRUCTION : 32,\n    COPY_NAMESPACES : 33,\n    DECLARE : 34,\n    DEFAULT : 35,\n    DESCENDANT : 36,\n    DESCENDANT_OR_SELF : 37,\n    DESCENDING : 38,\n    DIV : 39,\n    DOCUMENT : 40,\n    DOCUMENT_NODE : 41,\n    ELEMENT : 42,\n    ELSE : 43,\n    EMPTY : 44,\n    EMPTY_SEQUENCE : 45,\n    ENCODING : 46,\n    EQ : 47,\n    EVERY : 48,\n    EXCEPT : 49,\n    EXTERNAL : 50,\n    FOLLOWING : 51,\n    FOLLOWING_SIBLING : 52,\n    FOR : 53,\n    FUNCTION : 54,\n    GE : 55,\n    GREATEST : 56,\n    GT : 57,\n    IDIV : 58,\n    IF : 59,\n    IMPORT : 60,\n    IN : 61,\n    INHERIT : 62,\n    INSTANCE : 63,\n    INTERSECT : 64,\n    IS : 65,\n    ITEM : 66,\n    LAX : 67,\n    LE : 68,\n    LEAST : 69,\n    LET : 70,\n    LT : 71,\n    MOD : 72,\n    MODULE : 73,\n    NAMESPACE : 74,\n    NE : 75,\n    NO_INHERIT : 76,\n    NO_PRESERVE : 77,\n    NODE : 78,\n    JSON : 79,\n    OF : 80,\n    OPTION : 81,\n    OR : 82,\n    ORDER : 83,\n    ORDERED : 84,\n    ORDERING : 85,\n    PARENT : 86,\n    PRECEDING : 87,\n    PRECEDING_SIBLING : 88,\n    PRESERVE : 89,\n    PROCESSING_INSTRUCTION : 90,\n    STRUCTURED_ITEM : 91,\n    JSON_ITEM : 92,\n    OBJECT : 93,\n    ARRAY : 94,\n    RETURN : 95,\n    SATISFIES : 96,\n    SCHEMA : 97,\n    SCHEMA_ATTRIBUTE : 98,\n    SCHEMA_ELEMENT : 99,\n    SELF : 100,\n    SOME : 101,\n    STABLE : 102,\n    STRICT : 103,\n    STRIP : 104,\n    TEXT : 105,\n    THEN : 106,\n    TO : 107,\n    TREAT : 108,\n    TYPESWITCH : 109,\n    UNION : 110,\n    UNORDERED : 111,\n    VALIDATE : 112,\n    VARIABLE : 113,\n    VERSION : 114,\n    WHERE : 115,\n    XQUERY : 116,\n    ALLOWING : 117,\n    CATCH : 118,\n    CONTEXT : 119,\n    COUNT : 120,\n    DECIMAL_FORMAT : 121,\n    DECIMAL_SEPARATOR : 122,\n    DIGIT : 123,\n    END : 124,\n    GROUP : 125,\n    GROUPING_SEPARATOR : 126,\n    INFINITY : 127,\n    MINUS_SIGN : 128,\n    NAMESPACE_NODE : 129,\n    NAN : 130,\n    NEXT : 131,\n    ONLY : 132,\n    PATTERN_SEPARATOR : 133,\n    PERCENT : 134,\n    PER_MILLE : 135,\n    PREVIOUS : 136,\n    SLIDING : 137,\n    START : 138,\n    SWITCH : 139,\n    TRY : 140,\n    TUMBLING : 141,\n    TYPE : 142,\n    WHEN : 143,\n    WINDOW : 144,\n    ZERO_DIGIT : 145,\n    AFTER : 146,\n    BEFORE : 147,\n    COPY : 148,\n    DELETE : 149,\n    FIRST : 150,\n    INSERT : 151,\n    INTO : 152,\n    POSITION : 153,\n    APPEND : 154,\n    LAST : 155,\n    MODIFY : 156,\n    NODES : 157,\n    RENAME : 158,\n    REPLACE : 159,\n    REVALIDATION : 160,\n    SKIP : 161,\n    UPDATING : 162,\n    VALUE : 163,\n    WITH : 164,\n    ALL : 165,\n    ANY : 166,\n    CONTAINS : 167,\n    CONTENT : 168,\n    DIACRITICS : 169,\n    DIFFERENT : 170,\n    DISTANCE : 171,\n    ENTIRE : 172,\n    EXACTLY : 173,\n    FROM : 174,\n    FT_OPTION : 175,\n    FTAND : 176,\n    FTNOT : 177,\n    FTOR : 178,\n    INSENSITIVE : 179,\n    LANGUAGE : 180,\n    LEVELS : 181,\n    LOWERCASE : 182,\n    MOST : 183,\n    NO : 184,\n    NOT : 185,\n    OCCURS : 186,\n    PARAGRAPH : 187,\n    PARAGRAPHS : 188,\n    PHRASE : 189,\n    RELATIONSHIP : 190,\n    SAME : 191,\n    SCORE : 192,\n    SENSITIVE : 193,\n    SENTENCE : 194,\n    SENTENCES : 195,\n    STEMMING : 196,\n    STOP : 197,\n    THESAURUS : 198,\n    TIMES : 199,\n    UPPERCASE : 200,\n    USING : 201,\n    WEIGHT : 202,\n    WILDCARDS : 203,\n    WITHOUT : 204,\n    WORD : 205,\n    WORDS : 206,\n    BREAK : 207,\n    CONTINUE : 208,\n    EXIT : 209,\n    LOOP : 210,\n    RETURNING : 211,\n    WHILE : 212,\n    CHECK : 213,\n    COLLECTION : 214,\n    CONSTRAINT : 215,\n    FOREACH : 216,\n    FOREIGN : 217,\n    INDEX : 218,\n    INTEGRITY : 219,\n    KEY : 220,\n    ON : 221,\n    UNIQUE : 222,\n    AMP_ER : 223,\n    APOS_ER : 224,\n    QUOT_ER : 225,\n    CONCAT : 226,\n    LPAREN : 227,\n    RPAREN : 228,\n    DOLLAR : 229,\n    L_UNION_BRACKET : 230,\n    R_UNION_BRACKET : 231,\n    LBRACKET : 232,\n    RBRACKET : 233,\n    LSQUARE : 234,\n    RSQUARE : 235,\n    EQUAL : 236,\n    BIND : 237,\n    NOTEQUAL : 238,\n    ANN_PERCENT : 239,\n    HASH : 240,\n    AMP : 241,\n    COMMA : 242,\n    QUESTION : 243,\n    STAR : 244,\n    PLUS : 245,\n    MINUS : 246,\n    SMALLER : 247,\n    GREATER : 248,\n    SMALLEREQ : 249,\n    GREATEREQ : 250,\n    SMALLER_SMALLER : 251,\n    GREATER_GREATER : 252,\n    SLASH : 253,\n    SLASH_SLASH : 254,\n    BANG : 255,\n    DOT : 256,\n    DOT_DOT : 257,\n    COLON : 258,\n    COLON_COLON : 259,\n    EMPTY_CLOSE_TAG : 260,\n    CLOSE_TAG : 261,\n    SEMICOLON : 262,\n    VBAR : 263,\n    PRAGMA_START : 264,\n    PRAGMA_END : 265,\n    XML_COMMENT_START : 266,\n    XML_COMMENT_END : 267,\n    PI_START : 268,\n    PI_END : 269,\n    ATTR_SIGN : 270,\n    Q : 271,\n    CHARREF_DEC : 272,\n    CHARREF_HEX : 273,\n    APOS : 274,\n    QUOT : 275,\n    NCNameStartChar : 276,\n    NCNameChar : 277,\n    L_NCName : 278,\n    Letter : 279,\n    HexLetter : 280,\n    Digit : 281,\n    Digits : 282,\n    S : 283,\n    SU : 284,\n    L_Pragma : 285,\n    L_DirCommentConstructor : 286,\n    L_DirPIConstructor : 287,\n    L_IntegerLiteral : 288,\n    L_DecimalLiteral : 289,\n    L_DoubleLiteral : 290,\n    L_Comment : 291,\n    L_AnyChar : 292,\n    L_QuotStringLiteralChar : 293,\n    L_AposStringLiteralChar : 294,\n    getGrammarFileName: function() { return \"/Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g\"; }\n});\norg.antlr.lang.augmentObject(StringLexer.prototype, {\n    // $ANTLR start QUOT\n    mQUOT: function()  {\n        try {\n            var _type = this.QUOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:66:6: ({...}? => '\\\"' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:66:8: {...}? => '\\\"'\n            if ( !(( this.inQuotStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"QUOT\", \" this.inQuotStr \");\n            }\n            this.match('\\\"'); \n             this.inQuotStr = !this.inQuotStr; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"QUOT\",\n\n    // $ANTLR start APOS\n    mAPOS: function()  {\n        try {\n            var _type = this.APOS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:67:6: ({...}? => '\\\\'' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:67:8: {...}? => '\\\\''\n            if ( !(( this.inAposStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"APOS\", \" this.inAposStr \");\n            }\n            this.match('\\''); \n             this.inAposStr = !this.inAposStr; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"APOS\",\n\n    // $ANTLR start ESCAPE_QUOT\n    mESCAPE_QUOT: function()  {\n        try {\n            var _type = this.ESCAPE_QUOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:68:13: ({...}? => '\\\"\\\"' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:68:15: {...}? => '\\\"\\\"'\n            if ( !(( this.inQuotStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"ESCAPE_QUOT\", \" this.inQuotStr \");\n            }\n            this.match(\"\\\"\\\"\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ESCAPE_QUOT\",\n\n    // $ANTLR start ESCAPE_APOS\n    mESCAPE_APOS: function()  {\n        try {\n            var _type = this.ESCAPE_APOS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:69:13: ({...}? => '\\\\'\\\\'' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:69:15: {...}? => '\\\\'\\\\''\n            if ( !(( this.inAposStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"ESCAPE_APOS\", \" this.inAposStr \");\n            }\n            this.match(\"''\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ESCAPE_APOS\",\n\n    // $ANTLR start L_PredefinedEntityRef\n    mL_PredefinedEntityRef: function()  {\n        try {\n            var _type = this.L_PredefinedEntityRef;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:2: ({...}? => '&' ( 'lt' | 'gt' | 'apos' | 'quot' | 'amp' ) ';' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:4: {...}? => '&' ( 'lt' | 'gt' | 'apos' | 'quot' | 'amp' ) ';'\n            if ( !(( this.inQuotStr | this.inAposStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_PredefinedEntityRef\", \" this.inQuotStr | this.inAposStr \");\n            }\n            this.match('&'); \n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:48: ( 'lt' | 'gt' | 'apos' | 'quot' | 'amp' )\n            var alt1=5;\n            switch ( this.input.LA(1) ) {\n            case 'l':\n                alt1=1;\n                break;\n            case 'g':\n                alt1=2;\n                break;\n            case 'a':\n                var LA1_3 = this.input.LA(2);\n\n                if ( (LA1_3=='p') ) {\n                    alt1=3;\n                }\n                else if ( (LA1_3=='m') ) {\n                    alt1=5;\n                }\n                else {\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 1, 3, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case 'q':\n                alt1=4;\n                break;\n            default:\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 1, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt1) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:49: 'lt'\n                    this.match(\"lt\"); \n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:56: 'gt'\n                    this.match(\"gt\"); \n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:63: 'apos'\n                    this.match(\"apos\"); \n\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:72: 'quot'\n                    this.match(\"quot\"); \n\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:73:81: 'amp'\n                    this.match(\"amp\"); \n\n\n\n                    break;\n\n            }\n\n            this.match(';'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_PredefinedEntityRef\",\n\n    // $ANTLR start L_CharRef\n    mL_CharRef: function()  {\n        try {\n            var _type = this.L_CharRef;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:78:2: ({...}? => '&#' ( '0' .. '9' )+ ';' | '&#x' ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ ';' )\n            var alt4=2;\n            var LA4_0 = this.input.LA(1);\n\n            if ( (LA4_0=='&') ) {\n                var LA4_1 = this.input.LA(2);\n\n                if ( (LA4_1=='#') ) {\n                    var LA4_2 = this.input.LA(3);\n\n                    if ( (LA4_2=='x') ) {\n                        alt4=2;\n                    }\n                    else if ( ((LA4_2>='0' && LA4_2<='9')) && (( this.inQuotStr | this.inAposStr ))) {\n                        alt4=1;\n                    }\n                    else {\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 4, 2, this.input);\n\n                        throw nvae;\n                    }\n                }\n                else {\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 4, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else {\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 4, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt4) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:78:4: {...}? => '&#' ( '0' .. '9' )+ ';'\n                    if ( !(( this.inQuotStr | this.inAposStr )) ) {\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_CharRef\", \" this.inQuotStr | this.inAposStr \");\n                    }\n                    this.match(\"&#\"); \n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:78:49: ( '0' .. '9' )+\n                    var cnt2=0;\n                    loop2:\n                    do {\n                        var alt2=2;\n                        var LA2_0 = this.input.LA(1);\n\n                        if ( ((LA2_0>='0' && LA2_0<='9')) ) {\n                            alt2=1;\n                        }\n\n\n                        switch (alt2) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:78:49: '0' .. '9'\n                            this.matchRange('0','9'); \n\n\n                            break;\n\n                        default :\n                            if ( cnt2 >= 1 ) {\n                                break loop2;\n                            }\n                                var eee = new org.antlr.runtime.EarlyExitException(2, this.input);\n                                throw eee;\n                        }\n                        cnt2++;\n                    } while (true);\n\n                    this.match(';'); \n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:78:65: '&#x' ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ ';'\n                    this.match(\"&#x\"); \n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:78:71: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+\n                    var cnt3=0;\n                    loop3:\n                    do {\n                        var alt3=2;\n                        var LA3_0 = this.input.LA(1);\n\n                        if ( ((LA3_0>='0' && LA3_0<='9')||(LA3_0>='A' && LA3_0<='F')||(LA3_0>='a' && LA3_0<='f')) ) {\n                            alt3=1;\n                        }\n\n\n                        switch (alt3) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:\n                            if ( (this.input.LA(1)>='0' && this.input.LA(1)<='9')||(this.input.LA(1)>='A' && this.input.LA(1)<='F')||(this.input.LA(1)>='a' && this.input.LA(1)<='f') ) {\n                                this.input.consume();\n\n                            }\n                            else {\n                                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                                this.recover(mse);\n                                throw mse;}\n\n\n\n                            break;\n\n                        default :\n                            if ( cnt3 >= 1 ) {\n                                break loop3;\n                            }\n                                var eee = new org.antlr.runtime.EarlyExitException(3, this.input);\n                                throw eee;\n                        }\n                        cnt3++;\n                    } while (true);\n\n                    this.match(';'); \n\n\n                    break;\n\n            }\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_CharRef\",\n\n    // $ANTLR start L_QuotStringLiteralChar\n    mL_QuotStringLiteralChar: function()  {\n        try {\n            var _type = this.L_QuotStringLiteralChar;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:82:2: ({...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0027' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:82:4: {...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0027' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            if ( !(( this.inQuotStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_QuotStringLiteralChar\", \" this.inQuotStr \");\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:83:3: ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0027' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            var cnt5=0;\n            loop5:\n            do {\n                var alt5=2;\n                var LA5_0 = this.input.LA(1);\n\n                if ( ((LA5_0>='\\t' && LA5_0<='\\n')||LA5_0=='\\r'||(LA5_0>=' ' && LA5_0<='!')||(LA5_0>='#' && LA5_0<='%')||(LA5_0>='\\'' && LA5_0<='\\uD7FF')||(LA5_0>='\\uE000' && LA5_0<='\\uFFFD')) ) {\n                    alt5=1;\n                }\n\n\n                switch (alt5) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||(this.input.LA(1)>=' ' && this.input.LA(1)<='!')||(this.input.LA(1)>='#' && this.input.LA(1)<='%')||(this.input.LA(1)>='\\'' && this.input.LA(1)<='\\uD7FF')||(this.input.LA(1)>='\\uE000' && this.input.LA(1)<='\\uFFFD') ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt5 >= 1 ) {\n                        break loop5;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(5, this.input);\n                        throw eee;\n                }\n                cnt5++;\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_QuotStringLiteralChar\",\n\n    // $ANTLR start L_AposStringLiteralChar\n    mL_AposStringLiteralChar: function()  {\n        try {\n            var _type = this.L_AposStringLiteralChar;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:88:2: ({...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0028' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:88:4: {...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0028' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            if ( !(( this.inAposStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_AposStringLiteralChar\", \" this.inAposStr \");\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:89:3: ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0028' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            var cnt6=0;\n            loop6:\n            do {\n                var alt6=2;\n                var LA6_0 = this.input.LA(1);\n\n                if ( ((LA6_0>='\\t' && LA6_0<='\\n')||LA6_0=='\\r'||(LA6_0>=' ' && LA6_0<='%')||(LA6_0>='(' && LA6_0<='\\uD7FF')||(LA6_0>='\\uE000' && LA6_0<='\\uFFFD')) ) {\n                    alt6=1;\n                }\n\n\n                switch (alt6) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||(this.input.LA(1)>=' ' && this.input.LA(1)<='%')||(this.input.LA(1)>='(' && this.input.LA(1)<='\\uD7FF')||(this.input.LA(1)>='\\uE000' && this.input.LA(1)<='\\uFFFD') ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt6 >= 1 ) {\n                        break loop6;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(6, this.input);\n                        throw eee;\n                }\n                cnt6++;\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_AposStringLiteralChar\",\n\n    // $ANTLR start L_AnyChar\n    mL_AnyChar: function()  {\n        try {\n            var _type = this.L_AnyChar;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:98:5: ({...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0027' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:98:9: {...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0027' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            if ( !(( !this.inQuotStr && !this.inAposStr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_AnyChar\", \" !this.inQuotStr && !this.inAposStr \");\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:99:9: ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0027' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            var cnt7=0;\n            loop7:\n            do {\n                var alt7=2;\n                var LA7_0 = this.input.LA(1);\n\n                if ( ((LA7_0>='\\t' && LA7_0<='\\n')||LA7_0=='\\r'||(LA7_0>=' ' && LA7_0<='%')||(LA7_0>='\\'' && LA7_0<=';')||(LA7_0>='=' && LA7_0<='z')||LA7_0=='|'||(LA7_0>='~' && LA7_0<='\\uD7FF')||(LA7_0>='\\uE000' && LA7_0<='\\uFFFD')) ) {\n                    alt7=1;\n                }\n\n\n                switch (alt7) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||(this.input.LA(1)>=' ' && this.input.LA(1)<='%')||(this.input.LA(1)>='\\'' && this.input.LA(1)<=';')||(this.input.LA(1)>='=' && this.input.LA(1)<='z')||this.input.LA(1)=='|'||(this.input.LA(1)>='~' && this.input.LA(1)<='\\uD7FF')||(this.input.LA(1)>='\\uE000' && this.input.LA(1)<='\\uFFFD') ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt7 >= 1 ) {\n                        break loop7;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(7, this.input);\n                        throw eee;\n                }\n                cnt7++;\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_AnyChar\",\n\n    mTokens: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:8: ( QUOT | APOS | ESCAPE_QUOT | ESCAPE_APOS | L_PredefinedEntityRef | L_CharRef | L_QuotStringLiteralChar | L_AposStringLiteralChar | L_AnyChar )\n        var alt8=9;\n        alt8 = this.dfa8.predict(this.input);\n        switch (alt8) {\n            case 1 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:10: QUOT\n                this.mQUOT(); \n\n\n                break;\n            case 2 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:15: APOS\n                this.mAPOS(); \n\n\n                break;\n            case 3 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:20: ESCAPE_QUOT\n                this.mESCAPE_QUOT(); \n\n\n                break;\n            case 4 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:32: ESCAPE_APOS\n                this.mESCAPE_APOS(); \n\n\n                break;\n            case 5 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:44: L_PredefinedEntityRef\n                this.mL_PredefinedEntityRef(); \n\n\n                break;\n            case 6 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:66: L_CharRef\n                this.mL_CharRef(); \n\n\n                break;\n            case 7 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:76: L_QuotStringLiteralChar\n                this.mL_QuotStringLiteralChar(); \n\n\n                break;\n            case 8 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:100: L_AposStringLiteralChar\n                this.mL_AposStringLiteralChar(); \n\n\n                break;\n            case 9 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/StringLexer.g:1:124: L_AnyChar\n                this.mL_AnyChar(); \n\n\n                break;\n\n        }\n\n    }\n\n}, true); // important to pass true to overwrite default implementations\n\norg.antlr.lang.augmentObject(StringLexer, {\n    DFA8_eotS:\n        \"\\u0001\\uffff\\u0001\\u0007\\u0001\\u000c\\u0001\\uffff\\u0001\\u0011\\u0001\"+\n    \"\\u0012\\u0001\\u0013\\u0001\\uffff\\u0001\\u0015\\u0002\\uffff\\u0001\\u0016\\u0001\"+\n    \"\\uffff\\u0001\\u0018\\u000d\\uffff\",\n    DFA8_eofS:\n        \"\\u001b\\uffff\",\n    DFA8_minS:\n        \"\\u0003\\u0009\\u0001\\u0023\\u0003\\u0009\\u0001\\u0000\\u0001\\u0009\\u0002\"+\n    \"\\uffff\\u0001\\u0009\\u0001\\u0000\\u0001\\u0009\\u0003\\uffff\\u0003\\u0000\\u0001\"+\n    \"\\uffff\\u0002\\u0000\\u0001\\uffff\\u0001\\u0000\\u0002\\uffff\",\n    DFA8_maxS:\n        \"\\u0003\\ufffd\\u0001\\u0071\\u0003\\ufffd\\u0001\\u0000\\u0001\\ufffd\\u0002\"+\n    \"\\uffff\\u0001\\ufffd\\u0001\\u0000\\u0001\\ufffd\\u0003\\uffff\\u0003\\u0000\\u0001\"+\n    \"\\uffff\\u0002\\u0000\\u0001\\uffff\\u0001\\u0000\\u0002\\uffff\",\n    DFA8_acceptS:\n        \"\\u0009\\uffff\\u0001\\u0008\\u0001\\u0009\\u0003\\uffff\\u0001\\u0007\\u0001\"+\n    \"\\u0006\\u0001\\u0005\\u0003\\uffff\\u0001\\u0001\\u0002\\uffff\\u0001\\u0002\\u0001\"+\n    \"\\uffff\\u0001\\u0003\\u0001\\u0004\",\n    DFA8_specialS:\n        \"\\u0001\\u0007\\u0001\\u000e\\u0001\\u0000\\u0001\\u0004\\u0001\\u0011\\u0001\"+\n    \"\\u000a\\u0001\\u0005\\u0001\\u0009\\u0001\\u0010\\u0002\\uffff\\u0001\\u000f\\u0001\"+\n    \"\\u0008\\u0001\\u0006\\u0003\\uffff\\u0001\\u000d\\u0001\\u0003\\u0001\\u000b\\u0001\"+\n    \"\\uffff\\u0001\\u0001\\u0001\\u000c\\u0001\\uffff\\u0001\\u0002\\u0002\\uffff}>\",\n    DFA8_transitionS: [\n            \"\\u0002\\u0004\\u0002\\uffff\\u0001\\u0004\\u0012\\uffff\\u0002\\u0004\"+\n            \"\\u0001\\u0001\\u0003\\u0004\\u0001\\u0003\\u0001\\u0002\\u0014\\u0004\"+\n            \"\\u0001\\u0005\\u003e\\u0004\\u0001\\u0005\\u0001\\u0004\\u0001\\u0005\"+\n            \"\\ud782\\u0004\\u0800\\uffff\\u1ffe\\u0004\",\n            \"\\u0002\\u0008\\u0002\\uffff\\u0001\\u0008\\u0012\\uffff\\u0002\\u0008\"+\n            \"\\u0001\\u0006\\u0003\\u0008\\u0001\\uffff\\u0001\\u000a\\u0014\\u0008\"+\n            \"\\u0001\\u0009\\u003e\\u0008\\u0001\\u0009\\u0001\\u0008\\u0001\\u0009\"+\n            \"\\ud782\\u0008\\u0800\\uffff\\u1ffe\\u0008\",\n            \"\\u0002\\u000d\\u0002\\uffff\\u0001\\u000d\\u0012\\uffff\\u0002\\u000d\"+\n            \"\\u0001\\u000a\\u0003\\u000d\\u0001\\uffff\\u0001\\u000b\\u0014\\u000d\"+\n            \"\\u0001\\u000e\\u003e\\u000d\\u0001\\u000e\\u0001\\u000d\\u0001\\u000e\"+\n            \"\\ud782\\u000d\\u0800\\uffff\\u1ffe\\u000d\",\n            \"\\u0001\\u000f\\u003d\\uffff\\u0001\\u0010\\u0005\\uffff\\u0001\\u0010\"+\n            \"\\u0004\\uffff\\u0001\\u0010\\u0004\\uffff\\u0001\\u0010\",\n            \"\\u0002\\u0004\\u0002\\uffff\\u0001\\u0004\\u0012\\uffff\\u0002\\u0004\"+\n            \"\\u0001\\u0008\\u0003\\u0004\\u0001\\uffff\\u0001\\u000d\\u0014\\u0004\"+\n            \"\\u0001\\u0005\\u003e\\u0004\\u0001\\u0005\\u0001\\u0004\\u0001\\u0005\"+\n            \"\\ud782\\u0004\\u0800\\uffff\\u1ffe\\u0004\",\n            \"\\u0002\\u0005\\u0002\\uffff\\u0001\\u0005\\u0012\\uffff\\u0002\\u0005\"+\n            \"\\u0001\\u0009\\u0003\\u0005\\u0001\\uffff\\u0001\\u000e\\ud7d8\\u0005\"+\n            \"\\u0800\\uffff\\u1ffe\\u0005\",\n            \"\\u0002\\u0008\\u0002\\uffff\\u0001\\u0008\\u0012\\uffff\\u0006\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u000a\\u0014\\u0008\\u0001\\u0009\\u003e\\u0008\"+\n            \"\\u0001\\u0009\\u0001\\u0008\\u0001\\u0009\\ud782\\u0008\\u0800\\uffff\"+\n            \"\\u1ffe\\u0008\",\n            \"\\u0001\\uffff\",\n            \"\\u0002\\u0008\\u0002\\uffff\\u0001\\u0008\\u0012\\uffff\\u0006\\u0008\"+\n            \"\\u0001\\uffff\\u0001\\u000a\\u0014\\u0008\\u0001\\u0009\\u003e\\u0008\"+\n            \"\\u0001\\u0009\\u0001\\u0008\\u0001\\u0009\\ud782\\u0008\\u0800\\uffff\"+\n            \"\\u1ffe\\u0008\",\n            \"\",\n            \"\",\n            \"\\u0002\\u000d\\u0002\\uffff\\u0001\\u000d\\u0012\\uffff\\u0002\\u000d\"+\n            \"\\u0001\\u000a\\u0003\\u000d\\u0001\\uffff\\u0015\\u000d\\u0001\\u000e\"+\n            \"\\u003e\\u000d\\u0001\\u000e\\u0001\\u000d\\u0001\\u000e\\ud782\\u000d\"+\n            \"\\u0800\\uffff\\u1ffe\\u000d\",\n            \"\\u0001\\uffff\",\n            \"\\u0002\\u000d\\u0002\\uffff\\u0001\\u000d\\u0012\\uffff\\u0002\\u000d\"+\n            \"\\u0001\\u000a\\u0003\\u000d\\u0001\\uffff\\u0015\\u000d\\u0001\\u000e\"+\n            \"\\u003e\\u000d\\u0001\\u000e\\u0001\\u000d\\u0001\\u000e\\ud782\\u000d\"+\n            \"\\u0800\\uffff\\u1ffe\\u000d\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(StringLexer, {\n    DFA8_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(StringLexer.DFA8_eotS),\n    DFA8_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(StringLexer.DFA8_eofS),\n    DFA8_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(StringLexer.DFA8_minS),\n    DFA8_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(StringLexer.DFA8_maxS),\n    DFA8_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(StringLexer.DFA8_acceptS),\n    DFA8_special:\n        org.antlr.runtime.DFA.unpackEncodedString(StringLexer.DFA8_specialS),\n    DFA8_transition: (function() {\n        var a = [],\n            i,\n            numStates = StringLexer.DFA8_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(StringLexer.DFA8_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nStringLexer.DFA8 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 8;\n    this.eot = StringLexer.DFA8_eot;\n    this.eof = StringLexer.DFA8_eof;\n    this.min = StringLexer.DFA8_min;\n    this.max = StringLexer.DFA8_max;\n    this.accept = StringLexer.DFA8_accept;\n    this.special = StringLexer.DFA8_special;\n    this.transition = StringLexer.DFA8_transition;\n};\n\norg.antlr.lang.extend(StringLexer.DFA8, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"1:1: Tokens : ( QUOT | APOS | ESCAPE_QUOT | ESCAPE_APOS | L_PredefinedEntityRef | L_CharRef | L_QuotStringLiteralChar | L_AposStringLiteralChar | L_AnyChar );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA8_2 = input.LA(1);\n\n                             \n                            var index8_2 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA8_2=='\\'') && ((( this.inAposStr )||( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 11;}\n\n                            else if ( ((LA8_2>='\\t' && LA8_2<='\\n')||LA8_2=='\\r'||(LA8_2>=' ' && LA8_2<='!')||(LA8_2>='#' && LA8_2<='%')||(LA8_2>='(' && LA8_2<=';')||(LA8_2>='=' && LA8_2<='z')||LA8_2=='|'||(LA8_2>='~' && LA8_2<='\\uD7FF')||(LA8_2>='\\uE000' && LA8_2<='\\uFFFD')) && ((( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 13;}\n\n                            else if ( (LA8_2=='<'||LA8_2=='{'||LA8_2=='}') && (( this.inQuotStr ))) {s = 14;}\n\n                            else if ( (LA8_2=='\\\"') && (( !this.inQuotStr && !this.inAposStr ))) {s = 10;}\n\n                            else s = 12;\n\n                             \n                            input.seek(index8_2);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA8_21 = input.LA(1);\n\n                             \n                            var index8_21 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inAposStr )) ) {s = 9;}\n\n                            else if ( (( !this.inQuotStr && !this.inAposStr )) ) {s = 10;}\n\n                             \n                            input.seek(index8_21);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA8_24 = input.LA(1);\n\n                             \n                            var index8_24 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotStr )) ) {s = 14;}\n\n                            else if ( (( !this.inQuotStr && !this.inAposStr )) ) {s = 10;}\n\n                             \n                            input.seek(index8_24);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 3 : \n                            var LA8_18 = input.LA(1);\n\n                             \n                            var index8_18 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotStr )) ) {s = 14;}\n\n                            else if ( (( this.inAposStr )) ) {s = 9;}\n\n                             \n                            input.seek(index8_18);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 4 : \n                            var LA8_3 = input.LA(1);\n\n                             \n                            var index8_3 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA8_3=='#') ) {s = 15;}\n\n                            else if ( (LA8_3=='a'||LA8_3=='g'||LA8_3=='l'||LA8_3=='q') && (( this.inQuotStr | this.inAposStr ))) {s = 16;}\n\n                             \n                            input.seek(index8_3);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 5 : \n                            var LA8_6 = input.LA(1);\n\n                             \n                            var index8_6 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA8_6>='\\t' && LA8_6<='\\n')||LA8_6=='\\r'||(LA8_6>=' ' && LA8_6<='%')||(LA8_6>='(' && LA8_6<=';')||(LA8_6>='=' && LA8_6<='z')||LA8_6=='|'||(LA8_6>='~' && LA8_6<='\\uD7FF')||(LA8_6>='\\uE000' && LA8_6<='\\uFFFD')) && ((( this.inAposStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 8;}\n\n                            else if ( (LA8_6=='<'||LA8_6=='{'||LA8_6=='}') && (( this.inAposStr ))) {s = 9;}\n\n                            else if ( (LA8_6=='\\'') && (( !this.inQuotStr && !this.inAposStr ))) {s = 10;}\n\n                            else s = 19;\n\n                             \n                            input.seek(index8_6);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 6 : \n                            var LA8_13 = input.LA(1);\n\n                             \n                            var index8_13 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA8_13>='\\t' && LA8_13<='\\n')||LA8_13=='\\r'||(LA8_13>=' ' && LA8_13<='!')||(LA8_13>='#' && LA8_13<='%')||(LA8_13>='\\'' && LA8_13<=';')||(LA8_13>='=' && LA8_13<='z')||LA8_13=='|'||(LA8_13>='~' && LA8_13<='\\uD7FF')||(LA8_13>='\\uE000' && LA8_13<='\\uFFFD')) && ((( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 13;}\n\n                            else if ( (LA8_13=='<'||LA8_13=='{'||LA8_13=='}') && (( this.inQuotStr ))) {s = 14;}\n\n                            else if ( (LA8_13=='\\\"') && (( !this.inQuotStr && !this.inAposStr ))) {s = 10;}\n\n                            else s = 24;\n\n                             \n                            input.seek(index8_13);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 7 : \n                            var LA8_0 = input.LA(1);\n\n                             \n                            var index8_0 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA8_0=='\\\"') && ((( this.inAposStr )||( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 1;}\n\n                            else if ( (LA8_0=='\\'') && ((( this.inAposStr )||( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 2;}\n\n                            else if ( (LA8_0=='&') ) {s = 3;}\n\n                            else if ( ((LA8_0>='\\t' && LA8_0<='\\n')||LA8_0=='\\r'||(LA8_0>=' ' && LA8_0<='!')||(LA8_0>='#' && LA8_0<='%')||(LA8_0>='(' && LA8_0<=';')||(LA8_0>='=' && LA8_0<='z')||LA8_0=='|'||(LA8_0>='~' && LA8_0<='\\uD7FF')||(LA8_0>='\\uE000' && LA8_0<='\\uFFFD')) && ((( this.inAposStr )||( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 4;}\n\n                            else if ( (LA8_0=='<'||LA8_0=='{'||LA8_0=='}') && ((( this.inAposStr )||( this.inQuotStr )))) {s = 5;}\n\n                             \n                            input.seek(index8_0);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 8 : \n                            var LA8_12 = input.LA(1);\n\n                             \n                            var index8_12 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inAposStr )) ) {s = 23;}\n\n                            else if ( (( this.inQuotStr )) ) {s = 14;}\n\n                            else if ( (( !this.inQuotStr && !this.inAposStr )) ) {s = 10;}\n\n                             \n                            input.seek(index8_12);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 9 : \n                            var LA8_7 = input.LA(1);\n\n                             \n                            var index8_7 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotStr )) ) {s = 20;}\n\n                            else if ( (( this.inAposStr )) ) {s = 9;}\n\n                            else if ( (( !this.inQuotStr && !this.inAposStr )) ) {s = 10;}\n\n                             \n                            input.seek(index8_7);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 10 : \n                            var LA8_5 = input.LA(1);\n\n                             \n                            var index8_5 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA8_5>='\\t' && LA8_5<='\\n')||LA8_5=='\\r'||(LA8_5>=' ' && LA8_5<='!')||(LA8_5>='#' && LA8_5<='%')||(LA8_5>='(' && LA8_5<='\\uD7FF')||(LA8_5>='\\uE000' && LA8_5<='\\uFFFD')) && ((( this.inAposStr )||( this.inQuotStr )))) {s = 5;}\n\n                            else if ( (LA8_5=='\\'') && (( this.inQuotStr ))) {s = 14;}\n\n                            else if ( (LA8_5=='\\\"') && (( this.inAposStr ))) {s = 9;}\n\n                            else s = 18;\n\n                             \n                            input.seek(index8_5);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 11 : \n                            var LA8_19 = input.LA(1);\n\n                             \n                            var index8_19 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotStr )) ) {s = 25;}\n\n                            else if ( (( this.inAposStr )) ) {s = 9;}\n\n                            else if ( (( !this.inQuotStr && !this.inAposStr )) ) {s = 10;}\n\n                             \n                            input.seek(index8_19);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 12 : \n                            var LA8_22 = input.LA(1);\n\n                             \n                            var index8_22 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inAposStr )) ) {s = 26;}\n\n                            else if ( (( this.inQuotStr )) ) {s = 14;}\n\n                            else if ( (( !this.inQuotStr && !this.inAposStr )) ) {s = 10;}\n\n                             \n                            input.seek(index8_22);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 13 : \n                            var LA8_17 = input.LA(1);\n\n                             \n                            var index8_17 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotStr )) ) {s = 14;}\n\n                            else if ( (( this.inAposStr )) ) {s = 9;}\n\n                            else if ( (( !this.inQuotStr && !this.inAposStr )) ) {s = 10;}\n\n                             \n                            input.seek(index8_17);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 14 : \n                            var LA8_1 = input.LA(1);\n\n                             \n                            var index8_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA8_1=='\\\"') && ((( this.inAposStr )||( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 6;}\n\n                            else if ( ((LA8_1>='\\t' && LA8_1<='\\n')||LA8_1=='\\r'||(LA8_1>=' ' && LA8_1<='!')||(LA8_1>='#' && LA8_1<='%')||(LA8_1>='(' && LA8_1<=';')||(LA8_1>='=' && LA8_1<='z')||LA8_1=='|'||(LA8_1>='~' && LA8_1<='\\uD7FF')||(LA8_1>='\\uE000' && LA8_1<='\\uFFFD')) && ((( this.inAposStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 8;}\n\n                            else if ( (LA8_1=='<'||LA8_1=='{'||LA8_1=='}') && (( this.inAposStr ))) {s = 9;}\n\n                            else if ( (LA8_1=='\\'') && (( !this.inQuotStr && !this.inAposStr ))) {s = 10;}\n\n                            else s = 7;\n\n                             \n                            input.seek(index8_1);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 15 : \n                            var LA8_11 = input.LA(1);\n\n                             \n                            var index8_11 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA8_11>='\\t' && LA8_11<='\\n')||LA8_11=='\\r'||(LA8_11>=' ' && LA8_11<='!')||(LA8_11>='#' && LA8_11<='%')||(LA8_11>='\\'' && LA8_11<=';')||(LA8_11>='=' && LA8_11<='z')||LA8_11=='|'||(LA8_11>='~' && LA8_11<='\\uD7FF')||(LA8_11>='\\uE000' && LA8_11<='\\uFFFD')) && ((( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 13;}\n\n                            else if ( (LA8_11=='<'||LA8_11=='{'||LA8_11=='}') && (( this.inQuotStr ))) {s = 14;}\n\n                            else if ( (LA8_11=='\\\"') && (( !this.inQuotStr && !this.inAposStr ))) {s = 10;}\n\n                            else s = 22;\n\n                             \n                            input.seek(index8_11);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 16 : \n                            var LA8_8 = input.LA(1);\n\n                             \n                            var index8_8 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA8_8>='\\t' && LA8_8<='\\n')||LA8_8=='\\r'||(LA8_8>=' ' && LA8_8<='%')||(LA8_8>='(' && LA8_8<=';')||(LA8_8>='=' && LA8_8<='z')||LA8_8=='|'||(LA8_8>='~' && LA8_8<='\\uD7FF')||(LA8_8>='\\uE000' && LA8_8<='\\uFFFD')) && ((( this.inAposStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 8;}\n\n                            else if ( (LA8_8=='<'||LA8_8=='{'||LA8_8=='}') && (( this.inAposStr ))) {s = 9;}\n\n                            else if ( (LA8_8=='\\'') && (( !this.inQuotStr && !this.inAposStr ))) {s = 10;}\n\n                            else s = 21;\n\n                             \n                            input.seek(index8_8);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 17 : \n                            var LA8_4 = input.LA(1);\n\n                             \n                            var index8_4 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA8_4>='\\t' && LA8_4<='\\n')||LA8_4=='\\r'||(LA8_4>=' ' && LA8_4<='!')||(LA8_4>='#' && LA8_4<='%')||(LA8_4>='(' && LA8_4<=';')||(LA8_4>='=' && LA8_4<='z')||LA8_4=='|'||(LA8_4>='~' && LA8_4<='\\uD7FF')||(LA8_4>='\\uE000' && LA8_4<='\\uFFFD')) && ((( this.inAposStr )||( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 4;}\n\n                            else if ( (LA8_4=='\\'') && ((( this.inQuotStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 13;}\n\n                            else if ( (LA8_4=='\\\"') && ((( this.inAposStr )||( !this.inQuotStr && !this.inAposStr )))) {s = 8;}\n\n                            else if ( (LA8_4=='<'||LA8_4=='{'||LA8_4=='}') && ((( this.inAposStr )||( this.inQuotStr )))) {s = 5;}\n\n                            else s = 17;\n\n                             \n                            input.seek(index8_4);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 8, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\n \n})();\nexports.StringLexer = StringLexer; });\ndefine('ace/mode/xquery/XMLLexer', ['require', 'exports', 'module' , 'ace/mode/xquery/antlr3-all', 'ace/mode/xquery/XQDTLexer'], function(require, exports, module) {// $ANTLR 3.3 Nov 30, 2010 12:50:56 /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g 2012-09-05 10:41:40\n\n/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\nvar org =  require(\"./antlr3-all\").org;\nvar XQDTLexer   = require(\"./XQDTLexer\").XQDTLexer;\n\n\nvar XMLLexer = function(input, state) {\n// alternate constructor @todo\n// public XMLLexer(CharStream input)\n// public XMLLexer(CharStream input, RecognizerSharedState state) {\n    if (!state) {\n        state = new org.antlr.runtime.RecognizerSharedState();\n    }\n\n    (function(){\n\n\n        this.inElem = true;\n        this.inAposAttr = false;\n        this.inQuotAttr = false;\n\n        this.isInElement = function()\n        {\n           return this.inElem;\n        }\n\n        this.isInAposAttribute = function()\n        {\n           return this.inAposAttr;\n        }\n\n        this.isInQuotAttr = function()\n        {\n           return this.inQuotAttr;\n        }\n            \n        this.addToStack = function(stack) {\n        \tif (!this.inAposAttr && !this.inQuotAttr)\n        \t\tthis.inElem = false;\n        \tstack.push(this);\n        } \n\n\n        // dummy list for warning elimination\n        //List<Stack<Object>> dummy = new ArrayList<Stack<Object>>();\n\n        // when we start, the '<' has already been eaten by the other lexer\n        //boolean inElem = true;\n        //boolean inAposAttr = false;\n        //boolean inQuotAttr = false;\n        //\n        //public boolean isInElement()\n        //{\n        //   return inElem;\n        //}\n        //\n        //public boolean isInAposAttribute()\n        //{\n        //   return inAposAttr;\n        //}\n        //\n        //public boolean isInQuotAttr()\n        //{\n        //   return inQuotAttr;\n        //}\n        //    \n        //@Override\n        //public void addToStack(List<XQDTLexer> stack) {\n        //\tif (!inAposAttr && !inQuotAttr)\n        //\t\tinElem = false;\n        //\tstack.add(this);\n        //} \n        //\n        //private boolean log() {\n        //\tSystem.out.println(\"inApos:\\t\" + inAposAttr);\n        //\tSystem.out.println(\"inQuot:\\t\" + inQuotAttr);\n        //\tSystem.out.println(\"inElem:\\t\" + inElem);\n        //\tSystem.out.println(\"---------------------\");\n        //\treturn false;\n        //}\n\n\n    }).call(this);\n\n    this.dfa16 = new XMLLexer.DFA16(this);\n    XMLLexer.superclass.constructor.call(this, input, state);\n\n\n};\n\norg.antlr.lang.augmentObject(XMLLexer, {\n    EOF: -1,\n    L_QuotAttrContentChar: 4,\n    L_AposAttrContentChar: 5,\n    L_ElementContentChar: 6,\n    L_CDataSection: 7,\n    L_PredefinedEntityRef: 8,\n    L_CharRef: 9,\n    ESCAPE_LBRACKET: 10,\n    ESCAPE_RBRACKET: 11,\n    ESCAPE_APOS: 12,\n    ESCAPE_QUOT: 13,\n    CDATA_START: 14,\n    CDATA_END: 15,\n    ANCESTOR: 16,\n    ANCESTOR_OR_SELF: 17,\n    AND: 18,\n    AS: 19,\n    ASCENDING: 20,\n    AT: 21,\n    ATTRIBUTE: 22,\n    BASE_URI: 23,\n    BOUNDARY_SPACE: 24,\n    BY: 25,\n    CASE: 26,\n    CAST: 27,\n    CASTABLE: 28,\n    CHILD: 29,\n    COLLATION: 30,\n    COMMENT: 31,\n    CONSTRUCTION: 32,\n    COPY_NAMESPACES: 33,\n    DECLARE: 34,\n    DEFAULT: 35,\n    DESCENDANT: 36,\n    DESCENDANT_OR_SELF: 37,\n    DESCENDING: 38,\n    DIV: 39,\n    DOCUMENT: 40,\n    DOCUMENT_NODE: 41,\n    ELEMENT: 42,\n    ELSE: 43,\n    EMPTY: 44,\n    EMPTY_SEQUENCE: 45,\n    ENCODING: 46,\n    EQ: 47,\n    EVERY: 48,\n    EXCEPT: 49,\n    EXTERNAL: 50,\n    FOLLOWING: 51,\n    FOLLOWING_SIBLING: 52,\n    FOR: 53,\n    FUNCTION: 54,\n    GE: 55,\n    GREATEST: 56,\n    GT: 57,\n    IDIV: 58,\n    IF: 59,\n    IMPORT: 60,\n    IN: 61,\n    INHERIT: 62,\n    INSTANCE: 63,\n    INTERSECT: 64,\n    IS: 65,\n    ITEM: 66,\n    LAX: 67,\n    LE: 68,\n    LEAST: 69,\n    LET: 70,\n    LT: 71,\n    MOD: 72,\n    MODULE: 73,\n    NAMESPACE: 74,\n    NE: 75,\n    NO_INHERIT: 76,\n    NO_PRESERVE: 77,\n    NODE: 78,\n    JSON: 79,\n    OF: 80,\n    OPTION: 81,\n    OR: 82,\n    ORDER: 83,\n    ORDERED: 84,\n    ORDERING: 85,\n    PARENT: 86,\n    PRECEDING: 87,\n    PRECEDING_SIBLING: 88,\n    PRESERVE: 89,\n    PROCESSING_INSTRUCTION: 90,\n    STRUCTURED_ITEM: 91,\n    JSON_ITEM: 92,\n    OBJECT: 93,\n    ARRAY: 94,\n    RETURN: 95,\n    SATISFIES: 96,\n    SCHEMA: 97,\n    SCHEMA_ATTRIBUTE: 98,\n    SCHEMA_ELEMENT: 99,\n    SELF: 100,\n    SOME: 101,\n    STABLE: 102,\n    STRICT: 103,\n    STRIP: 104,\n    TEXT: 105,\n    THEN: 106,\n    TO: 107,\n    TREAT: 108,\n    TYPESWITCH: 109,\n    UNION: 110,\n    UNORDERED: 111,\n    VALIDATE: 112,\n    VARIABLE: 113,\n    VERSION: 114,\n    WHERE: 115,\n    XQUERY: 116,\n    ALLOWING: 117,\n    CATCH: 118,\n    CONTEXT: 119,\n    COUNT: 120,\n    DECIMAL_FORMAT: 121,\n    DECIMAL_SEPARATOR: 122,\n    DIGIT: 123,\n    END: 124,\n    GROUP: 125,\n    GROUPING_SEPARATOR: 126,\n    INFINITY: 127,\n    MINUS_SIGN: 128,\n    NAMESPACE_NODE: 129,\n    NAN: 130,\n    NEXT: 131,\n    ONLY: 132,\n    PATTERN_SEPARATOR: 133,\n    PERCENT: 134,\n    PER_MILLE: 135,\n    PREVIOUS: 136,\n    SLIDING: 137,\n    START: 138,\n    SWITCH: 139,\n    TRY: 140,\n    TUMBLING: 141,\n    TYPE: 142,\n    WHEN: 143,\n    WINDOW: 144,\n    ZERO_DIGIT: 145,\n    AFTER: 146,\n    BEFORE: 147,\n    COPY: 148,\n    DELETE: 149,\n    FIRST: 150,\n    INSERT: 151,\n    INTO: 152,\n    POSITION: 153,\n    APPEND: 154,\n    LAST: 155,\n    MODIFY: 156,\n    NODES: 157,\n    RENAME: 158,\n    REPLACE: 159,\n    REVALIDATION: 160,\n    SKIP: 161,\n    UPDATING: 162,\n    VALUE: 163,\n    WITH: 164,\n    ALL: 165,\n    ANY: 166,\n    CONTAINS: 167,\n    CONTENT: 168,\n    DIACRITICS: 169,\n    DIFFERENT: 170,\n    DISTANCE: 171,\n    ENTIRE: 172,\n    EXACTLY: 173,\n    FROM: 174,\n    FT_OPTION: 175,\n    FTAND: 176,\n    FTNOT: 177,\n    FTOR: 178,\n    INSENSITIVE: 179,\n    LANGUAGE: 180,\n    LEVELS: 181,\n    LOWERCASE: 182,\n    MOST: 183,\n    NO: 184,\n    NOT: 185,\n    OCCURS: 186,\n    PARAGRAPH: 187,\n    PARAGRAPHS: 188,\n    PHRASE: 189,\n    RELATIONSHIP: 190,\n    SAME: 191,\n    SCORE: 192,\n    SENSITIVE: 193,\n    SENTENCE: 194,\n    SENTENCES: 195,\n    STEMMING: 196,\n    STOP: 197,\n    THESAURUS: 198,\n    TIMES: 199,\n    UPPERCASE: 200,\n    USING: 201,\n    WEIGHT: 202,\n    WILDCARDS: 203,\n    WITHOUT: 204,\n    WORD: 205,\n    WORDS: 206,\n    BREAK: 207,\n    CONTINUE: 208,\n    EXIT: 209,\n    LOOP: 210,\n    RETURNING: 211,\n    WHILE: 212,\n    CHECK: 213,\n    COLLECTION: 214,\n    CONSTRAINT: 215,\n    FOREACH: 216,\n    FOREIGN: 217,\n    INDEX: 218,\n    INTEGRITY: 219,\n    KEY: 220,\n    ON: 221,\n    UNIQUE: 222,\n    AMP_ER: 223,\n    APOS_ER: 224,\n    QUOT_ER: 225,\n    CONCAT: 226,\n    LPAREN: 227,\n    RPAREN: 228,\n    DOLLAR: 229,\n    L_UNION_BRACKET: 230,\n    R_UNION_BRACKET: 231,\n    LBRACKET: 232,\n    RBRACKET: 233,\n    LSQUARE: 234,\n    RSQUARE: 235,\n    EQUAL: 236,\n    BIND: 237,\n    NOTEQUAL: 238,\n    ANN_PERCENT: 239,\n    HASH: 240,\n    AMP: 241,\n    COMMA: 242,\n    QUESTION: 243,\n    STAR: 244,\n    PLUS: 245,\n    MINUS: 246,\n    SMALLER: 247,\n    GREATER: 248,\n    SMALLEREQ: 249,\n    GREATEREQ: 250,\n    SMALLER_SMALLER: 251,\n    GREATER_GREATER: 252,\n    SLASH: 253,\n    SLASH_SLASH: 254,\n    BANG: 255,\n    DOT: 256,\n    DOT_DOT: 257,\n    COLON: 258,\n    COLON_COLON: 259,\n    EMPTY_CLOSE_TAG: 260,\n    CLOSE_TAG: 261,\n    SEMICOLON: 262,\n    VBAR: 263,\n    PRAGMA_START: 264,\n    PRAGMA_END: 265,\n    XML_COMMENT_START: 266,\n    XML_COMMENT_END: 267,\n    PI_START: 268,\n    PI_END: 269,\n    ATTR_SIGN: 270,\n    Q: 271,\n    CHARREF_DEC: 272,\n    CHARREF_HEX: 273,\n    APOS: 274,\n    QUOT: 275,\n    NCNameStartChar: 276,\n    NCNameChar: 277,\n    L_NCName: 278,\n    Letter: 279,\n    HexLetter: 280,\n    Digit: 281,\n    Digits: 282,\n    S: 283,\n    SU: 284,\n    L_Pragma: 285,\n    L_DirCommentConstructor: 286,\n    L_DirPIConstructor: 287,\n    L_IntegerLiteral: 288,\n    L_DecimalLiteral: 289,\n    L_DoubleLiteral: 290,\n    L_Comment: 291,\n    L_AnyChar: 292,\n    NCNameUnprotected: 293,\n    XMLDigit: 294\n});\n\n(function(){\nvar HIDDEN = org.antlr.runtime.Token.HIDDEN_CHANNEL,\n    EOF = org.antlr.runtime.Token.EOF;\norg.antlr.lang.extend(XMLLexer, XQDTLexer, {\n    EOF : -1,\n    L_QuotAttrContentChar : 4,\n    L_AposAttrContentChar : 5,\n    L_ElementContentChar : 6,\n    L_CDataSection : 7,\n    L_PredefinedEntityRef : 8,\n    L_CharRef : 9,\n    ESCAPE_LBRACKET : 10,\n    ESCAPE_RBRACKET : 11,\n    ESCAPE_APOS : 12,\n    ESCAPE_QUOT : 13,\n    CDATA_START : 14,\n    CDATA_END : 15,\n    ANCESTOR : 16,\n    ANCESTOR_OR_SELF : 17,\n    AND : 18,\n    AS : 19,\n    ASCENDING : 20,\n    AT : 21,\n    ATTRIBUTE : 22,\n    BASE_URI : 23,\n    BOUNDARY_SPACE : 24,\n    BY : 25,\n    CASE : 26,\n    CAST : 27,\n    CASTABLE : 28,\n    CHILD : 29,\n    COLLATION : 30,\n    COMMENT : 31,\n    CONSTRUCTION : 32,\n    COPY_NAMESPACES : 33,\n    DECLARE : 34,\n    DEFAULT : 35,\n    DESCENDANT : 36,\n    DESCENDANT_OR_SELF : 37,\n    DESCENDING : 38,\n    DIV : 39,\n    DOCUMENT : 40,\n    DOCUMENT_NODE : 41,\n    ELEMENT : 42,\n    ELSE : 43,\n    EMPTY : 44,\n    EMPTY_SEQUENCE : 45,\n    ENCODING : 46,\n    EQ : 47,\n    EVERY : 48,\n    EXCEPT : 49,\n    EXTERNAL : 50,\n    FOLLOWING : 51,\n    FOLLOWING_SIBLING : 52,\n    FOR : 53,\n    FUNCTION : 54,\n    GE : 55,\n    GREATEST : 56,\n    GT : 57,\n    IDIV : 58,\n    IF : 59,\n    IMPORT : 60,\n    IN : 61,\n    INHERIT : 62,\n    INSTANCE : 63,\n    INTERSECT : 64,\n    IS : 65,\n    ITEM : 66,\n    LAX : 67,\n    LE : 68,\n    LEAST : 69,\n    LET : 70,\n    LT : 71,\n    MOD : 72,\n    MODULE : 73,\n    NAMESPACE : 74,\n    NE : 75,\n    NO_INHERIT : 76,\n    NO_PRESERVE : 77,\n    NODE : 78,\n    JSON : 79,\n    OF : 80,\n    OPTION : 81,\n    OR : 82,\n    ORDER : 83,\n    ORDERED : 84,\n    ORDERING : 85,\n    PARENT : 86,\n    PRECEDING : 87,\n    PRECEDING_SIBLING : 88,\n    PRESERVE : 89,\n    PROCESSING_INSTRUCTION : 90,\n    STRUCTURED_ITEM : 91,\n    JSON_ITEM : 92,\n    OBJECT : 93,\n    ARRAY : 94,\n    RETURN : 95,\n    SATISFIES : 96,\n    SCHEMA : 97,\n    SCHEMA_ATTRIBUTE : 98,\n    SCHEMA_ELEMENT : 99,\n    SELF : 100,\n    SOME : 101,\n    STABLE : 102,\n    STRICT : 103,\n    STRIP : 104,\n    TEXT : 105,\n    THEN : 106,\n    TO : 107,\n    TREAT : 108,\n    TYPESWITCH : 109,\n    UNION : 110,\n    UNORDERED : 111,\n    VALIDATE : 112,\n    VARIABLE : 113,\n    VERSION : 114,\n    WHERE : 115,\n    XQUERY : 116,\n    ALLOWING : 117,\n    CATCH : 118,\n    CONTEXT : 119,\n    COUNT : 120,\n    DECIMAL_FORMAT : 121,\n    DECIMAL_SEPARATOR : 122,\n    DIGIT : 123,\n    END : 124,\n    GROUP : 125,\n    GROUPING_SEPARATOR : 126,\n    INFINITY : 127,\n    MINUS_SIGN : 128,\n    NAMESPACE_NODE : 129,\n    NAN : 130,\n    NEXT : 131,\n    ONLY : 132,\n    PATTERN_SEPARATOR : 133,\n    PERCENT : 134,\n    PER_MILLE : 135,\n    PREVIOUS : 136,\n    SLIDING : 137,\n    START : 138,\n    SWITCH : 139,\n    TRY : 140,\n    TUMBLING : 141,\n    TYPE : 142,\n    WHEN : 143,\n    WINDOW : 144,\n    ZERO_DIGIT : 145,\n    AFTER : 146,\n    BEFORE : 147,\n    COPY : 148,\n    DELETE : 149,\n    FIRST : 150,\n    INSERT : 151,\n    INTO : 152,\n    POSITION : 153,\n    APPEND : 154,\n    LAST : 155,\n    MODIFY : 156,\n    NODES : 157,\n    RENAME : 158,\n    REPLACE : 159,\n    REVALIDATION : 160,\n    SKIP : 161,\n    UPDATING : 162,\n    VALUE : 163,\n    WITH : 164,\n    ALL : 165,\n    ANY : 166,\n    CONTAINS : 167,\n    CONTENT : 168,\n    DIACRITICS : 169,\n    DIFFERENT : 170,\n    DISTANCE : 171,\n    ENTIRE : 172,\n    EXACTLY : 173,\n    FROM : 174,\n    FT_OPTION : 175,\n    FTAND : 176,\n    FTNOT : 177,\n    FTOR : 178,\n    INSENSITIVE : 179,\n    LANGUAGE : 180,\n    LEVELS : 181,\n    LOWERCASE : 182,\n    MOST : 183,\n    NO : 184,\n    NOT : 185,\n    OCCURS : 186,\n    PARAGRAPH : 187,\n    PARAGRAPHS : 188,\n    PHRASE : 189,\n    RELATIONSHIP : 190,\n    SAME : 191,\n    SCORE : 192,\n    SENSITIVE : 193,\n    SENTENCE : 194,\n    SENTENCES : 195,\n    STEMMING : 196,\n    STOP : 197,\n    THESAURUS : 198,\n    TIMES : 199,\n    UPPERCASE : 200,\n    USING : 201,\n    WEIGHT : 202,\n    WILDCARDS : 203,\n    WITHOUT : 204,\n    WORD : 205,\n    WORDS : 206,\n    BREAK : 207,\n    CONTINUE : 208,\n    EXIT : 209,\n    LOOP : 210,\n    RETURNING : 211,\n    WHILE : 212,\n    CHECK : 213,\n    COLLECTION : 214,\n    CONSTRAINT : 215,\n    FOREACH : 216,\n    FOREIGN : 217,\n    INDEX : 218,\n    INTEGRITY : 219,\n    KEY : 220,\n    ON : 221,\n    UNIQUE : 222,\n    AMP_ER : 223,\n    APOS_ER : 224,\n    QUOT_ER : 225,\n    CONCAT : 226,\n    LPAREN : 227,\n    RPAREN : 228,\n    DOLLAR : 229,\n    L_UNION_BRACKET : 230,\n    R_UNION_BRACKET : 231,\n    LBRACKET : 232,\n    RBRACKET : 233,\n    LSQUARE : 234,\n    RSQUARE : 235,\n    EQUAL : 236,\n    BIND : 237,\n    NOTEQUAL : 238,\n    ANN_PERCENT : 239,\n    HASH : 240,\n    AMP : 241,\n    COMMA : 242,\n    QUESTION : 243,\n    STAR : 244,\n    PLUS : 245,\n    MINUS : 246,\n    SMALLER : 247,\n    GREATER : 248,\n    SMALLEREQ : 249,\n    GREATEREQ : 250,\n    SMALLER_SMALLER : 251,\n    GREATER_GREATER : 252,\n    SLASH : 253,\n    SLASH_SLASH : 254,\n    BANG : 255,\n    DOT : 256,\n    DOT_DOT : 257,\n    COLON : 258,\n    COLON_COLON : 259,\n    EMPTY_CLOSE_TAG : 260,\n    CLOSE_TAG : 261,\n    SEMICOLON : 262,\n    VBAR : 263,\n    PRAGMA_START : 264,\n    PRAGMA_END : 265,\n    XML_COMMENT_START : 266,\n    XML_COMMENT_END : 267,\n    PI_START : 268,\n    PI_END : 269,\n    ATTR_SIGN : 270,\n    Q : 271,\n    CHARREF_DEC : 272,\n    CHARREF_HEX : 273,\n    APOS : 274,\n    QUOT : 275,\n    NCNameStartChar : 276,\n    NCNameChar : 277,\n    L_NCName : 278,\n    Letter : 279,\n    HexLetter : 280,\n    Digit : 281,\n    Digits : 282,\n    S : 283,\n    SU : 284,\n    L_Pragma : 285,\n    L_DirCommentConstructor : 286,\n    L_DirPIConstructor : 287,\n    L_IntegerLiteral : 288,\n    L_DecimalLiteral : 289,\n    L_DoubleLiteral : 290,\n    L_Comment : 291,\n    L_AnyChar : 292,\n    NCNameUnprotected : 293,\n    XMLDigit : 294,\n    getGrammarFileName: function() { return \"/Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g\"; }\n});\norg.antlr.lang.augmentObject(XMLLexer.prototype, {\n    // $ANTLR start QUOT\n    mQUOT: function()  {\n        try {\n            var _type = this.QUOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:132:6: ({...}? => '\\\"' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:132:8: {...}? => '\\\"'\n            if ( !(( this.inElem || this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"QUOT\", \" this.inElem || this.inQuotAttr \");\n            }\n            this.match('\\\"'); \n             if (!this.inAposAttr) this.inQuotAttr = (!this.inQuotAttr); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"QUOT\",\n\n    // $ANTLR start APOS\n    mAPOS: function()  {\n        try {\n            var _type = this.APOS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:133:6: ({...}? => '\\\\'' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:133:8: {...}? => '\\\\''\n            if ( !(( this.inElem || this.inAposAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"APOS\", \" this.inElem || this.inAposAttr \");\n            }\n            this.match('\\''); \n             if (!this.inQuotAttr) this.inAposAttr = !this.inAposAttr; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"APOS\",\n\n    // $ANTLR start L_QuotAttrContentChar\n    mL_QuotAttrContentChar: function()  {\n        try {\n            var _type = this.L_QuotAttrContentChar;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:136:2: ({...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' | '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0028' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' .. '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:136:4: {...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' | '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0028' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' .. '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            if ( !(( this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_QuotAttrContentChar\", \" this.inQuotAttr \");\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:137:3: ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' | '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0028' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' .. '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            var cnt1=0;\n            loop1:\n            do {\n                var alt1=2;\n                var LA1_0 = this.input.LA(1);\n\n                if ( ((LA1_0>='\\t' && LA1_0<='\\n')||LA1_0=='\\r'||(LA1_0>=' ' && LA1_0<='!')||(LA1_0>='#' && LA1_0<='%')||(LA1_0>='(' && LA1_0<=';')||(LA1_0>='=' && LA1_0<='z')||LA1_0=='|'||(LA1_0>='~' && LA1_0<='\\uD7FF')||(LA1_0>='\\uE000' && LA1_0<='\\uFFFD')) ) {\n                    alt1=1;\n                }\n\n\n                switch (alt1) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||(this.input.LA(1)>=' ' && this.input.LA(1)<='!')||(this.input.LA(1)>='#' && this.input.LA(1)<='%')||(this.input.LA(1)>='(' && this.input.LA(1)<=';')||(this.input.LA(1)>='=' && this.input.LA(1)<='z')||this.input.LA(1)=='|'||(this.input.LA(1)>='~' && this.input.LA(1)<='\\uD7FF')||(this.input.LA(1)>='\\uE000' && this.input.LA(1)<='\\uFFFD') ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt1 >= 1 ) {\n                        break loop1;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(1, this.input);\n                        throw eee;\n                }\n                cnt1++;\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_QuotAttrContentChar\",\n\n    // $ANTLR start L_AposAttrContentChar\n    mL_AposAttrContentChar: function()  {\n        try {\n            var _type = this.L_AposAttrContentChar;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:143:2: ({...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' | '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0028' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' .. '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:143:4: {...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' | '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0028' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' .. '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            if ( !(( this.inAposAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_AposAttrContentChar\", \" this.inAposAttr \");\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:144:3: ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' | '\\\\u0021' | '\\\\u0023' .. '\\\\u0025' | '\\\\u0028' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' .. '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            var cnt2=0;\n            loop2:\n            do {\n                var alt2=2;\n                var LA2_0 = this.input.LA(1);\n\n                if ( ((LA2_0>='\\t' && LA2_0<='\\n')||LA2_0=='\\r'||(LA2_0>=' ' && LA2_0<='!')||(LA2_0>='#' && LA2_0<='%')||(LA2_0>='(' && LA2_0<=';')||(LA2_0>='=' && LA2_0<='z')||LA2_0=='|'||(LA2_0>='~' && LA2_0<='\\uD7FF')||(LA2_0>='\\uE000' && LA2_0<='\\uFFFD')) ) {\n                    alt2=1;\n                }\n\n\n                switch (alt2) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||(this.input.LA(1)>=' ' && this.input.LA(1)<='!')||(this.input.LA(1)>='#' && this.input.LA(1)<='%')||(this.input.LA(1)>='(' && this.input.LA(1)<=';')||(this.input.LA(1)>='=' && this.input.LA(1)<='z')||this.input.LA(1)=='|'||(this.input.LA(1)>='~' && this.input.LA(1)<='\\uD7FF')||(this.input.LA(1)>='\\uE000' && this.input.LA(1)<='\\uFFFD') ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt2 >= 1 ) {\n                        break loop2;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(2, this.input);\n                        throw eee;\n                }\n                cnt2++;\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_AposAttrContentChar\",\n\n    // $ANTLR start L_ElementContentChar\n    mL_ElementContentChar: function()  {\n        try {\n            var _type = this.L_ElementContentChar;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:151:2: ({...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0027' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:151:4: {...}? => ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0027' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            if ( !(( !this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_ElementContentChar\", \" !this.inElem \");\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:152:3: ( '\\\\u0009' | '\\\\u000A' | '\\\\u000D' | '\\\\u0020' .. '\\\\u0025' | '\\\\u0027' .. '\\\\u003B' | '\\\\u003D' .. '\\\\u007A' | '\\\\u007C' | '\\\\u007E' .. '\\\\uD7FF' | '\\\\uE000' .. '\\\\uFFFD' )+\n            var cnt3=0;\n            loop3:\n            do {\n                var alt3=2;\n                var LA3_0 = this.input.LA(1);\n\n                if ( ((LA3_0>='\\t' && LA3_0<='\\n')||LA3_0=='\\r'||(LA3_0>=' ' && LA3_0<='%')||(LA3_0>='\\'' && LA3_0<=';')||(LA3_0>='=' && LA3_0<='z')||LA3_0=='|'||(LA3_0>='~' && LA3_0<='\\uD7FF')||(LA3_0>='\\uE000' && LA3_0<='\\uFFFD')) ) {\n                    alt3=1;\n                }\n\n\n                switch (alt3) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||(this.input.LA(1)>=' ' && this.input.LA(1)<='%')||(this.input.LA(1)>='\\'' && this.input.LA(1)<=';')||(this.input.LA(1)>='=' && this.input.LA(1)<='z')||this.input.LA(1)=='|'||(this.input.LA(1)>='~' && this.input.LA(1)<='\\uD7FF')||(this.input.LA(1)>='\\uE000' && this.input.LA(1)<='\\uFFFD') ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt3 >= 1 ) {\n                        break loop3;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(3, this.input);\n                        throw eee;\n                }\n                cnt3++;\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_ElementContentChar\",\n\n    // $ANTLR start GREATER\n    mGREATER: function()  {\n        try {\n            var _type = this.GREATER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:158:2: ({...}? => '>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:158:4: {...}? => '>'\n            if ( !(( this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"GREATER\", \" this.inElem \");\n            }\n            this.match('>'); \n             this.inElem = false; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"GREATER\",\n\n    // $ANTLR start EMPTY_CLOSE_TAG\n    mEMPTY_CLOSE_TAG: function()  {\n        try {\n            var _type = this.EMPTY_CLOSE_TAG;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:162:2: ({...}? => '/>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:162:4: {...}? => '/>'\n            if ( !(( this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"EMPTY_CLOSE_TAG\", \" this.inElem \");\n            }\n            this.match(\"/>\"); \n\n             this.inElem = false; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EMPTY_CLOSE_TAG\",\n\n    // $ANTLR start S\n    mS: function()  {\n        try {\n            var _type = this.S;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:166:2: ({...}? => ( ' ' | '\\\\t' | '\\\\r' | '\\\\n' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:166:4: {...}? => ( ' ' | '\\\\t' | '\\\\r' | '\\\\n' )+\n            if ( !(( this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"S\", \" this.inElem \");\n            }\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:166:24: ( ' ' | '\\\\t' | '\\\\r' | '\\\\n' )+\n            var cnt4=0;\n            loop4:\n            do {\n                var alt4=2;\n                var LA4_0 = this.input.LA(1);\n\n                if ( ((LA4_0>='\\t' && LA4_0<='\\n')||LA4_0=='\\r'||LA4_0==' ') ) {\n                    alt4=1;\n                }\n\n\n                switch (alt4) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||this.input.LA(1)==' ' ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt4 >= 1 ) {\n                        break loop4;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(4, this.input);\n                        throw eee;\n                }\n                cnt4++;\n            } while (true);\n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"S\",\n\n    // $ANTLR start L_NCName\n    mL_NCName: function()  {\n        try {\n            var _type = this.L_NCName;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:172:2: ({...}? => NCNameUnprotected )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:172:4: {...}? => NCNameUnprotected\n            if ( !(( this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_NCName\", \" this.inElem \");\n            }\n            this.mNCNameUnprotected(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_NCName\",\n\n    // $ANTLR start NCNameUnprotected\n    mNCNameUnprotected: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:176:2: ( NCNameStartChar ( NCNameChar )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:176:4: NCNameStartChar ( NCNameChar )*\n            this.mNCNameStartChar(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:176:20: ( NCNameChar )*\n            loop5:\n            do {\n                var alt5=2;\n                var LA5_0 = this.input.LA(1);\n\n                if ( ((LA5_0>='-' && LA5_0<='.')||(LA5_0>='0' && LA5_0<='9')||(LA5_0>='A' && LA5_0<='Z')||LA5_0=='_'||(LA5_0>='a' && LA5_0<='z')) ) {\n                    alt5=1;\n                }\n\n\n                switch (alt5) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:176:20: NCNameChar\n                    this.mNCNameChar(); \n\n\n                    break;\n\n                default :\n                    break loop5;\n                }\n            } while (true);\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NCNameUnprotected\",\n\n    // $ANTLR start NCNameStartChar\n    mNCNameStartChar: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:180:2: ( Letter | '_' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n            if ( (this.input.LA(1)>='A' && this.input.LA(1)<='Z')||this.input.LA(1)=='_'||(this.input.LA(1)>='a' && this.input.LA(1)<='z') ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NCNameStartChar\",\n\n    // $ANTLR start NCNameChar\n    mNCNameChar: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:184:2: ( Letter | XMLDigit | '.' | '-' | '_' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n            if ( (this.input.LA(1)>='-' && this.input.LA(1)<='.')||(this.input.LA(1)>='0' && this.input.LA(1)<='9')||(this.input.LA(1)>='A' && this.input.LA(1)<='Z')||this.input.LA(1)=='_'||(this.input.LA(1)>='a' && this.input.LA(1)<='z') ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"NCNameChar\",\n\n    // $ANTLR start Letter\n    mLetter: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:188:2: ( 'a' .. 'z' | 'A' .. 'Z' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n            if ( (this.input.LA(1)>='A' && this.input.LA(1)<='Z')||(this.input.LA(1)>='a' && this.input.LA(1)<='z') ) {\n                this.input.consume();\n\n            }\n            else {\n                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                this.recover(mse);\n                throw mse;}\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"Letter\",\n\n    // $ANTLR start XMLDigit\n    mXMLDigit: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:192:2: ( '0' .. '9' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:192:4: '0' .. '9'\n            this.matchRange('0','9'); \n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"XMLDigit\",\n\n    // $ANTLR start EQUAL\n    mEQUAL: function()  {\n        try {\n            var _type = this.EQUAL;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:207:7: ({...}? => '=' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:207:9: {...}? => '='\n            if ( !(( this.inElem  )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"EQUAL\", \" this.inElem  \");\n            }\n            this.match('='); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"EQUAL\",\n\n    // $ANTLR start ESCAPE_APOS\n    mESCAPE_APOS: function()  {\n        try {\n            var _type = this.ESCAPE_APOS;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:208:13: ({...}? => '\\\\'\\\\'' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:208:15: {...}? => '\\\\'\\\\''\n            if ( !(( this.inAposAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"ESCAPE_APOS\", \" this.inAposAttr \");\n            }\n            this.match(\"''\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ESCAPE_APOS\",\n\n    // $ANTLR start ESCAPE_QUOT\n    mESCAPE_QUOT: function()  {\n        try {\n            var _type = this.ESCAPE_QUOT;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:209:13: ({...}? => '\\\"\\\"' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:209:15: {...}? => '\\\"\\\"'\n            if ( !(( this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"ESCAPE_QUOT\", \" this.inQuotAttr \");\n            }\n            this.match(\"\\\"\\\"\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ESCAPE_QUOT\",\n\n    // $ANTLR start ESCAPE_LBRACKET\n    mESCAPE_LBRACKET: function()  {\n        try {\n            var _type = this.ESCAPE_LBRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:212:2: ({...}? => '{{' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:212:4: {...}? => '{{'\n            if ( !(( !this.inElem || this.inAposAttr || this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"ESCAPE_LBRACKET\", \" !this.inElem || this.inAposAttr || this.inQuotAttr \");\n            }\n            this.match(\"{{\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ESCAPE_LBRACKET\",\n\n    // $ANTLR start ESCAPE_RBRACKET\n    mESCAPE_RBRACKET: function()  {\n        try {\n            var _type = this.ESCAPE_RBRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:216:2: ({...}? => '}}' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:216:4: {...}? => '}}'\n            if ( !(( !this.inElem || this.inAposAttr || this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"ESCAPE_RBRACKET\", \" !this.inElem || this.inAposAttr || this.inQuotAttr \");\n            }\n            this.match(\"}}\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"ESCAPE_RBRACKET\",\n\n    // $ANTLR start LBRACKET\n    mLBRACKET: function()  {\n        try {\n            var _type = this.LBRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:219:10: ({...}? => '{' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:219:12: {...}? => '{'\n            if ( !(( !this.inElem || this.inAposAttr || this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"LBRACKET\", \" !this.inElem || this.inAposAttr || this.inQuotAttr \");\n            }\n            this.match('{'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"LBRACKET\",\n\n    // $ANTLR start RBRACKET\n    mRBRACKET: function()  {\n        try {\n            var _type = this.RBRACKET;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:220:10: ({...}? => '}' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:220:12: {...}? => '}'\n            if ( !(( !this.inElem || this.inAposAttr || this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"RBRACKET\", \" !this.inElem || this.inAposAttr || this.inQuotAttr \");\n            }\n            this.match('}'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"RBRACKET\",\n\n    // $ANTLR start SMALLER\n    mSMALLER: function()  {\n        try {\n            var _type = this.SMALLER;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:221:9: ( '<' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:221:11: '<'\n            this.match('<'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SMALLER\",\n\n    // $ANTLR start CLOSE_TAG\n    mCLOSE_TAG: function()  {\n        try {\n            var _type = this.CLOSE_TAG;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:222:11: ({...}? => '</' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:222:13: {...}? => '</'\n            if ( !(( !this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"CLOSE_TAG\", \" !this.inElem \");\n            }\n            this.match(\"</\"); \n\n             this.inElem = true; \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CLOSE_TAG\",\n\n    // $ANTLR start CDATA_START\n    mCDATA_START: function()  {\n        try {\n            var _type = this.CDATA_START;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:224:13: ( '<![CDATA[' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:224:15: '<![CDATA['\n            this.match(\"<![CDATA[\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CDATA_START\",\n\n    // $ANTLR start CDATA_END\n    mCDATA_END: function()  {\n        try {\n            var _type = this.CDATA_END;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:225:12: ( ']]>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:225:14: ']]>'\n            this.match(\"]]>\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"CDATA_END\",\n\n    // $ANTLR start L_CDataSection\n    mL_CDataSection: function()  {\n        try {\n            var _type = this.L_CDataSection;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:229:3: ({...}? => CDATA_START ( options {greedy=false; } : ( . )* ) CDATA_END )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:229:5: {...}? => CDATA_START ( options {greedy=false; } : ( . )* ) CDATA_END\n            if ( !(( !this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_CDataSection\", \" !this.inElem \");\n            }\n            this.mCDATA_START(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:229:38: ( options {greedy=false; } : ( . )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:229:65: ( . )*\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:229:65: ( . )*\n            loop6:\n            do {\n                var alt6=2;\n                var LA6_0 = this.input.LA(1);\n\n                if ( (LA6_0==']') ) {\n                    var LA6_1 = this.input.LA(2);\n\n                    if ( (LA6_1==']') ) {\n                        var LA6_3 = this.input.LA(3);\n\n                        if ( (LA6_3=='>') ) {\n                            alt6=2;\n                        }\n                        else if ( ((LA6_3>='\\u0000' && LA6_3<='=')||(LA6_3>='?' && LA6_3<='\\uFFFF')) ) {\n                            alt6=1;\n                        }\n\n\n                    }\n                    else if ( ((LA6_1>='\\u0000' && LA6_1<='\\\\')||(LA6_1>='^' && LA6_1<='\\uFFFF')) ) {\n                        alt6=1;\n                    }\n\n\n                }\n                else if ( ((LA6_0>='\\u0000' && LA6_0<='\\\\')||(LA6_0>='^' && LA6_0<='\\uFFFF')) ) {\n                    alt6=1;\n                }\n\n\n                switch (alt6) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:229:65: .\n                    this.matchAny(); \n\n\n                    break;\n\n                default :\n                    break loop6;\n                }\n            } while (true);\n\n\n\n\n            this.mCDATA_END(); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_CDataSection\",\n\n    // $ANTLR start L_PredefinedEntityRef\n    mL_PredefinedEntityRef: function()  {\n        try {\n            var _type = this.L_PredefinedEntityRef;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:2: ({...}? => '&' ( 'lt' | 'gt' | 'apos' | 'quot' | 'amp' ) ';' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:4: {...}? => '&' ( 'lt' | 'gt' | 'apos' | 'quot' | 'amp' ) ';'\n            if ( !(( !this.inElem || this.inAposAttr || this.inQuotAttr )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_PredefinedEntityRef\", \" !this.inElem || this.inAposAttr || this.inQuotAttr \");\n            }\n            this.match('&'); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:67: ( 'lt' | 'gt' | 'apos' | 'quot' | 'amp' )\n            var alt7=5;\n            switch ( this.input.LA(1) ) {\n            case 'l':\n                alt7=1;\n                break;\n            case 'g':\n                alt7=2;\n                break;\n            case 'a':\n                var LA7_3 = this.input.LA(2);\n\n                if ( (LA7_3=='p') ) {\n                    alt7=3;\n                }\n                else if ( (LA7_3=='m') ) {\n                    alt7=5;\n                }\n                else {\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 7, 3, this.input);\n\n                    throw nvae;\n                }\n                break;\n            case 'q':\n                alt7=4;\n                break;\n            default:\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 7, 0, this.input);\n\n                throw nvae;\n            }\n\n            switch (alt7) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:68: 'lt'\n                    this.match(\"lt\"); \n\n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:75: 'gt'\n                    this.match(\"gt\"); \n\n\n\n                    break;\n                case 3 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:82: 'apos'\n                    this.match(\"apos\"); \n\n\n\n                    break;\n                case 4 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:91: 'quot'\n                    this.match(\"quot\"); \n\n\n\n                    break;\n                case 5 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:237:100: 'amp'\n                    this.match(\"amp\"); \n\n\n\n                    break;\n\n            }\n\n            this.match(';'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_PredefinedEntityRef\",\n\n    // $ANTLR start L_CharRef\n    mL_CharRef: function()  {\n        try {\n            var _type = this.L_CharRef;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:242:2: ({...}? => '&#' ( '0' .. '9' )+ ';' | '&#x' ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ ';' )\n            var alt10=2;\n            var LA10_0 = this.input.LA(1);\n\n            if ( (LA10_0=='&') ) {\n                var LA10_1 = this.input.LA(2);\n\n                if ( (LA10_1=='#') ) {\n                    var LA10_2 = this.input.LA(3);\n\n                    if ( (LA10_2=='x') ) {\n                        alt10=2;\n                    }\n                    else if ( ((LA10_2>='0' && LA10_2<='9')) && (( !this.inElem || this.inAposAttr || this.inQuotAttr ))) {\n                        alt10=1;\n                    }\n                    else {\n                        var nvae =\n                            new org.antlr.runtime.NoViableAltException(\"\", 10, 2, this.input);\n\n                        throw nvae;\n                    }\n                }\n                else {\n                    var nvae =\n                        new org.antlr.runtime.NoViableAltException(\"\", 10, 1, this.input);\n\n                    throw nvae;\n                }\n            }\n            else {\n                var nvae =\n                    new org.antlr.runtime.NoViableAltException(\"\", 10, 0, this.input);\n\n                throw nvae;\n            }\n            switch (alt10) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:242:4: {...}? => '&#' ( '0' .. '9' )+ ';'\n                    if ( !(( !this.inElem || this.inAposAttr || this.inQuotAttr )) ) {\n                        throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_CharRef\", \" !this.inElem || this.inAposAttr || this.inQuotAttr \");\n                    }\n                    this.match(\"&#\"); \n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:242:68: ( '0' .. '9' )+\n                    var cnt8=0;\n                    loop8:\n                    do {\n                        var alt8=2;\n                        var LA8_0 = this.input.LA(1);\n\n                        if ( ((LA8_0>='0' && LA8_0<='9')) ) {\n                            alt8=1;\n                        }\n\n\n                        switch (alt8) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:242:69: '0' .. '9'\n                            this.matchRange('0','9'); \n\n\n                            break;\n\n                        default :\n                            if ( cnt8 >= 1 ) {\n                                break loop8;\n                            }\n                                var eee = new org.antlr.runtime.EarlyExitException(8, this.input);\n                                throw eee;\n                        }\n                        cnt8++;\n                    } while (true);\n\n                    this.match(';'); \n\n\n                    break;\n                case 2 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:242:86: '&#x' ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ ';'\n                    this.match(\"&#x\"); \n\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:242:92: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+\n                    var cnt9=0;\n                    loop9:\n                    do {\n                        var alt9=2;\n                        var LA9_0 = this.input.LA(1);\n\n                        if ( ((LA9_0>='0' && LA9_0<='9')||(LA9_0>='A' && LA9_0<='F')||(LA9_0>='a' && LA9_0<='f')) ) {\n                            alt9=1;\n                        }\n\n\n                        switch (alt9) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n                            if ( (this.input.LA(1)>='0' && this.input.LA(1)<='9')||(this.input.LA(1)>='A' && this.input.LA(1)<='F')||(this.input.LA(1)>='a' && this.input.LA(1)<='f') ) {\n                                this.input.consume();\n\n                            }\n                            else {\n                                var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                                this.recover(mse);\n                                throw mse;}\n\n\n\n                            break;\n\n                        default :\n                            if ( cnt9 >= 1 ) {\n                                break loop9;\n                            }\n                                var eee = new org.antlr.runtime.EarlyExitException(9, this.input);\n                                throw eee;\n                        }\n                        cnt9++;\n                    } while (true);\n\n                    this.match(';'); \n\n\n                    break;\n\n            }\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_CharRef\",\n\n    // $ANTLR start L_DirCommentConstructor\n    mL_DirCommentConstructor: function()  {\n        try {\n            var _type = this.L_DirCommentConstructor;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:246:2: ({...}? => '<!--' ( options {greedy=false; } : ( . )* ) '-->' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:246:4: {...}? => '<!--' ( options {greedy=false; } : ( . )* ) '-->'\n            if ( !(( !this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_DirCommentConstructor\", \" !this.inElem \");\n            }\n            this.match(\"<!--\"); \n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:246:32: ( options {greedy=false; } : ( . )* )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:246:59: ( . )*\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:246:59: ( . )*\n            loop11:\n            do {\n                var alt11=2;\n                var LA11_0 = this.input.LA(1);\n\n                if ( (LA11_0=='-') ) {\n                    var LA11_1 = this.input.LA(2);\n\n                    if ( (LA11_1=='-') ) {\n                        var LA11_3 = this.input.LA(3);\n\n                        if ( (LA11_3=='>') ) {\n                            alt11=2;\n                        }\n                        else if ( ((LA11_3>='\\u0000' && LA11_3<='=')||(LA11_3>='?' && LA11_3<='\\uFFFF')) ) {\n                            alt11=1;\n                        }\n\n\n                    }\n                    else if ( ((LA11_1>='\\u0000' && LA11_1<=',')||(LA11_1>='.' && LA11_1<='\\uFFFF')) ) {\n                        alt11=1;\n                    }\n\n\n                }\n                else if ( ((LA11_0>='\\u0000' && LA11_0<=',')||(LA11_0>='.' && LA11_0<='\\uFFFF')) ) {\n                    alt11=1;\n                }\n\n\n                switch (alt11) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:246:59: .\n                    this.matchAny(); \n\n\n                    break;\n\n                default :\n                    break loop11;\n                }\n            } while (true);\n\n\n\n\n            this.match(\"-->\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_DirCommentConstructor\",\n\n    // $ANTLR start L_DirPIConstructor\n    mL_DirPIConstructor: function()  {\n        try {\n            var _type = this.L_DirPIConstructor;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:249:2: ({...}? => '<?' ( SU )? NCNameUnprotected ( SU ( options {greedy=false; } : ( . )* ) )? '?>' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:249:4: {...}? => '<?' ( SU )? NCNameUnprotected ( SU ( options {greedy=false; } : ( . )* ) )? '?>'\n            if ( !(( !this.inElem )) ) {\n                throw new org.antlr.runtime.FailedPredicateException(this.input, \"L_DirPIConstructor\", \" !this.inElem \");\n            }\n            this.match(\"<?\"); \n\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:8: ( SU )?\n            var alt12=2;\n            var LA12_0 = this.input.LA(1);\n\n            if ( ((LA12_0>='\\t' && LA12_0<='\\n')||LA12_0=='\\r'||LA12_0==' ') ) {\n                alt12=1;\n            }\n            switch (alt12) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:8: SU\n                    this.mSU(); \n\n\n                    break;\n\n            }\n\n            this.mNCNameUnprotected(); \n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:30: ( SU ( options {greedy=false; } : ( . )* ) )?\n            var alt14=2;\n            var LA14_0 = this.input.LA(1);\n\n            if ( ((LA14_0>='\\t' && LA14_0<='\\n')||LA14_0=='\\r'||LA14_0==' ') ) {\n                alt14=1;\n            }\n            switch (alt14) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:31: SU ( options {greedy=false; } : ( . )* )\n                    this.mSU(); \n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:34: ( options {greedy=false; } : ( . )* )\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:61: ( . )*\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:61: ( . )*\n                    loop13:\n                    do {\n                        var alt13=2;\n                        var LA13_0 = this.input.LA(1);\n\n                        if ( (LA13_0=='?') ) {\n                            var LA13_1 = this.input.LA(2);\n\n                            if ( (LA13_1=='>') ) {\n                                alt13=2;\n                            }\n                            else if ( ((LA13_1>='\\u0000' && LA13_1<='=')||(LA13_1>='?' && LA13_1<='\\uFFFF')) ) {\n                                alt13=1;\n                            }\n\n\n                        }\n                        else if ( ((LA13_0>='\\u0000' && LA13_0<='>')||(LA13_0>='@' && LA13_0<='\\uFFFF')) ) {\n                            alt13=1;\n                        }\n\n\n                        switch (alt13) {\n                        case 1 :\n                            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:250:61: .\n                            this.matchAny(); \n\n\n                            break;\n\n                        default :\n                            break loop13;\n                        }\n                    } while (true);\n\n\n\n\n\n\n                    break;\n\n            }\n\n            this.match(\"?>\"); \n\n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"L_DirPIConstructor\",\n\n    // $ANTLR start SU\n    mSU: function()  {\n        try {\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:254:2: ( ( ' ' | '\\\\t' | '\\\\n' | '\\\\r' )+ )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:254:4: ( ' ' | '\\\\t' | '\\\\n' | '\\\\r' )+\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:254:4: ( ' ' | '\\\\t' | '\\\\n' | '\\\\r' )+\n            var cnt15=0;\n            loop15:\n            do {\n                var alt15=2;\n                var LA15_0 = this.input.LA(1);\n\n                if ( ((LA15_0>='\\t' && LA15_0<='\\n')||LA15_0=='\\r'||LA15_0==' ') ) {\n                    alt15=1;\n                }\n\n\n                switch (alt15) {\n                case 1 :\n                    // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:\n                    if ( (this.input.LA(1)>='\\t' && this.input.LA(1)<='\\n')||this.input.LA(1)=='\\r'||this.input.LA(1)==' ' ) {\n                        this.input.consume();\n\n                    }\n                    else {\n                        var mse = new org.antlr.runtime.MismatchedSetException(null,this.input);\n                        this.recover(mse);\n                        throw mse;}\n\n\n\n                    break;\n\n                default :\n                    if ( cnt15 >= 1 ) {\n                        break loop15;\n                    }\n                        var eee = new org.antlr.runtime.EarlyExitException(15, this.input);\n                        throw eee;\n                }\n                cnt15++;\n            } while (true);\n\n\n\n\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"SU\",\n\n    // $ANTLR start COLON\n    mCOLON: function()  {\n        try {\n            var _type = this.COLON;\n            var _channel = org.antlr.runtime.BaseRecognizer.DEFAULT_TOKEN_CHANNEL;\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:257:7: ( ':' )\n            // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:257:9: ':'\n            this.match(':'); \n\n\n\n            this.state.type = _type;\n            this.state.channel = _channel;\n        }\n        finally {\n        }\n    },\n    // $ANTLR end \"COLON\",\n\n    mTokens: function() {\n        // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:8: ( QUOT | APOS | L_QuotAttrContentChar | L_AposAttrContentChar | L_ElementContentChar | GREATER | EMPTY_CLOSE_TAG | S | L_NCName | EQUAL | ESCAPE_APOS | ESCAPE_QUOT | ESCAPE_LBRACKET | ESCAPE_RBRACKET | LBRACKET | RBRACKET | SMALLER | CLOSE_TAG | CDATA_START | CDATA_END | L_CDataSection | L_PredefinedEntityRef | L_CharRef | L_DirCommentConstructor | L_DirPIConstructor | COLON )\n        var alt16=26;\n        alt16 = this.dfa16.predict(this.input);\n        switch (alt16) {\n            case 1 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:10: QUOT\n                this.mQUOT(); \n\n\n                break;\n            case 2 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:15: APOS\n                this.mAPOS(); \n\n\n                break;\n            case 3 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:20: L_QuotAttrContentChar\n                this.mL_QuotAttrContentChar(); \n\n\n                break;\n            case 4 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:42: L_AposAttrContentChar\n                this.mL_AposAttrContentChar(); \n\n\n                break;\n            case 5 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:64: L_ElementContentChar\n                this.mL_ElementContentChar(); \n\n\n                break;\n            case 6 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:85: GREATER\n                this.mGREATER(); \n\n\n                break;\n            case 7 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:93: EMPTY_CLOSE_TAG\n                this.mEMPTY_CLOSE_TAG(); \n\n\n                break;\n            case 8 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:109: S\n                this.mS(); \n\n\n                break;\n            case 9 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:111: L_NCName\n                this.mL_NCName(); \n\n\n                break;\n            case 10 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:120: EQUAL\n                this.mEQUAL(); \n\n\n                break;\n            case 11 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:126: ESCAPE_APOS\n                this.mESCAPE_APOS(); \n\n\n                break;\n            case 12 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:138: ESCAPE_QUOT\n                this.mESCAPE_QUOT(); \n\n\n                break;\n            case 13 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:150: ESCAPE_LBRACKET\n                this.mESCAPE_LBRACKET(); \n\n\n                break;\n            case 14 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:166: ESCAPE_RBRACKET\n                this.mESCAPE_RBRACKET(); \n\n\n                break;\n            case 15 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:182: LBRACKET\n                this.mLBRACKET(); \n\n\n                break;\n            case 16 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:191: RBRACKET\n                this.mRBRACKET(); \n\n\n                break;\n            case 17 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:200: SMALLER\n                this.mSMALLER(); \n\n\n                break;\n            case 18 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:208: CLOSE_TAG\n                this.mCLOSE_TAG(); \n\n\n                break;\n            case 19 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:218: CDATA_START\n                this.mCDATA_START(); \n\n\n                break;\n            case 20 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:230: CDATA_END\n                this.mCDATA_END(); \n\n\n                break;\n            case 21 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:240: L_CDataSection\n                this.mL_CDataSection(); \n\n\n                break;\n            case 22 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:255: L_PredefinedEntityRef\n                this.mL_PredefinedEntityRef(); \n\n\n                break;\n            case 23 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:277: L_CharRef\n                this.mL_CharRef(); \n\n\n                break;\n            case 24 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:287: L_DirCommentConstructor\n                this.mL_DirCommentConstructor(); \n\n\n                break;\n            case 25 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:311: L_DirPIConstructor\n                this.mL_DirPIConstructor(); \n\n\n                break;\n            case 26 :\n                // /Users/wcandillon/28msec/xquery.js/xquery/XMLLexer.g:1:330: COLON\n                this.mCOLON(); \n\n\n                break;\n\n        }\n\n    }\n\n}, true); // important to pass true to overwrite default implementations\n\norg.antlr.lang.augmentObject(XMLLexer, {\n    DFA16_eotS:\n        \"\\u0001\\uffff\\u0001\\u0010\\u0001\\u0013\\u0001\\u0014\\u0001\\u0016\\u0001\"+\n    \"\\u0017\\u0001\\u0018\\u0001\\u001a\\u0001\\u0016\\u0001\\u001d\\u0001\\u001f\\u0001\"+\n    \"\\u0023\\u0001\\u0024\\u0001\\uffff\\u0001\\u0016\\u0001\\u0027\\u0002\\uffff\\u0001\"+\n    \"\\u0029\\u0002\\uffff\\u0001\\u002e\\u0003\\uffff\\u0001\\u0018\\u0001\\uffff\\u0001\"+\n    \"\\u0016\\u0016\\uffff\\u0001\\u0039\\u000d\\uffff\\u0001\\u0041\\u0002\\uffff\",\n    DFA16_eofS:\n        \"\\u0043\\uffff\",\n    DFA16_minS:\n        \"\\u0009\\u0009\\u0001\\u007b\\u0001\\u007d\\u0001\\u0021\\u0001\\u0009\\u0001\"+\n    \"\\u0023\\u0002\\u0009\\u0001\\u0000\\u0001\\uffff\\u0001\\u0009\\u0002\\u0000\\u0001\"+\n    \"\\u0009\\u0003\\u0000\\u0001\\u0009\\u0001\\u0000\\u0001\\u0009\\u0005\\uffff\\u0001\"+\n    \"\\u002d\\u0002\\uffff\\u0001\\u0000\\u0002\\uffff\\u0001\\u0000\\u0001\\uffff\\u0001\"+\n    \"\\u0000\\u0004\\uffff\\u0001\\u0000\\u0003\\uffff\\u0001\\u0009\\u0001\\u0043\\u0005\"+\n    \"\\uffff\\u0001\\u0000\\u0001\\u0044\\u0001\\uffff\\u0001\\u0041\\u0001\\u0054\\u0001\"+\n    \"\\u0041\\u0001\\u005b\\u0001\\u0000\\u0002\\uffff\",\n    DFA16_maxS:\n        \"\\u0009\\ufffd\\u0001\\u007b\\u0001\\u007d\\u0001\\u003f\\u0001\\ufffd\\u0001\"+\n    \"\\u0071\\u0002\\ufffd\\u0001\\u0000\\u0001\\uffff\\u0001\\ufffd\\u0002\\u0000\\u0001\"+\n    \"\\ufffd\\u0003\\u0000\\u0001\\ufffd\\u0001\\u0000\\u0001\\ufffd\\u0005\\uffff\\u0001\"+\n    \"\\u005b\\u0002\\uffff\\u0001\\u0000\\u0002\\uffff\\u0001\\u0000\\u0001\\uffff\\u0001\"+\n    \"\\u0000\\u0004\\uffff\\u0001\\u0000\\u0003\\uffff\\u0001\\ufffd\\u0001\\u0043\\u0005\"+\n    \"\\uffff\\u0001\\u0000\\u0001\\u0044\\u0001\\uffff\\u0001\\u0041\\u0001\\u0054\\u0001\"+\n    \"\\u0041\\u0001\\u005b\\u0001\\uffff\\u0002\\uffff\",\n    DFA16_acceptS:\n        \"\\u0011\\uffff\\u0001\\u0005\\u000a\\uffff\\u0001\\u000d\\u0001\\u000f\\u0001\"+\n    \"\\u000e\\u0001\\u0010\\u0001\\u0012\\u0001\\uffff\\u0001\\u0019\\u0001\\u0011\\u0001\"+\n    \"\\uffff\\u0001\\u0017\\u0001\\u0016\\u0001\\uffff\\u0001\\u0001\\u0001\\uffff\\u0001\"+\n    \"\\u0002\\u0001\\u0003\\u0001\\u0004\\u0001\\u0006\\u0001\\uffff\\u0001\\u0008\\u0001\"+\n    \"\\u0009\\u0001\\u000a\\u0002\\uffff\\u0001\\u0018\\u0001\\u001a\\u0001\\u000c\\u0001\"+\n    \"\\u000b\\u0001\\u0007\\u0002\\uffff\\u0001\\u0014\\u0005\\uffff\\u0001\\u0013\\u0001\"+\n    \"\\u0015\",\n    DFA16_specialS:\n        \"\\u0001\\u0000\\u0001\\u001f\\u0001\\u0022\\u0001\\u0004\\u0001\\u000d\\u0001\"+\n    \"\\u001e\\u0001\\u0015\\u0001\\u0002\\u0001\\u000b\\u0001\\u0021\\u0001\\u0005\\u0001\"+\n    \"\\u0011\\u0001\\u001b\\u0001\\u0020\\u0001\\u000c\\u0001\\u001a\\u0001\\u0009\\u0001\"+\n    \"\\uffff\\u0001\\u0010\\u0001\\u000a\\u0001\\u001d\\u0001\\u0016\\u0001\\u000f\\u0001\"+\n    \"\\u0018\\u0001\\u0019\\u0001\\u0003\\u0001\\u0017\\u0001\\u0008\\u0005\\uffff\\u0001\"+\n    \"\\u0012\\u0002\\uffff\\u0001\\u000e\\u0002\\uffff\\u0001\\u0006\\u0001\\uffff\\u0001\"+\n    \"\\u0007\\u0004\\uffff\\u0001\\u001c\\u0003\\uffff\\u0001\\u0013\\u0006\\uffff\\u0001\"+\n    \"\\u0014\\u0006\\uffff\\u0001\\u0001\\u0002\\uffff}>\",\n    DFA16_transitionS: [\n            \"\\u0002\\u0005\\u0002\\uffff\\u0001\\u0005\\u0012\\uffff\\u0001\\u0005\"+\n            \"\\u0001\\u000e\\u0001\\u0001\\u0003\\u000e\\u0001\\u000d\\u0001\\u0002\"+\n            \"\\u0007\\u000e\\u0001\\u0004\\u000a\\u000e\\u0001\\u000c\\u0001\\u000e\"+\n            \"\\u0001\\u000b\\u0001\\u0007\\u0001\\u0003\\u0002\\u000e\\u001a\\u0006\"+\n            \"\\u0002\\u000e\\u0001\\u0008\\u0001\\u000e\\u0001\\u0006\\u0001\\u000e\"+\n            \"\\u001a\\u0006\\u0001\\u0009\\u0001\\u000e\\u0001\\u000a\\ud782\\u000e\"+\n            \"\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0002\\u0011\\u0002\\uffff\\u0001\\u0011\\u0012\\uffff\\u0002\\u0011\"+\n            \"\\u0001\\u000f\\u0003\\u0011\\u0001\\uffff\\u0015\\u0011\\u0001\\uffff\"+\n            \"\\u003e\\u0011\\u0001\\uffff\\u0001\\u0011\\u0001\\uffff\\ud782\\u0011\"+\n            \"\\u0800\\uffff\\u1ffe\\u0011\",\n            \"\\u0002\\u0011\\u0002\\uffff\\u0001\\u0011\\u0012\\uffff\\u0006\\u0011\"+\n            \"\\u0001\\uffff\\u0001\\u0012\\u0014\\u0011\\u0001\\uffff\\u003e\\u0011\"+\n            \"\\u0001\\uffff\\u0001\\u0011\\u0001\\uffff\\ud782\\u0011\\u0800\\uffff\"+\n            \"\\u1ffe\\u0011\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u003e\\u000e\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\"+\n            \"\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u0001\\u000e\\u0001\\u0015\\u003c\\u000e\\u0001\\uffff\"+\n            \"\\u0001\\u000e\\u0001\\uffff\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0002\\u0005\\u0002\\uffff\\u0001\\u0005\\u0012\\uffff\\u0001\\u0005\"+\n            \"\\u0001\\u000e\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\"+\n            \"\\u0014\\u000e\\u0001\\uffff\\u003e\\u000e\\u0001\\uffff\\u0001\\u000e\"+\n            \"\\u0001\\uffff\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0005\\u000e\"+\n            \"\\u0002\\u0019\\u0001\\u000e\\u000a\\u0019\\u0002\\u000e\\u0001\\uffff\"+\n            \"\\u0004\\u000e\\u001a\\u0019\\u0004\\u000e\\u0001\\u0019\\u0001\\u000e\"+\n            \"\\u001a\\u0019\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\\ud782\\u000e\"+\n            \"\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u003e\\u000e\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\"+\n            \"\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u0020\\u000e\\u0001\\u001b\\u001d\\u000e\\u0001\\uffff\"+\n            \"\\u0001\\u000e\\u0001\\uffff\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0001\\u001c\",\n            \"\\u0001\\u001e\",\n            \"\\u0001\\u0021\\u000d\\uffff\\u0001\\u0020\\u000f\\uffff\\u0001\\u0022\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u003e\\u000e\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\"+\n            \"\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0001\\u0025\\u003d\\uffff\\u0001\\u0026\\u0005\\uffff\\u0001\\u0026\"+\n            \"\\u0004\\uffff\\u0001\\u0026\\u0004\\uffff\\u0001\\u0026\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u003e\\u000e\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\"+\n            \"\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0002\\u0011\\u0002\\uffff\\u0001\\u0011\\u0012\\uffff\\u0006\\u0011\"+\n            \"\\u0001\\uffff\\u0015\\u0011\\u0001\\uffff\\u003e\\u0011\\u0001\\uffff\"+\n            \"\\u0001\\u0011\\u0001\\uffff\\ud782\\u0011\\u0800\\uffff\\u1ffe\\u0011\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\\u0002\\u0011\\u0002\\uffff\\u0001\\u0011\\u0012\\uffff\\u0006\\u0011\"+\n            \"\\u0001\\uffff\\u0015\\u0011\\u0001\\uffff\\u003e\\u0011\\u0001\\uffff\"+\n            \"\\u0001\\u0011\\u0001\\uffff\\ud782\\u0011\\u0800\\uffff\\u1ffe\\u0011\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u003e\\u000e\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\"+\n            \"\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\uffff\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0005\\u000e\"+\n            \"\\u0002\\u0019\\u0001\\u000e\\u000a\\u0019\\u0002\\u000e\\u0001\\uffff\"+\n            \"\\u0004\\u000e\\u001a\\u0019\\u0004\\u000e\\u0001\\u0019\\u0001\\u000e\"+\n            \"\\u001a\\u0019\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\\ud782\\u000e\"+\n            \"\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0001\\uffff\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u0001\\u000e\\u0001\\u0032\\u003c\\u000e\\u0001\\uffff\"+\n            \"\\u0001\\u000e\\u0001\\uffff\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\u0034\\u002d\\uffff\\u0001\\u0033\",\n            \"\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0002\\u000e\\u0002\\uffff\\u0001\\u000e\\u0012\\uffff\\u0002\\u000e\"+\n            \"\\u0001\\u0011\\u0003\\u000e\\u0001\\uffff\\u0001\\u0011\\u0014\\u000e\"+\n            \"\\u0001\\uffff\\u003e\\u000e\\u0001\\uffff\\u0001\\u000e\\u0001\\uffff\"+\n            \"\\ud782\\u000e\\u0800\\uffff\\u1ffe\\u000e\",\n            \"\\u0001\\u003a\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\",\n            \"\\u0001\\uffff\",\n            \"\\u0001\\u003c\",\n            \"\",\n            \"\\u0001\\u003d\",\n            \"\\u0001\\u003e\",\n            \"\\u0001\\u003f\",\n            \"\\u0001\\u0040\",\n            \"\\u0000\\u0042\",\n            \"\",\n            \"\"\n    ]\n});\n\norg.antlr.lang.augmentObject(XMLLexer, {\n    DFA16_eot:\n        org.antlr.runtime.DFA.unpackEncodedString(XMLLexer.DFA16_eotS),\n    DFA16_eof:\n        org.antlr.runtime.DFA.unpackEncodedString(XMLLexer.DFA16_eofS),\n    DFA16_min:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XMLLexer.DFA16_minS),\n    DFA16_max:\n        org.antlr.runtime.DFA.unpackEncodedStringToUnsignedChars(XMLLexer.DFA16_maxS),\n    DFA16_accept:\n        org.antlr.runtime.DFA.unpackEncodedString(XMLLexer.DFA16_acceptS),\n    DFA16_special:\n        org.antlr.runtime.DFA.unpackEncodedString(XMLLexer.DFA16_specialS),\n    DFA16_transition: (function() {\n        var a = [],\n            i,\n            numStates = XMLLexer.DFA16_transitionS.length;\n        for (i=0; i<numStates; i++) {\n            a.push(org.antlr.runtime.DFA.unpackEncodedString(XMLLexer.DFA16_transitionS[i]));\n        }\n        return a;\n    })()\n});\n\nXMLLexer.DFA16 = function(recognizer) {\n    this.recognizer = recognizer;\n    this.decisionNumber = 16;\n    this.eot = XMLLexer.DFA16_eot;\n    this.eof = XMLLexer.DFA16_eof;\n    this.min = XMLLexer.DFA16_min;\n    this.max = XMLLexer.DFA16_max;\n    this.accept = XMLLexer.DFA16_accept;\n    this.special = XMLLexer.DFA16_special;\n    this.transition = XMLLexer.DFA16_transition;\n};\n\norg.antlr.lang.extend(XMLLexer.DFA16, org.antlr.runtime.DFA, {\n    getDescription: function() {\n        return \"1:1: Tokens : ( QUOT | APOS | L_QuotAttrContentChar | L_AposAttrContentChar | L_ElementContentChar | GREATER | EMPTY_CLOSE_TAG | S | L_NCName | EQUAL | ESCAPE_APOS | ESCAPE_QUOT | ESCAPE_LBRACKET | ESCAPE_RBRACKET | LBRACKET | RBRACKET | SMALLER | CLOSE_TAG | CDATA_START | CDATA_END | L_CDataSection | L_PredefinedEntityRef | L_CharRef | L_DirCommentConstructor | L_DirPIConstructor | COLON );\";\n    },\n    specialStateTransition: function(s, input) {\n        var _s = s;\n        var retval = (function(s, input) {\n            switch ( s ) {\n                        case 0 : \n                            var LA16_0 = input.LA(1);\n\n                             \n                            var index16_0 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_0=='\\\"') && ((( this.inQuotAttr )||( this.inElem || this.inQuotAttr )||( !this.inElem )))) {s = 1;}\n\n                            else if ( (LA16_0=='\\'') && ((( this.inElem || this.inAposAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 2;}\n\n                            else if ( (LA16_0=='>') && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 3;}\n\n                            else if ( (LA16_0=='/') && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 4;}\n\n                            else if ( ((LA16_0>='\\t' && LA16_0<='\\n')||LA16_0=='\\r'||LA16_0==' ') && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 5;}\n\n                            else if ( ((LA16_0>='A' && LA16_0<='Z')||LA16_0=='_'||(LA16_0>='a' && LA16_0<='z')) && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 6;}\n\n                            else if ( (LA16_0=='=') && ((( this.inElem  )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 7;}\n\n                            else if ( (LA16_0==']') ) {s = 8;}\n\n                            else if ( (LA16_0=='{') && (( !this.inElem || this.inAposAttr || this.inQuotAttr ))) {s = 9;}\n\n                            else if ( (LA16_0=='}') && (( !this.inElem || this.inAposAttr || this.inQuotAttr ))) {s = 10;}\n\n                            else if ( (LA16_0=='<') ) {s = 11;}\n\n                            else if ( (LA16_0==':') ) {s = 12;}\n\n                            else if ( (LA16_0=='&') ) {s = 13;}\n\n                            else if ( (LA16_0=='!'||(LA16_0>='#' && LA16_0<='%')||(LA16_0>='(' && LA16_0<='.')||(LA16_0>='0' && LA16_0<='9')||LA16_0==';'||(LA16_0>='?' && LA16_0<='@')||(LA16_0>='[' && LA16_0<='\\\\')||LA16_0=='^'||LA16_0=='`'||LA16_0=='|'||(LA16_0>='~' && LA16_0<='\\uD7FF')||(LA16_0>='\\uE000' && LA16_0<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                             \n                            input.seek(index16_0);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 1 : \n                            var LA16_64 = input.LA(1);\n\n                             \n                            var index16_64 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_64>='\\u0000' && LA16_64<='\\uFFFF')) && (( !this.inElem ))) {s = 66;}\n\n                            else s = 65;\n\n                             \n                            input.seek(index16_64);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 2 : \n                            var LA16_7 = input.LA(1);\n\n                             \n                            var index16_7 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_7>='\\t' && LA16_7<='\\n')||LA16_7=='\\r'||(LA16_7>=' ' && LA16_7<='!')||(LA16_7>='#' && LA16_7<='%')||(LA16_7>='(' && LA16_7<=';')||(LA16_7>='=' && LA16_7<='z')||LA16_7=='|'||(LA16_7>='~' && LA16_7<='\\uD7FF')||(LA16_7>='\\uE000' && LA16_7<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_7=='\\\"'||LA16_7=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 26;\n\n                             \n                            input.seek(index16_7);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 3 : \n                            var LA16_25 = input.LA(1);\n\n                             \n                            var index16_25 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_25>='-' && LA16_25<='.')||(LA16_25>='0' && LA16_25<='9')||(LA16_25>='A' && LA16_25<='Z')||LA16_25=='_'||(LA16_25>='a' && LA16_25<='z')) && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 25;}\n\n                            else if ( (LA16_25=='\\\"'||LA16_25=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else if ( ((LA16_25>='\\t' && LA16_25<='\\n')||LA16_25=='\\r'||(LA16_25>=' ' && LA16_25<='!')||(LA16_25>='#' && LA16_25<='%')||(LA16_25>='(' && LA16_25<=',')||LA16_25=='/'||(LA16_25>=':' && LA16_25<=';')||(LA16_25>='=' && LA16_25<='@')||(LA16_25>='[' && LA16_25<='^')||LA16_25=='`'||LA16_25=='|'||(LA16_25>='~' && LA16_25<='\\uD7FF')||(LA16_25>='\\uE000' && LA16_25<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else s = 24;\n\n                             \n                            input.seek(index16_25);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 4 : \n                            var LA16_3 = input.LA(1);\n\n                             \n                            var index16_3 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_3>='\\t' && LA16_3<='\\n')||LA16_3=='\\r'||(LA16_3>=' ' && LA16_3<='!')||(LA16_3>='#' && LA16_3<='%')||(LA16_3>='(' && LA16_3<=';')||(LA16_3>='=' && LA16_3<='z')||LA16_3=='|'||(LA16_3>='~' && LA16_3<='\\uD7FF')||(LA16_3>='\\uE000' && LA16_3<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_3=='\\\"'||LA16_3=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 20;\n\n                             \n                            input.seek(index16_3);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 5 : \n                            var LA16_10 = input.LA(1);\n\n                             \n                            var index16_10 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_10=='}') && (( !this.inElem || this.inAposAttr || this.inQuotAttr ))) {s = 30;}\n\n                            else s = 31;\n\n                             \n                            input.seek(index16_10);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 6 : \n                            var LA16_39 = input.LA(1);\n\n                             \n                            var index16_39 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (( this.inQuotAttr )) ) {s = 54;}\n\n                             \n                            input.seek(index16_39);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 7 : \n                            var LA16_41 = input.LA(1);\n\n                             \n                            var index16_41 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 55;}\n\n                             \n                            input.seek(index16_41);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 8 : \n                            var LA16_27 = input.LA(1);\n\n                             \n                            var index16_27 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_27=='>') ) {s = 50;}\n\n                            else if ( ((LA16_27>='\\t' && LA16_27<='\\n')||LA16_27=='\\r'||(LA16_27>=' ' && LA16_27<='!')||(LA16_27>='#' && LA16_27<='%')||(LA16_27>='(' && LA16_27<=';')||LA16_27=='='||(LA16_27>='?' && LA16_27<='z')||LA16_27=='|'||(LA16_27>='~' && LA16_27<='\\uD7FF')||(LA16_27>='\\uE000' && LA16_27<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_27=='\\\"'||LA16_27=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 22;\n\n                             \n                            input.seek(index16_27);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 9 : \n                            var LA16_16 = input.LA(1);\n\n                             \n                            var index16_16 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inElem || this.inQuotAttr )) ) {s = 40;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                             \n                            input.seek(index16_16);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 10 : \n                            var LA16_19 = input.LA(1);\n\n                             \n                            var index16_19 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inElem || this.inAposAttr )) ) {s = 42;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                             \n                            input.seek(index16_19);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 11 : \n                            var LA16_8 = input.LA(1);\n\n                             \n                            var index16_8 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_8==']') ) {s = 27;}\n\n                            else if ( ((LA16_8>='\\t' && LA16_8<='\\n')||LA16_8=='\\r'||(LA16_8>=' ' && LA16_8<='!')||(LA16_8>='#' && LA16_8<='%')||(LA16_8>='(' && LA16_8<=';')||(LA16_8>='=' && LA16_8<='\\\\')||(LA16_8>='^' && LA16_8<='z')||LA16_8=='|'||(LA16_8>='~' && LA16_8<='\\uD7FF')||(LA16_8>='\\uE000' && LA16_8<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_8=='\\\"'||LA16_8=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 22;\n\n                             \n                            input.seek(index16_8);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 12 : \n                            var LA16_14 = input.LA(1);\n\n                             \n                            var index16_14 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_14>='\\t' && LA16_14<='\\n')||LA16_14=='\\r'||(LA16_14>=' ' && LA16_14<='!')||(LA16_14>='#' && LA16_14<='%')||(LA16_14>='(' && LA16_14<=';')||(LA16_14>='=' && LA16_14<='z')||LA16_14=='|'||(LA16_14>='~' && LA16_14<='\\uD7FF')||(LA16_14>='\\uE000' && LA16_14<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_14=='\\\"'||LA16_14=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 22;\n\n                             \n                            input.seek(index16_14);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 13 : \n                            var LA16_4 = input.LA(1);\n\n                             \n                            var index16_4 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_4=='>') && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 21;}\n\n                            else if ( ((LA16_4>='\\t' && LA16_4<='\\n')||LA16_4=='\\r'||(LA16_4>=' ' && LA16_4<='!')||(LA16_4>='#' && LA16_4<='%')||(LA16_4>='(' && LA16_4<=';')||LA16_4=='='||(LA16_4>='?' && LA16_4<='z')||LA16_4=='|'||(LA16_4>='~' && LA16_4<='\\uD7FF')||(LA16_4>='\\uE000' && LA16_4<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_4=='\\\"'||LA16_4=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 22;\n\n                             \n                            input.seek(index16_4);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 14 : \n                            var LA16_36 = input.LA(1);\n\n                             \n                            var index16_36 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (true) ) {s = 53;}\n\n                             \n                            input.seek(index16_36);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 15 : \n                            var LA16_22 = input.LA(1);\n\n                             \n                            var index16_22 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                             \n                            input.seek(index16_22);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 16 : \n                            var LA16_18 = input.LA(1);\n\n                             \n                            var index16_18 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_18>='\\t' && LA16_18<='\\n')||LA16_18=='\\r'||(LA16_18>=' ' && LA16_18<='%')||(LA16_18>='\\'' && LA16_18<=';')||(LA16_18>='=' && LA16_18<='z')||LA16_18=='|'||(LA16_18>='~' && LA16_18<='\\uD7FF')||(LA16_18>='\\uE000' && LA16_18<='\\uFFFD')) && (( !this.inElem ))) {s = 17;}\n\n                            else s = 41;\n\n                             \n                            input.seek(index16_18);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 17 : \n                            var LA16_11 = input.LA(1);\n\n                             \n                            var index16_11 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_11=='/') && (( !this.inElem ))) {s = 32;}\n\n                            else if ( (LA16_11=='!') ) {s = 33;}\n\n                            else if ( (LA16_11=='?') && (( !this.inElem ))) {s = 34;}\n\n                            else s = 35;\n\n                             \n                            input.seek(index16_11);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 18 : \n                            var LA16_33 = input.LA(1);\n\n                             \n                            var index16_33 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_33=='[') ) {s = 51;}\n\n                            else if ( (LA16_33=='-') && (( !this.inElem ))) {s = 52;}\n\n                             \n                            input.seek(index16_33);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 19 : \n                            var LA16_50 = input.LA(1);\n\n                             \n                            var index16_50 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_50>='\\t' && LA16_50<='\\n')||LA16_50=='\\r'||(LA16_50>=' ' && LA16_50<='!')||(LA16_50>='#' && LA16_50<='%')||(LA16_50>='(' && LA16_50<=';')||(LA16_50>='=' && LA16_50<='z')||LA16_50=='|'||(LA16_50>='~' && LA16_50<='\\uD7FF')||(LA16_50>='\\uE000' && LA16_50<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_50=='\\\"'||LA16_50=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 57;\n\n                             \n                            input.seek(index16_50);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 20 : \n                            var LA16_57 = input.LA(1);\n\n                             \n                            var index16_57 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (true) ) {s = 59;}\n\n                             \n                            input.seek(index16_57);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 21 : \n                            var LA16_6 = input.LA(1);\n\n                             \n                            var index16_6 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_6>='-' && LA16_6<='.')||(LA16_6>='0' && LA16_6<='9')||(LA16_6>='A' && LA16_6<='Z')||LA16_6=='_'||(LA16_6>='a' && LA16_6<='z')) && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 25;}\n\n                            else if ( (LA16_6=='\\\"'||LA16_6=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else if ( ((LA16_6>='\\t' && LA16_6<='\\n')||LA16_6=='\\r'||(LA16_6>=' ' && LA16_6<='!')||(LA16_6>='#' && LA16_6<='%')||(LA16_6>='(' && LA16_6<=',')||LA16_6=='/'||(LA16_6>=':' && LA16_6<=';')||(LA16_6>='=' && LA16_6<='@')||(LA16_6>='[' && LA16_6<='^')||LA16_6=='`'||LA16_6=='|'||(LA16_6>='~' && LA16_6<='\\uD7FF')||(LA16_6>='\\uE000' && LA16_6<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else s = 24;\n\n                             \n                            input.seek(index16_6);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 22 : \n                            var LA16_21 = input.LA(1);\n\n                             \n                            var index16_21 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_21>='\\t' && LA16_21<='\\n')||LA16_21=='\\r'||(LA16_21>=' ' && LA16_21<='!')||(LA16_21>='#' && LA16_21<='%')||(LA16_21>='(' && LA16_21<=';')||(LA16_21>='=' && LA16_21<='z')||LA16_21=='|'||(LA16_21>='~' && LA16_21<='\\uD7FF')||(LA16_21>='\\uE000' && LA16_21<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_21=='\\\"'||LA16_21=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 46;\n\n                             \n                            input.seek(index16_21);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 23 : \n                            var LA16_26 = input.LA(1);\n\n                             \n                            var index16_26 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (( this.inElem  )) ) {s = 49;}\n\n                             \n                            input.seek(index16_26);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 24 : \n                            var LA16_23 = input.LA(1);\n\n                             \n                            var index16_23 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (( this.inElem )) ) {s = 47;}\n\n                             \n                            input.seek(index16_23);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 25 : \n                            var LA16_24 = input.LA(1);\n\n                             \n                            var index16_24 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (( this.inElem )) ) {s = 48;}\n\n                             \n                            input.seek(index16_24);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 26 : \n                            var LA16_15 = input.LA(1);\n\n                             \n                            var index16_15 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_15>='\\t' && LA16_15<='\\n')||LA16_15=='\\r'||(LA16_15>=' ' && LA16_15<='%')||(LA16_15>='\\'' && LA16_15<=';')||(LA16_15>='=' && LA16_15<='z')||LA16_15=='|'||(LA16_15>='~' && LA16_15<='\\uD7FF')||(LA16_15>='\\uE000' && LA16_15<='\\uFFFD')) && (( !this.inElem ))) {s = 17;}\n\n                            else s = 39;\n\n                             \n                            input.seek(index16_15);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 27 : \n                            var LA16_12 = input.LA(1);\n\n                             \n                            var index16_12 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_12>='\\t' && LA16_12<='\\n')||LA16_12=='\\r'||(LA16_12>=' ' && LA16_12<='!')||(LA16_12>='#' && LA16_12<='%')||(LA16_12>='(' && LA16_12<=';')||(LA16_12>='=' && LA16_12<='z')||LA16_12=='|'||(LA16_12>='~' && LA16_12<='\\uD7FF')||(LA16_12>='\\uE000' && LA16_12<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else if ( (LA16_12=='\\\"'||LA16_12=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else s = 36;\n\n                             \n                            input.seek(index16_12);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 28 : \n                            var LA16_46 = input.LA(1);\n\n                             \n                            var index16_46 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (( this.inElem )) ) {s = 56;}\n\n                             \n                            input.seek(index16_46);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 29 : \n                            var LA16_20 = input.LA(1);\n\n                             \n                            var index16_20 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (( this.inQuotAttr )) ) {s = 43;}\n\n                            else if ( (( this.inAposAttr )) ) {s = 44;}\n\n                            else if ( (( !this.inElem )) ) {s = 17;}\n\n                            else if ( (( this.inElem )) ) {s = 45;}\n\n                             \n                            input.seek(index16_20);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 30 : \n                            var LA16_5 = input.LA(1);\n\n                             \n                            var index16_5 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( ((LA16_5>='\\t' && LA16_5<='\\n')||LA16_5=='\\r'||LA16_5==' ') && ((( this.inElem )||( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 5;}\n\n                            else if ( (LA16_5=='\\\"'||LA16_5=='\\'') && (( !this.inElem ))) {s = 17;}\n\n                            else if ( (LA16_5=='!'||(LA16_5>='#' && LA16_5<='%')||(LA16_5>='(' && LA16_5<=';')||(LA16_5>='=' && LA16_5<='z')||LA16_5=='|'||(LA16_5>='~' && LA16_5<='\\uD7FF')||(LA16_5>='\\uE000' && LA16_5<='\\uFFFD')) && ((( this.inQuotAttr )||( this.inAposAttr )||( !this.inElem )))) {s = 14;}\n\n                            else s = 23;\n\n                             \n                            input.seek(index16_5);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 31 : \n                            var LA16_1 = input.LA(1);\n\n                             \n                            var index16_1 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_1=='\\\"') && ((( this.inQuotAttr )||( !this.inElem )))) {s = 15;}\n\n                            else if ( ((LA16_1>='\\t' && LA16_1<='\\n')||LA16_1=='\\r'||(LA16_1>=' ' && LA16_1<='!')||(LA16_1>='#' && LA16_1<='%')||(LA16_1>='\\'' && LA16_1<=';')||(LA16_1>='=' && LA16_1<='z')||LA16_1=='|'||(LA16_1>='~' && LA16_1<='\\uD7FF')||(LA16_1>='\\uE000' && LA16_1<='\\uFFFD')) && (( !this.inElem ))) {s = 17;}\n\n                            else s = 16;\n\n                             \n                            input.seek(index16_1);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 32 : \n                            var LA16_13 = input.LA(1);\n\n                             \n                            var index16_13 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_13=='#') ) {s = 37;}\n\n                            else if ( (LA16_13=='a'||LA16_13=='g'||LA16_13=='l'||LA16_13=='q') && (( !this.inElem || this.inAposAttr || this.inQuotAttr ))) {s = 38;}\n\n                             \n                            input.seek(index16_13);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 33 : \n                            var LA16_9 = input.LA(1);\n\n                             \n                            var index16_9 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_9=='{') && (( !this.inElem || this.inAposAttr || this.inQuotAttr ))) {s = 28;}\n\n                            else s = 29;\n\n                             \n                            input.seek(index16_9);\n                            if ( s>=0 ) return s;\n                            break;\n                        case 34 : \n                            var LA16_2 = input.LA(1);\n\n                             \n                            var index16_2 = input.index();\n                            input.rewind();\n                            s = -1;\n                            if ( (LA16_2=='\\'') && ((( this.inAposAttr )||( !this.inElem )))) {s = 18;}\n\n                            else if ( ((LA16_2>='\\t' && LA16_2<='\\n')||LA16_2=='\\r'||(LA16_2>=' ' && LA16_2<='%')||(LA16_2>='(' && LA16_2<=';')||(LA16_2>='=' && LA16_2<='z')||LA16_2=='|'||(LA16_2>='~' && LA16_2<='\\uD7FF')||(LA16_2>='\\uE000' && LA16_2<='\\uFFFD')) && (( !this.inElem ))) {s = 17;}\n\n                            else s = 19;\n\n                             \n                            input.seek(index16_2);\n                            if ( s>=0 ) return s;\n                            break;\n            }\n        }).call(this.recognizer, s, input);\n        if (!org.antlr.lang.isUndefined(retval)) {\n            return retval;\n        }\n        var nvae =\n            new org.antlr.runtime.NoViableAltException(this.getDescription(), 16, _s, input);\n        this.error(nvae);\n        throw nvae;\n    },\n    dummy: null\n});\n \n})();\nexports.XMLLexer = XMLLexer; });\ndefine('ace/mode/xquery/XQDTParser', ['require', 'exports', 'module' , 'ace/mode/xquery/antlr3-all', 'ace/mode/xquery/XQuerySemanticHighlighter'], function(require, exports, module) {\n\nvar org =  require(\"./antlr3-all\").org;\nvar XQuerySemanticHighlighter = require(\"./XQuerySemanticHighlighter\").XQuerySemanticHighlighter;\n\nvar XQDTParser = exports.XQDTParser = function(input, state)\n{\n  this.highlighter = new XQuerySemanticHighlighter();\n  var that = this;\n\n  input.getTokenSource().addComment = function(start, stop) { \n    var comments = input.getTokenSource().comments;\n    for(var i in comments)\n    { \n      var c = comments[i];\n      that.highlighter.addToken(c.start, c.stop, \"comment\");\n    }\n    input.getTokenSource().comments = [];\n    that.highlighter.addToken(start, stop, \"comment\")\n  };\n  XQDTParser.superclass.constructor.call(this, input, state);\n};\n\norg.antlr.lang.extend(XQDTParser, org.antlr.runtime.Parser, {\n\n});\n\n});\ndefine('ace/mode/xquery/XQuerySemanticHighlighter', ['require', 'exports', 'module' , 'ace/mode/xquery/Position'], function(require, exports, module) {\n  \n  var Position = require(\"./Position\").Position;\n  var XQuerySemanticHighlighter = exports.XQuerySemanticHighlighter = function() {\n    this.tokenizer = null;\n    this.plain = null;\n    this.source = [];\n    this.lines = [];\n\n    this.getTokens = function() {\n      var resultLines  = new Array(this.source.length);\n      var resultStates = new Array(this.source.length);\n      var previousState = \"start\";\n      var i = 0;\n      for(i in this.source){\n        var lineTokens = [];\n        var tokens = [];\n        if(this.lines[i]) {\n          tokens = this.lines[i].sort(function(a, b){ return a.position.getOffset() - b.position.getOffset();  });\n        }\n        var sourceLine = this.source[i];\n        var tokenizedLine = \"\";\n        var cursor = 0;\n        var j = 0;\n        for(j in tokens)\n        {\n          var token = tokens[j];\n          var position = token.position;\n          if(position.getOffset() > cursor) {\n            var value = sourceLine.substring(cursor, position.getOffset());\n            tokenizedLine += value;\n            lineTokens.push({\n              type: \"text\",\n              value: value\n            });\n          }\n          cursor = position.getOffset() + position.getLength();\n          value = sourceLine.substring(position.getOffset(), cursor);\n          tokenizedLine += value;\n          lineTokens.push({\n            type: token.type,\n            value: value \n          });\n        }\n        \n        var nextState = \"start\";\n        if(lineTokens.length > 0) {\n          lineTokens[lineTokens.length - 1].type;\n        }\n        nextState = (nextState != \"comment\" && nextState != \"string\" && nextState != \"cdata\" && nextState != \"tag\") ? \"start\" : nextState;\n        \n        if(cursor < (sourceLine.length )) {\n          value = sourceLine.substring(cursor);\n          lineTokens.push({\n             type: \"text\",\n             value: value\n          });\n          tokenizedLine += value; \n        }\n        //Check if the tokenized line is equal to the original one:\n        if(sourceLine == tokenizedLine) {\n          resultLines[i] = lineTokens;\n          resultStates[i] = nextState;\n          //result[i] = { line: sourceLine, startState: previousState, tokens: { tokens: lineTokens, state: nextState } };\n        } else {\n          //console.log(\"sourceLine: \" + sourceLine);\n          //console.log(\"tokenizedLine: \" + tokenizedLine);\n          resultLines[i] = [{ type: \"text\", value: sourceLine }];\n          resultStates[i] = nextState;\n          //result[i] = { tokens: [ { type: \"text\", value: sourceLine } ], state: nextState };\n        }\n\n        if(resultLines[i].length === 1 && resultLines[i][0].type === \"text\" && this.tokenizer instanceof Object) {\n          var prev = resultStates[i - 1] ?  resultStates[i - 1] : \"start\";\n          var result = this.tokenizer.getLineTokens(resultLines[i][0].value, prev);\n          resultLines[i] = result.tokens;\n          resultStates[i] = result.state;\n        }\n      }\n      return {states: resultStates, lines: resultLines};\n    };\n\n    this.addToken = function(start, stop, type) {\n      var before = this.plain.substring(0, start);\n      var startLine = this.plain.substring(0, start).split(\"\\n\").length;\n      startLine = startLine == 0 ? 0 : startLine - 1;\n      \n      var offset = before.lastIndexOf(\"\\n\");\n      offset = offset == -1 ? start : start - before.lastIndexOf(\"\\n\") - 1;\n\n      var cursor = start;\n\n      var text = this.plain.substring(start, stop);\n\n      var currentLine = startLine;\n      for(var i in text)\n      {\n        var c = text[i];\n        if(c == \"\\n\") {\n          var s = i;\n          s = s < stop ? s : stop; \n          this.addPosition(new Position(currentLine, offset, s), type);\n          currentLine++;\n          offset = 0;\n          cursor = i;\n        } \n      };\n      this.addPosition(new Position(currentLine, offset, stop - cursor + 1), type); \n    };\n    \n    this.addPosition = function(position, type)\n    {\n      var line = position.getLine();\n      if(!this.lines[line]) {\n        this.lines[line] = [];\n      }\n      this.lines[line].push({\n        type: type,\n        position: position\n      });\n    };\n\n    this.setSource = function(source)\n    {\n      this.plain  = source.data;\n      this.source = this.plain.split(\"\\n\");\n    };\n      //console.log(\"Line: \" + token.getLine());\n      //console.log(token.getText());\n      //console.log(type);\n  };\n});\ndefine('ace/mode/xquery/Position', ['require', 'exports', 'module' ], function(require, exports, module) {\n  var Position = exports.Position = function(line, offset, length)\n  {\n    this.line = line;\n    this.offset = offset;\n    this.length = length;\n    \n    this.getLine = function()\n    {\n      return this.line;\n    };\n\n    this.getOffset = function()\n    {\n      return this.offset;\n    };\n\n    this.getLength = function()\n    {\n      return this.length;\n    };\n  };\n\n});\n\ndefine('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\n/**\n * class Tokenizer\n *\n * This class takes a set of highlighting rules, and creates a tokenizer out of them. For more information, see [the wiki on extending highlighters](https://github.com/ajaxorg/ace/wiki/Creating-or-Extending-an-Edit-Mode#wiki-extendingTheHighlighter).\n *\n **/\n\n/**\n * new Tokenizer(rules, flag)\n * - rules (Object): The highlighting rules\n * - flag (String): Any additional regular expression flags to pass (like \"i\" for case insensitive)\n *\n * Constructs a new tokenizer based on the given rules and flags.\n *\n **/\nvar Tokenizer = function(rules, flag) {\n    flag = flag ? \"g\" + flag : \"g\";\n    this.rules = rules;\n\n    this.regExps = {};\n    this.matchMappings = {};\n    for ( var key in this.rules) {\n        var rule = this.rules[key];\n        var state = rule;\n        var ruleRegExps = [];\n        var matchTotal = 0;\n        var mapping = this.matchMappings[key] = {};\n\n        for ( var i = 0; i < state.length; i++) {\n\n            if (state[i].regex instanceof RegExp)\n                state[i].regex = state[i].regex.toString().slice(1, -1);\n\n            // Count number of matching groups. 2 extra groups from the full match\n            // And the catch-all on the end (used to force a match);\n            var matchcount = new RegExp(\"(?:(\" + state[i].regex + \")|(.))\").exec(\"a\").length - 2;\n\n            // Replace any backreferences and offset appropriately.\n            var adjustedregex = state[i].regex.replace(/\\\\([0-9]+)/g, function (match, digit) {\n                return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n            });\n\n            if (matchcount > 1 && state[i].token.length !== matchcount-1)\n                throw new Error(\"For \" + state[i].regex + \" the matching groups and length of the token array don't match (rule #\" + i + \" of state \" + key + \")\");\n\n            mapping[matchTotal] = {\n                rule: i,\n                len: matchcount\n            };\n            matchTotal += matchcount;\n\n            ruleRegExps.push(adjustedregex);\n        }\n\n        this.regExps[key] = new RegExp(\"(?:(\" + ruleRegExps.join(\")|(\") + \")|(.))\", flag);\n    }\n};\n\n(function() {\n\n    /**\n    * Tokenizer.getLineTokens() -> Object\n    *\n    * Returns an object containing two properties: `tokens`, which contains all the tokens; and `state`, the current state.\n    **/\n    this.getLineTokens = function(line, startState) {\n        var currentState = startState || \"start\";\n        var state = this.rules[currentState];\n        var mapping = this.matchMappings[currentState];\n        var re = this.regExps[currentState];\n        re.lastIndex = 0;\n\n        var match, tokens = [];\n\n        var lastIndex = 0;\n\n        var token = {\n            type: null,\n            value: \"\"\n        };\n\n        while (match = re.exec(line)) {\n            var type = \"text\";\n            var rule = null;\n            var value = [match[0]];\n\n            for (var i = 0; i < match.length-2; i++) {\n                if (match[i + 1] === undefined)\n                    continue;\n\n                rule = state[mapping[i].rule];\n\n                if (mapping[i].len > 1)\n                    value = match.slice(i+2, i+1+mapping[i].len);\n\n                // compute token type\n                if (typeof rule.token == \"function\")\n                    type = rule.token.apply(this, value);\n                else\n                    type = rule.token;\n\n                if (rule.next) {\n                    currentState = rule.next;\n                    state = this.rules[currentState];\n                    mapping = this.matchMappings[currentState];\n                    lastIndex = re.lastIndex;\n\n                    re = this.regExps[currentState];\n\n                    if (re === undefined) {\n                         throw new Error(\"You indicated a state of \" + rule.next + \" to go to, but it doesn't exist!\");\n                    }\n\n                    re.lastIndex = lastIndex;\n                }\n                break;\n            }\n\n            if (value[0]) {\n                if (typeof type == \"string\") {\n                    value = [value.join(\"\")];\n                    type = [type];\n                }\n                for (var i = 0; i < value.length; i++) {\n                    if (!value[i])\n                        continue;\n\n                    if ((!rule || rule.merge || type[i] === \"text\") && token.type === type[i]) {\n                        token.value += value[i];\n                    } else {\n                        if (token.type)\n                            tokens.push(token);\n\n                        token = {\n                            type: type[i],\n                            value: value[i]\n                        };\n                    }\n                }\n            }\n\n            if (lastIndex == line.length)\n                break;\n\n            lastIndex = re.lastIndex;\n        }\n\n        if (token.type)\n            tokens.push(token);\n\n        return {\n            tokens : tokens,\n            state : currentState\n        };\n    };\n\n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\ndefine('ace/mode/xquery_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XQueryHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        keyword: \"after|ancestor|ancestor-or-self|and|as|ascending|attribute|before|case|cast|castable|child|collation|comment|copy|count|declare|default|delete|descendant|descendant-or-self|descending|div|document|document-node|element|else|empty|empty-sequence|end|eq|every|except|first|following|following-sibling|for|function|ge|group|gt|idiv|if|import|insert|instance|intersect|into|is|item|last|le|let|lt|mod|modify|module|namespace|namespace-node|ne|node|only|or|order|ordered|parent|preceding|preceding-sibling|processing-instruction|rename|replace|return|satisfies|schema-attribute|schema-element|self|some|stable|start|switch|text|to|treat|try|typeswitch|union|unordered|validate|where|with|xquery|contains|paragraphs|sentences|times|words|by|collectionreturn|variable|version|option|when|encoding|toswitch|catch|tumbling|sliding|window|at|using|stemming|collection|schema|while|on|nodes|index|external|then|in|updating|value|of|containsbreak|loop|continue|exit|returning|append|json|position\"\n    }, \"identifier\");\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        start : [ {\n            token : \"text\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\",\n            next : \"cdata\"\n        }, {\n            token : \"xml_pe\",\n            regex : \"<\\\\?.*?\\\\?>\"\n        }, {\n            token : \"comment\",\n            regex : \"<\\\\!--\",\n            next : \"comment\"\n    }, {\n      token : \"comment\",\n      regex : \"\\\\(:\",\n      next : \"comment\"\n        }, {\n            token : \"text\", // opening tag\n            regex : \"<\\\\/?\",\n            next : \"tag\"\n        }, {\n            token : \"constant\", // number\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n            token : \"variable\", // variable\n            regex : \"\\\\$[a-zA-Z_][a-zA-Z0-9_\\\\-:]*\\\\b\"\n    }, {\n      token: \"string\",\n      regex : '\".*?\"'\n    }, {\n      token: \"string\",\n      regex : \"'.*?'\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"support.function\",\n            regex: \"\\\\w[\\\\w+_\\\\-:]+(?=\\\\()\"\n        }, {\n      token : keywordMapper,\n      regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n    }, {\n            token: \"keyword.operator\",\n            regex: \"\\\\*|=|<|>|\\\\-|\\\\+\"\n        }, {\n            token: \"lparen\",\n            regex: \"[[({]\"\n        }, {\n            token: \"rparen\",\n            regex: \"[\\\\])}]\"\n        } ],\n\n        tag : [ {\n            token : \"text\",\n            regex : \">\",\n            next : \"start\"\n        }, {\n            token : \"meta.tag\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"string\",\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",\n            regex : \"'.*?'\"\n        } ],\n\n        cdata : [ {\n            token : \"comment\",\n            regex : \"\\\\]\\\\]>\",\n            next : \"start\"\n        }, {\n            token : \"comment\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"comment\",\n            regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"\n        } ],\n\n        comment : [ {\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"start\"\n        }, {\n      token: \"comment\",\n      regex : \".*:\\\\)\",\n      next : \"start\"\n        }, {\n            token : \"comment\",\n            regex : \".+\"\n    } ]\n    };\n};\n\noop.inherits(XQueryHighlightRules, TextHighlightRules);\n\nexports.XQueryHighlightRules = XQueryHighlightRules;\n});\n\ndefine('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar lang = require(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n    // regexp must not have capturing parentheses\n    // regexps are ordered -> the first match is used\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"empty_line\",\n            regex : '^$'\n        }, {\n            token : \"text\",\n            regex : \".+\"\n        }]\n    };\n};\n\n(function() {\n\n    this.addRules = function(rules, prefix) {\n        for (var key in rules) {\n            var state = rules[key];\n            for (var i=0; i<state.length; i++) {\n                var rule = state[i];\n                if (rule.next) {\n                    rule.next = prefix + rule.next;\n                }\n            }\n            this.$rules[prefix + key] = state;\n        }\n    };\n\n    this.getRules = function() {\n        return this.$rules;\n    };\n\n    this.embedRules = function (HighlightRules, prefix, escapeRules, states) {\n        var embedRules = new HighlightRules().getRules();\n        if (states) {\n            for (var i = 0; i < states.length; i++) {\n                states[i] = prefix + states[i];\n            }\n        } else {\n            states = [];\n            for (var key in embedRules) {\n                states.push(prefix + key);\n            }\n        }\n        this.addRules(embedRules, prefix);\n\n        for (var i = 0; i < states.length; i++) {\n            Array.prototype.unshift.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n        }\n\n        if (!this.$embeds) {\n            this.$embeds = [];\n        }\n        this.$embeds.push(prefix);\n    }\n\n    this.getEmbeds = function() {\n        return this.$embeds;\n    }\n\n    this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n        var keywords = Object.create(null);\n        Object.keys(map).forEach(function(className) {\n            var list = map[className].split(splitChar || \"|\");\n            for (var i = list.length; i--; )\n                keywords[list[i]] = className;\n        });\n        map = null;\n        return ignoreCase\n            ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n            : function(value) {return keywords[value] || defaultToken };\n    }\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n"
  },
  {
    "path": "servers/www/assets/js/vendor/angular-cookies.js",
    "content": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, angular, undefined) {\r\n'use strict';\r\n\r\n/**\r\n * @ngdoc overview\r\n * @name ngCookies\r\n */\r\n\r\n\r\nangular.module('ngCookies', ['ng']).\r\n  /**\r\n   * @ngdoc object\r\n   * @name ngCookies.$cookies\r\n   * @requires $browser\r\n   *\r\n   * @description\r\n   * Provides read/write access to browser's cookies.\r\n   *\r\n   * Only a simple Object is exposed and by adding or removing properties to/from\r\n   * this object, new cookies are created/deleted at the end of current $eval.\r\n   *\r\n   * @example\r\n   */\r\n   factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {\r\n      var cookies = {},\r\n          lastCookies = {},\r\n          lastBrowserCookies,\r\n          runEval = false,\r\n          copy = angular.copy,\r\n          isUndefined = angular.isUndefined;\r\n\r\n      //creates a poller fn that copies all cookies from the $browser to service & inits the service\r\n      $browser.addPollFn(function() {\r\n        var currentCookies = $browser.cookies();\r\n        if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl\r\n          lastBrowserCookies = currentCookies;\r\n          copy(currentCookies, lastCookies);\r\n          copy(currentCookies, cookies);\r\n          if (runEval) $rootScope.$apply();\r\n        }\r\n      })();\r\n\r\n      runEval = true;\r\n\r\n      //at the end of each eval, push cookies\r\n      //TODO: this should happen before the \"delayed\" watches fire, because if some cookies are not\r\n      //      strings or browser refuses to store some cookies, we update the model in the push fn.\r\n      $rootScope.$watch(push);\r\n\r\n      return cookies;\r\n\r\n\r\n      /**\r\n       * Pushes all the cookies from the service to the browser and verifies if all cookies were stored.\r\n       */\r\n      function push() {\r\n        var name,\r\n            value,\r\n            browserCookies,\r\n            updated;\r\n\r\n        //delete any cookies deleted in $cookies\r\n        for (name in lastCookies) {\r\n          if (isUndefined(cookies[name])) {\r\n            $browser.cookies(name, undefined);\r\n          }\r\n        }\r\n\r\n        //update all cookies updated in $cookies\r\n        for(name in cookies) {\r\n          value = cookies[name];\r\n          if (!angular.isString(value)) {\r\n            if (angular.isDefined(lastCookies[name])) {\r\n              cookies[name] = lastCookies[name];\r\n            } else {\r\n              delete cookies[name];\r\n            }\r\n          } else if (value !== lastCookies[name]) {\r\n            $browser.cookies(name, value);\r\n            updated = true;\r\n          }\r\n        }\r\n\r\n        //verify what was actually stored\r\n        if (updated){\r\n          updated = false;\r\n          browserCookies = $browser.cookies();\r\n\r\n          for (name in cookies) {\r\n            if (cookies[name] !== browserCookies[name]) {\r\n              //delete or reset all cookies that the browser dropped from $cookies\r\n              if (isUndefined(browserCookies[name])) {\r\n                delete cookies[name];\r\n              } else {\r\n                cookies[name] = browserCookies[name];\r\n              }\r\n              updated = true;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }]).\r\n\r\n\r\n  /**\r\n   * @ngdoc object\r\n   * @name ngCookies.$cookieStore\r\n   * @requires $cookies\r\n   *\r\n   * @description\r\n   * Provides a key-value (string-object) storage, that is backed by session cookies.\r\n   * Objects put or retrieved from this storage are automatically serialized or\r\n   * deserialized by angular's toJson/fromJson.\r\n   * @example\r\n   */\r\n   factory('$cookieStore', ['$cookies', function($cookies) {\r\n\r\n      return {\r\n        /**\r\n         * @ngdoc method\r\n         * @name ngCookies.$cookieStore#get\r\n         * @methodOf ngCookies.$cookieStore\r\n         *\r\n         * @description\r\n         * Returns the value of given cookie key\r\n         *\r\n         * @param {string} key Id to use for lookup.\r\n         * @returns {Object} Deserialized cookie value.\r\n         */\r\n        get: function(key) {\r\n          return angular.fromJson($cookies[key]);\r\n        },\r\n\r\n        /**\r\n         * @ngdoc method\r\n         * @name ngCookies.$cookieStore#put\r\n         * @methodOf ngCookies.$cookieStore\r\n         *\r\n         * @description\r\n         * Sets a value for given cookie key\r\n         *\r\n         * @param {string} key Id for the `value`.\r\n         * @param {Object} value Value to be stored.\r\n         */\r\n        put: function(key, value) {\r\n          $cookies[key] = angular.toJson(value);\r\n        },\r\n\r\n        /**\r\n         * @ngdoc method\r\n         * @name ngCookies.$cookieStore#remove\r\n         * @methodOf ngCookies.$cookieStore\r\n         *\r\n         * @description\r\n         * Remove given cookie\r\n         *\r\n         * @param {string} key Id of the key-value pair to delete.\r\n         */\r\n        remove: function(key) {\r\n          delete $cookies[key];\r\n        }\r\n      };\r\n\r\n    }]);\r\n\r\n})(window, window.angular);"
  },
  {
    "path": "servers/www/assets/js/vendor/angular-jq.js",
    "content": "angular.module('ui.config', []).value('ui.config', {});\r\n\r\n/**\r\n * General-purpose jQuery wrapper. Simply pass the plugin name as the expression.\r\n * \r\n * It is possible to specify a default set of parameters for each jQuery plugin.\r\n * Under the jq key, namespace each plugin by that which will be passed to ui-jq.\r\n * Unfortunately, at this time you can only pre-define the first parameter.\r\n * @example { jq : { datepicker : { showOn:'click' } } }\r\n * \r\n * @param ui-jq {string} The $elm.[pluginName]() to call.\r\n * @param [ui-options] {mixed} Expression to be evaluated and passed as options to the function\r\n *     Multiple parameters can be separated by commas\r\n *    Set {ngChange:false} to disable passthrough support for change events ( since angular watches 'input' events, not 'change' events )\r\n * \r\n * @example <input ui-jq=\"datepicker\" ui-options=\"{showOn:'click'},secondParameter,thirdParameter\">\r\n */\r\nangular.module('ui.directives', [\"ui.config\"]).directive('uiJq', ['ui.config', function(uiConfig) {\r\n\treturn {\r\n\t\trestrict: 'A',\r\n\t\tcompile: function(tElm, tAttrs) {  \r\n\t\t\tif (!angular.isFunction(tElm[tAttrs.uiJq])) {\r\n\t\t\t\tthrow new Error('ui-jq: The \"'+tAttrs.uiJq+'\" function does not exist');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tvar options = uiConfig['jq'] && uiConfig['jq'][tAttrs.uiJq];\r\n\t\t\treturn function (scope, elm, attrs) {\r\n\t\t\t\tvar linkOptions = [], ngChange = 'change';\r\n\r\n\t\t\t\tif (attrs.uiOptions) {\r\n\t\t\t\t\tlinkOptions = scope.$eval('['+attrs.uiOptions+']');\r\n\t\t\t\t\tif (angular.isObject(options) && angular.isObject(linkOptions[0])) {\r\n\t\t\t\t\t\tlinkOptions[0] = angular.extend(options, linkOptions[0]);\r\n\t\t\t\t\t} \r\n\t\t\t\t} else if (options) {\r\n\t\t\t\t\tlinkOptions = [options]; \r\n\t\t\t\t}\r\n\t\t\t\tif (attrs.ngModel && elm.is('select,input,textarea')) {\r\n\t\t\t\t\tif (linkOptions && angular.isObject(linkOptions[0]) && linkOptions[0].ngChange !== undefined) {\r\n\t\t\t\t\t\tngChange = linkOptions[0].ngChange;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tngChange && elm.on(ngChange, function(){\r\n\t\t\t\t\t\telm.trigger('input');\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\telm[attrs.uiJq].apply(elm, linkOptions);\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n}]);"
  },
  {
    "path": "servers/www/assets/js/vendor/angular-resource.js",
    "content": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, angular, undefined) {\r\n'use strict';\r\n\r\n/**\r\n * @ngdoc overview\r\n * @name ngResource\r\n * @description\r\n */\r\n\r\n /**\r\n * @ngdoc object\r\n * @name ngResource.$resource\r\n * @requires $http\r\n *\r\n * @description\r\n * A factory which creates a resource object that lets you interact with\r\n * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.\r\n *\r\n * The returned resource object has action methods which provide high-level behaviors without\r\n * the need to interact with the low level {@link ng.$http $http} service.\r\n *\r\n * @param {string} url A parameterized URL template with parameters prefixed by `:` as in\r\n *   `/user/:username`.\r\n *\r\n * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in\r\n *   `actions` methods.\r\n *\r\n *   Each key value in the parameter object is first bound to url template if present and then any\r\n *   excess keys are appended to the url search query after the `?`.\r\n *\r\n *   Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in\r\n *   URL `/path/greet?salutation=Hello`.\r\n *\r\n *   If the parameter value is prefixed with `@` then the value of that parameter is extracted from\r\n *   the data object (useful for non-GET operations).\r\n *\r\n * @param {Object.<Object>=} actions Hash with declaration of custom action that should extend the\r\n *   default set of resource actions. The declaration should be created in the following format:\r\n *\r\n *       {action1: {method:?, params:?, isArray:?},\r\n *        action2: {method:?, params:?, isArray:?},\r\n *        ...}\r\n *\r\n *   Where:\r\n *\r\n *   - `action` â€“ {string} â€“ The name of action. This name becomes the name of the method on your\r\n *     resource object.\r\n *   - `method` â€“ {string} â€“ HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, `DELETE`,\r\n *     and `JSONP`\r\n *   - `params` â€“ {object=} â€“ Optional set of pre-bound parameters for this action.\r\n *   - isArray â€“ {boolean=} â€“ If true then the returned object for this action is an array, see\r\n *     `returns` section.\r\n *\r\n * @returns {Object} A resource \"class\" object with methods for the default set of resource actions\r\n *   optionally extended with custom `actions`. The default set contains these actions:\r\n *\r\n *       { 'get':    {method:'GET'},\r\n *         'save':   {method:'POST'},\r\n *         'query':  {method:'GET', isArray:true},\r\n *         'remove': {method:'DELETE'},\r\n *         'delete': {method:'DELETE'} };\r\n *\r\n *   Calling these methods invoke an {@link ng.$http} with the specified http method,\r\n *   destination and parameters. When the data is returned from the server then the object is an\r\n *   instance of the resource class `save`, `remove` and `delete` actions are available on it as\r\n *   methods with the `$` prefix. This allows you to easily perform CRUD operations (create, read,\r\n *   update, delete) on server-side data like this:\r\n *   <pre>\r\n        var User = $resource('/user/:userId', {userId:'@id'});\r\n        var user = User.get({userId:123}, function() {\r\n          user.abc = true;\r\n          user.$save();\r\n        });\r\n     </pre>\r\n *\r\n *   It is important to realize that invoking a $resource object method immediately returns an\r\n *   empty reference (object or array depending on `isArray`). Once the data is returned from the\r\n *   server the existing reference is populated with the actual data. This is a useful trick since\r\n *   usually the resource is assigned to a model which is then rendered by the view. Having an empty\r\n *   object results in no rendering, once the data arrives from the server then the object is\r\n *   populated with the data and the view automatically re-renders itself showing the new data. This\r\n *   means that in most case one never has to write a callback function for the action methods.\r\n *\r\n *   The action methods on the class object or instance object can be invoked with the following\r\n *   parameters:\r\n *\r\n *   - HTTP GET \"class\" actions: `Resource.action([parameters], [success], [error])`\r\n *   - non-GET \"class\" actions: `Resource.action([parameters], postData, [success], [error])`\r\n *   - non-GET instance actions:  `instance.$action([parameters], [success], [error])`\r\n *\r\n *\r\n * @example\r\n *\r\n * # Credit card resource\r\n *\r\n * <pre>\r\n     // Define CreditCard class\r\n     var CreditCard = $resource('/user/:userId/card/:cardId',\r\n      {userId:123, cardId:'@id'}, {\r\n       charge: {method:'POST', params:{charge:true}}\r\n      });\r\n\r\n     // We can retrieve a collection from the server\r\n     var cards = CreditCard.query(function() {\r\n       // GET: /user/123/card\r\n       // server returns: [ {id:456, number:'1234', name:'Smith'} ];\r\n\r\n       var card = cards[0];\r\n       // each item is an instance of CreditCard\r\n       expect(card instanceof CreditCard).toEqual(true);\r\n       card.name = \"J. Smith\";\r\n       // non GET methods are mapped onto the instances\r\n       card.$save();\r\n       // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}\r\n       // server returns: {id:456, number:'1234', name: 'J. Smith'};\r\n\r\n       // our custom method is mapped as well.\r\n       card.$charge({amount:9.99});\r\n       // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}\r\n     });\r\n\r\n     // we can create an instance as well\r\n     var newCard = new CreditCard({number:'0123'});\r\n     newCard.name = \"Mike Smith\";\r\n     newCard.$save();\r\n     // POST: /user/123/card {number:'0123', name:'Mike Smith'}\r\n     // server returns: {id:789, number:'01234', name: 'Mike Smith'};\r\n     expect(newCard.id).toEqual(789);\r\n * </pre>\r\n *\r\n * The object returned from this function execution is a resource \"class\" which has \"static\" method\r\n * for each action in the definition.\r\n *\r\n * Calling these methods invoke `$http` on the `url` template with the given `method` and `params`.\r\n * When the data is returned from the server then the object is an instance of the resource type and\r\n * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD\r\n * operations (create, read, update, delete) on server-side data.\r\n\r\n   <pre>\r\n     var User = $resource('/user/:userId', {userId:'@id'});\r\n     var user = User.get({userId:123}, function() {\r\n       user.abc = true;\r\n       user.$save();\r\n     });\r\n   </pre>\r\n *\r\n *     It's worth noting that the success callback for `get`, `query` and other method gets passed\r\n *     in the response that came from the server as well as $http header getter function, so one\r\n *     could rewrite the above example and get access to http headers as:\r\n *\r\n   <pre>\r\n     var User = $resource('/user/:userId', {userId:'@id'});\r\n     User.get({userId:123}, function(u, getResponseHeaders){\r\n       u.abc = true;\r\n       u.$save(function(u, putResponseHeaders) {\r\n         //u => saved user object\r\n         //putResponseHeaders => $http header getter\r\n       });\r\n     });\r\n   </pre>\r\n\r\n * # Buzz client\r\n\r\n   Let's look at what a buzz client created with the `$resource` service looks like:\r\n    <doc:example>\r\n      <doc:source jsfiddle=\"false\">\r\n       <script>\r\n         function BuzzController($resource) {\r\n           this.userId = 'googlebuzz';\r\n           this.Activity = $resource(\r\n             'https://www.googleapis.com/buzz/v1/activities/:userId/:visibility/:activityId/:comments',\r\n             {alt:'json', callback:'JSON_CALLBACK'},\r\n             {get:{method:'JSONP', params:{visibility:'@self'}}, replies: {method:'JSONP', params:{visibility:'@self', comments:'@comments'}}}\r\n           );\r\n         }\r\n\r\n         BuzzController.prototype = {\r\n           fetch: function() {\r\n             this.activities = this.Activity.get({userId:this.userId});\r\n           },\r\n           expandReplies: function(activity) {\r\n             activity.replies = this.Activity.replies({userId:this.userId, activityId:activity.id});\r\n           }\r\n         };\r\n         BuzzController.$inject = ['$resource'];\r\n       </script>\r\n\r\n       <div ng-controller=\"BuzzController\">\r\n         <input ng-model=\"userId\"/>\r\n         <button ng-click=\"fetch()\">fetch</button>\r\n         <hr/>\r\n         <div ng-repeat=\"item in activities.data.items\">\r\n           <h1 style=\"font-size: 15px;\">\r\n             <img src=\"{{item.actor.thumbnailUrl}}\" style=\"max-height:30px;max-width:30px;\"/>\r\n             <a href=\"{{item.actor.profileUrl}}\">{{item.actor.name}}</a>\r\n             <a href ng-click=\"expandReplies(item)\" style=\"float: right;\">Expand replies: {{item.links.replies[0].count}}</a>\r\n           </h1>\r\n           {{item.object.content | html}}\r\n           <div ng-repeat=\"reply in item.replies.data.items\" style=\"margin-left: 20px;\">\r\n             <img src=\"{{reply.actor.thumbnailUrl}}\" style=\"max-height:30px;max-width:30px;\"/>\r\n             <a href=\"{{reply.actor.profileUrl}}\">{{reply.actor.name}}</a>: {{reply.content | html}}\r\n           </div>\r\n         </div>\r\n       </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nangular.module('ngResource', ['ng']).\r\n  factory('$resource', ['$http', '$parse', function($http, $parse) {\r\n    var DEFAULT_ACTIONS = {\r\n      'get':    {method:'GET'},\r\n      'save':   {method:'POST'},\r\n      'query':  {method:'GET', isArray:true},\r\n      'remove': {method:'DELETE'},\r\n      'delete': {method:'DELETE'}\r\n    };\r\n    var noop = angular.noop,\r\n        forEach = angular.forEach,\r\n        extend = angular.extend,\r\n        copy = angular.copy,\r\n        isFunction = angular.isFunction,\r\n        getter = function(obj, path) {\r\n          return $parse(path)(obj);\r\n        };\r\n\r\n  /**\r\n   * We need our custom mehtod because encodeURIComponent is too agressive and doesn't follow\r\n   * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\r\n   * segments:\r\n   *    segment       = *pchar\r\n   *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n   *    pct-encoded   = \"%\" HEXDIG HEXDIG\r\n   *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n   *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n   *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n   */\r\n  function encodeUriSegment(val) {\r\n    return encodeUriQuery(val, true).\r\n      replace(/%26/gi, '&').\r\n      replace(/%3D/gi, '=').\r\n      replace(/%2B/gi, '+');\r\n  }\r\n\r\n\r\n  /**\r\n   * This method is intended for encoding *key* or *value* parts of query component. We need a custom\r\n   * method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be\r\n   * encoded per http://tools.ietf.org/html/rfc3986:\r\n   *    query       = *( pchar / \"/\" / \"?\" )\r\n   *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n   *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n   *    pct-encoded   = \"%\" HEXDIG HEXDIG\r\n   *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n   *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n   */\r\n  function encodeUriQuery(val, pctEncodeSpaces) {\r\n    return encodeURIComponent(val).\r\n      replace(/%40/gi, '@').\r\n      replace(/%3A/gi, ':').\r\n      replace(/%24/g, '$').\r\n      replace(/%2C/gi, ',').\r\n      replace((pctEncodeSpaces ? null : /%20/g), '+');\r\n  }\r\n\r\n  function Route(template, defaults) {\r\n      this.template = template = template + '#';\r\n      this.defaults = defaults || {};\r\n      var urlParams = this.urlParams = {};\r\n      forEach(template.split(/\\W/), function(param){\r\n        if (param && template.match(new RegExp(\"[^\\\\\\\\]:\" + param + \"\\\\W\"))) {\r\n          urlParams[param] = true;\r\n        }\r\n      });\r\n      this.template = template.replace(/\\\\:/g, ':');\r\n    }\r\n\r\n    Route.prototype = {\r\n      url: function(params) {\r\n        var self = this,\r\n            url = this.template,\r\n            encodedVal;\r\n\r\n        params = params || {};\r\n        forEach(this.urlParams, function(_, urlParam){\r\n          encodedVal = encodeUriSegment(params[urlParam] || self.defaults[urlParam] || \"\");\r\n          url = url.replace(new RegExp(\":\" + urlParam + \"(\\\\W)\"), encodedVal + \"$1\");\r\n        });\r\n        url = url.replace(/\\/?#$/, '');\r\n        var query = [];\r\n        forEach(params, function(value, key){\r\n          if (!self.urlParams[key]) {\r\n            query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value));\r\n          }\r\n        });\r\n        query.sort();\r\n        url = url.replace(/\\/*$/, '');\r\n        return url + (query.length ? '?' + query.join('&') : '');\r\n      }\r\n    };\r\n\r\n\r\n    function ResourceFactory(url, paramDefaults, actions, parser) {\r\n      var route = new Route(url);\r\n      var parser = isFunction(parser) ? parser : noop;\r\n\r\n      actions = extend({}, DEFAULT_ACTIONS, actions);\r\n\r\n      function extractParams(data){\r\n        var ids = {};\r\n        forEach(paramDefaults || {}, function(value, key){\r\n          ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;\r\n        });\r\n        return ids;\r\n      }\r\n\r\n      function Resource(value){\r\n        copy(parser(value || {}), this);\r\n      }\r\n\r\n      forEach(actions, function(action, name) {\r\n        var hasBody = action.method == 'POST' || action.method == 'PUT' || action.method == 'PATCH';\r\n        Resource[name] = function(a1, a2, a3, a4) {\r\n          var params = {};\r\n          var data;\r\n          var success = noop;\r\n          var error = null;\r\n          switch(arguments.length) {\r\n          case 4:\r\n            error = a4;\r\n            success = a3;\r\n            //fallthrough\r\n          case 3:\r\n          case 2:\r\n            if (isFunction(a2)) {\r\n              if (isFunction(a1)) {\r\n                success = a1;\r\n                error = a2;\r\n                break;\r\n              }\r\n\r\n              success = a2;\r\n              error = a3;\r\n              //fallthrough\r\n            } else {\r\n              params = a1;\r\n              data = a2;\r\n              success = a3;\r\n              break;\r\n            }\r\n          case 1:\r\n            if (isFunction(a1)) success = a1;\r\n            else if (hasBody) data = a1;\r\n            else params = a1;\r\n            break;\r\n          case 0: break;\r\n          default:\r\n            throw \"Expected between 0-4 arguments [params, data, success, error], got \" +\r\n              arguments.length + \" arguments.\";\r\n          }\r\n\r\n          var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));\r\n          $http({\r\n            method: action.method,\r\n            url: route.url(extend({}, extractParams(data), action.params || {}, params)),\r\n            data: data\r\n          }).then(function(response) {\r\n              var data = response.data;\r\n\r\n              if (data) {\r\n                if (action.isArray) {\r\n                  value.length = 0;\r\n                  forEach(data, function(item) {\r\n                    value.push(new Resource(item));\r\n                  });\r\n                } else {\r\n                  copy(data, value);\r\n                }\r\n              }\r\n              (success||noop)(value, response.headers);\r\n            }, error);\r\n\r\n          return value;\r\n        };\r\n\r\n\r\n        Resource.bind = function(additionalParamDefaults){\r\n          return ResourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);\r\n        };\r\n\r\n\r\n        Resource.prototype['$' + name] = function(a1, a2, a3) {\r\n          var params = extractParams(this),\r\n              success = noop,\r\n              error;\r\n\r\n          switch(arguments.length) {\r\n          case 3: params = a1; success = a2; error = a3; break;\r\n          case 2:\r\n          case 1:\r\n            if (isFunction(a1)) {\r\n              success = a1;\r\n              error = a2;\r\n            } else {\r\n              params = a1;\r\n              success = a2 || noop;\r\n            }\r\n          case 0: break;\r\n          default:\r\n            throw \"Expected between 1-3 arguments [params, success, error], got \" +\r\n              arguments.length + \" arguments.\";\r\n          }\r\n          var data = hasBody ? this : undefined;\r\n          Resource[name].call(this, params, data, success, error);\r\n        };\r\n      });\r\n      return Resource;\r\n    }\r\n\r\n    return ResourceFactory;\r\n  }]);\r\n\r\n})(window, window.angular);"
  },
  {
    "path": "servers/www/assets/js/vendor/angular-sanitize.js",
    "content": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, angular, undefined) {\r\n'use strict';\r\n\r\n/**\r\n * @ngdoc overview\r\n * @name ngSanitize\r\n * @description\r\n */\r\n\r\n/*\r\n * HTML Parser By Misko Hevery (misko@hevery.com)\r\n * based on:  HTML Parser By John Resig (ejohn.org)\r\n * Original code by Erik Arvidsson, Mozilla Public License\r\n * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js\r\n *\r\n * // Use like so:\r\n * htmlParser(htmlString, {\r\n *     start: function(tag, attrs, unary) {},\r\n *     end: function(tag) {},\r\n *     chars: function(text) {},\r\n *     comment: function(text) {}\r\n * });\r\n *\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc service\r\n * @name ngSanitize.$sanitize\r\n * @function\r\n *\r\n * @description\r\n *   The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are\r\n *   then serialized back to properly escaped html string. This means that no unsafe input can make\r\n *   it into the returned string, however, since our parser is more strict than a typical browser\r\n *   parser, it's possible that some obscure input, which would be recognized as valid HTML by a\r\n *   browser, won't make it through the sanitizer.\r\n *\r\n * @param {string} html Html input.\r\n * @returns {string} Sanitized html.\r\n *\r\n * @example\r\n   <doc:example module=\"ngSanitize\">\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.snippet =\r\n             '<p style=\"color:blue\">an html\\n' +\r\n             '<em onmouseover=\"this.textContent=\\'PWN3D!\\'\">click here</em>\\n' +\r\n             'snippet</p>';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n          Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\r\n           <table>\r\n             <tr>\r\n               <td>Filter</td>\r\n               <td>Source</td>\r\n               <td>Rendered</td>\r\n             </tr>\r\n             <tr id=\"html-filter\">\r\n               <td>html filter</td>\r\n               <td>\r\n                 <pre>&lt;div ng-bind-html=\"snippet\"&gt;<br/>&lt;/div&gt;</pre>\r\n               </td>\r\n               <td>\r\n                 <div ng-bind-html=\"snippet\"></div>\r\n               </td>\r\n             </tr>\r\n             <tr id=\"escaped-html\">\r\n               <td>no filter</td>\r\n               <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\r\n               <td><div ng-bind=\"snippet\"></div></td>\r\n             </tr>\r\n             <tr id=\"html-unsafe-filter\">\r\n               <td>unsafe html filter</td>\r\n               <td><pre>&lt;div ng-bind-html-unsafe=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\r\n               <td><div ng-bind-html-unsafe=\"snippet\"></div></td>\r\n             </tr>\r\n           </table>\r\n         </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should sanitize the html snippet ', function() {\r\n         expect(using('#html-filter').element('div').html()).\r\n           toBe('<p>an html\\n<em>click here</em>\\nsnippet</p>');\r\n       });\r\n\r\n       it('should escape snippet without any filter', function() {\r\n         expect(using('#escaped-html').element('div').html()).\r\n           toBe(\"&lt;p style=\\\"color:blue\\\"&gt;an html\\n\" +\r\n                \"&lt;em onmouseover=\\\"this.textContent='PWN3D!'\\\"&gt;click here&lt;/em&gt;\\n\" +\r\n                \"snippet&lt;/p&gt;\");\r\n       });\r\n\r\n       it('should inline raw snippet if filtered as unsafe', function() {\r\n         expect(using('#html-unsafe-filter').element(\"div\").html()).\r\n           toBe(\"<p style=\\\"color:blue\\\">an html\\n\" +\r\n                \"<em onmouseover=\\\"this.textContent='PWN3D!'\\\">click here</em>\\n\" +\r\n                \"snippet</p>\");\r\n       });\r\n\r\n       it('should update', function() {\r\n         input('snippet').enter('new <b>text</b>');\r\n         expect(using('#html-filter').binding('snippet')).toBe('new <b>text</b>');\r\n         expect(using('#escaped-html').element('div').html()).toBe(\"new &lt;b&gt;text&lt;/b&gt;\");\r\n         expect(using('#html-unsafe-filter').binding(\"snippet\")).toBe('new <b>text</b>');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar $sanitize = function(html) {\r\n  var buf = [];\r\n    htmlParser(html, htmlSanitizeWriter(buf));\r\n    return buf.join('');\r\n};\r\n\r\n\r\n// Regular Expressions for parsing tags and attributes\r\nvar START_TAG_REGEXP = /^<\\s*([\\w:-]+)((?:\\s+[\\w:-]+(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)\\s*>/,\r\n  END_TAG_REGEXP = /^<\\s*\\/\\s*([\\w:-]+)[^>]*>/,\r\n  ATTR_REGEXP = /([\\w:-]+)(?:\\s*=\\s*(?:(?:\"((?:[^\"])*)\")|(?:'((?:[^'])*)')|([^>\\s]+)))?/g,\r\n  BEGIN_TAG_REGEXP = /^</,\r\n  BEGING_END_TAGE_REGEXP = /^<\\s*\\//,\r\n  COMMENT_REGEXP = /<!--(.*?)-->/g,\r\n  CDATA_REGEXP = /<!\\[CDATA\\[(.*?)]]>/g,\r\n  URI_REGEXP = /^((ftp|https?):\\/\\/|mailto:|#)/,\r\n  NON_ALPHANUMERIC_REGEXP = /([^\\#-~| |!])/g; // Match everything outside of normal chars and \" (quote character)\r\n\r\n\r\n// Good source of info about elements and attributes\r\n// http://dev.w3.org/html5/spec/Overview.html#semantics\r\n// http://simon.html5.org/html-elements\r\n\r\n// Safe Void Elements - HTML5\r\n// http://dev.w3.org/html5/spec/Overview.html#void-elements\r\nvar voidElements = makeMap(\"area,br,col,hr,img,wbr\");\r\n\r\n// Elements that you can, intentionally, leave open (and which close themselves)\r\n// http://dev.w3.org/html5/spec/Overview.html#optional-tags\r\nvar optionalEndTagBlockElements = makeMap(\"colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr\"),\r\n    optionalEndTagInlineElements = makeMap(\"rp,rt\"),\r\n    optionalEndTagElements = angular.extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements);\r\n\r\n// Safe Block Elements - HTML5\r\nvar blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap(\"address,article,aside,\" +\r\n        \"blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,\" +\r\n        \"header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul\"));\r\n\r\n// Inline Elements - HTML5\r\nvar inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap(\"a,abbr,acronym,b,bdi,bdo,\" +\r\n        \"big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,\" +\r\n        \"span,strike,strong,sub,sup,time,tt,u,var\"));\r\n\r\n\r\n// Special Elements (can contain anything)\r\nvar specialElements = makeMap(\"script,style\");\r\n\r\nvar validElements = angular.extend({}, voidElements, blockElements, inlineElements, optionalEndTagElements);\r\n\r\n//Attributes that have href and hence need to be sanitized\r\nvar uriAttrs = makeMap(\"background,cite,href,longdesc,src,usemap\");\r\nvar validAttrs = angular.extend({}, uriAttrs, makeMap(\r\n    'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+\r\n    'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+\r\n    'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+\r\n    'scope,scrolling,shape,span,start,summary,target,title,type,'+\r\n    'valign,value,vspace,width'));\r\n\r\nfunction makeMap(str) {\r\n  var obj = {}, items = str.split(','), i;\r\n  for (i = 0; i < items.length; i++) obj[items[i]] = true;\r\n  return obj;\r\n}\r\n\r\n\r\n/**\r\n * @example\r\n * htmlParser(htmlString, {\r\n *     start: function(tag, attrs, unary) {},\r\n *     end: function(tag) {},\r\n *     chars: function(text) {},\r\n *     comment: function(text) {}\r\n * });\r\n *\r\n * @param {string} html string\r\n * @param {object} handler\r\n */\r\nfunction htmlParser( html, handler ) {\r\n  var index, chars, match, stack = [], last = html;\r\n  stack.last = function() { return stack[ stack.length - 1 ]; };\r\n\r\n  while ( html ) {\r\n    chars = true;\r\n\r\n    // Make sure we're not in a script or style element\r\n    if ( !stack.last() || !specialElements[ stack.last() ] ) {\r\n\r\n      // Comment\r\n      if ( html.indexOf(\"<!--\") === 0 ) {\r\n        index = html.indexOf(\"-->\");\r\n\r\n        if ( index >= 0 ) {\r\n          if (handler.comment) handler.comment( html.substring( 4, index ) );\r\n          html = html.substring( index + 3 );\r\n          chars = false;\r\n        }\r\n\r\n      // end tag\r\n      } else if ( BEGING_END_TAGE_REGEXP.test(html) ) {\r\n        match = html.match( END_TAG_REGEXP );\r\n\r\n        if ( match ) {\r\n          html = html.substring( match[0].length );\r\n          match[0].replace( END_TAG_REGEXP, parseEndTag );\r\n          chars = false;\r\n        }\r\n\r\n      // start tag\r\n      } else if ( BEGIN_TAG_REGEXP.test(html) ) {\r\n        match = html.match( START_TAG_REGEXP );\r\n\r\n        if ( match ) {\r\n          html = html.substring( match[0].length );\r\n          match[0].replace( START_TAG_REGEXP, parseStartTag );\r\n          chars = false;\r\n        }\r\n      }\r\n\r\n      if ( chars ) {\r\n        index = html.indexOf(\"<\");\r\n\r\n        var text = index < 0 ? html : html.substring( 0, index );\r\n        html = index < 0 ? \"\" : html.substring( index );\r\n\r\n        if (handler.chars) handler.chars( decodeEntities(text) );\r\n      }\r\n\r\n    } else {\r\n      html = html.replace(new RegExp(\"(.*)<\\\\s*\\\\/\\\\s*\" + stack.last() + \"[^>]*>\", 'i'), function(all, text){\r\n        text = text.\r\n          replace(COMMENT_REGEXP, \"$1\").\r\n          replace(CDATA_REGEXP, \"$1\");\r\n\r\n        if (handler.chars) handler.chars( decodeEntities(text) );\r\n\r\n        return \"\";\r\n      });\r\n\r\n      parseEndTag( \"\", stack.last() );\r\n    }\r\n\r\n    if ( html == last ) {\r\n      throw \"Parse Error: \" + html;\r\n    }\r\n    last = html;\r\n  }\r\n\r\n  // Clean up any remaining tags\r\n  parseEndTag();\r\n\r\n  function parseStartTag( tag, tagName, rest, unary ) {\r\n    tagName = angular.lowercase(tagName);\r\n    if ( blockElements[ tagName ] ) {\r\n      while ( stack.last() && inlineElements[ stack.last() ] ) {\r\n        parseEndTag( \"\", stack.last() );\r\n      }\r\n    }\r\n\r\n    if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) {\r\n      parseEndTag( \"\", tagName );\r\n    }\r\n\r\n    unary = voidElements[ tagName ] || !!unary;\r\n\r\n    if ( !unary )\r\n      stack.push( tagName );\r\n\r\n    var attrs = {};\r\n\r\n    rest.replace(ATTR_REGEXP, function(match, name, doubleQuotedValue, singleQoutedValue, unqoutedValue) {\r\n      var value = doubleQuotedValue\r\n        || singleQoutedValue\r\n        || unqoutedValue\r\n        || '';\r\n\r\n      attrs[name] = decodeEntities(value);\r\n    });\r\n    if (handler.start) handler.start( tagName, attrs, unary );\r\n  }\r\n\r\n  function parseEndTag( tag, tagName ) {\r\n    var pos = 0, i;\r\n    tagName = angular.lowercase(tagName);\r\n    if ( tagName )\r\n      // Find the closest opened tag of the same type\r\n      for ( pos = stack.length - 1; pos >= 0; pos-- )\r\n        if ( stack[ pos ] == tagName )\r\n          break;\r\n\r\n    if ( pos >= 0 ) {\r\n      // Close all the open elements, up the stack\r\n      for ( i = stack.length - 1; i >= pos; i-- )\r\n        if (handler.end) handler.end( stack[ i ] );\r\n\r\n      // Remove the open elements from the stack\r\n      stack.length = pos;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * decodes all entities into regular string\r\n * @param value\r\n * @returns {string} A string with decoded entities.\r\n */\r\nvar hiddenPre=document.createElement(\"pre\");\r\nfunction decodeEntities(value) {\r\n  hiddenPre.innerHTML=value.replace(/</g,\"&lt;\");\r\n  return hiddenPre.innerText || hiddenPre.textContent || '';\r\n}\r\n\r\n/**\r\n * Escapes all potentially dangerous characters, so that the\r\n * resulting string can be safely inserted into attribute or\r\n * element text.\r\n * @param value\r\n * @returns escaped text\r\n */\r\nfunction encodeEntities(value) {\r\n  return value.\r\n    replace(/&/g, '&amp;').\r\n    replace(NON_ALPHANUMERIC_REGEXP, function(value){\r\n      return '&#' + value.charCodeAt(0) + ';';\r\n    }).\r\n    replace(/</g, '&lt;').\r\n    replace(/>/g, '&gt;');\r\n}\r\n\r\n/**\r\n * create an HTML/XML writer which writes to buffer\r\n * @param {Array} buf use buf.jain('') to get out sanitized html string\r\n * @returns {object} in the form of {\r\n *     start: function(tag, attrs, unary) {},\r\n *     end: function(tag) {},\r\n *     chars: function(text) {},\r\n *     comment: function(text) {}\r\n * }\r\n */\r\nfunction htmlSanitizeWriter(buf){\r\n  var ignore = false;\r\n  var out = angular.bind(buf, buf.push);\r\n  return {\r\n    start: function(tag, attrs, unary){\r\n      tag = angular.lowercase(tag);\r\n      if (!ignore && specialElements[tag]) {\r\n        ignore = tag;\r\n      }\r\n      if (!ignore && validElements[tag] == true) {\r\n        out('<');\r\n        out(tag);\r\n        angular.forEach(attrs, function(value, key){\r\n          var lkey=angular.lowercase(key);\r\n          if (validAttrs[lkey]==true && (uriAttrs[lkey]!==true || value.match(URI_REGEXP))) {\r\n            out(' ');\r\n            out(key);\r\n            out('=\"');\r\n            out(encodeEntities(value));\r\n            out('\"');\r\n          }\r\n        });\r\n        out(unary ? '/>' : '>');\r\n      }\r\n    },\r\n    end: function(tag){\r\n        tag = angular.lowercase(tag);\r\n        if (!ignore && validElements[tag] == true) {\r\n          out('</');\r\n          out(tag);\r\n          out('>');\r\n        }\r\n        if (tag == ignore) {\r\n          ignore = false;\r\n        }\r\n      },\r\n    chars: function(chars){\r\n        if (!ignore) {\r\n          out(encodeEntities(chars));\r\n        }\r\n      }\r\n  };\r\n}\r\n\r\n\r\n// define ngSanitize module and register $sanitize service\r\nangular.module('ngSanitize', []).value('$sanitize', $sanitize);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ngSanitize.directive:ngBindHtml\r\n *\r\n * @description\r\n * Creates a binding that will sanitize the result of evaluating the `expression` with the\r\n * {@link ngSanitize.$sanitize $sanitize} service and innerHTML the result into the current element.\r\n *\r\n * See {@link ngSanitize.$sanitize $sanitize} docs for examples.\r\n *\r\n * @element ANY\r\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\r\n */\r\nangular.module('ngSanitize').directive('ngBindHtml', ['$sanitize', function($sanitize) {\r\n  return function(scope, element, attr) {\r\n    element.addClass('ng-binding').data('$binding', attr.ngBindHtml);\r\n    scope.$watch(attr.ngBindHtml, function(value) {\r\n      value = $sanitize(value);\r\n      element.html(value || '');\r\n    });\r\n  };\r\n}]);\r\n/**\r\n * @ngdoc filter\r\n * @name ngSanitize.filter:linky\r\n * @function\r\n *\r\n * @description\r\n *   Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and\r\n *   plain email address links.\r\n *\r\n * @param {string} text Input text.\r\n * @returns {string} Html-linkified text.\r\n *\r\n * @example\r\n   <doc:example module=\"ngSanitize\">\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.snippet =\r\n             'Pretty text with some links:\\n'+\r\n             'http://angularjs.org/,\\n'+\r\n             'mailto:us@somewhere.org,\\n'+\r\n             'another@somewhere.org,\\n'+\r\n             'and one more: ftp://127.0.0.1/.';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n       Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\r\n       <table>\r\n         <tr>\r\n           <td>Filter</td>\r\n           <td>Source</td>\r\n           <td>Rendered</td>\r\n         </tr>\r\n         <tr id=\"linky-filter\">\r\n           <td>linky filter</td>\r\n           <td>\r\n             <pre>&lt;div ng-bind-html=\"snippet | linky\"&gt;<br>&lt;/div&gt;</pre>\r\n           </td>\r\n           <td>\r\n             <div ng-bind-html=\"snippet | linky\"></div>\r\n           </td>\r\n         </tr>\r\n         <tr id=\"escaped-html\">\r\n           <td>no filter</td>\r\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br>&lt;/div&gt;</pre></td>\r\n           <td><div ng-bind=\"snippet\"></div></td>\r\n         </tr>\r\n       </table>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should linkify the snippet with urls', function() {\r\n         expect(using('#linky-filter').binding('snippet | linky')).\r\n           toBe('Pretty text with some links:&#10;' +\r\n                '<a href=\"http://angularjs.org/\">http://angularjs.org/</a>,&#10;' +\r\n                '<a href=\"mailto:us@somewhere.org\">us@somewhere.org</a>,&#10;' +\r\n                '<a href=\"mailto:another@somewhere.org\">another@somewhere.org</a>,&#10;' +\r\n                'and one more: <a href=\"ftp://127.0.0.1/\">ftp://127.0.0.1/</a>.');\r\n       });\r\n\r\n       it ('should not linkify snippet without the linky filter', function() {\r\n         expect(using('#escaped-html').binding('snippet')).\r\n           toBe(\"Pretty text with some links:\\n\" +\r\n                \"http://angularjs.org/,\\n\" +\r\n                \"mailto:us@somewhere.org,\\n\" +\r\n                \"another@somewhere.org,\\n\" +\r\n                \"and one more: ftp://127.0.0.1/.\");\r\n       });\r\n\r\n       it('should update', function() {\r\n         input('snippet').enter('new http://link.');\r\n         expect(using('#linky-filter').binding('snippet | linky')).\r\n           toBe('new <a href=\"http://link\">http://link</a>.');\r\n         expect(using('#escaped-html').binding('snippet')).toBe('new http://link.');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nangular.module('ngSanitize').filter('linky', function() {\r\n  var LINKY_URL_REGEXP = /((ftp|https?):\\/\\/|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s\\.\\;\\,\\(\\)\\{\\}\\<\\>]/,\r\n      MAILTO_REGEXP = /^mailto:/;\r\n\r\n  return function(text) {\r\n    if (!text) return text;\r\n    var match;\r\n    var raw = text;\r\n    var html = [];\r\n    // TODO(vojta): use $sanitize instead\r\n    var writer = htmlSanitizeWriter(html);\r\n    var url;\r\n    var i;\r\n    while ((match = raw.match(LINKY_URL_REGEXP))) {\r\n      // We can not end in these as they are sometimes found at the end of the sentence\r\n      url = match[0];\r\n      // if we did not match ftp/http/mailto then assume mailto\r\n      if (match[2] == match[3]) url = 'mailto:' + url;\r\n      i = match.index;\r\n      writer.chars(raw.substr(0, i));\r\n      writer.start('a', {href:url});\r\n      writer.chars(match[0].replace(MAILTO_REGEXP, ''));\r\n      writer.end('a');\r\n      raw = raw.substring(i + match[0].length);\r\n    }\r\n    writer.chars(raw);\r\n    return html.join('');\r\n  };\r\n});\r\n\r\n})(window, window.angular);"
  },
  {
    "path": "servers/www/assets/js/vendor/angular-ui.js",
    "content": "/**\r\n * AngularUI for AngularJS\r\n * v0.1.0\r\n * \r\n * @link http://angular-ui.github.com/\r\n */\r\n\r\nangular.module('ui.config', []).value('ui.config', {});\r\nangular.module('ui.filters', ['ui.config']);\r\nangular.module('ui.directives', ['ui.config']);\r\nangular.module('ui', [\r\n  'ui.filters', \r\n  'ui.directives',\r\n  'ui.config'\r\n]);\r\n\r\nangular.module('ui.directives').directive('uiKeypress', ['$parse', function ($parse) {\r\n  return {\r\n    link: function (scope, elm, attrs) {\r\n      var keysByCode = {\r\n        8: 'backspace',\r\n        9: 'tab',\r\n        13: 'enter',\r\n        27: 'esc',\r\n        32: 'space',\r\n        33: 'pageup',\r\n        34: 'pagedown',\r\n        35: 'end',\r\n        36: 'home',\r\n        37: 'left',\r\n        38: 'up',\r\n        39: 'right',\r\n        40: 'down',\r\n        45: 'insert',\r\n        46: 'delete'\r\n      };\r\n\r\n      var params, paramsParsed, expression, keys, combinations = [];\r\n      try {\r\n        params = scope.$eval(attrs.uiKeypress);\r\n        paramsParsed = true;\r\n      } catch (error) {\r\n        params = attrs.uiKeypress.split(/\\s+and\\s+/i);\r\n        paramsParsed = false;\r\n      }\r\n\r\n      // Prepare combinations for simple checking\r\n      angular.forEach(params, function (v, k) {\r\n        var combination = {};\r\n        if (paramsParsed) {\r\n          // An object passed\r\n          combination.expression = $parse(v);\r\n          combination.keys = k;\r\n        } else {\r\n          // A string passed\r\n          v = v.split(/\\s+on\\s+/i);\r\n          combination.expression = $parse(v[0]);\r\n          combination.keys = v[1];\r\n        }\r\n\r\n        keys = {};\r\n        angular.forEach(combination.keys.split('-'), function (value) {\r\n          keys[value] = true;\r\n        });\r\n        combination.keys = keys;\r\n        combinations.push(combination);\r\n      });\r\n\r\n      // Check only mathcing of pressed keys one of the conditions\r\n      elm.bind('keydown', function (event) {\r\n        // No need to do that inside the cycle\r\n        var altPressed = event.metaKey || event.altKey;\r\n        var ctrlPressed = event.ctrlKey;\r\n        var shiftPressed = event.shiftKey;\r\n\r\n        // Iterate over prepared combinations\r\n        angular.forEach(combinations, function (combination) {\r\n\r\n          var mainKeyPressed = (combination.keys[keysByCode[event.keyCode]] || combination.keys[event.keyCode.toString()]) || false;\r\n\r\n          var altRequired = combination.keys.alt || false;\r\n          var ctrlRequired = combination.keys.ctrl || false;\r\n          var shiftRequired = combination.keys.shift || false;\r\n\r\n          if (mainKeyPressed &&\r\n            ( altRequired == altPressed   ) &&\r\n            ( ctrlRequired == ctrlPressed  ) &&\r\n            ( shiftRequired == shiftPressed )\r\n            ) {\r\n            // Run the function\r\n            scope.$apply(function () {\r\n              combination.expression(scope, { '$event': event });\r\n            });\r\n          }\r\n        });\r\n      });\r\n    }\r\n  };\r\n}]);\r\nangular.module('ui.directives').directive('uiSelect2', ['ui.config', '$http', function (uiConfig, $http) {\r\n  var options = {};\r\n  if (uiConfig.select2) {\r\n    angular.extend(options, uiConfig.select2);\r\n  }\r\n  return {\r\n    require: '?ngModel',\r\n    compile: function (tElm, tAttrs) {\r\n      var watch,\r\n        repeatOption,\r\n        isSelect = tElm.is('select'),\r\n        isMultiple = (tAttrs.multiple !== undefined);\r\n\r\n      // Enable watching of the options dataset if in use\r\n      if (isSelect) {\r\n        repeatOption = tElm.find('option[ng-repeat]');\r\n        if (repeatOption.length) {\r\n          watch = repeatOption.attr('ng-repeat').split(' ').pop();\r\n        }\r\n      }\r\n\r\n      return function (scope, elm, attrs, controller) {\r\n        // instance-specific options\r\n        var opts = angular.extend({}, options, scope.$eval(attrs.uiSelect2));\r\n\r\n        if (isSelect) {\r\n          // Use <select multiple> instead\r\n          delete opts.multiple;\r\n          delete opts.initSelection;\r\n        } else if (isMultiple) {\r\n          opts.multiple = true;\r\n        }\r\n\r\n        if (controller) {\r\n          // Watch the model for programmatic changes\r\n          controller.$render = function () {\r\n            if (isSelect) {\r\n              elm.select2('val', controller.$modelValue);\r\n            } else {\r\n              if (isMultiple && !controller.$modelValue) {\r\n                elm.select2('data', []);\r\n              } else {\r\n                var items = [];\r\n                \r\n                angular.forEach(controller.$modelValue, function(item) {\r\n                  items.push({id: item, text: item});\r\n                });\r\n                \r\n                elm.select2('data', items);\r\n              }\r\n            }\r\n          };\r\n\r\n\r\n          // Watch the options dataset for changes\r\n          if (watch) {\r\n            scope.$watch(watch, function (newVal, oldVal, scope) {\r\n              if (!newVal) return;\r\n              // Delayed so that the options have time to be rendered\r\n              setTimeout(function () {\r\n                elm.select2('val', controller.$viewValue);\r\n                // Refresh angular to remove the superfluous option\r\n                elm.trigger('change');\r\n              });\r\n            });\r\n          }\r\n\r\n          if (!isSelect) {\r\n            // Set the view and model value and update the angular template manually for the ajax/multiple select2.\r\n            elm.bind(\"change\", function () {\r\n              scope.$apply(function () {\r\n                controller.$setViewValue(elm.select2('data'));\r\n              });\r\n            });\r\n\r\n            if (opts.initSelection) {\r\n              var initSelection = opts.initSelection;\r\n              opts.initSelection = function (element, callback) {\r\n                initSelection(element, function (value) {\r\n                  console.log(\"Initial bvalue\", value);\r\n                  controller.$setViewValue(value);\r\n                  callback(value);\r\n                });\r\n              };\r\n            }\r\n          }\r\n        }\r\n\r\n        attrs.$observe('disabled', function (value) {\r\n          elm.select2(value && 'disable' || 'enable');\r\n        });\r\n\r\n        // Set initial value since Angular doesn't\r\n        elm.val(scope.$eval(attrs.ngModel));\r\n\r\n        // Initialize the plugin late so that the injected DOM does not disrupt the template compiler\r\n        setTimeout(function () {\r\n          elm.select2(opts);\r\n        });\r\n      };\r\n    }\r\n  };\r\n}]);"
  },
  {
    "path": "servers/www/assets/js/vendor/angular.js",
    "content": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, document, undefined) {\r\n'use strict';\r\n\r\n////////////////////////////////////\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.lowercase\r\n * @function\r\n *\r\n * @description Converts the specified string to lowercase.\r\n * @param {string} string String to be converted to lowercase.\r\n * @returns {string} Lowercased string.\r\n */\r\nvar lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.uppercase\r\n * @function\r\n *\r\n * @description Converts the specified string to uppercase.\r\n * @param {string} string String to be converted to uppercase.\r\n * @returns {string} Uppercased string.\r\n */\r\nvar uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};\r\n\r\n\r\nvar manualLowercase = function(s) {\r\n  return isString(s)\r\n      ? s.replace(/[A-Z]/g, function(ch) {return fromCharCode(ch.charCodeAt(0) | 32);})\r\n      : s;\r\n};\r\nvar manualUppercase = function(s) {\r\n  return isString(s)\r\n      ? s.replace(/[a-z]/g, function(ch) {return fromCharCode(ch.charCodeAt(0) & ~32);})\r\n      : s;\r\n};\r\n\r\n\r\n// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\r\n// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\r\n// with correct but slower alternatives.\r\nif ('i' !== 'I'.toLowerCase()) {\r\n  lowercase = manualLowercase;\r\n  uppercase = manualUppercase;\r\n}\r\n\r\nfunction fromCharCode(code) {return String.fromCharCode(code);}\r\n\r\n\r\nvar Error             = window.Error,\r\n    /** holds major version number for IE or NaN for real browsers */\r\n    msie              = int((/msie (\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]),\r\n    jqLite,           // delay binding since jQuery could be loaded after us.\r\n    jQuery,           // delay binding\r\n    slice             = [].slice,\r\n    push              = [].push,\r\n    toString          = Object.prototype.toString,\r\n\r\n    /** @name angular */\r\n    angular           = window.angular || (window.angular = {}),\r\n    angularModule,\r\n    nodeName_,\r\n    uid               = ['0', '0', '0'];\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.forEach\r\n * @function\r\n *\r\n * @description\r\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\r\n * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`\r\n * is the value of an object property or an array element and `key` is the object property key or\r\n * array element index. Specifying a `context` for the function is optional.\r\n *\r\n * Note: this function was previously known as `angular.foreach`.\r\n *\r\n   <pre>\r\n     var values = {name: 'misko', gender: 'male'};\r\n     var log = [];\r\n     angular.forEach(values, function(value, key){\r\n       this.push(key + ': ' + value);\r\n     }, log);\r\n     expect(log).toEqual(['name: misko', 'gender:male']);\r\n   </pre>\r\n *\r\n * @param {Object|Array} obj Object to iterate over.\r\n * @param {Function} iterator Iterator function.\r\n * @param {Object=} context Object to become context (`this`) for the iterator function.\r\n * @returns {Object|Array} Reference to `obj`.\r\n */\r\nfunction forEach(obj, iterator, context) {\r\n  var key;\r\n  if (obj) {\r\n    if (isFunction(obj)){\r\n      for (key in obj) {\r\n        if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) {\r\n          iterator.call(context, obj[key], key);\r\n        }\r\n      }\r\n    } else if (obj.forEach && obj.forEach !== forEach) {\r\n      obj.forEach(iterator, context);\r\n    } else if (isObject(obj) && isNumber(obj.length)) {\r\n      for (key = 0; key < obj.length; key++)\r\n        iterator.call(context, obj[key], key);\r\n    } else {\r\n      for (key in obj) {\r\n        if (obj.hasOwnProperty(key)) {\r\n          iterator.call(context, obj[key], key);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return obj;\r\n}\r\n\r\nfunction sortedKeys(obj) {\r\n  var keys = [];\r\n  for (var key in obj) {\r\n    if (obj.hasOwnProperty(key)) {\r\n      keys.push(key);\r\n    }\r\n  }\r\n  return keys.sort();\r\n}\r\n\r\nfunction forEachSorted(obj, iterator, context) {\r\n  var keys = sortedKeys(obj);\r\n  for ( var i = 0; i < keys.length; i++) {\r\n    iterator.call(context, obj[keys[i]], keys[i]);\r\n  }\r\n  return keys;\r\n}\r\n\r\n\r\n/**\r\n * when using forEach the params are value, key, but it is often useful to have key, value.\r\n * @param {function(string, *)} iteratorFn\r\n * @returns {function(*, string)}\r\n */\r\nfunction reverseParams(iteratorFn) {\r\n  return function(value, key) { iteratorFn(key, value) };\r\n}\r\n\r\n/**\r\n * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\r\n * characters such as '012ABC'. The reason why we are not using simply a number counter is that\r\n * the number string gets longer over time, and it can also overflow, where as the the nextId\r\n * will grow much slower, it is a string, and it will never overflow.\r\n *\r\n * @returns an unique alpha-numeric string\r\n */\r\nfunction nextUid() {\r\n  var index = uid.length;\r\n  var digit;\r\n\r\n  while(index) {\r\n    index--;\r\n    digit = uid[index].charCodeAt(0);\r\n    if (digit == 57 /*'9'*/) {\r\n      uid[index] = 'A';\r\n      return uid.join('');\r\n    }\r\n    if (digit == 90  /*'Z'*/) {\r\n      uid[index] = '0';\r\n    } else {\r\n      uid[index] = String.fromCharCode(digit + 1);\r\n      return uid.join('');\r\n    }\r\n  }\r\n  uid.unshift('0');\r\n  return uid.join('');\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.extend\r\n * @function\r\n *\r\n * @description\r\n * Extends the destination object `dst` by copying all of the properties from the `src` object(s)\r\n * to `dst`. You can specify multiple `src` objects.\r\n *\r\n * @param {Object} dst Destination object.\r\n * @param {...Object} src Source object(s).\r\n */\r\nfunction extend(dst) {\r\n  forEach(arguments, function(obj){\r\n    if (obj !== dst) {\r\n      forEach(obj, function(value, key){\r\n        dst[key] = value;\r\n      });\r\n    }\r\n  });\r\n  return dst;\r\n}\r\n\r\nfunction int(str) {\r\n  return parseInt(str, 10);\r\n}\r\n\r\n\r\nfunction inherit(parent, extra) {\r\n  return extend(new (extend(function() {}, {prototype:parent}))(), extra);\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.noop\r\n * @function\r\n *\r\n * @description\r\n * A function that performs no operations. This function can be useful when writing code in the\r\n * functional style.\r\n   <pre>\r\n     function foo(callback) {\r\n       var result = calculateResult();\r\n       (callback || angular.noop)(result);\r\n     }\r\n   </pre>\r\n */\r\nfunction noop() {}\r\nnoop.$inject = [];\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.identity\r\n * @function\r\n *\r\n * @description\r\n * A function that returns its first argument. This function is useful when writing code in the\r\n * functional style.\r\n *\r\n   <pre>\r\n     function transformer(transformationFn, value) {\r\n       return (transformationFn || identity)(value);\r\n     };\r\n   </pre>\r\n */\r\nfunction identity($) {return $;}\r\nidentity.$inject = [];\r\n\r\n\r\nfunction valueFn(value) {return function() {return value;};}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isUndefined\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is undefined.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is undefined.\r\n */\r\nfunction isUndefined(value){return typeof value == 'undefined';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isDefined\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is defined.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is defined.\r\n */\r\nfunction isDefined(value){return typeof value != 'undefined';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isObject\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\r\n * considered to be objects.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is an `Object` but not `null`.\r\n */\r\nfunction isObject(value){return value != null && typeof value == 'object';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isString\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a `String`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `String`.\r\n */\r\nfunction isString(value){return typeof value == 'string';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isNumber\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a `Number`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `Number`.\r\n */\r\nfunction isNumber(value){return typeof value == 'number';}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isDate\r\n * @function\r\n *\r\n * @description\r\n * Determines if a value is a date.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `Date`.\r\n */\r\nfunction isDate(value){\r\n  return toString.apply(value) == '[object Date]';\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isArray\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is an `Array`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is an `Array`.\r\n */\r\nfunction isArray(value) {\r\n  return toString.apply(value) == '[object Array]';\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isFunction\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a `Function`.\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a `Function`.\r\n */\r\nfunction isFunction(value){return typeof value == 'function';}\r\n\r\n\r\n/**\r\n * Checks if `obj` is a window object.\r\n *\r\n * @private\r\n * @param {*} obj Object to check\r\n * @returns {boolean} True if `obj` is a window obj.\r\n */\r\nfunction isWindow(obj) {\r\n  return obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n}\r\n\r\n\r\nfunction isScope(obj) {\r\n  return obj && obj.$evalAsync && obj.$watch;\r\n}\r\n\r\n\r\nfunction isFile(obj) {\r\n  return toString.apply(obj) === '[object File]';\r\n}\r\n\r\n\r\nfunction isBoolean(value) {\r\n  return typeof value == 'boolean';\r\n}\r\n\r\n\r\nfunction trim(value) {\r\n  return isString(value) ? value.replace(/^\\s*/, '').replace(/\\s*$/, '') : value;\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.isElement\r\n * @function\r\n *\r\n * @description\r\n * Determines if a reference is a DOM element (or wrapped jQuery element).\r\n *\r\n * @param {*} value Reference to check.\r\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\r\n */\r\nfunction isElement(node) {\r\n  return node &&\r\n    (node.nodeName  // we are a direct element\r\n    || (node.bind && node.find));  // we have a bind and find method part of jQuery API\r\n}\r\n\r\n/**\r\n * @param str 'key1,key2,...'\r\n * @returns {object} in the form of {key1:true, key2:true, ...}\r\n */\r\nfunction makeMap(str){\r\n  var obj = {}, items = str.split(\",\"), i;\r\n  for ( i = 0; i < items.length; i++ )\r\n    obj[ items[i] ] = true;\r\n  return obj;\r\n}\r\n\r\n\r\nif (msie < 9) {\r\n  nodeName_ = function(element) {\r\n    element = element.nodeName ? element : element[0];\r\n    return (element.scopeName && element.scopeName != 'HTML')\r\n      ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;\r\n  };\r\n} else {\r\n  nodeName_ = function(element) {\r\n    return element.nodeName ? element.nodeName : element[0].nodeName;\r\n  };\r\n}\r\n\r\n\r\nfunction map(obj, iterator, context) {\r\n  var results = [];\r\n  forEach(obj, function(value, index, list) {\r\n    results.push(iterator.call(context, value, index, list));\r\n  });\r\n  return results;\r\n}\r\n\r\n\r\n/**\r\n * @description\r\n * Determines the number of elements in an array, the number of properties an object has, or\r\n * the length of a string.\r\n *\r\n * Note: This function is used to augment the Object type in Angular expressions. See\r\n * {@link angular.Object} for more information about Angular arrays.\r\n *\r\n * @param {Object|Array|string} obj Object, array, or string to inspect.\r\n * @param {boolean} [ownPropsOnly=false] Count only \"own\" properties in an object\r\n * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.\r\n */\r\nfunction size(obj, ownPropsOnly) {\r\n  var size = 0, key;\r\n\r\n  if (isArray(obj) || isString(obj)) {\r\n    return obj.length;\r\n  } else if (isObject(obj)){\r\n    for (key in obj)\r\n      if (!ownPropsOnly || obj.hasOwnProperty(key))\r\n        size++;\r\n  }\r\n\r\n  return size;\r\n}\r\n\r\n\r\nfunction includes(array, obj) {\r\n  return indexOf(array, obj) != -1;\r\n}\r\n\r\nfunction indexOf(array, obj) {\r\n  if (array.indexOf) return array.indexOf(obj);\r\n\r\n  for ( var i = 0; i < array.length; i++) {\r\n    if (obj === array[i]) return i;\r\n  }\r\n  return -1;\r\n}\r\n\r\nfunction arrayRemove(array, value) {\r\n  var index = indexOf(array, value);\r\n  if (index >=0)\r\n    array.splice(index, 1);\r\n  return value;\r\n}\r\n\r\nfunction isLeafNode (node) {\r\n  if (node) {\r\n    switch (node.nodeName) {\r\n    case \"OPTION\":\r\n    case \"PRE\":\r\n    case \"TITLE\":\r\n      return true;\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.copy\r\n * @function\r\n *\r\n * @description\r\n * Creates a deep copy of `source`, which should be an object or an array.\r\n *\r\n * * If no destination is supplied, a copy of the object or array is created.\r\n * * If a destination is provided, all of its elements (for array) or properties (for objects)\r\n *   are deleted and then all elements/properties from the source are copied to it.\r\n * * If  `source` is not an object or array, `source` is returned.\r\n *\r\n * Note: this function is used to augment the Object type in Angular expressions. See\r\n * {@link ng.$filter} for more information about Angular arrays.\r\n *\r\n * @param {*} source The source that will be used to make a copy.\r\n *                   Can be any type, including primitives, `null`, and `undefined`.\r\n * @param {(Object|Array)=} destination Destination into which the source is copied. If\r\n *     provided, must be of the same type as `source`.\r\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\r\n */\r\nfunction copy(source, destination){\r\n  if (isWindow(source) || isScope(source)) throw Error(\"Can't copy Window or Scope\");\r\n  if (!destination) {\r\n    destination = source;\r\n    if (source) {\r\n      if (isArray(source)) {\r\n        destination = copy(source, []);\r\n      } else if (isDate(source)) {\r\n        destination = new Date(source.getTime());\r\n      } else if (isObject(source)) {\r\n        destination = copy(source, {});\r\n      }\r\n    }\r\n  } else {\r\n    if (source === destination) throw Error(\"Can't copy equivalent objects or arrays\");\r\n    if (isArray(source)) {\r\n      while(destination.length) {\r\n        destination.pop();\r\n      }\r\n      for ( var i = 0; i < source.length; i++) {\r\n        destination.push(copy(source[i]));\r\n      }\r\n    } else {\r\n      forEach(destination, function(value, key){\r\n        delete destination[key];\r\n      });\r\n      for ( var key in source) {\r\n        destination[key] = copy(source[key]);\r\n      }\r\n    }\r\n  }\r\n  return destination;\r\n}\r\n\r\n/**\r\n * Create a shallow copy of an object\r\n */\r\nfunction shallowCopy(src, dst) {\r\n  dst = dst || {};\r\n\r\n  for(var key in src) {\r\n    if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') {\r\n      dst[key] = src[key];\r\n    }\r\n  }\r\n\r\n  return dst;\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.equals\r\n * @function\r\n *\r\n * @description\r\n * Determines if two objects or two values are equivalent. Supports value types, arrays and\r\n * objects.\r\n *\r\n * Two objects or values are considered equivalent if at least one of the following is true:\r\n *\r\n * * Both objects or values pass `===` comparison.\r\n * * Both objects or values are of the same type and all of their properties pass `===` comparison.\r\n * * Both values are NaN. (In JavasScript, NaN == NaN => false. But we consider two NaN as equal)\r\n *\r\n * During a property comparision, properties of `function` type and properties with names\r\n * that begin with `$` are ignored.\r\n *\r\n * Scope and DOMWindow objects are being compared only be identify (`===`).\r\n *\r\n * @param {*} o1 Object or value to compare.\r\n * @param {*} o2 Object or value to compare.\r\n * @returns {boolean} True if arguments are equal.\r\n */\r\nfunction equals(o1, o2) {\r\n  if (o1 === o2) return true;\r\n  if (o1 === null || o2 === null) return false;\r\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\r\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\r\n  if (t1 == t2) {\r\n    if (t1 == 'object') {\r\n      if (isArray(o1)) {\r\n        if ((length = o1.length) == o2.length) {\r\n          for(key=0; key<length; key++) {\r\n            if (!equals(o1[key], o2[key])) return false;\r\n          }\r\n          return true;\r\n        }\r\n      } else if (isDate(o1)) {\r\n        return isDate(o2) && o1.getTime() == o2.getTime();\r\n      } else {\r\n        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2)) return false;\r\n        keySet = {};\r\n        for(key in o1) {\r\n          if (key.charAt(0) !== '$' && !isFunction(o1[key]) && !equals(o1[key], o2[key])) {\r\n            return false;\r\n          }\r\n          keySet[key] = true;\r\n        }\r\n        for(key in o2) {\r\n          if (!keySet[key] && key.charAt(0) !== '$' && !isFunction(o2[key])) return false;\r\n        }\r\n        return true;\r\n      }\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n\r\nfunction concat(array1, array2, index) {\r\n  return array1.concat(slice.call(array2, index));\r\n}\r\n\r\nfunction sliceArgs(args, startIndex) {\r\n  return slice.call(args, startIndex || 0);\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.bind\r\n * @function\r\n *\r\n * @description\r\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\r\n * `fn`). You can supply optional `args` that are are prebound to the function. This feature is also\r\n * known as [function currying](http://en.wikipedia.org/wiki/Currying).\r\n *\r\n * @param {Object} self Context which `fn` should be evaluated in.\r\n * @param {function()} fn Function to be bound.\r\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\r\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\r\n */\r\nfunction bind(self, fn) {\r\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\r\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\r\n    return curryArgs.length\r\n      ? function() {\r\n          return arguments.length\r\n            ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))\r\n            : fn.apply(self, curryArgs);\r\n        }\r\n      : function() {\r\n          return arguments.length\r\n            ? fn.apply(self, arguments)\r\n            : fn.call(self);\r\n        };\r\n  } else {\r\n    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)\r\n    return fn;\r\n  }\r\n}\r\n\r\n\r\nfunction toJsonReplacer(key, value) {\r\n  var val = value;\r\n\r\n  if (/^\\$+/.test(key)) {\r\n    val = undefined;\r\n  } else if (isWindow(value)) {\r\n    val = '$WINDOW';\r\n  } else if (value &&  document === value) {\r\n    val = '$DOCUMENT';\r\n  } else if (isScope(value)) {\r\n    val = '$SCOPE';\r\n  }\r\n\r\n  return val;\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.toJson\r\n * @function\r\n *\r\n * @description\r\n * Serializes input into a JSON-formatted string.\r\n *\r\n * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.\r\n * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.\r\n * @returns {string} Jsonified string representing `obj`.\r\n */\r\nfunction toJson(obj, pretty) {\r\n  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.fromJson\r\n * @function\r\n *\r\n * @description\r\n * Deserializes a JSON string.\r\n *\r\n * @param {string} json JSON string to deserialize.\r\n * @returns {Object|Array|Date|string|number} Deserialized thingy.\r\n */\r\nfunction fromJson(json) {\r\n  return isString(json)\r\n      ? JSON.parse(json)\r\n      : json;\r\n}\r\n\r\n\r\nfunction toBoolean(value) {\r\n  if (value && value.length !== 0) {\r\n    var v = lowercase(\"\" + value);\r\n    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');\r\n  } else {\r\n    value = false;\r\n  }\r\n  return value;\r\n}\r\n\r\n/**\r\n * @returns {string} Returns the string representation of the element.\r\n */\r\nfunction startingTag(element) {\r\n  element = jqLite(element).clone();\r\n  try {\r\n    // turns out IE does not let you set .html() on elements which\r\n    // are not allowed to have children. So we just ignore it.\r\n    element.html('');\r\n  } catch(e) {}\r\n  return jqLite('<div>').append(element).html().\r\n      match(/^(<[^>]+>)/)[1].\r\n      replace(/^<([\\w\\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });\r\n}\r\n\r\n\r\n/////////////////////////////////////////////////\r\n\r\n/**\r\n * Parses an escaped url query string into key-value pairs.\r\n * @returns Object.<(string|boolean)>\r\n */\r\nfunction parseKeyValue(/**string*/keyValue) {\r\n  var obj = {}, key_value, key;\r\n  forEach((keyValue || \"\").split('&'), function(keyValue){\r\n    if (keyValue) {\r\n      key_value = keyValue.split('=');\r\n      key = decodeURIComponent(key_value[0]);\r\n      obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true;\r\n    }\r\n  });\r\n  return obj;\r\n}\r\n\r\nfunction toKeyValue(obj) {\r\n  var parts = [];\r\n  forEach(obj, function(value, key) {\r\n    parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true)));\r\n  });\r\n  return parts.length ? parts.join('&') : '';\r\n}\r\n\r\n\r\n/**\r\n * We need our custom mehtod because encodeURIComponent is too agressive and doesn't follow\r\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\r\n * segments:\r\n *    segment       = *pchar\r\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\r\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n */\r\nfunction encodeUriSegment(val) {\r\n  return encodeUriQuery(val, true).\r\n             replace(/%26/gi, '&').\r\n             replace(/%3D/gi, '=').\r\n             replace(/%2B/gi, '+');\r\n}\r\n\r\n\r\n/**\r\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\r\n * method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be\r\n * encoded per http://tools.ietf.org/html/rfc3986:\r\n *    query       = *( pchar / \"/\" / \"?\" )\r\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\r\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n */\r\nfunction encodeUriQuery(val, pctEncodeSpaces) {\r\n  return encodeURIComponent(val).\r\n             replace(/%40/gi, '@').\r\n             replace(/%3A/gi, ':').\r\n             replace(/%24/g, '$').\r\n             replace(/%2C/gi, ',').\r\n             replace((pctEncodeSpaces ? null : /%20/g), '+');\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngApp\r\n *\r\n * @element ANY\r\n * @param {angular.Module} ngApp on optional application\r\n *   {@link angular.module module} name to load.\r\n *\r\n * @description\r\n *\r\n * Use this directive to auto-bootstrap on application. Only\r\n * one directive can be used per HTML document. The directive\r\n * designates the root of the application and is typically placed\r\n * ot the root of the page.\r\n *\r\n * In the example below if the `ngApp` directive would not be placed\r\n * on the `html` element then the document would not be compiled\r\n * and the `{{ 1+2 }}` would not be resolved to `3`.\r\n *\r\n * `ngApp` is the easiest way to bootstrap an application.\r\n *\r\n <doc:example>\r\n   <doc:source>\r\n    I can add: 1 + 2 =  {{ 1+2 }}\r\n   </doc:source>\r\n </doc:example>\r\n *\r\n */\r\nfunction angularInit(element, bootstrap) {\r\n  var elements = [element],\r\n      appElement,\r\n      module,\r\n      names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],\r\n      NG_APP_CLASS_REGEXP = /\\sng[:\\-]app(:\\s*([\\w\\d_]+);?)?\\s/;\r\n\r\n  function append(element) {\r\n    element && elements.push(element);\r\n  }\r\n\r\n  forEach(names, function(name) {\r\n    names[name] = true;\r\n    append(document.getElementById(name));\r\n    name = name.replace(':', '\\\\:');\r\n    if (element.querySelectorAll) {\r\n      forEach(element.querySelectorAll('.' + name), append);\r\n      forEach(element.querySelectorAll('.' + name + '\\\\:'), append);\r\n      forEach(element.querySelectorAll('[' + name + ']'), append);\r\n    }\r\n  });\r\n\r\n  forEach(elements, function(element) {\r\n    if (!appElement) {\r\n      var className = ' ' + element.className + ' ';\r\n      var match = NG_APP_CLASS_REGEXP.exec(className);\r\n      if (match) {\r\n        appElement = element;\r\n        module = (match[2] || '').replace(/\\s+/g, ',');\r\n      } else {\r\n        forEach(element.attributes, function(attr) {\r\n          if (!appElement && names[attr.name]) {\r\n            appElement = element;\r\n            module = attr.value;\r\n          }\r\n        });\r\n      }\r\n    }\r\n  });\r\n  if (appElement) {\r\n    bootstrap(appElement, module ? [module] : []);\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.bootstrap\r\n * @description\r\n * Use this function to manually start up angular application.\r\n *\r\n * See: {@link guide/bootstrap Bootstrap}\r\n *\r\n * @param {Element} element DOM element which is the root of angular application.\r\n * @param {Array<String|Function>=} modules an array of module declarations. See: {@link angular.module modules}\r\n * @returns {AUTO.$injector} Returns the newly created injector for this app.\r\n */\r\nfunction bootstrap(element, modules) {\r\n  element = jqLite(element);\r\n  modules = modules || [];\r\n  modules.unshift(['$provide', function($provide) {\r\n    $provide.value('$rootElement', element);\r\n  }]);\r\n  modules.unshift('ng');\r\n  var injector = createInjector(modules);\r\n  injector.invoke(\r\n    ['$rootScope', '$rootElement', '$compile', '$injector', function(scope, element, compile, injector){\r\n      scope.$apply(function() {\r\n        element.data('$injector', injector);\r\n        compile(element)(scope);\r\n      });\r\n    }]\r\n  );\r\n  return injector;\r\n}\r\n\r\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\r\nfunction snake_case(name, separator){\r\n  separator = separator || '_';\r\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\r\n    return (pos ? separator : '') + letter.toLowerCase();\r\n  });\r\n}\r\n\r\nfunction bindJQuery() {\r\n  // bind to jQuery if present;\r\n  jQuery = window.jQuery;\r\n  // reset to jQuery or default to us.\r\n  if (jQuery) {\r\n    jqLite = jQuery;\r\n    extend(jQuery.fn, {\r\n      scope: JQLitePrototype.scope,\r\n      controller: JQLitePrototype.controller,\r\n      injector: JQLitePrototype.injector,\r\n      inheritedData: JQLitePrototype.inheritedData\r\n    });\r\n    JQLitePatchJQueryRemove('remove', true);\r\n    JQLitePatchJQueryRemove('empty');\r\n    JQLitePatchJQueryRemove('html');\r\n  } else {\r\n    jqLite = JQLite;\r\n  }\r\n  angular.element = jqLite;\r\n}\r\n\r\n/**\r\n * throw error of the argument is falsy.\r\n */\r\nfunction assertArg(arg, name, reason) {\r\n  if (!arg) {\r\n    throw new Error(\"Argument '\" + (name || '?') + \"' is \" + (reason || \"required\"));\r\n  }\r\n  return arg;\r\n}\r\n\r\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\r\n  if (acceptArrayAnnotation && isArray(arg)) {\r\n      arg = arg[arg.length - 1];\r\n  }\r\n\r\n  assertArg(isFunction(arg), name, 'not a function, got ' +\r\n      (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg));\r\n  return arg;\r\n}\r\n\r\n/**\r\n * @ngdoc interface\r\n * @name angular.Module\r\n * @description\r\n *\r\n * Interface for configuring angular {@link angular.module modules}.\r\n */\r\n\r\nfunction setupModuleLoader(window) {\r\n\r\n  function ensure(obj, name, factory) {\r\n    return obj[name] || (obj[name] = factory());\r\n  }\r\n\r\n  return ensure(ensure(window, 'angular', Object), 'module', function() {\r\n    /** @type {Object.<string, angular.Module>} */\r\n    var modules = {};\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name angular.module\r\n     * @description\r\n     *\r\n     * The `angular.module` is a global place for creating and registering Angular modules. All\r\n     * modules (angular core or 3rd party) that should be available to an application must be\r\n     * registered using this mechanism.\r\n     *\r\n     *\r\n     * # Module\r\n     *\r\n     * A module is a collocation of services, directives, filters, and configure information. Module\r\n     * is used to configure the {@link AUTO.$injector $injector}.\r\n     *\r\n     * <pre>\r\n     * // Create a new module\r\n     * var myModule = angular.module('myModule', []);\r\n     *\r\n     * // register a new service\r\n     * myModule.value('appName', 'MyCoolApp');\r\n     *\r\n     * // configure existing services inside initialization blocks.\r\n     * myModule.config(function($locationProvider) {\r\n     *   // Configure existing providers\r\n     *   $locationProvider.hashPrefix('!');\r\n     * });\r\n     * </pre>\r\n     *\r\n     * Then you can create an injector and load your modules like this:\r\n     *\r\n     * <pre>\r\n     * var injector = angular.injector(['ng', 'MyModule'])\r\n     * </pre>\r\n     *\r\n     * However it's more likely that you'll just use\r\n     * {@link ng.directive:ngApp ngApp} or\r\n     * {@link angular.bootstrap} to simplify this process for you.\r\n     *\r\n     * @param {!string} name The name of the module to create or retrieve.\r\n     * @param {Array.<string>=} requires If specified then new module is being created. If unspecified then the\r\n     *        the module is being retrieved for further configuration.\r\n     * @param {Function} configFn Option configuration function for the module. Same as\r\n     *        {@link angular.Module#config Module#config()}.\r\n     * @returns {module} new module with the {@link angular.Module} api.\r\n     */\r\n    return function module(name, requires, configFn) {\r\n      if (requires && modules.hasOwnProperty(name)) {\r\n        modules[name] = null;\r\n      }\r\n      return ensure(modules, name, function() {\r\n        if (!requires) {\r\n          throw Error('No module: ' + name);\r\n        }\r\n\r\n        /** @type {!Array.<Array.<*>>} */\r\n        var invokeQueue = [];\r\n\r\n        /** @type {!Array.<Function>} */\r\n        var runBlocks = [];\r\n\r\n        var config = invokeLater('$injector', 'invoke');\r\n\r\n        /** @type {angular.Module} */\r\n        var moduleInstance = {\r\n          // Private state\r\n          _invokeQueue: invokeQueue,\r\n          _runBlocks: runBlocks,\r\n\r\n          /**\r\n           * @ngdoc property\r\n           * @name angular.Module#requires\r\n           * @propertyOf angular.Module\r\n           * @returns {Array.<string>} List of module names which must be loaded before this module.\r\n           * @description\r\n           * Holds the list of modules which the injector will load before the current module is loaded.\r\n           */\r\n          requires: requires,\r\n\r\n          /**\r\n           * @ngdoc property\r\n           * @name angular.Module#name\r\n           * @propertyOf angular.Module\r\n           * @returns {string} Name of the module.\r\n           * @description\r\n           */\r\n          name: name,\r\n\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#provider\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {Function} providerType Construction function for creating new instance of the service.\r\n           * @description\r\n           * See {@link AUTO.$provide#provider $provide.provider()}.\r\n           */\r\n          provider: invokeLater('$provide', 'provider'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#factory\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {Function} providerFunction Function for creating new instance of the service.\r\n           * @description\r\n           * See {@link AUTO.$provide#factory $provide.factory()}.\r\n           */\r\n          factory: invokeLater('$provide', 'factory'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#service\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {Function} constructor A constructor function that will be instantiated.\r\n           * @description\r\n           * See {@link AUTO.$provide#service $provide.service()}.\r\n           */\r\n          service: invokeLater('$provide', 'service'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#value\r\n           * @methodOf angular.Module\r\n           * @param {string} name service name\r\n           * @param {*} object Service instance object.\r\n           * @description\r\n           * See {@link AUTO.$provide#value $provide.value()}.\r\n           */\r\n          value: invokeLater('$provide', 'value'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#constant\r\n           * @methodOf angular.Module\r\n           * @param {string} name constant name\r\n           * @param {*} object Constant value.\r\n           * @description\r\n           * Because the constant are fixed, they get applied before other provide methods.\r\n           * See {@link AUTO.$provide#constant $provide.constant()}.\r\n           */\r\n          constant: invokeLater('$provide', 'constant', 'unshift'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#filter\r\n           * @methodOf angular.Module\r\n           * @param {string} name Filter name.\r\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\r\n           * @description\r\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\r\n           */\r\n          filter: invokeLater('$filterProvider', 'register'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#controller\r\n           * @methodOf angular.Module\r\n           * @param {string} name Controller name.\r\n           * @param {Function} constructor Controller constructor function.\r\n           * @description\r\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\r\n           */\r\n          controller: invokeLater('$controllerProvider', 'register'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#directive\r\n           * @methodOf angular.Module\r\n           * @param {string} name directive name\r\n           * @param {Function} directiveFactory Factory function for creating new instance of\r\n           * directives.\r\n           * @description\r\n           * See {@link ng.$compileProvider.directive $compileProvider.directive()}.\r\n           */\r\n          directive: invokeLater('$compileProvider', 'directive'),\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#config\r\n           * @methodOf angular.Module\r\n           * @param {Function} configFn Execute this function on module load. Useful for service\r\n           *    configuration.\r\n           * @description\r\n           * Use this method to register work which needs to be performed on module loading.\r\n           */\r\n          config: config,\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name angular.Module#run\r\n           * @methodOf angular.Module\r\n           * @param {Function} initializationFn Execute this function after injector creation.\r\n           *    Useful for application initialization.\r\n           * @description\r\n           * Use this method to register work which needs to be performed when the injector with\r\n           * with the current module is finished loading.\r\n           */\r\n          run: function(block) {\r\n            runBlocks.push(block);\r\n            return this;\r\n          }\r\n        };\r\n\r\n        if (configFn) {\r\n          config(configFn);\r\n        }\r\n\r\n        return  moduleInstance;\r\n\r\n        /**\r\n         * @param {string} provider\r\n         * @param {string} method\r\n         * @param {String=} insertMethod\r\n         * @returns {angular.Module}\r\n         */\r\n        function invokeLater(provider, method, insertMethod) {\r\n          return function() {\r\n            invokeQueue[insertMethod || 'push']([provider, method, arguments]);\r\n            return moduleInstance;\r\n          }\r\n        }\r\n      });\r\n    };\r\n  });\r\n\r\n}\r\n\r\n/**\r\n * @ngdoc property\r\n * @name angular.version\r\n * @description\r\n * An object that contains information about the current AngularJS version. This object has the\r\n * following properties:\r\n *\r\n * - `full` â€“ `{string}` â€“ Full version string, such as \"0.9.18\".\r\n * - `major` â€“ `{number}` â€“ Major version number, such as \"0\".\r\n * - `minor` â€“ `{number}` â€“ Minor version number, such as \"9\".\r\n * - `dot` â€“ `{number}` â€“ Dot version number, such as \"18\".\r\n * - `codeName` â€“ `{string}` â€“ Code name of the release, such as \"jiggling-armfat\".\r\n */\r\nvar version = {\r\n  full: '1.0.1',    // all of these placeholder strings will be replaced by rake's\r\n  major: 1,    // compile task\r\n  minor: 0,\r\n  dot: 1,\r\n  codeName: 'thorium-shielding'\r\n};\r\n\r\n\r\nfunction publishExternalAPI(angular){\r\n  extend(angular, {\r\n    'bootstrap': bootstrap,\r\n    'copy': copy,\r\n    'extend': extend,\r\n    'equals': equals,\r\n    'element': jqLite,\r\n    'forEach': forEach,\r\n    'injector': createInjector,\r\n    'noop':noop,\r\n    'bind':bind,\r\n    'toJson': toJson,\r\n    'fromJson': fromJson,\r\n    'identity':identity,\r\n    'isUndefined': isUndefined,\r\n    'isDefined': isDefined,\r\n    'isString': isString,\r\n    'isFunction': isFunction,\r\n    'isObject': isObject,\r\n    'isNumber': isNumber,\r\n    'isElement': isElement,\r\n    'isArray': isArray,\r\n    'version': version,\r\n    'isDate': isDate,\r\n    'lowercase': lowercase,\r\n    'uppercase': uppercase,\r\n    'callbacks': {counter: 0}\r\n  });\r\n\r\n  angularModule = setupModuleLoader(window);\r\n  try {\r\n    angularModule('ngLocale');\r\n  } catch (e) {\r\n    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);\r\n  }\r\n\r\n  angularModule('ng', ['ngLocale'], ['$provide',\r\n    function ngModule($provide) {\r\n      $provide.provider('$compile', $CompileProvider).\r\n        directive({\r\n            a: htmlAnchorDirective,\r\n            input: inputDirective,\r\n            textarea: inputDirective,\r\n            form: formDirective,\r\n            script: scriptDirective,\r\n            select: selectDirective,\r\n            style: styleDirective,\r\n            option: optionDirective,\r\n            ngBind: ngBindDirective,\r\n            ngBindHtmlUnsafe: ngBindHtmlUnsafeDirective,\r\n            ngBindTemplate: ngBindTemplateDirective,\r\n            ngClass: ngClassDirective,\r\n            ngClassEven: ngClassEvenDirective,\r\n            ngClassOdd: ngClassOddDirective,\r\n            ngCsp: ngCspDirective,\r\n            ngCloak: ngCloakDirective,\r\n            ngController: ngControllerDirective,\r\n            ngForm: ngFormDirective,\r\n            ngHide: ngHideDirective,\r\n            ngInclude: ngIncludeDirective,\r\n            ngInit: ngInitDirective,\r\n            ngNonBindable: ngNonBindableDirective,\r\n            ngPluralize: ngPluralizeDirective,\r\n            ngRepeat: ngRepeatDirective,\r\n            ngShow: ngShowDirective,\r\n            ngSubmit: ngSubmitDirective,\r\n            ngStyle: ngStyleDirective,\r\n            ngSwitch: ngSwitchDirective,\r\n            ngSwitchWhen: ngSwitchWhenDirective,\r\n            ngSwitchDefault: ngSwitchDefaultDirective,\r\n            ngOptions: ngOptionsDirective,\r\n            ngView: ngViewDirective,\r\n            ngTransclude: ngTranscludeDirective,\r\n            ngModel: ngModelDirective,\r\n            ngList: ngListDirective,\r\n            ngChange: ngChangeDirective,\r\n            required: requiredDirective,\r\n            ngRequired: requiredDirective,\r\n            ngValue: ngValueDirective\r\n        }).\r\n        directive(ngAttributeAliasDirectives).\r\n        directive(ngEventDirectives);\r\n      $provide.provider({\r\n        $anchorScroll: $AnchorScrollProvider,\r\n        $browser: $BrowserProvider,\r\n        $cacheFactory: $CacheFactoryProvider,\r\n        $controller: $ControllerProvider,\r\n        $document: $DocumentProvider,\r\n        $exceptionHandler: $ExceptionHandlerProvider,\r\n        $filter: $FilterProvider,\r\n        $interpolate: $InterpolateProvider,\r\n        $http: $HttpProvider,\r\n        $httpBackend: $HttpBackendProvider,\r\n        $location: $LocationProvider,\r\n        $log: $LogProvider,\r\n        $parse: $ParseProvider,\r\n        $route: $RouteProvider,\r\n        $routeParams: $RouteParamsProvider,\r\n        $rootScope: $RootScopeProvider,\r\n        $q: $QProvider,\r\n        $sniffer: $SnifferProvider,\r\n        $templateCache: $TemplateCacheProvider,\r\n        $timeout: $TimeoutProvider,\r\n        $window: $WindowProvider\r\n      });\r\n    }\r\n  ]);\r\n}\r\n\r\n//////////////////////////////////\r\n//JQLite\r\n//////////////////////////////////\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.element\r\n * @function\r\n *\r\n * @description\r\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\r\n * `angular.element` can be either an alias for [jQuery](http://api.jquery.com/jQuery/) function, if\r\n * jQuery is available, or a function that wraps the element or string in Angular's jQuery lite\r\n * implementation (commonly referred to as jqLite).\r\n *\r\n * Real jQuery always takes precedence over jqLite, provided it was loaded before `DOMContentLoaded`\r\n * event fired.\r\n *\r\n * jqLite is a tiny, API-compatible subset of jQuery that allows\r\n * Angular to manipulate the DOM. jqLite implements only the most commonly needed functionality\r\n * within a very small footprint, so only a subset of the jQuery API - methods, arguments and\r\n * invocation styles - are supported.\r\n *\r\n * Note: All element references in Angular are always wrapped with jQuery or jqLite; they are never\r\n * raw DOM references.\r\n *\r\n * ## Angular's jQuery lite provides the following methods:\r\n *\r\n * - [addClass()](http://api.jquery.com/addClass/)\r\n * - [after()](http://api.jquery.com/after/)\r\n * - [append()](http://api.jquery.com/append/)\r\n * - [attr()](http://api.jquery.com/attr/)\r\n * - [bind()](http://api.jquery.com/bind/)\r\n * - [children()](http://api.jquery.com/children/)\r\n * - [clone()](http://api.jquery.com/clone/)\r\n * - [contents()](http://api.jquery.com/contents/)\r\n * - [css()](http://api.jquery.com/css/)\r\n * - [data()](http://api.jquery.com/data/)\r\n * - [eq()](http://api.jquery.com/eq/)\r\n * - [find()](http://api.jquery.com/find/) - Limited to lookups by tag name.\r\n * - [hasClass()](http://api.jquery.com/hasClass/)\r\n * - [html()](http://api.jquery.com/html/)\r\n * - [next()](http://api.jquery.com/next/)\r\n * - [parent()](http://api.jquery.com/parent/)\r\n * - [prepend()](http://api.jquery.com/prepend/)\r\n * - [prop()](http://api.jquery.com/prop/)\r\n * - [ready()](http://api.jquery.com/ready/)\r\n * - [remove()](http://api.jquery.com/remove/)\r\n * - [removeAttr()](http://api.jquery.com/removeAttr/)\r\n * - [removeClass()](http://api.jquery.com/removeClass/)\r\n * - [removeData()](http://api.jquery.com/removeData/)\r\n * - [replaceWith()](http://api.jquery.com/replaceWith/)\r\n * - [text()](http://api.jquery.com/text/)\r\n * - [toggleClass()](http://api.jquery.com/toggleClass/)\r\n * - [unbind()](http://api.jquery.com/unbind/)\r\n * - [val()](http://api.jquery.com/val/)\r\n * - [wrap()](http://api.jquery.com/wrap/)\r\n *\r\n * ## In addtion to the above, Angular privides an additional method to both jQuery and jQuery lite:\r\n *\r\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\r\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\r\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\r\n *   `'ngModel'`).\r\n * - `injector()` - retrieves the injector of the current element or its parent.\r\n * - `scope()` - retrieves the {@link api/ng.$rootScope.Scope scope} of the current\r\n *   element or its parent.\r\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\r\n *   parent element is reached.\r\n *\r\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\r\n * @returns {Object} jQuery object.\r\n */\r\n\r\nvar jqCache = JQLite.cache = {},\r\n    jqName = JQLite.expando = 'ng-' + new Date().getTime(),\r\n    jqId = 1,\r\n    addEventListenerFn = (window.document.addEventListener\r\n      ? function(element, type, fn) {element.addEventListener(type, fn, false);}\r\n      : function(element, type, fn) {element.attachEvent('on' + type, fn);}),\r\n    removeEventListenerFn = (window.document.removeEventListener\r\n      ? function(element, type, fn) {element.removeEventListener(type, fn, false); }\r\n      : function(element, type, fn) {element.detachEvent('on' + type, fn); });\r\n\r\nfunction jqNextId() { return ++jqId; }\r\n\r\n\r\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\r\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\r\n\r\n/**\r\n * Converts snake_case to camelCase.\r\n * Also there is special case for Moz prefix starting with upper case letter.\r\n * @param name Name to normalize\r\n */\r\nfunction camelCase(name) {\r\n  return name.\r\n    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\r\n      return offset ? letter.toUpperCase() : letter;\r\n    }).\r\n    replace(MOZ_HACK_REGEXP, 'Moz$1');\r\n}\r\n\r\n/////////////////////////////////////////////\r\n// jQuery mutation patch\r\n//\r\n//  In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a\r\n// $destroy event on all DOM nodes being removed.\r\n//\r\n/////////////////////////////////////////////\r\n\r\nfunction JQLitePatchJQueryRemove(name, dispatchThis) {\r\n  var originalJqFn = jQuery.fn[name];\r\n  originalJqFn = originalJqFn.$original || originalJqFn;\r\n  removePatch.$original = originalJqFn;\r\n  jQuery.fn[name] = removePatch;\r\n\r\n  function removePatch() {\r\n    var list = [this],\r\n        fireEvent = dispatchThis,\r\n        set, setIndex, setLength,\r\n        element, childIndex, childLength, children,\r\n        fns, events;\r\n\r\n    while(list.length) {\r\n      set = list.shift();\r\n      for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {\r\n        element = jqLite(set[setIndex]);\r\n        if (fireEvent) {\r\n          events = element.data('events');\r\n          if ( (fns = events && events.$destroy) ) {\r\n            forEach(fns, function(fn){\r\n              fn.handler();\r\n            });\r\n          }\r\n        } else {\r\n          fireEvent = !fireEvent;\r\n        }\r\n        for(childIndex = 0, childLength = (children = element.children()).length;\r\n            childIndex < childLength;\r\n            childIndex++) {\r\n          list.push(jQuery(children[childIndex]));\r\n        }\r\n      }\r\n    }\r\n    return originalJqFn.apply(this, arguments);\r\n  }\r\n}\r\n\r\n/////////////////////////////////////////////\r\nfunction JQLite(element) {\r\n  if (element instanceof JQLite) {\r\n    return element;\r\n  }\r\n  if (!(this instanceof JQLite)) {\r\n    if (isString(element) && element.charAt(0) != '<') {\r\n      throw Error('selectors not implemented');\r\n    }\r\n    return new JQLite(element);\r\n  }\r\n\r\n  if (isString(element)) {\r\n    var div = document.createElement('div');\r\n    // Read about the NoScope elements here:\r\n    // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx\r\n    div.innerHTML = '<div>&nbsp;</div>' + element; // IE insanity to make NoScope elements work!\r\n    div.removeChild(div.firstChild); // remove the superfluous div\r\n    JQLiteAddNodes(this, div.childNodes);\r\n    this.remove(); // detach the elements from the temporary DOM div.\r\n  } else {\r\n    JQLiteAddNodes(this, element);\r\n  }\r\n}\r\n\r\nfunction JQLiteClone(element) {\r\n  return element.cloneNode(true);\r\n}\r\n\r\nfunction JQLiteDealoc(element){\r\n  JQLiteRemoveData(element);\r\n  for ( var i = 0, children = element.childNodes || []; i < children.length; i++) {\r\n    JQLiteDealoc(children[i]);\r\n  }\r\n}\r\n\r\nfunction JQLiteUnbind(element, type, fn) {\r\n  var events = JQLiteExpandoStore(element, 'events'),\r\n      handle = JQLiteExpandoStore(element, 'handle');\r\n\r\n  if (!handle) return; //no listeners registered\r\n\r\n  if (isUndefined(type)) {\r\n    forEach(events, function(eventHandler, type) {\r\n      removeEventListenerFn(element, type, eventHandler);\r\n      delete events[type];\r\n    });\r\n  } else {\r\n    if (isUndefined(fn)) {\r\n      removeEventListenerFn(element, type, events[type]);\r\n      delete events[type];\r\n    } else {\r\n      arrayRemove(events[type], fn);\r\n    }\r\n  }\r\n}\r\n\r\nfunction JQLiteRemoveData(element) {\r\n  var expandoId = element[jqName],\r\n      expandoStore = jqCache[expandoId];\r\n\r\n  if (expandoStore) {\r\n    if (expandoStore.handle) {\r\n      expandoStore.events.$destroy && expandoStore.handle({}, '$destroy');\r\n      JQLiteUnbind(element);\r\n    }\r\n    delete jqCache[expandoId];\r\n    element[jqName] = undefined; // ie does not allow deletion of attributes on elements.\r\n  }\r\n}\r\n\r\nfunction JQLiteExpandoStore(element, key, value) {\r\n  var expandoId = element[jqName],\r\n      expandoStore = jqCache[expandoId || -1];\r\n\r\n  if (isDefined(value)) {\r\n    if (!expandoStore) {\r\n      element[jqName] = expandoId = jqNextId();\r\n      expandoStore = jqCache[expandoId] = {};\r\n    }\r\n    expandoStore[key] = value;\r\n  } else {\r\n    return expandoStore && expandoStore[key];\r\n  }\r\n}\r\n\r\nfunction JQLiteData(element, key, value) {\r\n  var data = JQLiteExpandoStore(element, 'data'),\r\n      isSetter = isDefined(value),\r\n      keyDefined = !isSetter && isDefined(key),\r\n      isSimpleGetter = keyDefined && !isObject(key);\r\n\r\n  if (!data && !isSimpleGetter) {\r\n    JQLiteExpandoStore(element, 'data', data = {});\r\n  }\r\n\r\n  if (isSetter) {\r\n    data[key] = value;\r\n  } else {\r\n    if (keyDefined) {\r\n      if (isSimpleGetter) {\r\n        // don't create data in this case.\r\n        return data && data[key];\r\n      } else {\r\n        extend(data, key);\r\n      }\r\n    } else {\r\n      return data;\r\n    }\r\n  }\r\n}\r\n\r\nfunction JQLiteHasClass(element, selector) {\r\n  return ((\" \" + element.className + \" \").replace(/[\\n\\t]/g, \" \").\r\n      indexOf( \" \" + selector + \" \" ) > -1);\r\n}\r\n\r\nfunction JQLiteRemoveClass(element, selector) {\r\n  if (selector) {\r\n    forEach(selector.split(' '), function(cssClass) {\r\n      element.className = trim(\r\n          (\" \" + element.className + \" \")\r\n          .replace(/[\\n\\t]/g, \" \")\r\n          .replace(\" \" + trim(cssClass) + \" \", \" \")\r\n      );\r\n    });\r\n  }\r\n}\r\n\r\nfunction JQLiteAddClass(element, selector) {\r\n  if (selector) {\r\n    forEach(selector.split(' '), function(cssClass) {\r\n      if (!JQLiteHasClass(element, cssClass)) {\r\n        element.className = trim(element.className + ' ' + trim(cssClass));\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nfunction JQLiteAddNodes(root, elements) {\r\n  if (elements) {\r\n    elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))\r\n      ? elements\r\n      : [ elements ];\r\n    for(var i=0; i < elements.length; i++) {\r\n      root.push(elements[i]);\r\n    }\r\n  }\r\n}\r\n\r\nfunction JQLiteController(element, name) {\r\n  return JQLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');\r\n}\r\n\r\nfunction JQLiteInheritedData(element, name, value) {\r\n  element = jqLite(element);\r\n\r\n  // if element is the document object work with the html element instead\r\n  // this makes $(document).scope() possible\r\n  if(element[0].nodeType == 9) {\r\n    element = element.find('html');\r\n  }\r\n\r\n  while (element.length) {\r\n    if (value = element.data(name)) return value;\r\n    element = element.parent();\r\n  }\r\n}\r\n\r\n//////////////////////////////////////////\r\n// Functions which are declared directly.\r\n//////////////////////////////////////////\r\nvar JQLitePrototype = JQLite.prototype = {\r\n  ready: function(fn) {\r\n    var fired = false;\r\n\r\n    function trigger() {\r\n      if (fired) return;\r\n      fired = true;\r\n      fn();\r\n    }\r\n\r\n    this.bind('DOMContentLoaded', trigger); // works for modern browsers and IE9\r\n    // we can not use jqLite since we are not done loading and jQuery could be loaded later.\r\n    JQLite(window).bind('load', trigger); // fallback to window.onload for others\r\n  },\r\n  toString: function() {\r\n    var value = [];\r\n    forEach(this, function(e){ value.push('' + e);});\r\n    return '[' + value.join(', ') + ']';\r\n  },\r\n\r\n  eq: function(index) {\r\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\r\n  },\r\n\r\n  length: 0,\r\n  push: push,\r\n  sort: [].sort,\r\n  splice: [].splice\r\n};\r\n\r\n//////////////////////////////////////////\r\n// Functions iterating getter/setters.\r\n// these functions return self on setter and\r\n// value on get.\r\n//////////////////////////////////////////\r\nvar BOOLEAN_ATTR = {};\r\nforEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value) {\r\n  BOOLEAN_ATTR[lowercase(value)] = value;\r\n});\r\nvar BOOLEAN_ELEMENTS = {};\r\nforEach('input,select,option,textarea,button,form'.split(','), function(value) {\r\n  BOOLEAN_ELEMENTS[uppercase(value)] = true;\r\n});\r\n\r\nfunction getBooleanAttrName(element, name) {\r\n  // check dom last since we will most likely fail on name\r\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\r\n\r\n  // booleanAttr is here twice to minimize DOM access\r\n  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;\r\n}\r\n\r\nforEach({\r\n  data: JQLiteData,\r\n  inheritedData: JQLiteInheritedData,\r\n\r\n  scope: function(element) {\r\n    return JQLiteInheritedData(element, '$scope');\r\n  },\r\n\r\n  controller: JQLiteController ,\r\n\r\n  injector: function(element) {\r\n    return JQLiteInheritedData(element, '$injector');\r\n  },\r\n\r\n  removeAttr: function(element,name) {\r\n    element.removeAttribute(name);\r\n  },\r\n\r\n  hasClass: JQLiteHasClass,\r\n\r\n  css: function(element, name, value) {\r\n    name = camelCase(name);\r\n\r\n    if (isDefined(value)) {\r\n      element.style[name] = value;\r\n    } else {\r\n      var val;\r\n\r\n      if (msie <= 8) {\r\n        // this is some IE specific weirdness that jQuery 1.6.4 does not sure why\r\n        val = element.currentStyle && element.currentStyle[name];\r\n        if (val === '') val = 'auto';\r\n      }\r\n\r\n      val = val || element.style[name];\r\n\r\n      if (msie <= 8) {\r\n        // jquery weirdness :-/\r\n        val = (val === '') ? undefined : val;\r\n      }\r\n\r\n      return  val;\r\n    }\r\n  },\r\n\r\n  attr: function(element, name, value){\r\n    var lowercasedName = lowercase(name);\r\n    if (BOOLEAN_ATTR[lowercasedName]) {\r\n      if (isDefined(value)) {\r\n        if (!!value) {\r\n          element[name] = true;\r\n          element.setAttribute(name, lowercasedName);\r\n        } else {\r\n          element[name] = false;\r\n          element.removeAttribute(lowercasedName);\r\n        }\r\n      } else {\r\n        return (element[name] ||\r\n                 (element.attributes.getNamedItem(name)|| noop).specified)\r\n               ? lowercasedName\r\n               : undefined;\r\n      }\r\n    } else if (isDefined(value)) {\r\n      element.setAttribute(name, value);\r\n    } else if (element.getAttribute) {\r\n      // the extra argument \"2\" is to get the right thing for a.href in IE, see jQuery code\r\n      // some elements (e.g. Document) don't have get attribute, so return undefined\r\n      var ret = element.getAttribute(name, 2);\r\n      // normalize non-existing attributes to undefined (as jQuery)\r\n      return ret === null ? undefined : ret;\r\n    }\r\n  },\r\n\r\n  prop: function(element, name, value) {\r\n    if (isDefined(value)) {\r\n      element[name] = value;\r\n    } else {\r\n      return element[name];\r\n    }\r\n  },\r\n\r\n  text: extend((msie < 9)\r\n      ? function(element, value) {\r\n        if (element.nodeType == 1 /** Element */) {\r\n          if (isUndefined(value))\r\n            return element.innerText;\r\n          element.innerText = value;\r\n        } else {\r\n          if (isUndefined(value))\r\n            return element.nodeValue;\r\n          element.nodeValue = value;\r\n        }\r\n      }\r\n      : function(element, value) {\r\n        if (isUndefined(value)) {\r\n          return element.textContent;\r\n        }\r\n        element.textContent = value;\r\n      }, {$dv:''}),\r\n\r\n  val: function(element, value) {\r\n    if (isUndefined(value)) {\r\n      return element.value;\r\n    }\r\n    element.value = value;\r\n  },\r\n\r\n  html: function(element, value) {\r\n    if (isUndefined(value)) {\r\n      return element.innerHTML;\r\n    }\r\n    for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\r\n      JQLiteDealoc(childNodes[i]);\r\n    }\r\n    element.innerHTML = value;\r\n  }\r\n}, function(fn, name){\r\n  /**\r\n   * Properties: writes return selection, reads return first value\r\n   */\r\n  JQLite.prototype[name] = function(arg1, arg2) {\r\n    var i, key;\r\n\r\n    // JQLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\r\n    // in a way that survives minification.\r\n    if (((fn.length == 2 && (fn !== JQLiteHasClass && fn !== JQLiteController)) ? arg1 : arg2) === undefined) {\r\n      if (isObject(arg1)) {\r\n\r\n        // we are a write, but the object properties are the key/values\r\n        for(i=0; i < this.length; i++) {\r\n          if (fn === JQLiteData) {\r\n            // data() takes the whole object in jQuery\r\n            fn(this[i], arg1);\r\n          } else {\r\n            for (key in arg1) {\r\n              fn(this[i], key, arg1[key]);\r\n            }\r\n          }\r\n        }\r\n        // return self for chaining\r\n        return this;\r\n      } else {\r\n        // we are a read, so read the first child.\r\n        if (this.length)\r\n          return fn(this[0], arg1, arg2);\r\n      }\r\n    } else {\r\n      // we are a write, so apply to all children\r\n      for(i=0; i < this.length; i++) {\r\n        fn(this[i], arg1, arg2);\r\n      }\r\n      // return self for chaining\r\n      return this;\r\n    }\r\n    return fn.$dv;\r\n  };\r\n});\r\n\r\nfunction createEventHandler(element, events) {\r\n  var eventHandler = function (event, type) {\r\n    if (!event.preventDefault) {\r\n      event.preventDefault = function() {\r\n        event.returnValue = false; //ie\r\n      };\r\n    }\r\n\r\n    if (!event.stopPropagation) {\r\n      event.stopPropagation = function() {\r\n        event.cancelBubble = true; //ie\r\n      };\r\n    }\r\n\r\n    if (!event.target) {\r\n      event.target = event.srcElement || document;\r\n    }\r\n\r\n    if (isUndefined(event.defaultPrevented)) {\r\n      var prevent = event.preventDefault;\r\n      event.preventDefault = function() {\r\n        event.defaultPrevented = true;\r\n        prevent.call(event);\r\n      };\r\n      event.defaultPrevented = false;\r\n    }\r\n\r\n    event.isDefaultPrevented = function() {\r\n      return event.defaultPrevented;\r\n    };\r\n\r\n    forEach(events[type || event.type], function(fn) {\r\n      fn.call(element, event);\r\n    });\r\n\r\n    // Remove monkey-patched methods (IE),\r\n    // as they would cause memory leaks in IE8.\r\n    if (msie <= 8) {\r\n      // IE7/8 does not allow to delete property on native object\r\n      event.preventDefault = null;\r\n      event.stopPropagation = null;\r\n      event.isDefaultPrevented = null;\r\n    } else {\r\n      // It shouldn't affect normal browsers (native methods are defined on prototype).\r\n      delete event.preventDefault;\r\n      delete event.stopPropagation;\r\n      delete event.isDefaultPrevented;\r\n    }\r\n  };\r\n  eventHandler.elem = element;\r\n  return eventHandler;\r\n}\r\n\r\n//////////////////////////////////////////\r\n// Functions iterating traversal.\r\n// These functions chain results into a single\r\n// selector.\r\n//////////////////////////////////////////\r\nforEach({\r\n  removeData: JQLiteRemoveData,\r\n\r\n  dealoc: JQLiteDealoc,\r\n\r\n  bind: function bindFn(element, type, fn){\r\n    var events = JQLiteExpandoStore(element, 'events'),\r\n        handle = JQLiteExpandoStore(element, 'handle');\r\n\r\n    if (!events) JQLiteExpandoStore(element, 'events', events = {});\r\n    if (!handle) JQLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));\r\n\r\n    forEach(type.split(' '), function(type){\r\n      var eventFns = events[type];\r\n\r\n      if (!eventFns) {\r\n        if (type == 'mouseenter' || type == 'mouseleave') {\r\n          var counter = 0;\r\n\r\n          events.mouseenter = [];\r\n          events.mouseleave = [];\r\n\r\n          bindFn(element, 'mouseover', function(event) {\r\n            counter++;\r\n            if (counter == 1) {\r\n              handle(event, 'mouseenter');\r\n            }\r\n          });\r\n          bindFn(element, 'mouseout', function(event) {\r\n            counter --;\r\n            if (counter == 0) {\r\n              handle(event, 'mouseleave');\r\n            }\r\n          });\r\n        } else {\r\n          addEventListenerFn(element, type, handle);\r\n          events[type] = [];\r\n        }\r\n        eventFns = events[type]\r\n      }\r\n      eventFns.push(fn);\r\n    });\r\n  },\r\n\r\n  unbind: JQLiteUnbind,\r\n\r\n  replaceWith: function(element, replaceNode) {\r\n    var index, parent = element.parentNode;\r\n    JQLiteDealoc(element);\r\n    forEach(new JQLite(replaceNode), function(node){\r\n      if (index) {\r\n        parent.insertBefore(node, index.nextSibling);\r\n      } else {\r\n        parent.replaceChild(node, element);\r\n      }\r\n      index = node;\r\n    });\r\n  },\r\n\r\n  children: function(element) {\r\n    var children = [];\r\n    forEach(element.childNodes, function(element){\r\n      if (element.nodeName != '#text')\r\n        children.push(element);\r\n    });\r\n    return children;\r\n  },\r\n\r\n  contents: function(element) {\r\n    return element.childNodes;\r\n  },\r\n\r\n  append: function(element, node) {\r\n    forEach(new JQLite(node), function(child){\r\n      if (element.nodeType === 1)\r\n        element.appendChild(child);\r\n    });\r\n  },\r\n\r\n  prepend: function(element, node) {\r\n    if (element.nodeType === 1) {\r\n      var index = element.firstChild;\r\n      forEach(new JQLite(node), function(child){\r\n        if (index) {\r\n          element.insertBefore(child, index);\r\n        } else {\r\n          element.appendChild(child);\r\n          index = child;\r\n        }\r\n      });\r\n    }\r\n  },\r\n\r\n  wrap: function(element, wrapNode) {\r\n    wrapNode = jqLite(wrapNode)[0];\r\n    var parent = element.parentNode;\r\n    if (parent) {\r\n      parent.replaceChild(wrapNode, element);\r\n    }\r\n    wrapNode.appendChild(element);\r\n  },\r\n\r\n  remove: function(element) {\r\n    JQLiteDealoc(element);\r\n    var parent = element.parentNode;\r\n    if (parent) parent.removeChild(element);\r\n  },\r\n\r\n  after: function(element, newElement) {\r\n    var index = element, parent = element.parentNode;\r\n    forEach(new JQLite(newElement), function(node){\r\n      parent.insertBefore(node, index.nextSibling);\r\n      index = node;\r\n    });\r\n  },\r\n\r\n  addClass: JQLiteAddClass,\r\n  removeClass: JQLiteRemoveClass,\r\n\r\n  toggleClass: function(element, selector, condition) {\r\n    if (isUndefined(condition)) {\r\n      condition = !JQLiteHasClass(element, selector);\r\n    }\r\n    (condition ? JQLiteAddClass : JQLiteRemoveClass)(element, selector);\r\n  },\r\n\r\n  parent: function(element) {\r\n    var parent = element.parentNode;\r\n    return parent && parent.nodeType !== 11 ? parent : null;\r\n  },\r\n\r\n  next: function(element) {\r\n    return element.nextSibling;\r\n  },\r\n\r\n  find: function(element, selector) {\r\n    return element.getElementsByTagName(selector);\r\n  },\r\n\r\n  clone: JQLiteClone\r\n}, function(fn, name){\r\n  /**\r\n   * chaining functions\r\n   */\r\n  JQLite.prototype[name] = function(arg1, arg2) {\r\n    var value;\r\n    for(var i=0; i < this.length; i++) {\r\n      if (value == undefined) {\r\n        value = fn(this[i], arg1, arg2);\r\n        if (value !== undefined) {\r\n          // any function which returns a value needs to be wrapped\r\n          value = jqLite(value);\r\n        }\r\n      } else {\r\n        JQLiteAddNodes(value, fn(this[i], arg1, arg2));\r\n      }\r\n    }\r\n    return value == undefined ? this : value;\r\n  };\r\n});\r\n\r\n/**\r\n * Computes a hash of an 'obj'.\r\n * Hash of a:\r\n *  string is string\r\n *  number is number as string\r\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\r\n *         that is also assigned to the $$hashKey property of the object.\r\n *\r\n * @param obj\r\n * @returns {string} hash string such that the same input will have the same hash string.\r\n *         The resulting string key is in 'type:hashKey' format.\r\n */\r\nfunction hashKey(obj) {\r\n  var objType = typeof obj,\r\n      key;\r\n\r\n  if (objType == 'object' && obj !== null) {\r\n    if (typeof (key = obj.$$hashKey) == 'function') {\r\n      // must invoke on object to keep the right this\r\n      key = obj.$$hashKey();\r\n    } else if (key === undefined) {\r\n      key = obj.$$hashKey = nextUid();\r\n    }\r\n  } else {\r\n    key = obj;\r\n  }\r\n\r\n  return objType + ':' + key;\r\n}\r\n\r\n/**\r\n * HashMap which can use objects as keys\r\n */\r\nfunction HashMap(array){\r\n  forEach(array, this.put, this);\r\n}\r\nHashMap.prototype = {\r\n  /**\r\n   * Store key value pair\r\n   * @param key key to store can be any type\r\n   * @param value value to store can be any type\r\n   */\r\n  put: function(key, value) {\r\n    this[hashKey(key)] = value;\r\n  },\r\n\r\n  /**\r\n   * @param key\r\n   * @returns the value for the key\r\n   */\r\n  get: function(key) {\r\n    return this[hashKey(key)];\r\n  },\r\n\r\n  /**\r\n   * Remove the key/value pair\r\n   * @param key\r\n   */\r\n  remove: function(key) {\r\n    var value = this[key = hashKey(key)];\r\n    delete this[key];\r\n    return value;\r\n  }\r\n};\r\n\r\n/**\r\n * A map where multiple values can be added to the same key such that they form a queue.\r\n * @returns {HashQueueMap}\r\n */\r\nfunction HashQueueMap() {}\r\nHashQueueMap.prototype = {\r\n  /**\r\n   * Same as array push, but using an array as the value for the hash\r\n   */\r\n  push: function(key, value) {\r\n    var array = this[key = hashKey(key)];\r\n    if (!array) {\r\n      this[key] = [value];\r\n    } else {\r\n      array.push(value);\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Same as array shift, but using an array as the value for the hash\r\n   */\r\n  shift: function(key) {\r\n    var array = this[key = hashKey(key)];\r\n    if (array) {\r\n      if (array.length == 1) {\r\n        delete this[key];\r\n        return array[0];\r\n      } else {\r\n        return array.shift();\r\n      }\r\n    }\r\n  }\r\n};\r\n\r\n/**\r\n * @ngdoc function\r\n * @name angular.injector\r\n * @function\r\n *\r\n * @description\r\n * Creates an injector function that can be used for retrieving services as well as for\r\n * dependency injection (see {@link guide/di dependency injection}).\r\n *\r\n\r\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\r\n *        {@link angular.module}. The `ng` module must be explicitly added.\r\n * @returns {function()} Injector function. See {@link AUTO.$injector $injector}.\r\n *\r\n * @example\r\n * Typical usage\r\n * <pre>\r\n *   // create an injector\r\n *   var $injector = angular.injector(['ng']);\r\n *\r\n *   // use the injector to kick of your application\r\n *   // use the type inference to auto inject arguments, or use implicit injection\r\n *   $injector.invoke(function($rootScope, $compile, $document){\r\n *     $compile($document)($rootScope);\r\n *     $rootScope.$digest();\r\n *   });\r\n * </pre>\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc overview\r\n * @name AUTO\r\n * @description\r\n *\r\n * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}.\r\n */\r\n\r\nvar FN_ARGS = /^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\r\nvar FN_ARG_SPLIT = /,/;\r\nvar FN_ARG = /^\\s*(_?)(.+?)\\1\\s*$/;\r\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\r\nfunction annotate(fn) {\r\n  var $inject,\r\n      fnText,\r\n      argDecl,\r\n      last;\r\n\r\n  if (typeof fn == 'function') {\r\n    if (!($inject = fn.$inject)) {\r\n      $inject = [];\r\n      fnText = fn.toString().replace(STRIP_COMMENTS, '');\r\n      argDecl = fnText.match(FN_ARGS);\r\n      forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){\r\n        arg.replace(FN_ARG, function(all, underscore, name){\r\n          $inject.push(name);\r\n        });\r\n      });\r\n      fn.$inject = $inject;\r\n    }\r\n  } else if (isArray(fn)) {\r\n    last = fn.length - 1;\r\n    assertArgFn(fn[last], 'fn')\r\n    $inject = fn.slice(0, last);\r\n  } else {\r\n    assertArgFn(fn, 'fn', true);\r\n  }\r\n  return $inject;\r\n}\r\n\r\n///////////////////////////////////////\r\n\r\n/**\r\n * @ngdoc object\r\n * @name AUTO.$injector\r\n * @function\r\n *\r\n * @description\r\n *\r\n * `$injector` is used to retrieve object instances as defined by\r\n * {@link AUTO.$provide provider}, instantiate types, invoke methods,\r\n * and load modules.\r\n *\r\n * The following always holds true:\r\n *\r\n * <pre>\r\n *   var $injector = angular.injector();\r\n *   expect($injector.get('$injector')).toBe($injector);\r\n *   expect($injector.invoke(function($injector){\r\n *     return $injector;\r\n *   }).toBe($injector);\r\n * </pre>\r\n *\r\n * # Injection Function Annotation\r\n *\r\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\r\n * following ways are all valid way of annotating function with injection arguments and are equivalent.\r\n *\r\n * <pre>\r\n *   // inferred (only works if code not minified/obfuscated)\r\n *   $inject.invoke(function(serviceA){});\r\n *\r\n *   // annotated\r\n *   function explicit(serviceA) {};\r\n *   explicit.$inject = ['serviceA'];\r\n *   $inject.invoke(explicit);\r\n *\r\n *   // inline\r\n *   $inject.invoke(['serviceA', function(serviceA){}]);\r\n * </pre>\r\n *\r\n * ## Inference\r\n *\r\n * In JavaScript calling `toString()` on a function returns the function definition. The definition can then be\r\n * parsed and the function arguments can be extracted. *NOTE:* This does not work with minification, and obfuscation\r\n * tools since these tools change the argument names.\r\n *\r\n * ## `$inject` Annotation\r\n * By adding a `$inject` property onto a function the injection parameters can be specified.\r\n *\r\n * ## Inline\r\n * As an array of injection names, where the last item in the array is the function to call.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#get\r\n * @methodOf AUTO.$injector\r\n *\r\n * @description\r\n * Return an instance of the service.\r\n *\r\n * @param {string} name The name of the instance to retrieve.\r\n * @return {*} The instance.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#invoke\r\n * @methodOf AUTO.$injector\r\n *\r\n * @description\r\n * Invoke the method and supply the method arguments from the `$injector`.\r\n *\r\n * @param {!function} fn The function to invoke. The function arguments come form the function annotation.\r\n * @param {Object=} self The `this` for the invoked method.\r\n * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before\r\n *   the `$injector` is consulted.\r\n * @returns {*} the value returned by the invoked `fn` function.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#instantiate\r\n * @methodOf AUTO.$injector\r\n * @description\r\n * Create a new instance of JS type. The method takes a constructor function invokes the new operator and supplies\r\n * all of the arguments to the constructor function as specified by the constructor annotation.\r\n *\r\n * @param {function} Type Annotated constructor function.\r\n * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before\r\n *   the `$injector` is consulted.\r\n * @returns {Object} new instance of `Type`.\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$injector#annotate\r\n * @methodOf AUTO.$injector\r\n *\r\n * @description\r\n * Returns an array of service names which the function is requesting for injection. This API is used by the injector\r\n * to determine which services need to be injected into the function when the function is invoked. There are three\r\n * ways in which the function can be annotated with the needed dependencies.\r\n *\r\n * # Argument names\r\n *\r\n * The simplest form is to extract the dependencies from the arguments of the function. This is done by converting\r\n * the function into a string using `toString()` method and extracting the argument names.\r\n * <pre>\r\n *   // Given\r\n *   function MyController($scope, $route) {\r\n *     // ...\r\n *   }\r\n *\r\n *   // Then\r\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\r\n * </pre>\r\n *\r\n * This method does not work with code minfication / obfuscation. For this reason the following annotation strategies\r\n * are supported.\r\n *\r\n * # The `$injector` property\r\n *\r\n * If a function has an `$inject` property and its value is an array of strings, then the strings represent names of\r\n * services to be injected into the function.\r\n * <pre>\r\n *   // Given\r\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\r\n *     // ...\r\n *   }\r\n *   // Define function dependencies\r\n *   MyController.$inject = ['$scope', '$route'];\r\n *\r\n *   // Then\r\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\r\n * </pre>\r\n *\r\n * # The array notation\r\n *\r\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property is very\r\n * inconvenient. In these situations using the array notation to specify the dependencies in a way that survives\r\n * minification is a better choice:\r\n *\r\n * <pre>\r\n *   // We wish to write this (not minification / obfuscation safe)\r\n *   injector.invoke(function($compile, $rootScope) {\r\n *     // ...\r\n *   });\r\n *\r\n *   // We are forced to write break inlining\r\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\r\n *     // ...\r\n *   };\r\n *   tmpFn.$inject = ['$compile', '$rootScope'];\r\n *   injector.invoke(tempFn);\r\n *\r\n *   // To better support inline function the inline annotation is supported\r\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\r\n *     // ...\r\n *   }]);\r\n *\r\n *   // Therefore\r\n *   expect(injector.annotate(\r\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\r\n *    ).toEqual(['$compile', '$rootScope']);\r\n * </pre>\r\n *\r\n * @param {function|Array.<string|Function>} fn Function for which dependent service names need to be retrieved as described\r\n *   above.\r\n *\r\n * @returns {Array.<string>} The names of the services which the function requires.\r\n */\r\n\r\n\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name AUTO.$provide\r\n *\r\n * @description\r\n *\r\n * Use `$provide` to register new providers with the `$injector`. The providers are the factories for the instance.\r\n * The providers share the same name as the instance they create with the `Provider` suffixed to them.\r\n *\r\n * A provider is an object with a `$get()` method. The injector calls the `$get` method to create a new instance of\r\n * a service. The Provider can have additional methods which would allow for configuration of the provider.\r\n *\r\n * <pre>\r\n *   function GreetProvider() {\r\n *     var salutation = 'Hello';\r\n *\r\n *     this.salutation = function(text) {\r\n *       salutation = text;\r\n *     };\r\n *\r\n *     this.$get = function() {\r\n *       return function (name) {\r\n *         return salutation + ' ' + name + '!';\r\n *       };\r\n *     };\r\n *   }\r\n *\r\n *   describe('Greeter', function(){\r\n *\r\n *     beforeEach(module(function($provide) {\r\n *       $provide.provider('greet', GreetProvider);\r\n *     });\r\n *\r\n *     it('should greet', inject(function(greet) {\r\n *       expect(greet('angular')).toEqual('Hello angular!');\r\n *     }));\r\n *\r\n *     it('should allow configuration of salutation', function() {\r\n *       module(function(greetProvider) {\r\n *         greetProvider.salutation('Ahoj');\r\n *       });\r\n *       inject(function(greet) {\r\n *         expect(greet('angular')).toEqual('Ahoj angular!');\r\n *       });\r\n *     )};\r\n *\r\n *   });\r\n * </pre>\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#provider\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * Register a provider for a service. The providers can be retrieved and can have additional configuration methods.\r\n *\r\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key.\r\n * @param {(Object|function())} provider If the provider is:\r\n *\r\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\r\n *               {@link AUTO.$injector#invoke $injector.invoke()} when an instance needs to be created.\r\n *   - `Constructor`: a new instance of the provider will be created using\r\n *               {@link AUTO.$injector#instantiate $injector.instantiate()}, then treated as `object`.\r\n *\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#factory\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A short hand for configuring services if only `$get` method is required.\r\n *\r\n * @param {string} name The name of the instance.\r\n * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand for\r\n * `$provide.provider(name, {$get: $getFn})`.\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#service\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A short hand for registering service of given class.\r\n *\r\n * @param {string} name The name of the instance.\r\n * @param {Function} constructor A class (constructor function) that will be instantiated.\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#value\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A short hand for configuring services if the `$get` method is a constant.\r\n *\r\n * @param {string} name The name of the instance.\r\n * @param {*} value The value.\r\n * @returns {Object} registered provider instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#constant\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * A constant value, but unlike {@link AUTO.$provide#value value} it can be injected\r\n * into configuration function (other modules) and it is not interceptable by\r\n * {@link AUTO.$provide#decorator decorator}.\r\n *\r\n * @param {string} name The name of the constant.\r\n * @param {*} value The constant value.\r\n * @returns {Object} registered instance\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc method\r\n * @name AUTO.$provide#decorator\r\n * @methodOf AUTO.$provide\r\n * @description\r\n *\r\n * Decoration of service, allows the decorator to intercept the service instance creation. The\r\n * returned instance may be the original instance, or a new instance which delegates to the\r\n * original instance.\r\n *\r\n * @param {string} name The name of the service to decorate.\r\n * @param {function()} decorator This function will be invoked when the service needs to be\r\n *    instanciated. The function is called using the {@link AUTO.$injector#invoke\r\n *    injector.invoke} method and is therefore fully injectable. Local injection arguments:\r\n *\r\n *    * `$delegate` - The original service instance, which can be monkey patched, configured,\r\n *      decorated or delegated to.\r\n */\r\n\r\n\r\nfunction createInjector(modulesToLoad) {\r\n  var INSTANTIATING = {},\r\n      providerSuffix = 'Provider',\r\n      path = [],\r\n      loadedModules = new HashMap(),\r\n      providerCache = {\r\n        $provide: {\r\n            provider: supportObject(provider),\r\n            factory: supportObject(factory),\r\n            service: supportObject(service),\r\n            value: supportObject(value),\r\n            constant: supportObject(constant),\r\n            decorator: decorator\r\n          }\r\n      },\r\n      providerInjector = createInternalInjector(providerCache, function() {\r\n        throw Error(\"Unknown provider: \" + path.join(' <- '));\r\n      }),\r\n      instanceCache = {},\r\n      instanceInjector = (instanceCache.$injector =\r\n          createInternalInjector(instanceCache, function(servicename) {\r\n            var provider = providerInjector.get(servicename + providerSuffix);\r\n            return instanceInjector.invoke(provider.$get, provider);\r\n          }));\r\n\r\n\r\n  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });\r\n\r\n  return instanceInjector;\r\n\r\n  ////////////////////////////////////\r\n  // $provider\r\n  ////////////////////////////////////\r\n\r\n  function supportObject(delegate) {\r\n    return function(key, value) {\r\n      if (isObject(key)) {\r\n        forEach(key, reverseParams(delegate));\r\n      } else {\r\n        return delegate(key, value);\r\n      }\r\n    }\r\n  }\r\n\r\n  function provider(name, provider_) {\r\n    if (isFunction(provider_)) {\r\n      provider_ = providerInjector.instantiate(provider_);\r\n    }\r\n    if (!provider_.$get) {\r\n      throw Error('Provider ' + name + ' must define $get factory method.');\r\n    }\r\n    return providerCache[name + providerSuffix] = provider_;\r\n  }\r\n\r\n  function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }\r\n\r\n  function service(name, constructor) {\r\n    return factory(name, ['$injector', function($injector) {\r\n      return $injector.instantiate(constructor);\r\n    }]);\r\n  }\r\n\r\n  function value(name, value) { return factory(name, valueFn(value)); }\r\n\r\n  function constant(name, value) {\r\n    providerCache[name] = value;\r\n    instanceCache[name] = value;\r\n  }\r\n\r\n  function decorator(serviceName, decorFn) {\r\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\r\n        orig$get = origProvider.$get;\r\n\r\n    origProvider.$get = function() {\r\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\r\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\r\n    };\r\n  }\r\n\r\n  ////////////////////////////////////\r\n  // Module Loading\r\n  ////////////////////////////////////\r\n  function loadModules(modulesToLoad){\r\n    var runBlocks = [];\r\n    forEach(modulesToLoad, function(module) {\r\n      if (loadedModules.get(module)) return;\r\n      loadedModules.put(module, true);\r\n      if (isString(module)) {\r\n        var moduleFn = angularModule(module);\r\n        runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\r\n\r\n        try {\r\n          for(var invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {\r\n            var invokeArgs = invokeQueue[i],\r\n                provider = invokeArgs[0] == '$injector'\r\n                    ? providerInjector\r\n                    : providerInjector.get(invokeArgs[0]);\r\n\r\n            provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\r\n          }\r\n        } catch (e) {\r\n          if (e.message) e.message += ' from ' + module;\r\n          throw e;\r\n        }\r\n      } else if (isFunction(module)) {\r\n        try {\r\n          runBlocks.push(providerInjector.invoke(module));\r\n        } catch (e) {\r\n          if (e.message) e.message += ' from ' + module;\r\n          throw e;\r\n        }\r\n      } else if (isArray(module)) {\r\n        try {\r\n          runBlocks.push(providerInjector.invoke(module));\r\n        } catch (e) {\r\n          if (e.message) e.message += ' from ' + String(module[module.length - 1]);\r\n          throw e;\r\n        }\r\n      } else {\r\n        assertArgFn(module, 'module');\r\n      }\r\n    });\r\n    return runBlocks;\r\n  }\r\n\r\n  ////////////////////////////////////\r\n  // internal Injector\r\n  ////////////////////////////////////\r\n\r\n  function createInternalInjector(cache, factory) {\r\n\r\n    function getService(serviceName) {\r\n      if (typeof serviceName !== 'string') {\r\n        throw Error('Service name expected');\r\n      }\r\n      if (cache.hasOwnProperty(serviceName)) {\r\n        if (cache[serviceName] === INSTANTIATING) {\r\n          throw Error('Circular dependency: ' + path.join(' <- '));\r\n        }\r\n        return cache[serviceName];\r\n      } else {\r\n        try {\r\n          path.unshift(serviceName);\r\n          cache[serviceName] = INSTANTIATING;\r\n          return cache[serviceName] = factory(serviceName);\r\n        } finally {\r\n          path.shift();\r\n        }\r\n      }\r\n    }\r\n\r\n    function invoke(fn, self, locals){\r\n      var args = [],\r\n          $inject = annotate(fn),\r\n          length, i,\r\n          key;\r\n\r\n      for(i = 0, length = $inject.length; i < length; i++) {\r\n        key = $inject[i];\r\n        args.push(\r\n          locals && locals.hasOwnProperty(key)\r\n          ? locals[key]\r\n          : getService(key, path)\r\n        );\r\n      }\r\n      if (!fn.$inject) {\r\n        // this means that we must be an array.\r\n        fn = fn[length];\r\n      }\r\n\r\n\r\n      // Performance optimization: http://jsperf.com/apply-vs-call-vs-invoke\r\n      switch (self ? -1 : args.length) {\r\n        case  0: return fn();\r\n        case  1: return fn(args[0]);\r\n        case  2: return fn(args[0], args[1]);\r\n        case  3: return fn(args[0], args[1], args[2]);\r\n        case  4: return fn(args[0], args[1], args[2], args[3]);\r\n        case  5: return fn(args[0], args[1], args[2], args[3], args[4]);\r\n        case  6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]);\r\n        case  7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\r\n        case  8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);\r\n        case  9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);\r\n        case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);\r\n        default: return fn.apply(self, args);\r\n      }\r\n    }\r\n\r\n    function instantiate(Type, locals) {\r\n      var Constructor = function() {},\r\n          instance, returnedValue;\r\n\r\n      Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;\r\n      instance = new Constructor();\r\n      returnedValue = invoke(Type, instance, locals);\r\n\r\n      return isObject(returnedValue) ? returnedValue : instance;\r\n    }\r\n\r\n    return {\r\n      invoke: invoke,\r\n      instantiate: instantiate,\r\n      get: getService,\r\n      annotate: annotate\r\n    };\r\n  }\r\n}\r\n/**\r\n * @ngdoc function\r\n * @name ng.$anchorScroll\r\n * @requires $window\r\n * @requires $location\r\n * @requires $rootScope\r\n *\r\n * @description\r\n * When called, it checks current value of `$location.hash()` and scroll to related element,\r\n * according to rules specified in\r\n * {@link http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document Html5 spec}.\r\n *\r\n * It also watches the `$location.hash()` and scroll whenever it changes to match any anchor.\r\n * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.\r\n */\r\nfunction $AnchorScrollProvider() {\r\n\r\n  var autoScrollingEnabled = true;\r\n\r\n  this.disableAutoScrolling = function() {\r\n    autoScrollingEnabled = false;\r\n  };\r\n\r\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\r\n    var document = $window.document;\r\n\r\n    // helper function to get first anchor from a NodeList\r\n    // can't use filter.filter, as it accepts only instances of Array\r\n    // and IE can't convert NodeList to an array using [].slice\r\n    // TODO(vojta): use filter if we change it to accept lists as well\r\n    function getFirstAnchor(list) {\r\n      var result = null;\r\n      forEach(list, function(element) {\r\n        if (!result && lowercase(element.nodeName) === 'a') result = element;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    function scroll() {\r\n      var hash = $location.hash(), elm;\r\n\r\n      // empty hash, scroll to the top of the page\r\n      if (!hash) $window.scrollTo(0, 0);\r\n\r\n      // element with given id\r\n      else if ((elm = document.getElementById(hash))) elm.scrollIntoView();\r\n\r\n      // first anchor with given name :-D\r\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();\r\n\r\n      // no element and hash == 'top', scroll to the top of the page\r\n      else if (hash === 'top') $window.scrollTo(0, 0);\r\n    }\r\n\r\n    // does not scroll when user clicks on anchor link that is currently on\r\n    // (no url change, no $locaiton.hash() change), browser native does scroll\r\n    if (autoScrollingEnabled) {\r\n      $rootScope.$watch(function() {return $location.hash();}, function() {\r\n        $rootScope.$evalAsync(scroll);\r\n      });\r\n    }\r\n\r\n    return scroll;\r\n  }];\r\n}\r\n\r\n/**\r\n * ! This is a private undocumented service !\r\n *\r\n * @name ng.$browser\r\n * @requires $log\r\n * @description\r\n * This object has two goals:\r\n *\r\n * - hide all the global state in the browser caused by the window object\r\n * - abstract away all the browser specific features and inconsistencies\r\n *\r\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\r\n * service, which can be used for convenient testing of the application without the interaction with\r\n * the real browser apis.\r\n */\r\n/**\r\n * @param {object} window The global window object.\r\n * @param {object} document jQuery wrapped document.\r\n * @param {function()} XHR XMLHttpRequest constructor.\r\n * @param {object} $log console.log or an object with the same interface.\r\n * @param {object} $sniffer $sniffer service\r\n */\r\nfunction Browser(window, document, $log, $sniffer) {\r\n  var self = this,\r\n      rawDocument = document[0],\r\n      location = window.location,\r\n      history = window.history,\r\n      setTimeout = window.setTimeout,\r\n      clearTimeout = window.clearTimeout,\r\n      pendingDeferIds = {};\r\n\r\n  self.isMock = false;\r\n\r\n  var outstandingRequestCount = 0;\r\n  var outstandingRequestCallbacks = [];\r\n\r\n  // TODO(vojta): remove this temporary api\r\n  self.$$completeOutstandingRequest = completeOutstandingRequest;\r\n  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };\r\n\r\n  /**\r\n   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\r\n   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\r\n   */\r\n  function completeOutstandingRequest(fn) {\r\n    try {\r\n      fn.apply(null, sliceArgs(arguments, 1));\r\n    } finally {\r\n      outstandingRequestCount--;\r\n      if (outstandingRequestCount === 0) {\r\n        while(outstandingRequestCallbacks.length) {\r\n          try {\r\n            outstandingRequestCallbacks.pop()();\r\n          } catch (e) {\r\n            $log.error(e);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * Note: this method is used only by scenario runner\r\n   * TODO(vojta): prefix this method with $$ ?\r\n   * @param {function()} callback Function that will be called when no outstanding request\r\n   */\r\n  self.notifyWhenNoOutstandingRequests = function(callback) {\r\n    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire\r\n    // at some deterministic time in respect to the test runner's actions. Leaving things up to the\r\n    // regular poller would result in flaky tests.\r\n    forEach(pollFns, function(pollFn){ pollFn(); });\r\n\r\n    if (outstandingRequestCount === 0) {\r\n      callback();\r\n    } else {\r\n      outstandingRequestCallbacks.push(callback);\r\n    }\r\n  };\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // Poll Watcher API\r\n  //////////////////////////////////////////////////////////////\r\n  var pollFns = [],\r\n      pollTimeout;\r\n\r\n  /**\r\n   * @name ng.$browser#addPollFn\r\n   * @methodOf ng.$browser\r\n   *\r\n   * @param {function()} fn Poll function to add\r\n   *\r\n   * @description\r\n   * Adds a function to the list of functions that poller periodically executes,\r\n   * and starts polling if not started yet.\r\n   *\r\n   * @returns {function()} the added function\r\n   */\r\n  self.addPollFn = function(fn) {\r\n    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);\r\n    pollFns.push(fn);\r\n    return fn;\r\n  };\r\n\r\n  /**\r\n   * @param {number} interval How often should browser call poll functions (ms)\r\n   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.\r\n   *\r\n   * @description\r\n   * Configures the poller to run in the specified intervals, using the specified\r\n   * setTimeout fn and kicks it off.\r\n   */\r\n  function startPoller(interval, setTimeout) {\r\n    (function check() {\r\n      forEach(pollFns, function(pollFn){ pollFn(); });\r\n      pollTimeout = setTimeout(check, interval);\r\n    })();\r\n  }\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // URL API\r\n  //////////////////////////////////////////////////////////////\r\n\r\n  var lastBrowserUrl = location.href,\r\n      baseElement = document.find('base');\r\n\r\n  /**\r\n   * @name ng.$browser#url\r\n   * @methodOf ng.$browser\r\n   *\r\n   * @description\r\n   * GETTER:\r\n   * Without any argument, this method just returns current value of location.href.\r\n   *\r\n   * SETTER:\r\n   * With at least one argument, this method sets url to new value.\r\n   * If html5 history api supported, pushState/replaceState is used, otherwise\r\n   * location.href/location.replace is used.\r\n   * Returns its own instance to allow chaining\r\n   *\r\n   * NOTE: this api is intended for use only by the $location service. Please use the\r\n   * {@link ng.$location $location service} to change url.\r\n   *\r\n   * @param {string} url New url (when used as setter)\r\n   * @param {boolean=} replace Should new url replace current history record ?\r\n   */\r\n  self.url = function(url, replace) {\r\n    // setter\r\n    if (url) {\r\n      if (lastBrowserUrl == url) return;\r\n      lastBrowserUrl = url;\r\n      if ($sniffer.history) {\r\n        if (replace) history.replaceState(null, '', url);\r\n        else {\r\n          history.pushState(null, '', url);\r\n          // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462\r\n          baseElement.attr('href', baseElement.attr('href'));\r\n        }\r\n      } else {\r\n        if (replace) location.replace(url);\r\n        else location.href = url;\r\n      }\r\n      return self;\r\n    // getter\r\n    } else {\r\n      // the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\r\n      return location.href.replace(/%27/g,\"'\");\r\n    }\r\n  };\r\n\r\n  var urlChangeListeners = [],\r\n      urlChangeInit = false;\r\n\r\n  function fireUrlChange() {\r\n    if (lastBrowserUrl == self.url()) return;\r\n\r\n    lastBrowserUrl = self.url();\r\n    forEach(urlChangeListeners, function(listener) {\r\n      listener(self.url());\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @name ng.$browser#onUrlChange\r\n   * @methodOf ng.$browser\r\n   * @TODO(vojta): refactor to use node's syntax for events\r\n   *\r\n   * @description\r\n   * Register callback function that will be called, when url changes.\r\n   *\r\n   * It's only called when the url is changed by outside of angular:\r\n   * - user types different url into address bar\r\n   * - user clicks on history (forward/back) button\r\n   * - user clicks on a link\r\n   *\r\n   * It's not called when url is changed by $browser.url() method\r\n   *\r\n   * The listener gets called with new url as parameter.\r\n   *\r\n   * NOTE: this api is intended for use only by the $location service. Please use the\r\n   * {@link ng.$location $location service} to monitor url changes in angular apps.\r\n   *\r\n   * @param {function(string)} listener Listener function to be called when url changes.\r\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\r\n   */\r\n  self.onUrlChange = function(callback) {\r\n    if (!urlChangeInit) {\r\n      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)\r\n      // don't fire popstate when user change the address bar and don't fire hashchange when url\r\n      // changed by push/replaceState\r\n\r\n      // html5 history api - popstate event\r\n      if ($sniffer.history) jqLite(window).bind('popstate', fireUrlChange);\r\n      // hashchange event\r\n      if ($sniffer.hashchange) jqLite(window).bind('hashchange', fireUrlChange);\r\n      // polling\r\n      else self.addPollFn(fireUrlChange);\r\n\r\n      urlChangeInit = true;\r\n    }\r\n\r\n    urlChangeListeners.push(callback);\r\n    return callback;\r\n  };\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // Misc API\r\n  //////////////////////////////////////////////////////////////\r\n\r\n  /**\r\n   * Returns current <base href>\r\n   * (always relative - without domain)\r\n   *\r\n   * @returns {string=}\r\n   */\r\n  self.baseHref = function() {\r\n    var href = baseElement.attr('href');\r\n    return href ? href.replace(/^https?\\:\\/\\/[^\\/]*/, '') : href;\r\n  };\r\n\r\n  //////////////////////////////////////////////////////////////\r\n  // Cookies API\r\n  //////////////////////////////////////////////////////////////\r\n  var lastCookies = {};\r\n  var lastCookieString = '';\r\n  var cookiePath = self.baseHref();\r\n\r\n  /**\r\n   * @name ng.$browser#cookies\r\n   * @methodOf ng.$browser\r\n   *\r\n   * @param {string=} name Cookie name\r\n   * @param {string=} value Cokkie value\r\n   *\r\n   * @description\r\n   * The cookies method provides a 'private' low level access to browser cookies.\r\n   * It is not meant to be used directly, use the $cookie service instead.\r\n   *\r\n   * The return values vary depending on the arguments that the method was called with as follows:\r\n   * <ul>\r\n   *   <li>cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify it</li>\r\n   *   <li>cookies(name, value) -> set name to value, if value is undefined delete the cookie</li>\r\n   *   <li>cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way)</li>\r\n   * </ul>\r\n   *\r\n   * @returns {Object} Hash of all cookies (if called without any parameter)\r\n   */\r\n  self.cookies = function(name, value) {\r\n    var cookieLength, cookieArray, cookie, i, index;\r\n\r\n    if (name) {\r\n      if (value === undefined) {\r\n        rawDocument.cookie = escape(name) + \"=;path=\" + cookiePath + \";expires=Thu, 01 Jan 1970 00:00:00 GMT\";\r\n      } else {\r\n        if (isString(value)) {\r\n          cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath).length + 1;\r\n          if (cookieLength > 4096) {\r\n            $log.warn(\"Cookie '\"+ name +\"' possibly not set or overflowed because it was too large (\"+\r\n              cookieLength + \" > 4096 bytes)!\");\r\n          }\r\n          if (lastCookies.length > 20) {\r\n            $log.warn(\"Cookie '\"+ name +\"' possibly not set or overflowed because too many cookies \" +\r\n              \"were already set (\" + lastCookies.length + \" > 20 )\");\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      if (rawDocument.cookie !== lastCookieString) {\r\n        lastCookieString = rawDocument.cookie;\r\n        cookieArray = lastCookieString.split(\"; \");\r\n        lastCookies = {};\r\n\r\n        for (i = 0; i < cookieArray.length; i++) {\r\n          cookie = cookieArray[i];\r\n          index = cookie.indexOf('=');\r\n          if (index > 0) { //ignore nameless cookies\r\n            lastCookies[unescape(cookie.substring(0, index))] = unescape(cookie.substring(index + 1));\r\n          }\r\n        }\r\n      }\r\n      return lastCookies;\r\n    }\r\n  };\r\n\r\n\r\n  /**\r\n   * @name ng.$browser#defer\r\n   * @methodOf ng.$browser\r\n   * @param {function()} fn A function, who's execution should be defered.\r\n   * @param {number=} [delay=0] of milliseconds to defer the function execution.\r\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\r\n   *\r\n   * @description\r\n   * Executes a fn asynchroniously via `setTimeout(fn, delay)`.\r\n   *\r\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\r\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\r\n   * via `$browser.defer.flush()`.\r\n   *\r\n   */\r\n  self.defer = function(fn, delay) {\r\n    var timeoutId;\r\n    outstandingRequestCount++;\r\n    timeoutId = setTimeout(function() {\r\n      delete pendingDeferIds[timeoutId];\r\n      completeOutstandingRequest(fn);\r\n    }, delay || 0);\r\n    pendingDeferIds[timeoutId] = true;\r\n    return timeoutId;\r\n  };\r\n\r\n\r\n  /**\r\n   * @name ng.$browser#defer.cancel\r\n   * @methodOf ng.$browser.defer\r\n   *\r\n   * @description\r\n   * Cancels a defered task identified with `deferId`.\r\n   *\r\n   * @param {*} deferId Token returned by the `$browser.defer` function.\r\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfuly canceled.\r\n   */\r\n  self.defer.cancel = function(deferId) {\r\n    if (pendingDeferIds[deferId]) {\r\n      delete pendingDeferIds[deferId];\r\n      clearTimeout(deferId);\r\n      completeOutstandingRequest(noop);\r\n      return true;\r\n    }\r\n    return false;\r\n  };\r\n\r\n}\r\n\r\nfunction $BrowserProvider(){\r\n  this.$get = ['$window', '$log', '$sniffer', '$document',\r\n      function( $window,   $log,   $sniffer,   $document){\r\n        return new Browser($window, $document, $log, $sniffer);\r\n      }];\r\n}\r\n/**\r\n * @ngdoc object\r\n * @name ng.$cacheFactory\r\n *\r\n * @description\r\n * Factory that constructs cache objects.\r\n *\r\n *\r\n * @param {string} cacheId Name or id of the newly created cache.\r\n * @param {object=} options Options object that specifies the cache behavior. Properties:\r\n *\r\n *   - `{number=}` `capacity` â€” turns the cache into LRU cache.\r\n *\r\n * @returns {object} Newly created cache object with the following set of methods:\r\n *\r\n * - `{object}` `info()` â€” Returns id, size, and options of cache.\r\n * - `{void}` `put({string} key, {*} value)` â€” Puts a new key-value pair into the cache.\r\n * - `{{*}} `get({string} key) â€” Returns cached value for `key` or undefined for cache miss.\r\n * - `{void}` `remove({string} key) â€” Removes a key-value pair from the cache.\r\n * - `{void}` `removeAll() â€” Removes all cached values.\r\n * - `{void}` `destroy() â€” Removes references to this cache from $cacheFactory.\r\n *\r\n */\r\nfunction $CacheFactoryProvider() {\r\n\r\n  this.$get = function() {\r\n    var caches = {};\r\n\r\n    function cacheFactory(cacheId, options) {\r\n      if (cacheId in caches) {\r\n        throw Error('cacheId ' + cacheId + ' taken');\r\n      }\r\n\r\n      var size = 0,\r\n          stats = extend({}, options, {id: cacheId}),\r\n          data = {},\r\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\r\n          lruHash = {},\r\n          freshEnd = null,\r\n          staleEnd = null;\r\n\r\n      return caches[cacheId] = {\r\n\r\n        put: function(key, value) {\r\n          var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\r\n\r\n          refresh(lruEntry);\r\n\r\n          if (isUndefined(value)) return;\r\n          if (!(key in data)) size++;\r\n          data[key] = value;\r\n\r\n          if (size > capacity) {\r\n            this.remove(staleEnd.key);\r\n          }\r\n        },\r\n\r\n\r\n        get: function(key) {\r\n          var lruEntry = lruHash[key];\r\n\r\n          if (!lruEntry) return;\r\n\r\n          refresh(lruEntry);\r\n\r\n          return data[key];\r\n        },\r\n\r\n\r\n        remove: function(key) {\r\n          var lruEntry = lruHash[key];\r\n\r\n          if (lruEntry == freshEnd) freshEnd = lruEntry.p;\r\n          if (lruEntry == staleEnd) staleEnd = lruEntry.n;\r\n          link(lruEntry.n,lruEntry.p);\r\n\r\n          delete lruHash[key];\r\n          delete data[key];\r\n          size--;\r\n        },\r\n\r\n\r\n        removeAll: function() {\r\n          data = {};\r\n          size = 0;\r\n          lruHash = {};\r\n          freshEnd = staleEnd = null;\r\n        },\r\n\r\n\r\n        destroy: function() {\r\n          data = null;\r\n          stats = null;\r\n          lruHash = null;\r\n          delete caches[cacheId];\r\n        },\r\n\r\n\r\n        info: function() {\r\n          return extend({}, stats, {size: size});\r\n        }\r\n      };\r\n\r\n\r\n      /**\r\n       * makes the `entry` the freshEnd of the LRU linked list\r\n       */\r\n      function refresh(entry) {\r\n        if (entry != freshEnd) {\r\n          if (!staleEnd) {\r\n            staleEnd = entry;\r\n          } else if (staleEnd == entry) {\r\n            staleEnd = entry.n;\r\n          }\r\n\r\n          link(entry.n, entry.p);\r\n          link(entry, freshEnd);\r\n          freshEnd = entry;\r\n          freshEnd.n = null;\r\n        }\r\n      }\r\n\r\n\r\n      /**\r\n       * bidirectionally links two entries of the LRU linked list\r\n       */\r\n      function link(nextEntry, prevEntry) {\r\n        if (nextEntry != prevEntry) {\r\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\r\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\r\n        }\r\n      }\r\n    }\r\n\r\n\r\n    cacheFactory.info = function() {\r\n      var info = {};\r\n      forEach(caches, function(cache, cacheId) {\r\n        info[cacheId] = cache.info();\r\n      });\r\n      return info;\r\n    };\r\n\r\n\r\n    cacheFactory.get = function(cacheId) {\r\n      return caches[cacheId];\r\n    };\r\n\r\n\r\n    return cacheFactory;\r\n  };\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$templateCache\r\n *\r\n * @description\r\n * Cache used for storing html templates.\r\n *\r\n * See {@link ng.$cacheFactory $cacheFactory}.\r\n *\r\n */\r\nfunction $TemplateCacheProvider() {\r\n  this.$get = ['$cacheFactory', function($cacheFactory) {\r\n    return $cacheFactory('templates');\r\n  }];\r\n}\r\n\r\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\r\n *\r\n * DOM-related variables:\r\n *\r\n * - \"node\" - DOM Node\r\n * - \"element\" - DOM Element or Node\r\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\r\n *\r\n *\r\n * Compiler related stuff:\r\n *\r\n * - \"linkFn\" - linking fn of a single directive\r\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\r\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\r\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\r\n */\r\n\r\n\r\nvar NON_ASSIGNABLE_MODEL_EXPRESSION = 'Non-assignable model expression: ';\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$compile\r\n * @function\r\n *\r\n * @description\r\n * Compiles a piece of HTML string or DOM into a template and produces a template function, which\r\n * can then be used to link {@link ng.$rootScope.Scope scope} and the template together.\r\n *\r\n * The compilation is a process of walking the DOM tree and trying to match DOM elements to\r\n * {@link ng.$compileProvider.directive directives}. For each match it\r\n * executes corresponding template function and collects the\r\n * instance functions into a single template function which is then returned.\r\n *\r\n * The template function can then be used once to produce the view or as it is the case with\r\n * {@link ng.directive:ngRepeat repeater} many-times, in which\r\n * case each call results in a view that is a DOM clone of the original template.\r\n *\r\n <doc:example module=\"compile\">\r\n   <doc:source>\r\n    <script>\r\n      // declare a new module, and inject the $compileProvider\r\n      angular.module('compile', [], function($compileProvider) {\r\n        // configure new 'compile' directive by passing a directive\r\n        // factory function. The factory function injects the '$compile'\r\n        $compileProvider.directive('compile', function($compile) {\r\n          // directive factory creates a link function\r\n          return function(scope, element, attrs) {\r\n            scope.$watch(\r\n              function(scope) {\r\n                 // watch the 'compile' expression for changes\r\n                return scope.$eval(attrs.compile);\r\n              },\r\n              function(value) {\r\n                // when the 'compile' expression changes\r\n                // assign it into the current DOM\r\n                element.html(value);\r\n\r\n                // compile the new DOM and link it to the current\r\n                // scope.\r\n                // NOTE: we only compile .childNodes so that\r\n                // we don't get into infinite loop compiling ourselves\r\n                $compile(element.contents())(scope);\r\n              }\r\n            );\r\n          };\r\n        })\r\n      });\r\n\r\n      function Ctrl($scope) {\r\n        $scope.name = 'Angular';\r\n        $scope.html = 'Hello {{name}}';\r\n      }\r\n    </script>\r\n    <div ng-controller=\"Ctrl\">\r\n      <input ng-model=\"name\"> <br>\r\n      <textarea ng-model=\"html\"></textarea> <br>\r\n      <div compile=\"html\"></div>\r\n    </div>\r\n   </doc:source>\r\n   <doc:scenario>\r\n     it('should auto compile', function() {\r\n       expect(element('div[compile]').text()).toBe('Hello Angular');\r\n       input('html').enter('{{name}}!');\r\n       expect(element('div[compile]').text()).toBe('Angular!');\r\n     });\r\n   </doc:scenario>\r\n </doc:example>\r\n\r\n *\r\n *\r\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\r\n * @param {function(angular.Scope[, cloneAttachFn]} transclude function available to directives.\r\n * @param {number} maxPriority only apply directives lower then given priority (Only effects the\r\n *                 root element(s), not their children)\r\n * @returns {function(scope[, cloneAttachFn])} a link function which is used to bind template\r\n * (a DOM element/tree) to a scope. Where:\r\n *\r\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\r\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\r\n *               `template` and call the `cloneAttachFn` function allowing the caller to attach the\r\n *               cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\r\n *               called as: <br> `cloneAttachFn(clonedElement, scope)` where:\r\n *\r\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\r\n *      * `scope` - is the current scope with which the linking function is working with.\r\n *\r\n * Calling the linking function returns the element of the template. It is either the original element\r\n * passed in, or the clone of the element if the `cloneAttachFn` is provided.\r\n *\r\n * After linking the view is not updated until after a call to $digest which typically is done by\r\n * Angular automatically.\r\n *\r\n * If you need access to the bound view, there are two ways to do it:\r\n *\r\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\r\n *   before you send them to the compiler and keep this reference around.\r\n *   <pre>\r\n *     var element = $compile('<p>{{total}}</p>')(scope);\r\n *   </pre>\r\n *\r\n * - if on the other hand, you need the element to be cloned, the view reference from the original\r\n *   example would not point to the clone, but rather to the original template that was cloned. In\r\n *   this case, you can access the clone via the cloneAttachFn:\r\n *   <pre>\r\n *     var templateHTML = angular.element('<p>{{total}}</p>'),\r\n *         scope = ....;\r\n *\r\n *     var clonedElement = $compile(templateHTML)(scope, function(clonedElement, scope) {\r\n *       //attach the clone to DOM document at the right place\r\n *     });\r\n *\r\n *     //now we have reference to the cloned DOM via `clone`\r\n *   </pre>\r\n *\r\n *\r\n * For information on how the compiler works, see the\r\n * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc service\r\n * @name ng.$compileProvider\r\n * @function\r\n *\r\n * @description\r\n */\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$compileProvider#directive\r\n * @methodOf ng.$compileProvider\r\n * @function\r\n *\r\n * @description\r\n * Register a new directive with compiler\r\n *\r\n * @param {string} name name of the directive.\r\n * @param {function} directiveFactory An injectable directive factory function.\r\n * @returns {ng.$compileProvider} Self for chaining.\r\n */\r\n$CompileProvider.$inject = ['$provide'];\r\nfunction $CompileProvider($provide) {\r\n  var hasDirectives = {},\r\n      Suffix = 'Directive',\r\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive\\:\\s*([\\d\\w\\-_]+)\\s+(.*)$/,\r\n      CLASS_DIRECTIVE_REGEXP = /(([\\d\\w\\-_]+)(?:\\:([^;]+))?;?)/,\r\n      MULTI_ROOT_TEMPLATE_ERROR = 'Template must have exactly one root element. was: ';\r\n\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.$compileProvider.directive\r\n   * @methodOf ng.$compileProvider\r\n   * @function\r\n   *\r\n   * @description\r\n   * Register directives with the compiler.\r\n   *\r\n   * @param {string} name Name of the directive in camel-case. (ie <code>ngBind</code> which will match as\r\n   *                <code>ng-bind</code>).\r\n   * @param {function} directiveFactory An injectable directive factroy function. See {@link guide/directive} for more\r\n   *                info.\r\n   */\r\n   this.directive = function registerDirective(name, directiveFactory) {\r\n    if (isString(name)) {\r\n      assertArg(directiveFactory, 'directive');\r\n      if (!hasDirectives.hasOwnProperty(name)) {\r\n        hasDirectives[name] = [];\r\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\r\n          function($injector, $exceptionHandler) {\r\n            var directives = [];\r\n            forEach(hasDirectives[name], function(directiveFactory) {\r\n              try {\r\n                var directive = $injector.invoke(directiveFactory);\r\n                if (isFunction(directive)) {\r\n                  directive = { compile: valueFn(directive) };\r\n                } else if (!directive.compile && directive.link) {\r\n                  directive.compile = valueFn(directive.link);\r\n                }\r\n                directive.priority = directive.priority || 0;\r\n                directive.name = directive.name || name;\r\n                directive.require = directive.require || (directive.controller && directive.name);\r\n                directive.restrict = directive.restrict || 'A';\r\n                directives.push(directive);\r\n              } catch (e) {\r\n                $exceptionHandler(e);\r\n              }\r\n            });\r\n            return directives;\r\n          }]);\r\n      }\r\n      hasDirectives[name].push(directiveFactory);\r\n    } else {\r\n      forEach(name, reverseParams(registerDirective));\r\n    }\r\n    return this;\r\n  };\r\n\r\n\r\n  this.$get = [\r\n            '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',\r\n            '$controller', '$rootScope',\r\n    function($injector,   $interpolate,   $exceptionHandler,   $http,   $templateCache,   $parse,\r\n             $controller,   $rootScope) {\r\n\r\n    var Attributes = function(element, attr) {\r\n      this.$$element = element;\r\n      this.$attr = attr || {};\r\n    };\r\n\r\n    Attributes.prototype = {\r\n      $normalize: directiveNormalize,\r\n\r\n\r\n      /**\r\n       * Set a normalized attribute on the element in a way such that all directives\r\n       * can share the attribute. This function properly handles boolean attributes.\r\n       * @param {string} key Normalized key. (ie ngAttribute)\r\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\r\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\r\n       *     Defaults to true.\r\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\r\n       */\r\n      $set: function(key, value, writeAttr, attrName) {\r\n        var booleanKey = getBooleanAttrName(this.$$element[0], key),\r\n            $$observers = this.$$observers;\r\n\r\n        if (booleanKey) {\r\n          this.$$element.prop(key, value);\r\n          attrName = booleanKey;\r\n        }\r\n\r\n        this[key] = value;\r\n\r\n        // translate normalized key to actual key\r\n        if (attrName) {\r\n          this.$attr[key] = attrName;\r\n        } else {\r\n          attrName = this.$attr[key];\r\n          if (!attrName) {\r\n            this.$attr[key] = attrName = snake_case(key, '-');\r\n          }\r\n        }\r\n\r\n        if (writeAttr !== false) {\r\n          if (value === null || value === undefined) {\r\n            this.$$element.removeAttr(attrName);\r\n          } else {\r\n            this.$$element.attr(attrName, value);\r\n          }\r\n        }\r\n\r\n        // fire observers\r\n        $$observers && forEach($$observers[key], function(fn) {\r\n          try {\r\n            fn(value);\r\n          } catch (e) {\r\n            $exceptionHandler(e);\r\n          }\r\n        });\r\n      },\r\n\r\n\r\n      /**\r\n       * Observe an interpolated attribute.\r\n       * The observer will never be called, if given attribute is not interpolated.\r\n       *\r\n       * @param {string} key Normalized key. (ie ngAttribute) .\r\n       * @param {function(*)} fn Function that will be called whenever the attribute value changes.\r\n       * @returns {function(*)} the `fn` Function passed in.\r\n       */\r\n      $observe: function(key, fn) {\r\n        var attrs = this,\r\n            $$observers = (attrs.$$observers || (attrs.$$observers = {})),\r\n            listeners = ($$observers[key] || ($$observers[key] = []));\r\n\r\n        listeners.push(fn);\r\n        $rootScope.$evalAsync(function() {\r\n          if (!listeners.$$inter) {\r\n            // no one registered attribute interpolation function, so lets call it manually\r\n            fn(attrs[key]);\r\n          }\r\n        });\r\n        return fn;\r\n      }\r\n    };\r\n\r\n    return compile;\r\n\r\n    //================================\r\n\r\n    function compile($compileNode, transcludeFn, maxPriority) {\r\n      if (!($compileNode instanceof jqLite)) {\r\n        // jquery always rewraps, where as we need to preserve the original selector so that we can modify it.\r\n        $compileNode = jqLite($compileNode);\r\n      }\r\n      // We can not compile top level text elements since text nodes can be merged and we will\r\n      // not be able to attach scope data to them, so we will wrap them in <span>\r\n      forEach($compileNode, function(node, index){\r\n        if (node.nodeType == 3 /* text node */) {\r\n          $compileNode[index] = jqLite(node).wrap('<span>').parent()[0];\r\n        }\r\n      });\r\n      var compositeLinkFn = compileNodes($compileNode, transcludeFn, $compileNode, maxPriority);\r\n      return function(scope, cloneConnectFn){\r\n        assertArg(scope, 'scope');\r\n        // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\r\n        // and sometimes changes the structure of the DOM.\r\n        var $linkNode = cloneConnectFn\r\n          ? JQLitePrototype.clone.call($compileNode) // IMPORTANT!!!\r\n          : $compileNode;\r\n        $linkNode.data('$scope', scope);\r\n        safeAddClass($linkNode, 'ng-scope');\r\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\r\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);\r\n        return $linkNode;\r\n      };\r\n    }\r\n\r\n    function wrongMode(localName, mode) {\r\n      throw Error(\"Unsupported '\" + mode + \"' for '\" + localName + \"'.\");\r\n    }\r\n\r\n    function safeAddClass($element, className) {\r\n      try {\r\n        $element.addClass(className);\r\n      } catch(e) {\r\n        // ignore, since it means that we are trying to set class on\r\n        // SVG element, where class name is read-only.\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Compile function matches each node in nodeList against the directives. Once all directives\r\n     * for a particular node are collected their compile functions are executed. The compile\r\n     * functions return values - the linking functions - are combined into a composite linking\r\n     * function, which is the a linking function for the node.\r\n     *\r\n     * @param {NodeList} nodeList an array of nodes to compile\r\n     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the\r\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\r\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then the\r\n     *        rootElement must be set the jqLite collection of the compile root. This is\r\n     *        needed so that the jqLite collection items can be replaced with widgets.\r\n     * @param {number=} max directive priority\r\n     * @returns {?function} A composite linking function of all of the matched directives or null.\r\n     */\r\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority) {\r\n     var linkFns = [],\r\n         nodeLinkFn, childLinkFn, directives, attrs, linkFnFound;\r\n\r\n     for(var i = 0; i < nodeList.length; i++) {\r\n       attrs = new Attributes();\r\n\r\n       // we must always refer to nodeList[i] since the nodes can be replaced underneath us.\r\n       directives = collectDirectives(nodeList[i], [], attrs, maxPriority);\r\n\r\n       nodeLinkFn = (directives.length)\r\n           ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement)\r\n           : null;\r\n\r\n       childLinkFn = (nodeLinkFn && nodeLinkFn.terminal)\r\n           ? null\r\n           : compileNodes(nodeList[i].childNodes,\r\n                nodeLinkFn ? nodeLinkFn.transclude : transcludeFn);\r\n\r\n       linkFns.push(nodeLinkFn);\r\n       linkFns.push(childLinkFn);\r\n       linkFnFound = (linkFnFound || nodeLinkFn || childLinkFn);\r\n     }\r\n\r\n     // return a linking function if we have found anything, null otherwise\r\n     return linkFnFound ? compositeLinkFn : null;\r\n\r\n     function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) {\r\n       var nodeLinkFn, childLinkFn, node, childScope, childTranscludeFn;\r\n\r\n       for(var i = 0, n = 0, ii = linkFns.length; i < ii; n++) {\r\n         node = nodeList[n];\r\n         nodeLinkFn = linkFns[i++];\r\n         childLinkFn = linkFns[i++];\r\n\r\n         if (nodeLinkFn) {\r\n           if (nodeLinkFn.scope) {\r\n             childScope = scope.$new(isObject(nodeLinkFn.scope));\r\n             jqLite(node).data('$scope', childScope);\r\n           } else {\r\n             childScope = scope;\r\n           }\r\n           childTranscludeFn = nodeLinkFn.transclude;\r\n           if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) {\r\n             nodeLinkFn(childLinkFn, childScope, node, $rootElement,\r\n                 (function(transcludeFn) {\r\n                   return function(cloneFn) {\r\n                     var transcludeScope = scope.$new();\r\n\r\n                     return transcludeFn(transcludeScope, cloneFn).\r\n                         bind('$destroy', bind(transcludeScope, transcludeScope.$destroy));\r\n                    };\r\n                  })(childTranscludeFn || transcludeFn)\r\n             );\r\n           } else {\r\n             nodeLinkFn(childLinkFn, childScope, node, undefined, boundTranscludeFn);\r\n           }\r\n         } else if (childLinkFn) {\r\n           childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);\r\n         }\r\n       }\r\n     }\r\n   }\r\n\r\n\r\n    /**\r\n     * Looks for directives on the given node ands them to the directive collection which is sorted.\r\n     *\r\n     * @param node node to search\r\n     * @param directives an array to which the directives are added to. This array is sorted before\r\n     *        the function returns.\r\n     * @param attrs the shared attrs object which is used to populate the normalized attributes.\r\n     * @param {number=} max directive priority\r\n     */\r\n    function collectDirectives(node, directives, attrs, maxPriority) {\r\n      var nodeType = node.nodeType,\r\n          attrsMap = attrs.$attr,\r\n          match,\r\n          className;\r\n\r\n      switch(nodeType) {\r\n        case 1: /* Element */\r\n          // use the node name: <directive>\r\n          addDirective(directives,\r\n              directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority);\r\n\r\n          // iterate over the attributes\r\n          for (var attr, name, nName, value, nAttrs = node.attributes,\r\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\r\n            attr = nAttrs[j];\r\n            if (attr.specified) {\r\n              name = attr.name;\r\n              nName = directiveNormalize(name.toLowerCase());\r\n              attrsMap[nName] = name;\r\n              attrs[nName] = value = trim((msie && name == 'href')\r\n                ? decodeURIComponent(node.getAttribute(name, 2))\r\n                : attr.value);\r\n              if (getBooleanAttrName(node, nName)) {\r\n                attrs[nName] = true; // presence means true\r\n              }\r\n              addAttrInterpolateDirective(node, directives, value, nName);\r\n              addDirective(directives, nName, 'A', maxPriority);\r\n            }\r\n          }\r\n\r\n          // use class as directive\r\n          className = node.className;\r\n          if (isString(className)) {\r\n            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {\r\n              nName = directiveNormalize(match[2]);\r\n              if (addDirective(directives, nName, 'C', maxPriority)) {\r\n                attrs[nName] = trim(match[3]);\r\n              }\r\n              className = className.substr(match.index + match[0].length);\r\n            }\r\n          }\r\n          break;\r\n        case 3: /* Text Node */\r\n          addTextInterpolateDirective(directives, node.nodeValue);\r\n          break;\r\n        case 8: /* Comment */\r\n          try {\r\n            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\r\n            if (match) {\r\n              nName = directiveNormalize(match[1]);\r\n              if (addDirective(directives, nName, 'M', maxPriority)) {\r\n                attrs[nName] = trim(match[2]);\r\n              }\r\n            }\r\n          } catch (e) {\r\n            // turns out that under some circumstances IE9 throws errors when one attempts to read comment's node value.\r\n            // Just ignore it and continue. (Can't seem to reproduce in test case.)\r\n          }\r\n          break;\r\n      }\r\n\r\n      directives.sort(byPriority);\r\n      return directives;\r\n    }\r\n\r\n\r\n    /**\r\n     * Once the directives have been collected their compile functions is executed. This method\r\n     * is responsible for inlining directive templates as well as terminating the application\r\n     * of the directives if the terminal directive has been reached..\r\n     *\r\n     * @param {Array} directives Array of collected directives to execute their compile function.\r\n     *        this needs to be pre-sorted by priority order.\r\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\r\n     * @param {Object} templateAttrs The shared attribute function\r\n     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the\r\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\r\n     * @param {DOMElement} $rootElement If we are working on the root of the compile tree then this\r\n     *        argument has the root jqLite array so that we can replace widgets on it.\r\n     * @returns linkFn\r\n     */\r\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, $rootElement) {\r\n      var terminalPriority = -Number.MAX_VALUE,\r\n          preLinkFns = [],\r\n          postLinkFns = [],\r\n          newScopeDirective = null,\r\n          newIsolatedScopeDirective = null,\r\n          templateDirective = null,\r\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\r\n          directive,\r\n          directiveName,\r\n          $template,\r\n          transcludeDirective,\r\n          childTranscludeFn = transcludeFn,\r\n          controllerDirectives,\r\n          linkFn,\r\n          directiveValue;\r\n\r\n      // executes all directives on the current element\r\n      for(var i = 0, ii = directives.length; i < ii; i++) {\r\n        directive = directives[i];\r\n        $template = undefined;\r\n\r\n        if (terminalPriority > directive.priority) {\r\n          break; // prevent further processing of directives\r\n        }\r\n\r\n        if (directiveValue = directive.scope) {\r\n          assertNoDuplicate('isolated scope', newIsolatedScopeDirective, directive, $compileNode);\r\n          if (isObject(directiveValue)) {\r\n            safeAddClass($compileNode, 'ng-isolate-scope');\r\n            newIsolatedScopeDirective = directive;\r\n          }\r\n          safeAddClass($compileNode, 'ng-scope');\r\n          newScopeDirective = newScopeDirective || directive;\r\n        }\r\n\r\n        directiveName = directive.name;\r\n\r\n        if (directiveValue = directive.controller) {\r\n          controllerDirectives = controllerDirectives || {};\r\n          assertNoDuplicate(\"'\" + directiveName + \"' controller\",\r\n              controllerDirectives[directiveName], directive, $compileNode);\r\n          controllerDirectives[directiveName] = directive;\r\n        }\r\n\r\n        if (directiveValue = directive.transclude) {\r\n          assertNoDuplicate('transclusion', transcludeDirective, directive, $compileNode);\r\n          transcludeDirective = directive;\r\n          terminalPriority = directive.priority;\r\n          if (directiveValue == 'element') {\r\n            $template = jqLite(compileNode);\r\n            $compileNode = templateAttrs.$$element =\r\n                jqLite('<!-- ' + directiveName + ': ' + templateAttrs[directiveName]  + ' -->');\r\n            compileNode = $compileNode[0];\r\n            replaceWith($rootElement, jqLite($template[0]), compileNode);\r\n            childTranscludeFn = compile($template, transcludeFn, terminalPriority);\r\n          } else {\r\n            $template = jqLite(JQLiteClone(compileNode)).contents();\r\n            $compileNode.html(''); // clear contents\r\n            childTranscludeFn = compile($template, transcludeFn);\r\n          }\r\n        }\r\n\r\n        if (directiveValue = directive.template) {\r\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\r\n          templateDirective = directive;\r\n\r\n          $template = jqLite('<div>' + trim(directiveValue) + '</div>').contents();\r\n          compileNode = $template[0];\r\n\r\n          if (directive.replace) {\r\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\r\n              throw new Error(MULTI_ROOT_TEMPLATE_ERROR + directiveValue);\r\n            }\r\n\r\n            replaceWith($rootElement, $compileNode, compileNode);\r\n\r\n            var newTemplateAttrs = {$attr: {}};\r\n\r\n            // combine directives from the original node and from the template:\r\n            // - take the array of directives for this element\r\n            // - split it into two parts, those that were already applied and those that weren't\r\n            // - collect directives from the template, add them to the second group and sort them\r\n            // - append the second group with new directives to the first group\r\n            directives = directives.concat(\r\n                collectDirectives(\r\n                    compileNode,\r\n                    directives.splice(i + 1, directives.length - (i + 1)),\r\n                    newTemplateAttrs\r\n                )\r\n            );\r\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\r\n\r\n            ii = directives.length;\r\n          } else {\r\n            $compileNode.html(directiveValue);\r\n          }\r\n        }\r\n\r\n        if (directive.templateUrl) {\r\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\r\n          templateDirective = directive;\r\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i),\r\n              nodeLinkFn, $compileNode, templateAttrs, $rootElement, directive.replace,\r\n              childTranscludeFn);\r\n          ii = directives.length;\r\n        } else if (directive.compile) {\r\n          try {\r\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\r\n            if (isFunction(linkFn)) {\r\n              addLinkFns(null, linkFn);\r\n            } else if (linkFn) {\r\n              addLinkFns(linkFn.pre, linkFn.post);\r\n            }\r\n          } catch (e) {\r\n            $exceptionHandler(e, startingTag($compileNode));\r\n          }\r\n        }\r\n\r\n        if (directive.terminal) {\r\n          nodeLinkFn.terminal = true;\r\n          terminalPriority = Math.max(terminalPriority, directive.priority);\r\n        }\r\n\r\n      }\r\n\r\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope;\r\n      nodeLinkFn.transclude = transcludeDirective && childTranscludeFn;\r\n\r\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\r\n      return nodeLinkFn;\r\n\r\n      ////////////////////\r\n\r\n      function addLinkFns(pre, post) {\r\n        if (pre) {\r\n          pre.require = directive.require;\r\n          preLinkFns.push(pre);\r\n        }\r\n        if (post) {\r\n          post.require = directive.require;\r\n          postLinkFns.push(post);\r\n        }\r\n      }\r\n\r\n\r\n      function getControllers(require, $element) {\r\n        var value, retrievalMethod = 'data', optional = false;\r\n        if (isString(require)) {\r\n          while((value = require.charAt(0)) == '^' || value == '?') {\r\n            require = require.substr(1);\r\n            if (value == '^') {\r\n              retrievalMethod = 'inheritedData';\r\n            }\r\n            optional = optional || value == '?';\r\n          }\r\n          value = $element[retrievalMethod]('$' + require + 'Controller');\r\n          if (!value && !optional) {\r\n            throw Error(\"No controller: \" + require);\r\n          }\r\n          return value;\r\n        } else if (isArray(require)) {\r\n          value = [];\r\n          forEach(require, function(require) {\r\n            value.push(getControllers(require, $element));\r\n          });\r\n        }\r\n        return value;\r\n      }\r\n\r\n\r\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\r\n        var attrs, $element, i, ii, linkFn, controller;\r\n\r\n        if (compileNode === linkNode) {\r\n          attrs = templateAttrs;\r\n        } else {\r\n          attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));\r\n        }\r\n        $element = attrs.$$element;\r\n\r\n        if (newScopeDirective && isObject(newScopeDirective.scope)) {\r\n          var LOCAL_REGEXP = /^\\s*([@=&])\\s*(\\w*)\\s*$/;\r\n\r\n          var parentScope = scope.$parent || scope;\r\n\r\n          forEach(newScopeDirective.scope, function(definiton, scopeName) {\r\n            var match = definiton.match(LOCAL_REGEXP) || [],\r\n                attrName = match[2]|| scopeName,\r\n                mode = match[1], // @, =, or &\r\n                lastValue,\r\n                parentGet, parentSet;\r\n\r\n            switch (mode) {\r\n\r\n              case '@': {\r\n                attrs.$observe(attrName, function(value) {\r\n                  scope[scopeName] = value;\r\n                });\r\n                attrs.$$observers[attrName].$$scope = parentScope;\r\n                break;\r\n              }\r\n\r\n              case '=': {\r\n                parentGet = $parse(attrs[attrName]);\r\n                parentSet = parentGet.assign || function() {\r\n                  // reset the change, or we will throw this exception on every $digest\r\n                  lastValue = scope[scopeName] = parentGet(parentScope);\r\n                  throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] +\r\n                      ' (directive: ' + newScopeDirective.name + ')');\r\n                };\r\n                lastValue = scope[scopeName] = parentGet(parentScope);\r\n                scope.$watch(function() {\r\n                  var parentValue = parentGet(parentScope);\r\n\r\n                  if (parentValue !== scope[scopeName]) {\r\n                    // we are out of sync and need to copy\r\n                    if (parentValue !== lastValue) {\r\n                      // parent changed and it has precedence\r\n                      lastValue = scope[scopeName] = parentValue;\r\n                    } else {\r\n                      // if the parent can be assigned then do so\r\n                      parentSet(parentScope, lastValue = scope[scopeName]);\r\n                    }\r\n                  }\r\n                  return parentValue;\r\n                });\r\n                break;\r\n              }\r\n\r\n              case '&': {\r\n                parentGet = $parse(attrs[attrName]);\r\n                scope[scopeName] = function(locals) {\r\n                  return parentGet(parentScope, locals);\r\n                }\r\n                break;\r\n              }\r\n\r\n              default: {\r\n                throw Error('Invalid isolate scope definition for directive ' +\r\n                    newScopeDirective.name + ': ' + definiton);\r\n              }\r\n            }\r\n          });\r\n        }\r\n\r\n        if (controllerDirectives) {\r\n          forEach(controllerDirectives, function(directive) {\r\n            var locals = {\r\n              $scope: scope,\r\n              $element: $element,\r\n              $attrs: attrs,\r\n              $transclude: boundTranscludeFn\r\n            };\r\n\r\n            controller = directive.controller;\r\n            if (controller == '@') {\r\n              controller = attrs[directive.name];\r\n            }\r\n\r\n            $element.data(\r\n                '$' + directive.name + 'Controller',\r\n                $controller(controller, locals));\r\n          });\r\n        }\r\n\r\n        // PRELINKING\r\n        for(i = 0, ii = preLinkFns.length; i < ii; i++) {\r\n          try {\r\n            linkFn = preLinkFns[i];\r\n            linkFn(scope, $element, attrs,\r\n                linkFn.require && getControllers(linkFn.require, $element));\r\n          } catch (e) {\r\n            $exceptionHandler(e, startingTag($element));\r\n          }\r\n        }\r\n\r\n        // RECURSION\r\n        childLinkFn && childLinkFn(scope, linkNode.childNodes, undefined, boundTranscludeFn);\r\n\r\n        // POSTLINKING\r\n        for(i = 0, ii = postLinkFns.length; i < ii; i++) {\r\n          try {\r\n            linkFn = postLinkFns[i];\r\n            linkFn(scope, $element, attrs,\r\n                linkFn.require && getControllers(linkFn.require, $element));\r\n          } catch (e) {\r\n            $exceptionHandler(e, startingTag($element));\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n\r\n    /**\r\n     * looks up the directive and decorates it with exception handling and proper parameters. We\r\n     * call this the boundDirective.\r\n     *\r\n     * @param {string} name name of the directive to look up.\r\n     * @param {string} location The directive must be found in specific format.\r\n     *   String containing any of theses characters:\r\n     *\r\n     *   * `E`: element name\r\n     *   * `A': attribute\r\n     *   * `C`: class\r\n     *   * `M`: comment\r\n     * @returns true if directive was added.\r\n     */\r\n    function addDirective(tDirectives, name, location, maxPriority) {\r\n      var match = false;\r\n      if (hasDirectives.hasOwnProperty(name)) {\r\n        for(var directive, directives = $injector.get(name + Suffix),\r\n            i = 0, ii = directives.length; i<ii; i++) {\r\n          try {\r\n            directive = directives[i];\r\n            if ( (maxPriority === undefined || maxPriority > directive.priority) &&\r\n                 directive.restrict.indexOf(location) != -1) {\r\n              tDirectives.push(directive);\r\n              match = true;\r\n            }\r\n          } catch(e) { $exceptionHandler(e); }\r\n        }\r\n      }\r\n      return match;\r\n    }\r\n\r\n\r\n    /**\r\n     * When the element is replaced with HTML template then the new attributes\r\n     * on the template need to be merged with the existing attributes in the DOM.\r\n     * The desired effect is to have both of the attributes present.\r\n     *\r\n     * @param {object} dst destination attributes (original DOM)\r\n     * @param {object} src source attributes (from the directive template)\r\n     */\r\n    function mergeTemplateAttributes(dst, src) {\r\n      var srcAttr = src.$attr,\r\n          dstAttr = dst.$attr,\r\n          $element = dst.$$element;\r\n\r\n      // reapply the old attributes to the new element\r\n      forEach(dst, function(value, key) {\r\n        if (key.charAt(0) != '$') {\r\n          if (src[key]) {\r\n            value += (key === 'style' ? ';' : ' ') + src[key];\r\n          }\r\n          dst.$set(key, value, true, srcAttr[key]);\r\n        }\r\n      });\r\n\r\n      // copy the new attributes on the old attrs object\r\n      forEach(src, function(value, key) {\r\n        if (key == 'class') {\r\n          safeAddClass($element, value);\r\n          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;\r\n        } else if (key == 'style') {\r\n          $element.attr('style', $element.attr('style') + ';' + value);\r\n        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {\r\n          dst[key] = value;\r\n          dstAttr[key] = srcAttr[key];\r\n        }\r\n      });\r\n    }\r\n\r\n\r\n    function compileTemplateUrl(directives, beforeTemplateNodeLinkFn, $compileNode, tAttrs,\r\n        $rootElement, replace, childTranscludeFn) {\r\n      var linkQueue = [],\r\n          afterTemplateNodeLinkFn,\r\n          afterTemplateChildLinkFn,\r\n          beforeTemplateCompileNode = $compileNode[0],\r\n          origAsyncDirective = directives.shift(),\r\n          // The fact that we have to copy and patch the directive seems wrong!\r\n          derivedSyncDirective = extend({}, origAsyncDirective, {\r\n            controller: null, templateUrl: null, transclude: null\r\n          });\r\n\r\n      $compileNode.html('');\r\n\r\n      $http.get(origAsyncDirective.templateUrl, {cache: $templateCache}).\r\n        success(function(content) {\r\n          var compileNode, tempTemplateAttrs, $template;\r\n\r\n          if (replace) {\r\n            $template = jqLite('<div>' + trim(content) + '</div>').contents();\r\n            compileNode = $template[0];\r\n\r\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\r\n              throw new Error(MULTI_ROOT_TEMPLATE_ERROR + content);\r\n            }\r\n\r\n            tempTemplateAttrs = {$attr: {}};\r\n            replaceWith($rootElement, $compileNode, compileNode);\r\n            collectDirectives(compileNode, directives, tempTemplateAttrs);\r\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\r\n          } else {\r\n            compileNode = beforeTemplateCompileNode;\r\n            $compileNode.html(content);\r\n          }\r\n\r\n          directives.unshift(derivedSyncDirective);\r\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, $compileNode, tAttrs, childTranscludeFn);\r\n          afterTemplateChildLinkFn = compileNodes($compileNode.contents(), childTranscludeFn);\r\n\r\n\r\n          while(linkQueue.length) {\r\n            var controller = linkQueue.pop(),\r\n                linkRootElement = linkQueue.pop(),\r\n                beforeTemplateLinkNode = linkQueue.pop(),\r\n                scope = linkQueue.pop(),\r\n                linkNode = compileNode;\r\n\r\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\r\n              // it was cloned therefore we have to clone as well.\r\n              linkNode = JQLiteClone(compileNode);\r\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\r\n            }\r\n\r\n            afterTemplateNodeLinkFn(function() {\r\n              beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, controller);\r\n            }, scope, linkNode, $rootElement, controller);\r\n          }\r\n          linkQueue = null;\r\n        }).\r\n        error(function(response, code, headers, config) {\r\n          throw Error('Failed to load template: ' + config.url);\r\n        });\r\n\r\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, controller) {\r\n        if (linkQueue) {\r\n          linkQueue.push(scope);\r\n          linkQueue.push(node);\r\n          linkQueue.push(rootElement);\r\n          linkQueue.push(controller);\r\n        } else {\r\n          afterTemplateNodeLinkFn(function() {\r\n            beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, controller);\r\n          }, scope, node, rootElement, controller);\r\n        }\r\n      };\r\n    }\r\n\r\n\r\n    /**\r\n     * Sorting function for bound directives.\r\n     */\r\n    function byPriority(a, b) {\r\n      return b.priority - a.priority;\r\n    }\r\n\r\n\r\n    function assertNoDuplicate(what, previousDirective, directive, element) {\r\n      if (previousDirective) {\r\n        throw Error('Multiple directives [' + previousDirective.name + ', ' +\r\n          directive.name + '] asking for ' + what + ' on: ' +  startingTag(element));\r\n      }\r\n    }\r\n\r\n\r\n    function addTextInterpolateDirective(directives, text) {\r\n      var interpolateFn = $interpolate(text, true);\r\n      if (interpolateFn) {\r\n        directives.push({\r\n          priority: 0,\r\n          compile: valueFn(function(scope, node) {\r\n            var parent = node.parent(),\r\n                bindings = parent.data('$binding') || [];\r\n            bindings.push(interpolateFn);\r\n            safeAddClass(parent.data('$binding', bindings), 'ng-binding');\r\n            scope.$watch(interpolateFn, function(value) {\r\n              node[0].nodeValue = value;\r\n            });\r\n          })\r\n        });\r\n      }\r\n    }\r\n\r\n\r\n    function addAttrInterpolateDirective(node, directives, value, name) {\r\n      var interpolateFn = $interpolate(value, true);\r\n\r\n\r\n      // no interpolation found -> ignore\r\n      if (!interpolateFn) return;\r\n\r\n      directives.push({\r\n        priority: 100,\r\n        compile: valueFn(function(scope, element, attr) {\r\n          var $$observers = (attr.$$observers || (attr.$$observers = {}));\r\n\r\n          if (name === 'class') {\r\n            // we need to interpolate classes again, in the case the element was replaced\r\n            // and therefore the two class attrs got merged - we want to interpolate the result\r\n            interpolateFn = $interpolate(attr[name], true);\r\n          }\r\n\r\n          attr[name] = undefined;\r\n          ($$observers[name] || ($$observers[name] = [])).$$inter = true;\r\n          (attr.$$observers && attr.$$observers[name].$$scope || scope).\r\n            $watch(interpolateFn, function(value) {\r\n              attr.$set(name, value);\r\n            });\r\n        })\r\n      });\r\n    }\r\n\r\n\r\n    /**\r\n     * This is a special jqLite.replaceWith, which can replace items which\r\n     * have no parents, provided that the containing jqLite collection is provided.\r\n     *\r\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\r\n     *    in the root of the tree.\r\n     * @param {JqLite} $element The jqLite element which we are going to replace. We keep the shell,\r\n     *    but replace its DOM node reference.\r\n     * @param {Node} newNode The new DOM node.\r\n     */\r\n    function replaceWith($rootElement, $element, newNode) {\r\n      var oldNode = $element[0],\r\n          parent = oldNode.parentNode,\r\n          i, ii;\r\n\r\n      if ($rootElement) {\r\n        for(i = 0, ii = $rootElement.length; i < ii; i++) {\r\n          if ($rootElement[i] == oldNode) {\r\n            $rootElement[i] = newNode;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n\r\n      if (parent) {\r\n        parent.replaceChild(newNode, oldNode);\r\n      }\r\n\r\n      newNode[jqLite.expando] = oldNode[jqLite.expando];\r\n      $element[0] = newNode;\r\n    }\r\n  }];\r\n}\r\n\r\nvar PREFIX_REGEXP = /^(x[\\:\\-_]|data[\\:\\-_])/i;\r\n/**\r\n * Converts all accepted directives format into proper directive name.\r\n * All of these will become 'myDirective':\r\n *   my:DiRective\r\n *   my-directive\r\n *   x-my-directive\r\n *   data-my:directive\r\n *\r\n * Also there is special case for Moz prefix starting with upper case letter.\r\n * @param name Name to normalize\r\n */\r\nfunction directiveNormalize(name) {\r\n  return camelCase(name.replace(PREFIX_REGEXP, ''));\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$compile.directive.Attributes\r\n * @description\r\n *\r\n * A shared object between directive compile / linking functions which contains normalized DOM element\r\n * attributes. The the values reflect current binding state `{{ }}`. The normalization is needed\r\n * since all of these are treated as equivalent in Angular:\r\n *\r\n *          <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\r\n */\r\n\r\n/**\r\n * @ngdoc property\r\n * @name ng.$compile.directive.Attributes#$attr\r\n * @propertyOf ng.$compile.directive.Attributes\r\n * @returns {object} A map of DOM element attribute names to the normalized name. This is\r\n *          needed to do reverse lookup from normalized name back to actual name.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$compile.directive.Attributes#$set\r\n * @methodOf ng.$compile.directive.Attributes\r\n * @function\r\n *\r\n * @description\r\n * Set DOM element attribute value.\r\n *\r\n *\r\n * @param {string} name Normalized element attribute name of the property to modify. The name is\r\n *          revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\r\n *          property to the original name.\r\n * @param {string} value Value to set the attribute to.\r\n */\r\n\r\n\r\n\r\n/**\r\n * Closure compiler type information\r\n */\r\n\r\nfunction nodesetLinkingFn(\r\n  /* angular.Scope */ scope,\r\n  /* NodeList */ nodeList,\r\n  /* Element */ rootElement,\r\n  /* function(Function) */ boundTranscludeFn\r\n){}\r\n\r\nfunction directiveLinkingFn(\r\n  /* nodesetLinkingFn */ nodesetLinkingFn,\r\n  /* angular.Scope */ scope,\r\n  /* Node */ node,\r\n  /* Element */ rootElement,\r\n  /* function(Function) */ boundTranscludeFn\r\n){}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$controllerProvider\r\n * @description\r\n * The {@link ng.$controller $controller service} is used by Angular to create new\r\n * controllers.\r\n *\r\n * This provider allows controller registration via the\r\n * {@link ng.$controllerProvider#register register} method.\r\n */\r\nfunction $ControllerProvider() {\r\n  var controllers = {};\r\n\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.$controllerProvider#register\r\n   * @methodOf ng.$controllerProvider\r\n   * @param {string} name Controller name\r\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\r\n   *    annotations in the array notation).\r\n   */\r\n  this.register = function(name, constructor) {\r\n    if (isObject(name)) {\r\n      extend(controllers, name)\r\n    } else {\r\n      controllers[name] = constructor;\r\n    }\r\n  };\r\n\r\n\r\n  this.$get = ['$injector', '$window', function($injector, $window) {\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$controller\r\n     * @requires $injector\r\n     *\r\n     * @param {Function|string} constructor If called with a function then it's considered to be the\r\n     *    controller constructor function. Otherwise it's considered to be a string which is used\r\n     *    to retrieve the controller constructor using the following steps:\r\n     *\r\n     *    * check if a controller with given name is registered via `$controllerProvider`\r\n     *    * check if evaluating the string on the current scope returns a constructor\r\n     *    * check `window[constructor]` on the global `window` object\r\n     *\r\n     * @param {Object} locals Injection locals for Controller.\r\n     * @return {Object} Instance of given controller.\r\n     *\r\n     * @description\r\n     * `$controller` service is responsible for instantiating controllers.\r\n     *\r\n     * It's just simple call to {@link AUTO.$injector $injector}, but extracted into\r\n     * a service, so that one can override this service with {@link https://gist.github.com/1649788\r\n     * BC version}.\r\n     */\r\n    return function(constructor, locals) {\r\n      if(isString(constructor)) {\r\n        var name = constructor;\r\n        constructor = controllers.hasOwnProperty(name)\r\n            ? controllers[name]\r\n            : getter(locals.$scope, name, true) || getter($window, name, true);\r\n\r\n        assertArgFn(constructor, name, true);\r\n      }\r\n\r\n      return $injector.instantiate(constructor, locals);\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$document\r\n * @requires $window\r\n *\r\n * @description\r\n * A {@link angular.element jQuery (lite)}-wrapped reference to the browser's `window.document`\r\n * element.\r\n */\r\nfunction $DocumentProvider(){\r\n  this.$get = ['$window', function(window){\r\n    return jqLite(window.document);\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$exceptionHandler\r\n * @requires $log\r\n *\r\n * @description\r\n * Any uncaught exception in angular expressions is delegated to this service.\r\n * The default implementation simply delegates to `$log.error` which logs it into\r\n * the browser console.\r\n *\r\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\r\n * {@link ngMock.$exceptionHandler mock $exceptionHandler}\r\n *\r\n * @param {Error} exception Exception associated with the error.\r\n * @param {string=} cause optional information about the context in which\r\n *       the error was thrown.\r\n */\r\nfunction $ExceptionHandlerProvider() {\r\n  this.$get = ['$log', function($log){\r\n    return function(exception, cause) {\r\n      $log.error.apply($log, arguments);\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$interpolateProvider\r\n * @function\r\n *\r\n * @description\r\n *\r\n * Used for configuring the interpolation markup. Deafults to `{{` and `}}`.\r\n */\r\nfunction $InterpolateProvider() {\r\n  var startSymbol = '{{';\r\n  var endSymbol = '}}';\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$interpolateProvider#startSymbol\r\n   * @methodOf ng.$interpolateProvider\r\n   * @description\r\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\r\n   *\r\n   * @prop {string=} value new value to set the starting symbol to.\r\n   */\r\n  this.startSymbol = function(value){\r\n    if (value) {\r\n      startSymbol = value;\r\n      return this;\r\n    } else {\r\n      return startSymbol;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$interpolateProvider#endSymbol\r\n   * @methodOf ng.$interpolateProvider\r\n   * @description\r\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\r\n   *\r\n   * @prop {string=} value new value to set the ending symbol to.\r\n   */\r\n  this.endSymbol = function(value){\r\n    if (value) {\r\n      endSymbol = value;\r\n      return this;\r\n    } else {\r\n      return startSymbol;\r\n    }\r\n  };\r\n\r\n\r\n  this.$get = ['$parse', function($parse) {\r\n    var startSymbolLength = startSymbol.length,\r\n        endSymbolLength = endSymbol.length;\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$interpolate\r\n     * @function\r\n     *\r\n     * @requires $parse\r\n     *\r\n     * @description\r\n     *\r\n     * Compiles a string with markup into an interpolation function. This service is used by the\r\n     * HTML {@link ng.$compile $compile} service for data binding. See\r\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\r\n     * interpolation markup.\r\n     *\r\n     *\r\n       <pre>\r\n         var $interpolate = ...; // injected\r\n         var exp = $interpolate('Hello {{name}}!');\r\n         expect(exp({name:'Angular'}).toEqual('Hello Angular!');\r\n       </pre>\r\n     *\r\n     *\r\n     * @param {string} text The text with markup to interpolate.\r\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\r\n     *    embedded expression in order to return an interpolation function. Strings with no\r\n     *    embedded expression will return null for the interpolation function.\r\n     * @returns {function(context)} an interpolation function which is used to compute the interpolated\r\n     *    string. The function has these parameters:\r\n     *\r\n     *    * `context`: an object against which any expressions embedded in the strings are evaluated\r\n     *      against.\r\n     *\r\n     */\r\n    return function(text, mustHaveExpression) {\r\n      var startIndex,\r\n          endIndex,\r\n          index = 0,\r\n          parts = [],\r\n          length = text.length,\r\n          hasInterpolation = false,\r\n          fn,\r\n          exp,\r\n          concat = [];\r\n\r\n      while(index < length) {\r\n        if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&\r\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) {\r\n          (index != startIndex) && parts.push(text.substring(index, startIndex));\r\n          parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex)));\r\n          fn.exp = exp;\r\n          index = endIndex + endSymbolLength;\r\n          hasInterpolation = true;\r\n        } else {\r\n          // we did not find anything, so we have to add the remainder to the parts array\r\n          (index != length) && parts.push(text.substring(index));\r\n          index = length;\r\n        }\r\n      }\r\n\r\n      if (!(length = parts.length)) {\r\n        // we added, nothing, must have been an empty string.\r\n        parts.push('');\r\n        length = 1;\r\n      }\r\n\r\n      if (!mustHaveExpression  || hasInterpolation) {\r\n        concat.length = length;\r\n        fn = function(context) {\r\n          for(var i = 0, ii = length, part; i<ii; i++) {\r\n            if (typeof (part = parts[i]) == 'function') {\r\n              part = part(context);\r\n              if (part == null || part == undefined) {\r\n                part = '';\r\n              } else if (typeof part != 'string') {\r\n                part = toJson(part);\r\n              }\r\n            }\r\n            concat[i] = part;\r\n          }\r\n          return concat.join('');\r\n        };\r\n        fn.exp = text;\r\n        fn.parts = parts;\r\n        return fn;\r\n      }\r\n    };\r\n  }];\r\n}\r\n\r\nvar URL_MATCH = /^([^:]+):\\/\\/(\\w+:{0,1}\\w*@)?([\\w\\.-]*)(:([0-9]+))?(\\/[^\\?#]*)?(\\?([^#]*))?(#(.*))?$/,\r\n    PATH_MATCH = /^([^\\?#]*)?(\\?([^#]*))?(#(.*))?$/,\r\n    HASH_MATCH = PATH_MATCH,\r\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\r\n\r\n\r\n/**\r\n * Encode path using encodeUriSegment, ignoring forward slashes\r\n *\r\n * @param {string} path Path to encode\r\n * @returns {string}\r\n */\r\nfunction encodePath(path) {\r\n  var segments = path.split('/'),\r\n      i = segments.length;\r\n\r\n  while (i--) {\r\n    segments[i] = encodeUriSegment(segments[i]);\r\n  }\r\n\r\n  return segments.join('/');\r\n}\r\n\r\nfunction stripHash(url) {\r\n  return url.split('#')[0];\r\n}\r\n\r\n\r\nfunction matchUrl(url, obj) {\r\n  var match = URL_MATCH.exec(url);\r\n\r\n  match = {\r\n      protocol: match[1],\r\n      host: match[3],\r\n      port: int(match[5]) || DEFAULT_PORTS[match[1]] || null,\r\n      path: match[6] || '/',\r\n      search: match[8],\r\n      hash: match[10]\r\n    };\r\n\r\n  if (obj) {\r\n    obj.$$protocol = match.protocol;\r\n    obj.$$host = match.host;\r\n    obj.$$port = match.port;\r\n  }\r\n\r\n  return match;\r\n}\r\n\r\n\r\nfunction composeProtocolHostPort(protocol, host, port) {\r\n  return protocol + '://' + host + (port == DEFAULT_PORTS[protocol] ? '' : ':' + port);\r\n}\r\n\r\n\r\nfunction pathPrefixFromBase(basePath) {\r\n  return basePath.substr(0, basePath.lastIndexOf('/'));\r\n}\r\n\r\n\r\nfunction convertToHtml5Url(url, basePath, hashPrefix) {\r\n  var match = matchUrl(url);\r\n\r\n  // already html5 url\r\n  if (decodeURIComponent(match.path) != basePath || isUndefined(match.hash) ||\r\n      match.hash.indexOf(hashPrefix) !== 0) {\r\n    return url;\r\n  // convert hashbang url -> html5 url\r\n  } else {\r\n    return composeProtocolHostPort(match.protocol, match.host, match.port) +\r\n           pathPrefixFromBase(basePath) + match.hash.substr(hashPrefix.length);\r\n  }\r\n}\r\n\r\n\r\nfunction convertToHashbangUrl(url, basePath, hashPrefix) {\r\n  var match = matchUrl(url);\r\n\r\n  // already hashbang url\r\n  if (decodeURIComponent(match.path) == basePath) {\r\n    return url;\r\n  // convert html5 url -> hashbang url\r\n  } else {\r\n    var search = match.search && '?' + match.search || '',\r\n        hash = match.hash && '#' + match.hash || '',\r\n        pathPrefix = pathPrefixFromBase(basePath),\r\n        path = match.path.substr(pathPrefix.length);\r\n\r\n    if (match.path.indexOf(pathPrefix) !== 0) {\r\n      throw Error('Invalid url \"' + url + '\", missing path prefix \"' + pathPrefix + '\" !');\r\n    }\r\n\r\n    return composeProtocolHostPort(match.protocol, match.host, match.port) + basePath +\r\n           '#' + hashPrefix + path + search + hash;\r\n  }\r\n}\r\n\r\n\r\n/**\r\n * LocationUrl represents an url\r\n * This object is exposed as $location service when HTML5 mode is enabled and supported\r\n *\r\n * @constructor\r\n * @param {string} url HTML5 url\r\n * @param {string} pathPrefix\r\n */\r\nfunction LocationUrl(url, pathPrefix, appBaseUrl) {\r\n  pathPrefix = pathPrefix || '';\r\n\r\n  /**\r\n   * Parse given html5 (regular) url string into properties\r\n   * @param {string} newAbsoluteUrl HTML5 url\r\n   * @private\r\n   */\r\n  this.$$parse = function(newAbsoluteUrl) {\r\n    var match = matchUrl(newAbsoluteUrl, this);\r\n\r\n    if (match.path.indexOf(pathPrefix) !== 0) {\r\n      throw Error('Invalid url \"' + newAbsoluteUrl + '\", missing path prefix \"' + pathPrefix + '\" !');\r\n    }\r\n\r\n    this.$$path = decodeURIComponent(match.path.substr(pathPrefix.length));\r\n    this.$$search = parseKeyValue(match.search);\r\n    this.$$hash = match.hash && decodeURIComponent(match.hash) || '';\r\n\r\n    this.$$compose();\r\n  };\r\n\r\n  /**\r\n   * Compose url and update `absUrl` property\r\n   * @private\r\n   */\r\n  this.$$compose = function() {\r\n    var search = toKeyValue(this.$$search),\r\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\r\n\r\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\r\n    this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) +\r\n                    pathPrefix + this.$$url;\r\n  };\r\n\r\n\r\n  this.$$rewriteAppUrl = function(absoluteLinkUrl) {\r\n    if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) {\r\n      return absoluteLinkUrl;\r\n    }\r\n  }\r\n\r\n\r\n  this.$$parse(url);\r\n}\r\n\r\n\r\n/**\r\n * LocationHashbangUrl represents url\r\n * This object is exposed as $location service when html5 history api is disabled or not supported\r\n *\r\n * @constructor\r\n * @param {string} url Legacy url\r\n * @param {string} hashPrefix Prefix for hash part (containing path and search)\r\n */\r\nfunction LocationHashbangUrl(url, hashPrefix, appBaseUrl) {\r\n  var basePath;\r\n\r\n  /**\r\n   * Parse given hashbang url into properties\r\n   * @param {string} url Hashbang url\r\n   * @private\r\n   */\r\n  this.$$parse = function(url) {\r\n    var match = matchUrl(url, this);\r\n\r\n\r\n    if (match.hash && match.hash.indexOf(hashPrefix) !== 0) {\r\n      throw Error('Invalid url \"' + url + '\", missing hash prefix \"' + hashPrefix + '\" !');\r\n    }\r\n\r\n    basePath = match.path + (match.search ? '?' + match.search : '');\r\n    match = HASH_MATCH.exec((match.hash || '').substr(hashPrefix.length));\r\n    if (match[1]) {\r\n      this.$$path = (match[1].charAt(0) == '/' ? '' : '/') + decodeURIComponent(match[1]);\r\n    } else {\r\n      this.$$path = '';\r\n    }\r\n\r\n    this.$$search = parseKeyValue(match[3]);\r\n    this.$$hash = match[5] && decodeURIComponent(match[5]) || '';\r\n\r\n    this.$$compose();\r\n  };\r\n\r\n  /**\r\n   * Compose hashbang url and update `absUrl` property\r\n   * @private\r\n   */\r\n  this.$$compose = function() {\r\n    var search = toKeyValue(this.$$search),\r\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\r\n\r\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\r\n    this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) +\r\n                    basePath + (this.$$url ? '#' + hashPrefix + this.$$url : '');\r\n  };\r\n\r\n  this.$$rewriteAppUrl = function(absoluteLinkUrl) {\r\n    if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) {\r\n      return absoluteLinkUrl;\r\n    }\r\n  }\r\n\r\n\r\n  this.$$parse(url);\r\n}\r\n\r\n\r\nLocationUrl.prototype = {\r\n\r\n  /**\r\n   * Has any change been replacing ?\r\n   * @private\r\n   */\r\n  $$replace: false,\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#absUrl\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return full url representation with all segments encoded according to rules specified in\r\n   * {@link http://www.ietf.org/rfc/rfc3986.txt RFC 3986}.\r\n   *\r\n   * @return {string} full url\r\n   */\r\n  absUrl: locationGetter('$$absUrl'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#url\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.\r\n   *\r\n   * Change path, search and hash, when called with parameter and return `$location`.\r\n   *\r\n   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)\r\n   * @return {string} url\r\n   */\r\n  url: function(url, replace) {\r\n    if (isUndefined(url))\r\n      return this.$$url;\r\n\r\n    var match = PATH_MATCH.exec(url);\r\n    if (match[1]) this.path(decodeURIComponent(match[1]));\r\n    if (match[2] || match[1]) this.search(match[3] || '');\r\n    this.hash(match[5] || '', replace);\r\n\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#protocol\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return protocol of current url.\r\n   *\r\n   * @return {string} protocol of current url\r\n   */\r\n  protocol: locationGetter('$$protocol'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#host\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return host of current url.\r\n   *\r\n   * @return {string} host of current url.\r\n   */\r\n  host: locationGetter('$$host'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#port\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter only.\r\n   *\r\n   * Return port of current url.\r\n   *\r\n   * @return {Number} port\r\n   */\r\n  port: locationGetter('$$port'),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#path\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return path of current url when called without any parameter.\r\n   *\r\n   * Change path when called with parameter and return `$location`.\r\n   *\r\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\r\n   * if it is missing.\r\n   *\r\n   * @param {string=} path New path\r\n   * @return {string} path\r\n   */\r\n  path: locationGetterSetter('$$path', function(path) {\r\n    return path.charAt(0) == '/' ? path : '/' + path;\r\n  }),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#search\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return search part (as object) of current url when called without any parameter.\r\n   *\r\n   * Change search part when called with parameter and return `$location`.\r\n   *\r\n   * @param {string|object<string,string>=} search New search params - string or hash object\r\n   * @param {string=} paramValue If `search` is a string, then `paramValue` will override only a\r\n   *    single search parameter. If the value is `null`, the parameter will be deleted.\r\n   *\r\n   * @return {string} search\r\n   */\r\n  search: function(search, paramValue) {\r\n    if (isUndefined(search))\r\n      return this.$$search;\r\n\r\n    if (isDefined(paramValue)) {\r\n      if (paramValue === null) {\r\n        delete this.$$search[search];\r\n      } else {\r\n        this.$$search[search] = paramValue;\r\n      }\r\n    } else {\r\n      this.$$search = isString(search) ? parseKeyValue(search) : search;\r\n    }\r\n\r\n    this.$$compose();\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#hash\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * This method is getter / setter.\r\n   *\r\n   * Return hash fragment when called without any parameter.\r\n   *\r\n   * Change hash fragment when called with parameter and return `$location`.\r\n   *\r\n   * @param {string=} hash New hash fragment\r\n   * @return {string} hash\r\n   */\r\n  hash: locationGetterSetter('$$hash', identity),\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$location#replace\r\n   * @methodOf ng.$location\r\n   *\r\n   * @description\r\n   * If called, all changes to $location during current `$digest` will be replacing current history\r\n   * record, instead of adding new one.\r\n   */\r\n  replace: function() {\r\n    this.$$replace = true;\r\n    return this;\r\n  }\r\n};\r\n\r\nLocationHashbangUrl.prototype = inherit(LocationUrl.prototype);\r\n\r\nfunction LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExtra) {\r\n  LocationHashbangUrl.apply(this, arguments);\r\n\r\n\r\n  this.$$rewriteAppUrl = function(absoluteLinkUrl) {\r\n    if (absoluteLinkUrl.indexOf(appBaseUrl) == 0) {\r\n      return appBaseUrl + baseExtra + '#' + hashPrefix  + absoluteLinkUrl.substr(appBaseUrl.length);\r\n    }\r\n  }\r\n}\r\n\r\nLocationHashbangInHtml5Url.prototype = inherit(LocationHashbangUrl.prototype);\r\n\r\nfunction locationGetter(property) {\r\n  return function() {\r\n    return this[property];\r\n  };\r\n}\r\n\r\n\r\nfunction locationGetterSetter(property, preprocess) {\r\n  return function(value) {\r\n    if (isUndefined(value))\r\n      return this[property];\r\n\r\n    this[property] = preprocess(value);\r\n    this.$$compose();\r\n\r\n    return this;\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$location\r\n *\r\n * @requires $browser\r\n * @requires $sniffer\r\n * @requires $rootElement\r\n *\r\n * @description\r\n * The $location service parses the URL in the browser address bar (based on the\r\n * {@link https://developer.mozilla.org/en/window.location window.location}) and makes the URL\r\n * available to your application. Changes to the URL in the address bar are reflected into\r\n * $location service and changes to $location are reflected into the browser address bar.\r\n *\r\n * **The $location service:**\r\n *\r\n * - Exposes the current URL in the browser address bar, so you can\r\n *   - Watch and observe the URL.\r\n *   - Change the URL.\r\n * - Synchronizes the URL with the browser when the user\r\n *   - Changes the address bar.\r\n *   - Clicks the back or forward button (or clicks a History link).\r\n *   - Clicks on a link.\r\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\r\n *\r\n * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular\r\n * Services: Using $location}\r\n */\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$locationProvider\r\n * @description\r\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\r\n */\r\nfunction $LocationProvider(){\r\n  var hashPrefix = '',\r\n      html5Mode = false;\r\n\r\n  /**\r\n   * @ngdoc property\r\n   * @name ng.$locationProvider#hashPrefix\r\n   * @methodOf ng.$locationProvider\r\n   * @description\r\n   * @param {string=} prefix Prefix for hash part (containing path and search)\r\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\r\n   */\r\n  this.hashPrefix = function(prefix) {\r\n    if (isDefined(prefix)) {\r\n      hashPrefix = prefix;\r\n      return this;\r\n    } else {\r\n      return hashPrefix;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * @ngdoc property\r\n   * @name ng.$locationProvider#html5Mode\r\n   * @methodOf ng.$locationProvider\r\n   * @description\r\n   * @param {string=} mode Use HTML5 strategy if available.\r\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\r\n   */\r\n  this.html5Mode = function(mode) {\r\n    if (isDefined(mode)) {\r\n      html5Mode = mode;\r\n      return this;\r\n    } else {\r\n      return html5Mode;\r\n    }\r\n  };\r\n\r\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',\r\n      function( $rootScope,   $browser,   $sniffer,   $rootElement) {\r\n    var $location,\r\n        basePath,\r\n        pathPrefix,\r\n        initUrl = $browser.url(),\r\n        initUrlParts = matchUrl(initUrl),\r\n        appBaseUrl;\r\n\r\n    if (html5Mode) {\r\n      basePath = $browser.baseHref() || '/';\r\n      pathPrefix = pathPrefixFromBase(basePath);\r\n      appBaseUrl =\r\n          composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) +\r\n          pathPrefix + '/';\r\n\r\n      if ($sniffer.history) {\r\n        $location = new LocationUrl(\r\n          convertToHtml5Url(initUrl, basePath, hashPrefix),\r\n          pathPrefix, appBaseUrl);\r\n      } else {\r\n        $location = new LocationHashbangInHtml5Url(\r\n          convertToHashbangUrl(initUrl, basePath, hashPrefix),\r\n          hashPrefix, appBaseUrl, basePath.substr(pathPrefix.length + 1));\r\n      }\r\n    } else {\r\n      appBaseUrl =\r\n          composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) +\r\n          (initUrlParts.path || '') +\r\n          (initUrlParts.search ? ('?' + initUrlParts.search) : '') +\r\n          '#' + hashPrefix + '/';\r\n\r\n      $location = new LocationHashbangUrl(initUrl, hashPrefix, appBaseUrl);\r\n    }\r\n\r\n    $rootElement.bind('click', function(event) {\r\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\r\n      // currently we open nice url link and redirect then\r\n\r\n      if (event.ctrlKey || event.metaKey || event.which == 2) return;\r\n\r\n      var elm = jqLite(event.target);\r\n\r\n      // traverse the DOM up to find first A tag\r\n      while (lowercase(elm[0].nodeName) !== 'a') {\r\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\r\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\r\n      }\r\n\r\n      var absHref = elm.prop('href'),\r\n          rewrittenUrl = $location.$$rewriteAppUrl(absHref);\r\n\r\n      if (absHref && !elm.attr('target') && rewrittenUrl) {\r\n        // update location manually\r\n        $location.$$parse(rewrittenUrl);\r\n        $rootScope.$apply();\r\n        event.preventDefault();\r\n        // hack to work around FF6 bug 684208 when scenario runner clicks on links\r\n        window.angular['ff-684208-preventDefault'] = true;\r\n      }\r\n    });\r\n\r\n\r\n    // rewrite hashbang url <> html5 url\r\n    if ($location.absUrl() != initUrl) {\r\n      $browser.url($location.absUrl(), true);\r\n    }\r\n\r\n    // update $location when $browser url changes\r\n    $browser.onUrlChange(function(newUrl) {\r\n      if ($location.absUrl() != newUrl) {\r\n        $rootScope.$evalAsync(function() {\r\n          var oldUrl = $location.absUrl();\r\n\r\n          $location.$$parse(newUrl);\r\n          afterLocationChange(oldUrl);\r\n        });\r\n        if (!$rootScope.$$phase) $rootScope.$digest();\r\n      }\r\n    });\r\n\r\n    // update browser\r\n    var changeCounter = 0;\r\n    $rootScope.$watch(function $locationWatch() {\r\n      var oldUrl = $browser.url();\r\n\r\n      if (!changeCounter || oldUrl != $location.absUrl()) {\r\n        changeCounter++;\r\n        $rootScope.$evalAsync(function() {\r\n          if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\r\n              defaultPrevented) {\r\n            $location.$$parse(oldUrl);\r\n          } else {\r\n            $browser.url($location.absUrl(), $location.$$replace);\r\n            $location.$$replace = false;\r\n            afterLocationChange(oldUrl);\r\n          }\r\n        });\r\n      }\r\n\r\n      return changeCounter;\r\n    });\r\n\r\n    return $location;\r\n\r\n    function afterLocationChange(oldUrl) {\r\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);\r\n    }\r\n}];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$log\r\n * @requires $window\r\n *\r\n * @description\r\n * Simple service for logging. Default implementation writes the message\r\n * into the browser's console (if present).\r\n *\r\n * The main purpose of this service is to simplify debugging and troubleshooting.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n         <script>\r\n           function LogCtrl($log) {\r\n             this.$log = $log;\r\n             this.message = 'Hello World!';\r\n           }\r\n         </script>\r\n         <div ng-controller=\"LogCtrl\">\r\n           <p>Reload this page with open console, enter text and hit the log button...</p>\r\n           Message:\r\n           <input type=\"text\" ng-model=\"message\"/>\r\n           <button ng-click=\"$log.log(message)\">log</button>\r\n           <button ng-click=\"$log.warn(message)\">warn</button>\r\n           <button ng-click=\"$log.info(message)\">info</button>\r\n           <button ng-click=\"$log.error(message)\">error</button>\r\n         </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\n\r\nfunction $LogProvider(){\r\n  this.$get = ['$window', function($window){\r\n    return {\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#log\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write a log message\r\n       */\r\n      log: consoleLog('log'),\r\n\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#warn\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write a warning message\r\n       */\r\n      warn: consoleLog('warn'),\r\n\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#info\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write an information message\r\n       */\r\n      info: consoleLog('info'),\r\n\r\n      /**\r\n       * @ngdoc method\r\n       * @name ng.$log#error\r\n       * @methodOf ng.$log\r\n       *\r\n       * @description\r\n       * Write an error message\r\n       */\r\n      error: consoleLog('error')\r\n    };\r\n\r\n    function formatError(arg) {\r\n      if (arg instanceof Error) {\r\n        if (arg.stack) {\r\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\r\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\r\n              : arg.stack;\r\n        } else if (arg.sourceURL) {\r\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\r\n        }\r\n      }\r\n      return arg;\r\n    }\r\n\r\n    function consoleLog(type) {\r\n      var console = $window.console || {},\r\n          logFn = console[type] || console.log || noop;\r\n\r\n      if (logFn.apply) {\r\n        return function() {\r\n          var args = [];\r\n          forEach(arguments, function(arg) {\r\n            args.push(formatError(arg));\r\n          });\r\n          return logFn.apply(console, args);\r\n        };\r\n      }\r\n\r\n      // we are IE which either doesn't have window.console => this is noop and we do nothing,\r\n      // or we are IE where console.log doesn't have apply so we log at least first 2 args\r\n      return function(arg1, arg2) {\r\n        logFn(arg1, arg2);\r\n      }\r\n    }\r\n  }];\r\n}\r\n\r\nvar OPERATORS = {\r\n    'null':function(){return null;},\r\n    'true':function(){return true;},\r\n    'false':function(){return false;},\r\n    undefined:noop,\r\n    '+':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)+(isDefined(b)?b:0);},\r\n    '-':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)-(isDefined(b)?b:0);},\r\n    '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);},\r\n    '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);},\r\n    '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},\r\n    '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);},\r\n    '=':noop,\r\n    '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},\r\n    '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},\r\n    '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},\r\n    '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);},\r\n    '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);},\r\n    '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);},\r\n    '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);},\r\n    '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);},\r\n    '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);},\r\n//    '|':function(self, locals, a,b){return a|b;},\r\n    '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));},\r\n    '!':function(self, locals, a){return !a(self, locals);}\r\n};\r\nvar ESCAPE = {\"n\":\"\\n\", \"f\":\"\\f\", \"r\":\"\\r\", \"t\":\"\\t\", \"v\":\"\\v\", \"'\":\"'\", '\"':'\"'};\r\n\r\nfunction lex(text, csp){\r\n  var tokens = [],\r\n      token,\r\n      index = 0,\r\n      json = [],\r\n      ch,\r\n      lastCh = ':'; // can start regexp\r\n\r\n  while (index < text.length) {\r\n    ch = text.charAt(index);\r\n    if (is('\"\\'')) {\r\n      readString(ch);\r\n    } else if (isNumber(ch) || is('.') && isNumber(peek())) {\r\n      readNumber();\r\n    } else if (isIdent(ch)) {\r\n      readIdent();\r\n      // identifiers can only be if the preceding char was a { or ,\r\n      if (was('{,') && json[0]=='{' &&\r\n         (token=tokens[tokens.length-1])) {\r\n        token.json = token.text.indexOf('.') == -1;\r\n      }\r\n    } else if (is('(){}[].,;:')) {\r\n      tokens.push({\r\n        index:index,\r\n        text:ch,\r\n        json:(was(':[,') && is('{[')) || is('}]:,')\r\n      });\r\n      if (is('{[')) json.unshift(ch);\r\n      if (is('}]')) json.shift();\r\n      index++;\r\n    } else if (isWhitespace(ch)) {\r\n      index++;\r\n      continue;\r\n    } else {\r\n      var ch2 = ch + peek(),\r\n          fn = OPERATORS[ch],\r\n          fn2 = OPERATORS[ch2];\r\n      if (fn2) {\r\n        tokens.push({index:index, text:ch2, fn:fn2});\r\n        index += 2;\r\n      } else if (fn) {\r\n        tokens.push({index:index, text:ch, fn:fn, json: was('[,:') && is('+-')});\r\n        index += 1;\r\n      } else {\r\n        throwError(\"Unexpected next character \", index, index+1);\r\n      }\r\n    }\r\n    lastCh = ch;\r\n  }\r\n  return tokens;\r\n\r\n  function is(chars) {\r\n    return chars.indexOf(ch) != -1;\r\n  }\r\n\r\n  function was(chars) {\r\n    return chars.indexOf(lastCh) != -1;\r\n  }\r\n\r\n  function peek() {\r\n    return index + 1 < text.length ? text.charAt(index + 1) : false;\r\n  }\r\n  function isNumber(ch) {\r\n    return '0' <= ch && ch <= '9';\r\n  }\r\n  function isWhitespace(ch) {\r\n    return ch == ' ' || ch == '\\r' || ch == '\\t' ||\r\n           ch == '\\n' || ch == '\\v' || ch == '\\u00A0'; // IE treats non-breaking space as \\u00A0\r\n  }\r\n  function isIdent(ch) {\r\n    return 'a' <= ch && ch <= 'z' ||\r\n           'A' <= ch && ch <= 'Z' ||\r\n           '_' == ch || ch == '$';\r\n  }\r\n  function isExpOperator(ch) {\r\n    return ch == '-' || ch == '+' || isNumber(ch);\r\n  }\r\n\r\n  function throwError(error, start, end) {\r\n    end = end || index;\r\n    throw Error(\"Lexer Error: \" + error + \" at column\" +\r\n        (isDefined(start)\r\n            ? \"s \" + start +  \"-\" + index + \" [\" + text.substring(start, end) + \"]\"\r\n            : \" \" + end) +\r\n        \" in expression [\" + text + \"].\");\r\n  }\r\n\r\n  function readNumber() {\r\n    var number = \"\";\r\n    var start = index;\r\n    while (index < text.length) {\r\n      var ch = lowercase(text.charAt(index));\r\n      if (ch == '.' || isNumber(ch)) {\r\n        number += ch;\r\n      } else {\r\n        var peekCh = peek();\r\n        if (ch == 'e' && isExpOperator(peekCh)) {\r\n          number += ch;\r\n        } else if (isExpOperator(ch) &&\r\n            peekCh && isNumber(peekCh) &&\r\n            number.charAt(number.length - 1) == 'e') {\r\n          number += ch;\r\n        } else if (isExpOperator(ch) &&\r\n            (!peekCh || !isNumber(peekCh)) &&\r\n            number.charAt(number.length - 1) == 'e') {\r\n          throwError('Invalid exponent');\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n      index++;\r\n    }\r\n    number = 1 * number;\r\n    tokens.push({index:start, text:number, json:true,\r\n      fn:function() {return number;}});\r\n  }\r\n  function readIdent() {\r\n    var ident = \"\",\r\n        start = index,\r\n        lastDot, peekIndex, methodName;\r\n\r\n    while (index < text.length) {\r\n      var ch = text.charAt(index);\r\n      if (ch == '.' || isIdent(ch) || isNumber(ch)) {\r\n        if (ch == '.') lastDot = index;\r\n        ident += ch;\r\n      } else {\r\n        break;\r\n      }\r\n      index++;\r\n    }\r\n\r\n    //check if this is not a method invocation and if it is back out to last dot\r\n    if (lastDot) {\r\n      peekIndex = index;\r\n      while(peekIndex < text.length) {\r\n        var ch = text.charAt(peekIndex);\r\n        if (ch == '(') {\r\n          methodName = ident.substr(lastDot - start + 1);\r\n          ident = ident.substr(0, lastDot - start);\r\n          index = peekIndex;\r\n          break;\r\n        }\r\n        if(isWhitespace(ch)) {\r\n          peekIndex++;\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n\r\n    var token = {\r\n      index:start,\r\n      text:ident\r\n    };\r\n\r\n    if (OPERATORS.hasOwnProperty(ident)) {\r\n      token.fn = token.json = OPERATORS[ident];\r\n    } else {\r\n      var getter = getterFn(ident, csp);\r\n      token.fn = extend(function(self, locals) {\r\n        return (getter(self, locals));\r\n      }, {\r\n        assign: function(self, value) {\r\n          return setter(self, ident, value);\r\n        }\r\n      });\r\n    }\r\n\r\n    tokens.push(token);\r\n\r\n    if (methodName) {\r\n      tokens.push({\r\n        index:lastDot,\r\n        text: '.',\r\n        json: false\r\n      });\r\n      tokens.push({\r\n        index: lastDot + 1,\r\n        text: methodName,\r\n        json: false\r\n      });\r\n    }\r\n  }\r\n\r\n  function readString(quote) {\r\n    var start = index;\r\n    index++;\r\n    var string = \"\";\r\n    var rawString = quote;\r\n    var escape = false;\r\n    while (index < text.length) {\r\n      var ch = text.charAt(index);\r\n      rawString += ch;\r\n      if (escape) {\r\n        if (ch == 'u') {\r\n          var hex = text.substring(index + 1, index + 5);\r\n          if (!hex.match(/[\\da-f]{4}/i))\r\n            throwError( \"Invalid unicode escape [\\\\u\" + hex + \"]\");\r\n          index += 4;\r\n          string += String.fromCharCode(parseInt(hex, 16));\r\n        } else {\r\n          var rep = ESCAPE[ch];\r\n          if (rep) {\r\n            string += rep;\r\n          } else {\r\n            string += ch;\r\n          }\r\n        }\r\n        escape = false;\r\n      } else if (ch == '\\\\') {\r\n        escape = true;\r\n      } else if (ch == quote) {\r\n        index++;\r\n        tokens.push({\r\n          index:start,\r\n          text:rawString,\r\n          string:string,\r\n          json:true,\r\n          fn:function() { return string; }\r\n        });\r\n        return;\r\n      } else {\r\n        string += ch;\r\n      }\r\n      index++;\r\n    }\r\n    throwError(\"Unterminated quote\", start);\r\n  }\r\n}\r\n\r\n/////////////////////////////////////////\r\n\r\nfunction parser(text, json, $filter, csp){\r\n  var ZERO = valueFn(0),\r\n      value,\r\n      tokens = lex(text, csp),\r\n      assignment = _assignment,\r\n      functionCall = _functionCall,\r\n      fieldAccess = _fieldAccess,\r\n      objectIndex = _objectIndex,\r\n      filterChain = _filterChain;\r\n\r\n  if(json){\r\n    // The extra level of aliasing is here, just in case the lexer misses something, so that\r\n    // we prevent any accidental execution in JSON.\r\n    assignment = logicalOR;\r\n    functionCall =\r\n      fieldAccess =\r\n      objectIndex =\r\n      filterChain =\r\n        function() { throwError(\"is not valid json\", {text:text, index:0}); };\r\n    value = primary();\r\n  } else {\r\n    value = statements();\r\n  }\r\n  if (tokens.length !== 0) {\r\n    throwError(\"is an unexpected token\", tokens[0]);\r\n  }\r\n  return value;\r\n\r\n  ///////////////////////////////////\r\n  function throwError(msg, token) {\r\n    throw Error(\"Syntax Error: Token '\" + token.text +\r\n      \"' \" + msg + \" at column \" +\r\n      (token.index + 1) + \" of the expression [\" +\r\n      text + \"] starting at [\" + text.substring(token.index) + \"].\");\r\n  }\r\n\r\n  function peekToken() {\r\n    if (tokens.length === 0)\r\n      throw Error(\"Unexpected end of expression: \" + text);\r\n    return tokens[0];\r\n  }\r\n\r\n  function peek(e1, e2, e3, e4) {\r\n    if (tokens.length > 0) {\r\n      var token = tokens[0];\r\n      var t = token.text;\r\n      if (t==e1 || t==e2 || t==e3 || t==e4 ||\r\n          (!e1 && !e2 && !e3 && !e4)) {\r\n        return token;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function expect(e1, e2, e3, e4){\r\n    var token = peek(e1, e2, e3, e4);\r\n    if (token) {\r\n      if (json && !token.json) {\r\n        throwError(\"is not valid json\", token);\r\n      }\r\n      tokens.shift();\r\n      return token;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function consume(e1){\r\n    if (!expect(e1)) {\r\n      throwError(\"is unexpected, expecting [\" + e1 + \"]\", peek());\r\n    }\r\n  }\r\n\r\n  function unaryFn(fn, right) {\r\n    return function(self, locals) {\r\n      return fn(self, locals, right);\r\n    };\r\n  }\r\n\r\n  function binaryFn(left, fn, right) {\r\n    return function(self, locals) {\r\n      return fn(self, locals, left, right);\r\n    };\r\n  }\r\n\r\n  function statements() {\r\n    var statements = [];\r\n    while(true) {\r\n      if (tokens.length > 0 && !peek('}', ')', ';', ']'))\r\n        statements.push(filterChain());\r\n      if (!expect(';')) {\r\n        // optimize for the common case where there is only one statement.\r\n        // TODO(size): maybe we should not support multiple statements?\r\n        return statements.length == 1\r\n          ? statements[0]\r\n          : function(self, locals){\r\n            var value;\r\n            for ( var i = 0; i < statements.length; i++) {\r\n              var statement = statements[i];\r\n              if (statement)\r\n                value = statement(self, locals);\r\n            }\r\n            return value;\r\n          };\r\n      }\r\n    }\r\n  }\r\n\r\n  function _filterChain() {\r\n    var left = expression();\r\n    var token;\r\n    while(true) {\r\n      if ((token = expect('|'))) {\r\n        left = binaryFn(left, token.fn, filter());\r\n      } else {\r\n        return left;\r\n      }\r\n    }\r\n  }\r\n\r\n  function filter() {\r\n    var token = expect();\r\n    var fn = $filter(token.text);\r\n    var argsFn = [];\r\n    while(true) {\r\n      if ((token = expect(':'))) {\r\n        argsFn.push(expression());\r\n      } else {\r\n        var fnInvoke = function(self, locals, input){\r\n          var args = [input];\r\n          for ( var i = 0; i < argsFn.length; i++) {\r\n            args.push(argsFn[i](self, locals));\r\n          }\r\n          return fn.apply(self, args);\r\n        };\r\n        return function() {\r\n          return fnInvoke;\r\n        };\r\n      }\r\n    }\r\n  }\r\n\r\n  function expression() {\r\n    return assignment();\r\n  }\r\n\r\n  function _assignment() {\r\n    var left = logicalOR();\r\n    var right;\r\n    var token;\r\n    if ((token = expect('='))) {\r\n      if (!left.assign) {\r\n        throwError(\"implies assignment but [\" +\r\n          text.substring(0, token.index) + \"] can not be assigned to\", token);\r\n      }\r\n      right = logicalOR();\r\n      return function(self, locals){\r\n        return left.assign(self, right(self, locals), locals);\r\n      };\r\n    } else {\r\n      return left;\r\n    }\r\n  }\r\n\r\n  function logicalOR() {\r\n    var left = logicalAND();\r\n    var token;\r\n    while(true) {\r\n      if ((token = expect('||'))) {\r\n        left = binaryFn(left, token.fn, logicalAND());\r\n      } else {\r\n        return left;\r\n      }\r\n    }\r\n  }\r\n\r\n  function logicalAND() {\r\n    var left = equality();\r\n    var token;\r\n    if ((token = expect('&&'))) {\r\n      left = binaryFn(left, token.fn, logicalAND());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function equality() {\r\n    var left = relational();\r\n    var token;\r\n    if ((token = expect('==','!='))) {\r\n      left = binaryFn(left, token.fn, equality());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function relational() {\r\n    var left = additive();\r\n    var token;\r\n    if ((token = expect('<', '>', '<=', '>='))) {\r\n      left = binaryFn(left, token.fn, relational());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function additive() {\r\n    var left = multiplicative();\r\n    var token;\r\n    while ((token = expect('+','-'))) {\r\n      left = binaryFn(left, token.fn, multiplicative());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function multiplicative() {\r\n    var left = unary();\r\n    var token;\r\n    while ((token = expect('*','/','%'))) {\r\n      left = binaryFn(left, token.fn, unary());\r\n    }\r\n    return left;\r\n  }\r\n\r\n  function unary() {\r\n    var token;\r\n    if (expect('+')) {\r\n      return primary();\r\n    } else if ((token = expect('-'))) {\r\n      return binaryFn(ZERO, token.fn, unary());\r\n    } else if ((token = expect('!'))) {\r\n      return unaryFn(token.fn, unary());\r\n    } else {\r\n      return primary();\r\n    }\r\n  }\r\n\r\n\r\n  function primary() {\r\n    var primary;\r\n    if (expect('(')) {\r\n      primary = filterChain();\r\n      consume(')');\r\n    } else if (expect('[')) {\r\n      primary = arrayDeclaration();\r\n    } else if (expect('{')) {\r\n      primary = object();\r\n    } else {\r\n      var token = expect();\r\n      primary = token.fn;\r\n      if (!primary) {\r\n        throwError(\"not a primary expression\", token);\r\n      }\r\n    }\r\n\r\n    var next, context;\r\n    while ((next = expect('(', '[', '.'))) {\r\n      if (next.text === '(') {\r\n        primary = functionCall(primary, context);\r\n        context = null;\r\n      } else if (next.text === '[') {\r\n        context = primary;\r\n        primary = objectIndex(primary);\r\n      } else if (next.text === '.') {\r\n        context = primary;\r\n        primary = fieldAccess(primary);\r\n      } else {\r\n        throwError(\"IMPOSSIBLE\");\r\n      }\r\n    }\r\n    return primary;\r\n  }\r\n\r\n  function _fieldAccess(object) {\r\n    var field = expect().text;\r\n    var getter = getterFn(field, csp);\r\n    return extend(\r\n        function(self, locals) {\r\n          return getter(object(self, locals), locals);\r\n        },\r\n        {\r\n          assign:function(self, value, locals) {\r\n            return setter(object(self, locals), field, value);\r\n          }\r\n        }\r\n    );\r\n  }\r\n\r\n  function _objectIndex(obj) {\r\n    var indexFn = expression();\r\n    consume(']');\r\n    return extend(\r\n      function(self, locals){\r\n        var o = obj(self, locals),\r\n            i = indexFn(self, locals),\r\n            v, p;\r\n\r\n        if (!o) return undefined;\r\n        v = o[i];\r\n        if (v && v.then) {\r\n          p = v;\r\n          if (!('$$v' in v)) {\r\n            p.$$v = undefined;\r\n            p.then(function(val) { p.$$v = val; });\r\n          }\r\n          v = v.$$v;\r\n        }\r\n        return v;\r\n      }, {\r\n        assign:function(self, value, locals){\r\n          return obj(self, locals)[indexFn(self, locals)] = value;\r\n        }\r\n      });\r\n  }\r\n\r\n  function _functionCall(fn, contextGetter) {\r\n    var argsFn = [];\r\n    if (peekToken().text != ')') {\r\n      do {\r\n        argsFn.push(expression());\r\n      } while (expect(','));\r\n    }\r\n    consume(')');\r\n    return function(self, locals){\r\n      var args = [],\r\n          context = contextGetter ? contextGetter(self, locals) : self;\r\n\r\n      for ( var i = 0; i < argsFn.length; i++) {\r\n        args.push(argsFn[i](self, locals));\r\n      }\r\n      var fnPtr = fn(self, locals) || noop;\r\n      // IE stupidity!\r\n      return fnPtr.apply\r\n          ? fnPtr.apply(context, args)\r\n          : fnPtr(args[0], args[1], args[2], args[3], args[4]);\r\n    };\r\n  }\r\n\r\n  // This is used with json array declaration\r\n  function arrayDeclaration () {\r\n    var elementFns = [];\r\n    if (peekToken().text != ']') {\r\n      do {\r\n        elementFns.push(expression());\r\n      } while (expect(','));\r\n    }\r\n    consume(']');\r\n    return function(self, locals){\r\n      var array = [];\r\n      for ( var i = 0; i < elementFns.length; i++) {\r\n        array.push(elementFns[i](self, locals));\r\n      }\r\n      return array;\r\n    };\r\n  }\r\n\r\n  function object () {\r\n    var keyValues = [];\r\n    if (peekToken().text != '}') {\r\n      do {\r\n        var token = expect(),\r\n        key = token.string || token.text;\r\n        consume(\":\");\r\n        var value = expression();\r\n        keyValues.push({key:key, value:value});\r\n      } while (expect(','));\r\n    }\r\n    consume('}');\r\n    return function(self, locals){\r\n      var object = {};\r\n      for ( var i = 0; i < keyValues.length; i++) {\r\n        var keyValue = keyValues[i];\r\n        var value = keyValue.value(self, locals);\r\n        object[keyValue.key] = value;\r\n      }\r\n      return object;\r\n    };\r\n  }\r\n}\r\n\r\n//////////////////////////////////////////////////\r\n// Parser helper functions\r\n//////////////////////////////////////////////////\r\n\r\nfunction setter(obj, path, setValue) {\r\n  var element = path.split('.');\r\n  for (var i = 0; element.length > 1; i++) {\r\n    var key = element.shift();\r\n    var propertyObj = obj[key];\r\n    if (!propertyObj) {\r\n      propertyObj = {};\r\n      obj[key] = propertyObj;\r\n    }\r\n    obj = propertyObj;\r\n  }\r\n  obj[element.shift()] = setValue;\r\n  return setValue;\r\n}\r\n\r\n/**\r\n * Return the value accesible from the object by path. Any undefined traversals are ignored\r\n * @param {Object} obj starting object\r\n * @param {string} path path to traverse\r\n * @param {boolean=true} bindFnToScope\r\n * @returns value as accesbile by path\r\n */\r\n//TODO(misko): this function needs to be removed\r\nfunction getter(obj, path, bindFnToScope) {\r\n  if (!path) return obj;\r\n  var keys = path.split('.');\r\n  var key;\r\n  var lastInstance = obj;\r\n  var len = keys.length;\r\n\r\n  for (var i = 0; i < len; i++) {\r\n    key = keys[i];\r\n    if (obj) {\r\n      obj = (lastInstance = obj)[key];\r\n    }\r\n  }\r\n  if (!bindFnToScope && isFunction(obj)) {\r\n    return bind(lastInstance, obj);\r\n  }\r\n  return obj;\r\n}\r\n\r\nvar getterFnCache = {};\r\n\r\n/**\r\n * Implementation of the \"Black Hole\" variant from:\r\n * - http://jsperf.com/angularjs-parse-getter/4\r\n * - http://jsperf.com/path-evaluation-simplified/7\r\n */\r\nfunction cspSafeGetterFn(key0, key1, key2, key3, key4) {\r\n  return function(scope, locals) {\r\n    var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope,\r\n        promise;\r\n\r\n    if (pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key0];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key1 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key1];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key2 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key2];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key3 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key3];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    if (!key4 || pathVal === null || pathVal === undefined) return pathVal;\r\n\r\n    pathVal = pathVal[key4];\r\n    if (pathVal && pathVal.then) {\r\n      if (!(\"$$v\" in pathVal)) {\r\n        promise = pathVal;\r\n        promise.$$v = undefined;\r\n        promise.then(function(val) { promise.$$v = val; });\r\n      }\r\n      pathVal = pathVal.$$v;\r\n    }\r\n    return pathVal;\r\n  };\r\n};\r\n\r\nfunction getterFn(path, csp) {\r\n  if (getterFnCache.hasOwnProperty(path)) {\r\n    return getterFnCache[path];\r\n  }\r\n\r\n  var pathKeys = path.split('.'),\r\n      pathKeysLength = pathKeys.length,\r\n      fn;\r\n\r\n  if (csp) {\r\n    fn = (pathKeysLength < 6)\r\n        ? cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4])\r\n        : function(scope, locals) {\r\n          var i = 0, val\r\n          do {\r\n            val = cspSafeGetterFn(\r\n                    pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++]\r\n                  )(scope, locals);\r\n\r\n            locals = undefined; // clear after first iteration\r\n            scope = val;\r\n          } while (i < pathKeysLength);\r\n          return val;\r\n        }\r\n  } else {\r\n    var code = 'var l, fn, p;\\n';\r\n    forEach(pathKeys, function(key, index) {\r\n      code += 'if(s === null || s === undefined) return s;\\n' +\r\n              'l=s;\\n' +\r\n              's='+ (index\r\n                      // we simply dereference 's' on any .dot notation\r\n                      ? 's'\r\n                      // but if we are first then we check locals first, and if so read it first\r\n                      : '((k&&k.hasOwnProperty(\"' + key + '\"))?k:s)') + '[\"' + key + '\"]' + ';\\n' +\r\n              'if (s && s.then) {\\n' +\r\n                ' if (!(\"$$v\" in s)) {\\n' +\r\n                  ' p=s;\\n' +\r\n                  ' p.$$v = undefined;\\n' +\r\n                  ' p.then(function(v) {p.$$v=v;});\\n' +\r\n                  '}\\n' +\r\n                ' s=s.$$v\\n' +\r\n              '}\\n';\r\n    });\r\n    code += 'return s;';\r\n    fn = Function('s', 'k', code); // s=scope, k=locals\r\n    fn.toString = function() { return code; };\r\n  }\r\n\r\n  return getterFnCache[path] = fn;\r\n}\r\n\r\n///////////////////////////////////\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$parse\r\n * @function\r\n *\r\n * @description\r\n *\r\n * Converts Angular {@link guide/expression expression} into a function.\r\n *\r\n * <pre>\r\n *   var getter = $parse('user.name');\r\n *   var setter = getter.assign;\r\n *   var context = {user:{name:'angular'}};\r\n *   var locals = {user:{name:'local'}};\r\n *\r\n *   expect(getter(context)).toEqual('angular');\r\n *   setter(context, 'newValue');\r\n *   expect(context.user.name).toEqual('newValue');\r\n *   expect(getter(context, locals)).toEqual('local');\r\n * </pre>\r\n *\r\n *\r\n * @param {string} expression String expression to compile.\r\n * @returns {function(context, locals)} a function which represents the compiled expression:\r\n *\r\n *    * `context`: an object against which any expressions embedded in the strings are evaluated\r\n *      against (Topically a scope object).\r\n *    * `locals`: local variables context object, useful for overriding values in `context`.\r\n *\r\n *    The return function also has an `assign` property, if the expression is assignable, which\r\n *    allows one to set values to expressions.\r\n *\r\n */\r\nfunction $ParseProvider() {\r\n  var cache = {};\r\n  this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {\r\n    return function(exp) {\r\n      switch(typeof exp) {\r\n        case 'string':\r\n          return cache.hasOwnProperty(exp)\r\n            ? cache[exp]\r\n            : cache[exp] =  parser(exp, false, $filter, $sniffer.csp);\r\n        case 'function':\r\n          return exp;\r\n        default:\r\n          return noop;\r\n      }\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc service\r\n * @name ng.$q\r\n * @requires $rootScope\r\n *\r\n * @description\r\n * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).\r\n *\r\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\r\n * interface for interacting with an object that represents the result of an action that is\r\n * performed asynchronously, and may or may not be finished at any given point in time.\r\n *\r\n * From the perspective of dealing with error handling, deferred and promise apis are to\r\n * asynchronous programing what `try`, `catch` and `throw` keywords are to synchronous programing.\r\n *\r\n * <pre>\r\n *   // for the purpose of this example let's assume that variables `$q` and `scope` are\r\n *   // available in the current lexical scope (they could have been injected or passed in).\r\n *\r\n *   function asyncGreet(name) {\r\n *     var deferred = $q.defer();\r\n *\r\n *     setTimeout(function() {\r\n *       // since this fn executes async in a future turn of the event loop, we need to wrap\r\n *       // our code into an $apply call so that the model changes are properly observed.\r\n *       scope.$apply(function() {\r\n *         if (okToGreet(name)) {\r\n *           deferred.resolve('Hello, ' + name + '!');\r\n *         } else {\r\n *           deferred.reject('Greeting ' + name + ' is not allowed.');\r\n *         }\r\n *       });\r\n *     }, 1000);\r\n *\r\n *     return deferred.promise;\r\n *   }\r\n *\r\n *   var promise = asyncGreet('Robin Hood');\r\n *   promise.then(function(greeting) {\r\n *     alert('Success: ' + greeting);\r\n *   }, function(reason) {\r\n *     alert('Failed: ' + reason);\r\n *   );\r\n * </pre>\r\n *\r\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\r\n * comes in the way of\r\n * [guarantees that promise and deferred apis make](https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md).\r\n *\r\n * Additionally the promise api allows for composition that is very hard to do with the\r\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\r\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\r\n * section on serial or parallel joining of promises.\r\n *\r\n *\r\n * # The Deferred API\r\n *\r\n * A new instance of deferred is constructed by calling `$q.defer()`.\r\n *\r\n * The purpose of the deferred object is to expose the associated Promise instance as well as apis\r\n * that can be used for signaling the successful or unsuccessful completion of the task.\r\n *\r\n * **Methods**\r\n *\r\n * - `resolve(value)` â€“ resolves the derived promise with the `value`. If the value is a rejection\r\n *   constructed via `$q.reject`, the promise will be rejected instead.\r\n * - `reject(reason)` â€“ rejects the derived promise with the `reason`. This is equivalent to\r\n *   resolving it with a rejection constructed via `$q.reject`.\r\n *\r\n * **Properties**\r\n *\r\n * - promise â€“ `{Promise}` â€“ promise object associated with this deferred.\r\n *\r\n *\r\n * # The Promise API\r\n *\r\n * A new promise instance is created when a deferred instance is created and can be retrieved by\r\n * calling `deferred.promise`.\r\n *\r\n * The purpose of the promise object is to allow for interested parties to get access to the result\r\n * of the deferred task when it completes.\r\n *\r\n * **Methods**\r\n *\r\n * - `then(successCallback, errorCallback)` â€“ regardless of when the promise was or will be resolved\r\n *   or rejected calls one of the success or error callbacks asynchronously as soon as the result\r\n *   is available. The callbacks are called with a single argument the result or rejection reason.\r\n *\r\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\r\n *   `successCallback` or `errorCallback`.\r\n *\r\n *\r\n * # Chaining promises\r\n *\r\n * Because calling `then` api of a promise returns a new derived promise, it is easily possible\r\n * to create a chain of promises:\r\n *\r\n * <pre>\r\n *   promiseB = promiseA.then(function(result) {\r\n *     return result + 1;\r\n *   });\r\n *\r\n *   // promiseB will be resolved immediately after promiseA is resolved and it's value will be\r\n *   // the result of promiseA incremented by 1\r\n * </pre>\r\n *\r\n * It is possible to create chains of any length and since a promise can be resolved with another\r\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\r\n * the promises at any point in the chain. This makes it possible to implement powerful apis like\r\n * $http's response interceptors.\r\n *\r\n *\r\n * # Differences between Kris Kowal's Q and $q\r\n *\r\n *  There are three main differences:\r\n *\r\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\r\n *   mechanism in angular, which means faster propagation of resolution or rejection into your\r\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\r\n * - $q promises are recognized by the templating engine in angular, which means that in templates\r\n *   you can treat promises attached to a scope as if they were the resulting values.\r\n * - Q has many more features that $q, but that comes at a cost of bytes. $q is tiny, but contains\r\n *   all the important functionality needed for common async tasks.\r\n */\r\nfunction $QProvider() {\r\n\r\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\r\n    return qFactory(function(callback) {\r\n      $rootScope.$evalAsync(callback);\r\n    }, $exceptionHandler);\r\n  }];\r\n}\r\n\r\n\r\n/**\r\n * Constructs a promise manager.\r\n *\r\n * @param {function(function)} nextTick Function for executing functions in the next turn.\r\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\r\n *     debugging purposes.\r\n * @returns {object} Promise manager.\r\n */\r\nfunction qFactory(nextTick, exceptionHandler) {\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#defer\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Creates a `Deferred` object which represents a task which will finish in the future.\r\n   *\r\n   * @returns {Deferred} Returns a new instance of deferred.\r\n   */\r\n  var defer = function() {\r\n    var pending = [],\r\n        value, deferred;\r\n\r\n    deferred = {\r\n\r\n      resolve: function(val) {\r\n        if (pending) {\r\n          var callbacks = pending;\r\n          pending = undefined;\r\n          value = ref(val);\r\n\r\n          if (callbacks.length) {\r\n            nextTick(function() {\r\n              var callback;\r\n              for (var i = 0, ii = callbacks.length; i < ii; i++) {\r\n                callback = callbacks[i];\r\n                value.then(callback[0], callback[1]);\r\n              }\r\n            });\r\n          }\r\n        }\r\n      },\r\n\r\n\r\n      reject: function(reason) {\r\n        deferred.resolve(reject(reason));\r\n      },\r\n\r\n\r\n      promise: {\r\n        then: function(callback, errback) {\r\n          var result = defer();\r\n\r\n          var wrappedCallback = function(value) {\r\n            try {\r\n              result.resolve((callback || defaultCallback)(value));\r\n            } catch(e) {\r\n              exceptionHandler(e);\r\n              result.reject(e);\r\n            }\r\n          };\r\n\r\n          var wrappedErrback = function(reason) {\r\n            try {\r\n              result.resolve((errback || defaultErrback)(reason));\r\n            } catch(e) {\r\n              exceptionHandler(e);\r\n              result.reject(e);\r\n            }\r\n          };\r\n\r\n          if (pending) {\r\n            pending.push([wrappedCallback, wrappedErrback]);\r\n          } else {\r\n            value.then(wrappedCallback, wrappedErrback);\r\n          }\r\n\r\n          return result.promise;\r\n        }\r\n      }\r\n    };\r\n\r\n    return deferred;\r\n  };\r\n\r\n\r\n  var ref = function(value) {\r\n    if (value && value.then) return value;\r\n    return {\r\n      then: function(callback) {\r\n        var result = defer();\r\n        nextTick(function() {\r\n          result.resolve(callback(value));\r\n        });\r\n        return result.promise;\r\n      }\r\n    };\r\n  };\r\n\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#reject\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\r\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\r\n   * a promise chain, you don't need to worry about it.\r\n   *\r\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\r\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\r\n   * a promise error callback and you want to forward the error to the promise derived from the\r\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\r\n   * `reject`.\r\n   *\r\n   * <pre>\r\n   *   promiseB = promiseA.then(function(result) {\r\n   *     // success: do something and resolve promiseB\r\n   *     //          with the old or a new result\r\n   *     return result;\r\n   *   }, function(reason) {\r\n   *     // error: handle the error if possible and\r\n   *     //        resolve promiseB with newPromiseOrValue,\r\n   *     //        otherwise forward the rejection to promiseB\r\n   *     if (canHandle(reason)) {\r\n   *      // handle the error and recover\r\n   *      return newPromiseOrValue;\r\n   *     }\r\n   *     return $q.reject(reason);\r\n   *   });\r\n   * </pre>\r\n   *\r\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\r\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\r\n   */\r\n  var reject = function(reason) {\r\n    return {\r\n      then: function(callback, errback) {\r\n        var result = defer();\r\n        nextTick(function() {\r\n          result.resolve((errback || defaultErrback)(reason));\r\n        });\r\n        return result.promise;\r\n      }\r\n    };\r\n  };\r\n\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#when\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\r\n   * This is useful when you are dealing with on object that might or might not be a promise, or if\r\n   * the promise comes from a source that can't be trusted.\r\n   *\r\n   * @param {*} value Value or a promise\r\n   * @returns {Promise} Returns a single promise that will be resolved with an array of values,\r\n   *   each value coresponding to the promise at the same index in the `promises` array. If any of\r\n   *   the promises is resolved with a rejection, this resulting promise will be resolved with the\r\n   *   same rejection.\r\n   */\r\n  var when = function(value, callback, errback) {\r\n    var result = defer(),\r\n        done;\r\n\r\n    var wrappedCallback = function(value) {\r\n      try {\r\n        return (callback || defaultCallback)(value);\r\n      } catch (e) {\r\n        exceptionHandler(e);\r\n        return reject(e);\r\n      }\r\n    };\r\n\r\n    var wrappedErrback = function(reason) {\r\n      try {\r\n        return (errback || defaultErrback)(reason);\r\n      } catch (e) {\r\n        exceptionHandler(e);\r\n        return reject(e);\r\n      }\r\n    };\r\n\r\n    nextTick(function() {\r\n      ref(value).then(function(value) {\r\n        if (done) return;\r\n        done = true;\r\n        result.resolve(ref(value).then(wrappedCallback, wrappedErrback));\r\n      }, function(reason) {\r\n        if (done) return;\r\n        done = true;\r\n        result.resolve(wrappedErrback(reason));\r\n      });\r\n    });\r\n\r\n    return result.promise;\r\n  };\r\n\r\n\r\n  function defaultCallback(value) {\r\n    return value;\r\n  }\r\n\r\n\r\n  function defaultErrback(reason) {\r\n    return reject(reason);\r\n  }\r\n\r\n\r\n  /**\r\n   * @ngdoc\r\n   * @name ng.$q#all\r\n   * @methodOf ng.$q\r\n   * @description\r\n   * Combines multiple promises into a single promise that is resolved when all of the input\r\n   * promises are resolved.\r\n   *\r\n   * @param {Array.<Promise>} promises An array of promises.\r\n   * @returns {Promise} Returns a single promise that will be resolved with an array of values,\r\n   *   each value coresponding to the promise at the same index in the `promises` array. If any of\r\n   *   the promises is resolved with a rejection, this resulting promise will be resolved with the\r\n   *   same rejection.\r\n   */\r\n  function all(promises) {\r\n    var deferred = defer(),\r\n        counter = promises.length,\r\n        results = [];\r\n\r\n    if (counter) {\r\n      forEach(promises, function(promise, index) {\r\n        ref(promise).then(function(value) {\r\n          if (index in results) return;\r\n          results[index] = value;\r\n          if (!(--counter)) deferred.resolve(results);\r\n        }, function(reason) {\r\n          if (index in results) return;\r\n          deferred.reject(reason);\r\n        });\r\n      });\r\n    } else {\r\n      deferred.resolve(results);\r\n    }\r\n\r\n    return deferred.promise;\r\n  }\r\n\r\n  return {\r\n    defer: defer,\r\n    reject: reject,\r\n    when: when,\r\n    all: all\r\n  };\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$routeProvider\r\n * @function\r\n *\r\n * @description\r\n *\r\n * Used for configuring routes. See {@link ng.$route $route} for an example.\r\n */\r\nfunction $RouteProvider(){\r\n  var routes = {};\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$routeProvider#when\r\n   * @methodOf ng.$routeProvider\r\n   *\r\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\r\n   *    contains redundant trailing slash or is missing one, the route will still match and the\r\n   *    `$location.path` will be updated to add or drop the trailing slash to exacly match the\r\n   *    route definition.\r\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\r\n   *    match.\r\n   *\r\n   *    Object properties:\r\n   *\r\n   *    - `controller` â€“ `{function()=}` â€“ Controller fn that should be associated with newly\r\n   *      created scope.\r\n   *    - `template` â€“ `{string=}` â€“  html template as a string that should be used by\r\n   *      {@link ng.directive:ngView ngView} or\r\n   *      {@link ng.directive:ngInclude ngInclude} directives.\r\n   *      this property takes precedence over `templateUrl`.\r\n   *    - `templateUrl` â€“ `{string=}` â€“ path to an html template that should be used by\r\n   *      {@link ng.directive:ngView ngView}.\r\n   *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\r\n   *      be injected into the controller. If any of these dependencies are promises, they will be\r\n   *      resolved and converted to a value before the controller is instantiated and the\r\n   *      `$aftreRouteChange` event is fired. The map object is:\r\n   *\r\n   *      - `key` â€“ `{string}`: a name of a dependency to be injected into the controller.\r\n   *      - `factory` - `{string|function}`: If `string` then it is an alias for a service.\r\n   *        Otherwise if function, then it is {@link api/AUTO.$injector#invoke injected}\r\n   *        and the return value is treated as the dependency. If the result is a promise, it is resolved\r\n   *        before its value is injected into the controller.\r\n   *\r\n   *    - `redirectTo` â€“ {(string|function())=} â€“ value to update\r\n   *      {@link ng.$location $location} path with and trigger route redirection.\r\n   *\r\n   *      If `redirectTo` is a function, it will be called with the following parameters:\r\n   *\r\n   *      - `{Object.<string>}` - route parameters extracted from the current\r\n   *        `$location.path()` by applying the current route templateUrl.\r\n   *      - `{string}` - current `$location.path()`\r\n   *      - `{Object}` - current `$location.search()`\r\n   *\r\n   *      The custom `redirectTo` function is expected to return a string which will be used\r\n   *      to update `$location.path()` and `$location.search()`.\r\n   *\r\n   *    - `[reloadOnSearch=true]` - {boolean=} - reload route when only $location.search()\r\n   *    changes.\r\n   *\r\n   *      If the option is set to `false` and url in the browser changes, then\r\n   *      `$routeUpdate` event is broadcasted on the root scope.\r\n   *\r\n   * @returns {Object} self\r\n   *\r\n   * @description\r\n   * Adds a new route definition to the `$route` service.\r\n   */\r\n  this.when = function(path, route) {\r\n    routes[path] = extend({reloadOnSearch: true}, route);\r\n\r\n    // create redirection for trailing slashes\r\n    if (path) {\r\n      var redirectPath = (path[path.length-1] == '/')\r\n          ? path.substr(0, path.length-1)\r\n          : path +'/';\r\n\r\n      routes[redirectPath] = {redirectTo: path};\r\n    }\r\n\r\n    return this;\r\n  };\r\n\r\n  /**\r\n   * @ngdoc method\r\n   * @name ng.$routeProvider#otherwise\r\n   * @methodOf ng.$routeProvider\r\n   *\r\n   * @description\r\n   * Sets route definition that will be used on route change when no other route definition\r\n   * is matched.\r\n   *\r\n   * @param {Object} params Mapping information to be assigned to `$route.current`.\r\n   * @returns {Object} self\r\n   */\r\n  this.otherwise = function(params) {\r\n    this.when(null, params);\r\n    return this;\r\n  };\r\n\r\n\r\n  this.$get = ['$rootScope', '$location', '$routeParams', '$q', '$injector', '$http', '$templateCache',\r\n      function( $rootScope,   $location,   $routeParams,   $q,   $injector,   $http,   $templateCache) {\r\n\r\n    /**\r\n     * @ngdoc object\r\n     * @name ng.$route\r\n     * @requires $location\r\n     * @requires $routeParams\r\n     *\r\n     * @property {Object} current Reference to the current route definition.\r\n     * The route definition contains:\r\n     *\r\n     *   - `controller`: The controller constructor as define in route definition.\r\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\r\n     *     controller instantiation. The `locals` contain\r\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\r\n     *\r\n     *     - `$scope` - The current route scope.\r\n     *     - `$template` - The current route template HTML.\r\n     *\r\n     * @property {Array.<Object>} routes Array of all configured routes.\r\n     *\r\n     * @description\r\n     * Is used for deep-linking URLs to controllers and views (HTML partials).\r\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\r\n     *\r\n     * You can define routes through {@link ng.$routeProvider $routeProvider}'s API.\r\n     *\r\n     * The `$route` service is typically used in conjunction with {@link ng.directive:ngView ngView}\r\n     * directive and the {@link ng.$routeParams $routeParams} service.\r\n     *\r\n     * @example\r\n       This example shows how changing the URL hash causes the `$route` to match a route against the\r\n       URL, and the `ngView` pulls in the partial.\r\n\r\n       Note that this example is using {@link ng.directive:script inlined templates}\r\n       to get it working on jsfiddle as well.\r\n\r\n     <example module=\"ngView\">\r\n       <file name=\"index.html\">\r\n         <div ng-controller=\"MainCntl\">\r\n           Choose:\r\n           <a href=\"Book/Moby\">Moby</a> |\r\n           <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\r\n           <a href=\"Book/Gatsby\">Gatsby</a> |\r\n           <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\r\n           <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\r\n\r\n           <div ng-view></div>\r\n           <hr />\r\n\r\n           <pre>$location.path() = {{$location.path()}}</pre>\r\n           <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\r\n           <pre>$route.current.params = {{$route.current.params}}</pre>\r\n           <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\r\n           <pre>$routeParams = {{$routeParams}}</pre>\r\n         </div>\r\n       </file>\r\n\r\n       <file name=\"book.html\">\r\n         controller: {{name}}<br />\r\n         Book Id: {{params.bookId}}<br />\r\n       </file>\r\n\r\n       <file name=\"chapter.html\">\r\n         controller: {{name}}<br />\r\n         Book Id: {{params.bookId}}<br />\r\n         Chapter Id: {{params.chapterId}}\r\n       </file>\r\n\r\n       <file name=\"script.js\">\r\n         angular.module('ngView', [], function($routeProvider, $locationProvider) {\r\n           $routeProvider.when('/Book/:bookId', {\r\n             templateUrl: 'book.html',\r\n             controller: BookCntl,\r\n             resolve: {\r\n               // I will cause a 1 second delay\r\n               delay: function($q, $timeout) {\r\n                 var delay = $q.defer();\r\n                 $timeout(delay.resolve, 1000);\r\n                 return delay.promise;\r\n               }\r\n             }\r\n           });\r\n           $routeProvider.when('/Book/:bookId/ch/:chapterId', {\r\n             templateUrl: 'chapter.html',\r\n             controller: ChapterCntl\r\n           });\r\n\r\n           // configure html5 to get links working on jsfiddle\r\n           $locationProvider.html5Mode(true);\r\n         });\r\n\r\n         function MainCntl($scope, $route, $routeParams, $location) {\r\n           $scope.$route = $route;\r\n           $scope.$location = $location;\r\n           $scope.$routeParams = $routeParams;\r\n         }\r\n\r\n         function BookCntl($scope, $routeParams) {\r\n           $scope.name = \"BookCntl\";\r\n           $scope.params = $routeParams;\r\n         }\r\n\r\n         function ChapterCntl($scope, $routeParams) {\r\n           $scope.name = \"ChapterCntl\";\r\n           $scope.params = $routeParams;\r\n         }\r\n       </file>\r\n\r\n       <file name=\"scenario.js\">\r\n         it('should load and compile correct template', function() {\r\n           element('a:contains(\"Moby: Ch1\")').click();\r\n           var content = element('.doc-example-live [ng-view]').text();\r\n           expect(content).toMatch(/controller\\: ChapterCntl/);\r\n           expect(content).toMatch(/Book Id\\: Moby/);\r\n           expect(content).toMatch(/Chapter Id\\: 1/);\r\n\r\n           element('a:contains(\"Scarlet\")').click();\r\n           sleep(2); // promises are not part of scenario waiting\r\n           content = element('.doc-example-live [ng-view]').text();\r\n           expect(content).toMatch(/controller\\: BookCntl/);\r\n           expect(content).toMatch(/Book Id\\: Scarlet/);\r\n         });\r\n       </file>\r\n     </example>\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeChangeStart\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     * Broadcasted before a route change. At this  point the route services starts\r\n     * resolving all of the dependencies needed for the route change to occurs.\r\n     * Typically this involves fetching the view template as well as any dependencies\r\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\r\n     * `$routeChangeSuccess` is fired.\r\n     *\r\n     * @param {Route} next Future route information.\r\n     * @param {Route} current Current route information.\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeChangeSuccess\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     * Broadcasted after a route dependencies are resolved.\r\n     * {@link ng.directive:ngView ngView} listens for the directive\r\n     * to instantiate the controller and render the view.\r\n     *\r\n     * @param {Route} current Current route information.\r\n     * @param {Route} previous Previous route information.\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeChangeError\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     * Broadcasted if any of the resolve promises are rejected.\r\n     *\r\n     * @param {Route} current Current route information.\r\n     * @param {Route} previous Previous route information.\r\n     * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.\r\n     */\r\n\r\n    /**\r\n     * @ngdoc event\r\n     * @name ng.$route#$routeUpdate\r\n     * @eventOf ng.$route\r\n     * @eventType broadcast on root scope\r\n     * @description\r\n     *\r\n     * The `reloadOnSearch` property has been set to false, and we are reusing the same\r\n     * instance of the Controller.\r\n     */\r\n\r\n    var matcher = switchRouteMatcher,\r\n        forceReload = false,\r\n        $route = {\r\n          routes: routes,\r\n\r\n          /**\r\n           * @ngdoc method\r\n           * @name ng.$route#reload\r\n           * @methodOf ng.$route\r\n           *\r\n           * @description\r\n           * Causes `$route` service to reload the current route even if\r\n           * {@link ng.$location $location} hasn't changed.\r\n           *\r\n           * As a result of that, {@link ng.directive:ngView ngView}\r\n           * creates new scope, reinstantiates the controller.\r\n           */\r\n          reload: function() {\r\n            forceReload = true;\r\n            $rootScope.$evalAsync(updateRoute);\r\n          }\r\n        };\r\n\r\n    $rootScope.$on('$locationChangeSuccess', updateRoute);\r\n\r\n    return $route;\r\n\r\n    /////////////////////////////////////////////////////\r\n\r\n    function switchRouteMatcher(on, when) {\r\n      // TODO(i): this code is convoluted and inefficient, we should construct the route matching\r\n      //   regex only once and then reuse it\r\n      var regex = '^' + when.replace(/([\\.\\\\\\(\\)\\^\\$])/g, \"\\\\$1\") + '$',\r\n          params = [],\r\n          dst = {};\r\n      forEach(when.split(/\\W/), function(param) {\r\n        if (param) {\r\n          var paramRegExp = new RegExp(\":\" + param + \"([\\\\W])\");\r\n          if (regex.match(paramRegExp)) {\r\n            regex = regex.replace(paramRegExp, \"([^\\\\/]*)$1\");\r\n            params.push(param);\r\n          }\r\n        }\r\n      });\r\n      var match = on.match(new RegExp(regex));\r\n      if (match) {\r\n        forEach(params, function(name, index) {\r\n          dst[name] = match[index + 1];\r\n        });\r\n      }\r\n      return match ? dst : null;\r\n    }\r\n\r\n    function updateRoute() {\r\n      var next = parseRoute(),\r\n          last = $route.current;\r\n\r\n      if (next && last && next.$route === last.$route\r\n          && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) {\r\n        last.params = next.params;\r\n        copy(last.params, $routeParams);\r\n        $rootScope.$broadcast('$routeUpdate', last);\r\n      } else if (next || last) {\r\n        forceReload = false;\r\n        $rootScope.$broadcast('$routeChangeStart', next, last);\r\n        $route.current = next;\r\n        if (next) {\r\n          if (next.redirectTo) {\r\n            if (isString(next.redirectTo)) {\r\n              $location.path(interpolate(next.redirectTo, next.params)).search(next.params)\r\n                       .replace();\r\n            } else {\r\n              $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))\r\n                       .replace();\r\n            }\r\n          }\r\n        }\r\n\r\n        $q.when(next).\r\n          then(function() {\r\n            if (next) {\r\n              var keys = [],\r\n                  values = [],\r\n                  template;\r\n\r\n              forEach(next.resolve || {}, function(value, key) {\r\n                keys.push(key);\r\n                values.push(isFunction(value) ? $injector.invoke(value) : $injector.get(value));\r\n              });\r\n              if (isDefined(template = next.template)) {\r\n              } else if (isDefined(template = next.templateUrl)) {\r\n                template = $http.get(template, {cache: $templateCache}).\r\n                    then(function(response) { return response.data; });\r\n              }\r\n              if (isDefined(template)) {\r\n                keys.push('$template');\r\n                values.push(template);\r\n              }\r\n              return $q.all(values).then(function(values) {\r\n                var locals = {};\r\n                forEach(values, function(value, index) {\r\n                  locals[keys[index]] = value;\r\n                });\r\n                return locals;\r\n              });\r\n            }\r\n          }).\r\n          // after route change\r\n          then(function(locals) {\r\n            if (next == $route.current) {\r\n              if (next) {\r\n                next.locals = locals;\r\n                copy(next.params, $routeParams);\r\n              }\r\n              $rootScope.$broadcast('$routeChangeSuccess', next, last);\r\n            }\r\n          }, function(error) {\r\n            if (next == $route.current) {\r\n              $rootScope.$broadcast('$routeChangeError', next, last, error);\r\n            }\r\n          });\r\n      }\r\n    }\r\n\r\n\r\n    /**\r\n     * @returns the current active route, by matching it against the URL\r\n     */\r\n    function parseRoute() {\r\n      // Match a route\r\n      var params, match;\r\n      forEach(routes, function(route, path) {\r\n        if (!match && (params = matcher($location.path(), path))) {\r\n          match = inherit(route, {\r\n            params: extend({}, $location.search(), params),\r\n            pathParams: params});\r\n          match.$route = route;\r\n        }\r\n      });\r\n      // No route matched; fallback to \"otherwise\" route\r\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\r\n    }\r\n\r\n    /**\r\n     * @returns interpolation of the redirect path with the parametrs\r\n     */\r\n    function interpolate(string, params) {\r\n      var result = [];\r\n      forEach((string||'').split(':'), function(segment, i) {\r\n        if (i == 0) {\r\n          result.push(segment);\r\n        } else {\r\n          var segmentMatch = segment.match(/(\\w+)(.*)/);\r\n          var key = segmentMatch[1];\r\n          result.push(params[key]);\r\n          result.push(segmentMatch[2] || '');\r\n          delete params[key];\r\n        }\r\n      });\r\n      return result.join('');\r\n    }\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$routeParams\r\n * @requires $route\r\n *\r\n * @description\r\n * Current set of route parameters. The route parameters are a combination of the\r\n * {@link ng.$location $location} `search()`, and `path()`. The `path` parameters\r\n * are extracted when the {@link ng.$route $route} path is matched.\r\n *\r\n * In case of parameter name collision, `path` params take precedence over `search` params.\r\n *\r\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\r\n * (but its properties will likely change) even when a route change occurs.\r\n *\r\n * @example\r\n * <pre>\r\n *  // Given:\r\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\r\n *  // Route: /Chapter/:chapterId/Section/:sectionId\r\n *  //\r\n *  // Then\r\n *  $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}\r\n * </pre>\r\n */\r\nfunction $RouteParamsProvider() {\r\n  this.$get = valueFn({});\r\n}\r\n\r\n/**\r\n * DESIGN NOTES\r\n *\r\n * The design decisions behind the scope ware heavily favored for speed and memory consumption.\r\n *\r\n * The typical use of scope is to watch the expressions, which most of the time return the same\r\n * value as last time so we optimize the operation.\r\n *\r\n * Closures construction is expensive from speed as well as memory:\r\n *   - no closures, instead ups prototypical inheritance for API\r\n *   - Internal state needs to be stored on scope directly, which means that private state is\r\n *     exposed as $$____ properties\r\n *\r\n * Loop operations are optimized by using while(count--) { ... }\r\n *   - this means that in order to keep the same order of execution as addition we have to add\r\n *     items to the array at the begging (shift) instead of at the end (push)\r\n *\r\n * Child scopes are created and removed often\r\n *   - Using array would be slow since inserts in meddle are expensive so we use linked list\r\n *\r\n * There are few watches then a lot of observers. This is why you don't want the observer to be\r\n * implemented in the same way as watch. Watch requires return of initialization function which\r\n * are expensive to construct.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$rootScopeProvider\r\n * @description\r\n *\r\n * Provider for the $rootScope service.\r\n */\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$rootScopeProvider#digestTtl\r\n * @methodOf ng.$rootScopeProvider\r\n * @description\r\n *\r\n * Sets the number of digest iteration the scope should attempt to execute before giving up and\r\n * assuming that the model is unstable.\r\n *\r\n * The current default is 10 iterations.\r\n *\r\n * @param {number} limit The number of digest iterations.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$rootScope\r\n * @description\r\n *\r\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\r\n * All other scopes are child scopes of the root scope. Scopes provide mechanism for watching the model and provide\r\n * event processing life-cycle. See {@link guide/scope developer guide on scopes}.\r\n */\r\nfunction $RootScopeProvider(){\r\n  var TTL = 10;\r\n\r\n  this.digestTtl = function(value) {\r\n    if (arguments.length) {\r\n      TTL = value;\r\n    }\r\n    return TTL;\r\n  };\r\n\r\n  this.$get = ['$injector', '$exceptionHandler', '$parse',\r\n      function( $injector,   $exceptionHandler,   $parse) {\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$rootScope.Scope\r\n     *\r\n     * @description\r\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\r\n     * {@link AUTO.$injector $injector}. Child scopes are created using the\r\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\r\n     * compiled HTML template is executed.)\r\n     *\r\n     * Here is a simple scope snippet to show how you can interact with the scope.\r\n     * <pre>\r\n        angular.injector(['ng']).invoke(function($rootScope) {\r\n           var scope = $rootScope.$new();\r\n           scope.salutation = 'Hello';\r\n           scope.name = 'World';\r\n\r\n           expect(scope.greeting).toEqual(undefined);\r\n\r\n           scope.$watch('name', function() {\r\n             this.greeting = this.salutation + ' ' + this.name + '!';\r\n           }); // initialize the watch\r\n\r\n           expect(scope.greeting).toEqual(undefined);\r\n           scope.name = 'Misko';\r\n           // still old value, since watches have not been called yet\r\n           expect(scope.greeting).toEqual(undefined);\r\n\r\n           scope.$digest(); // fire all  the watches\r\n           expect(scope.greeting).toEqual('Hello Misko!');\r\n        });\r\n     * </pre>\r\n     *\r\n     * # Inheritance\r\n     * A scope can inherit from a parent scope, as in this example:\r\n     * <pre>\r\n         var parent = $rootScope;\r\n         var child = parent.$new();\r\n\r\n         parent.salutation = \"Hello\";\r\n         child.name = \"World\";\r\n         expect(child.salutation).toEqual('Hello');\r\n\r\n         child.salutation = \"Welcome\";\r\n         expect(child.salutation).toEqual('Welcome');\r\n         expect(parent.salutation).toEqual('Hello');\r\n     * </pre>\r\n     *\r\n     *\r\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be provided\r\n     *     for the current scope. Defaults to {@link ng}.\r\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\r\n     *     append/override services provided by `providers`. This is handy when unit-testing and having\r\n     *     the need to override a default service.\r\n     * @returns {Object} Newly created scope.\r\n     *\r\n     */\r\n    function Scope() {\r\n      this.$id = nextUid();\r\n      this.$$phase = this.$parent = this.$$watchers =\r\n                     this.$$nextSibling = this.$$prevSibling =\r\n                     this.$$childHead = this.$$childTail = null;\r\n      this['this'] = this.$root =  this;\r\n      this.$$asyncQueue = [];\r\n      this.$$listeners = {};\r\n    }\r\n\r\n    /**\r\n     * @ngdoc property\r\n     * @name ng.$rootScope.Scope#$id\r\n     * @propertyOf ng.$rootScope.Scope\r\n     * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for\r\n     *   debugging.\r\n     */\r\n\r\n\r\n    Scope.prototype = {\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$new\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\r\n       *\r\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and\r\n       * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the scope\r\n       * hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\r\n       *\r\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is desired for\r\n       * the scope and its child scopes to be permanently detached from the parent and thus stop\r\n       * participating in model change detection and listener notification by invoking.\r\n       *\r\n       * @param {boolean} isolate if true then the scoped does not prototypically inherit from the\r\n       *         parent scope. The scope is isolated, as it can not se parent scope properties.\r\n       *         When creating widgets it is useful for the widget to not accidently read parent\r\n       *         state.\r\n       *\r\n       * @returns {Object} The newly created child scope.\r\n       *\r\n       */\r\n      $new: function(isolate) {\r\n        var Child,\r\n            child;\r\n\r\n        if (isFunction(isolate)) {\r\n          // TODO: remove at some point\r\n          throw Error('API-CHANGE: Use $controller to instantiate controllers.');\r\n        }\r\n        if (isolate) {\r\n          child = new Scope();\r\n          child.$root = this.$root;\r\n        } else {\r\n          Child = function() {}; // should be anonymous; This is so that when the minifier munges\r\n            // the name it does not become random set of chars. These will then show up as class\r\n            // name in the debugger.\r\n          Child.prototype = this;\r\n          child = new Child();\r\n          child.$id = nextUid();\r\n        }\r\n        child['this'] = child;\r\n        child.$$listeners = {};\r\n        child.$parent = this;\r\n        child.$$asyncQueue = [];\r\n        child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null;\r\n        child.$$prevSibling = this.$$childTail;\r\n        if (this.$$childHead) {\r\n          this.$$childTail.$$nextSibling = child;\r\n          this.$$childTail = child;\r\n        } else {\r\n          this.$$childHead = this.$$childTail = child;\r\n        }\r\n        return child;\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$watch\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\r\n       *\r\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest $digest()} and\r\n       *   should return the value which will be watched. (Since {@link ng.$rootScope.Scope#$digest $digest()}\r\n       *   reruns when it detects changes the `watchExpression` can execute multiple times per\r\n       *   {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)\r\n       * - The `listener` is called only when the value from the current `watchExpression` and the\r\n       *   previous call to `watchExpression' are not equal (with the exception of the initial run\r\n       *   see below). The inequality is determined according to\r\n       *   {@link angular.equals} function. To save the value of the object for later comparison\r\n       *   {@link angular.copy} function is used. It also means that watching complex options will\r\n       *   have adverse memory and performance implications.\r\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire. This\r\n       *   is achieved by rerunning the watchers until no changes are detected. The rerun iteration\r\n       *   limit is 100 to prevent infinity loop deadlock.\r\n       *\r\n       *\r\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\r\n       * you can register an `watchExpression` function with no `listener`. (Since `watchExpression`,\r\n       * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a change is\r\n       * detected, be prepared for multiple calls to your listener.)\r\n       *\r\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\r\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\r\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\r\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\r\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\r\n       * listener was called due to initialization.\r\n       *\r\n       *\r\n       * # Example\r\n       * <pre>\r\n           // let's assume that scope was dependency injected as the $rootScope\r\n           var scope = $rootScope;\r\n           scope.name = 'misko';\r\n           scope.counter = 0;\r\n\r\n           expect(scope.counter).toEqual(0);\r\n           scope.$watch('name', function(newValue, oldValue) { counter = counter + 1; });\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.$digest();\r\n           // no variable change\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.name = 'adam';\r\n           scope.$digest();\r\n           expect(scope.counter).toEqual(1);\r\n       * </pre>\r\n       *\r\n       *\r\n       *\r\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\r\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers a\r\n       *    call to the `listener`.\r\n       *\r\n       *    - `string`: Evaluated as {@link guide/expression expression}\r\n       *    - `function(scope)`: called with current `scope` as a parameter.\r\n       * @param {(function()|string)=} listener Callback called whenever the return value of\r\n       *   the `watchExpression` changes.\r\n       *\r\n       *    - `string`: Evaluated as {@link guide/expression expression}\r\n       *    - `function(newValue, oldValue, scope)`: called with current and previous values as parameters.\r\n       *\r\n       * @param {boolean=} objectEquality Compare object for equality rather then for refference.\r\n       * @returns {function()} Returns a deregistration function for this listener.\r\n       */\r\n      $watch: function(watchExp, listener, objectEquality) {\r\n        var scope = this,\r\n            get = compileToFn(watchExp, 'watch'),\r\n            array = scope.$$watchers,\r\n            watcher = {\r\n              fn: listener,\r\n              last: initWatchVal,\r\n              get: get,\r\n              exp: watchExp,\r\n              eq: !!objectEquality\r\n            };\r\n\r\n        // in the case user pass string, we need to compile it, do we really need this ?\r\n        if (!isFunction(listener)) {\r\n          var listenFn = compileToFn(listener || noop, 'listener');\r\n          watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);};\r\n        }\r\n\r\n        if (!array) {\r\n          array = scope.$$watchers = [];\r\n        }\r\n        // we use unshift since we use a while loop in $digest for speed.\r\n        // the while loop reads in reverse order.\r\n        array.unshift(watcher);\r\n\r\n        return function() {\r\n          arrayRemove(array, watcher);\r\n        };\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$digest\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Process all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and its children.\r\n       * Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change the model, the\r\n       * `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} until no more listeners are\r\n       * firing. This means that it is possible to get into an infinite loop. This function will throw\r\n       * `'Maximum iteration limit exceeded.'` if the number of iterations exceeds 10.\r\n       *\r\n       * Usually you don't call `$digest()` directly in\r\n       * {@link ng.directive:ngController controllers} or in\r\n       * {@link ng.$compileProvider.directive directives}.\r\n       * Instead a call to {@link ng.$rootScope.Scope#$apply $apply()} (typically from within a\r\n       * {@link ng.$compileProvider.directive directives}) will force a `$digest()`.\r\n       *\r\n       * If you want to be notified whenever `$digest()` is called,\r\n       * you can register a `watchExpression` function  with {@link ng.$rootScope.Scope#$watch $watch()}\r\n       * with no `listener`.\r\n       *\r\n       * You may have a need to call `$digest()` from within unit-tests, to simulate the scope\r\n       * life-cycle.\r\n       *\r\n       * # Example\r\n       * <pre>\r\n           var scope = ...;\r\n           scope.name = 'misko';\r\n           scope.counter = 0;\r\n\r\n           expect(scope.counter).toEqual(0);\r\n           scope.$watch('name', function(newValue, oldValue) {\r\n             counter = counter + 1;\r\n           });\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.$digest();\r\n           // no variable change\r\n           expect(scope.counter).toEqual(0);\r\n\r\n           scope.name = 'adam';\r\n           scope.$digest();\r\n           expect(scope.counter).toEqual(1);\r\n       * </pre>\r\n       *\r\n       */\r\n      $digest: function() {\r\n        var watch, value, last,\r\n            watchers,\r\n            asyncQueue,\r\n            length,\r\n            dirty, ttl = TTL,\r\n            next, current, target = this,\r\n            watchLog = [],\r\n            logIdx, logMsg;\r\n\r\n        beginPhase('$digest');\r\n\r\n        do {\r\n          dirty = false;\r\n          current = target;\r\n          do {\r\n            asyncQueue = current.$$asyncQueue;\r\n            while(asyncQueue.length) {\r\n              try {\r\n                current.$eval(asyncQueue.shift());\r\n              } catch (e) {\r\n                $exceptionHandler(e);\r\n              }\r\n            }\r\n            if ((watchers = current.$$watchers)) {\r\n              // process our watches\r\n              length = watchers.length;\r\n              while (length--) {\r\n                try {\r\n                  watch = watchers[length];\r\n                  // Most common watches are on primitives, in which case we can short\r\n                  // circuit it with === operator, only when === fails do we use .equals\r\n                  if ((value = watch.get(current)) !== (last = watch.last) &&\r\n                      !(watch.eq\r\n                          ? equals(value, last)\r\n                          : (typeof value == 'number' && typeof last == 'number'\r\n                             && isNaN(value) && isNaN(last)))) {\r\n                    dirty = true;\r\n                    watch.last = watch.eq ? copy(value) : value;\r\n                    watch.fn(value, ((last === initWatchVal) ? value : last), current);\r\n                    if (ttl < 5) {\r\n                      logIdx = 4 - ttl;\r\n                      if (!watchLog[logIdx]) watchLog[logIdx] = [];\r\n                      logMsg = (isFunction(watch.exp))\r\n                          ? 'fn: ' + (watch.exp.name || watch.exp.toString())\r\n                          : watch.exp;\r\n                      logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);\r\n                      watchLog[logIdx].push(logMsg);\r\n                    }\r\n                  }\r\n                } catch (e) {\r\n                  $exceptionHandler(e);\r\n                }\r\n              }\r\n            }\r\n\r\n            // Insanity Warning: scope depth-first traversal\r\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\r\n            // this piece should be kept in sync with the traversal in $broadcast\r\n            if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {\r\n              while(current !== target && !(next = current.$$nextSibling)) {\r\n                current = current.$parent;\r\n              }\r\n            }\r\n          } while ((current = next));\r\n\r\n          if(dirty && !(ttl--)) {\r\n            clearPhase();\r\n            throw Error(TTL + ' $digest() iterations reached. Aborting!\\n' +\r\n                'Watchers fired in the last 5 iterations: ' + toJson(watchLog));\r\n          }\r\n        } while (dirty || asyncQueue.length);\r\n\r\n        clearPhase();\r\n      },\r\n\r\n\r\n      /**\r\n       * @ngdoc event\r\n       * @name ng.$rootScope.Scope#$destroy\r\n       * @eventOf ng.$rootScope.Scope\r\n       * @eventType broadcast on scope being destroyed\r\n       *\r\n       * @description\r\n       * Broadcasted when a scope and its children are being destroyed.\r\n       */\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$destroy\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Remove the current scope (and all of its children) from the parent scope. Removal implies\r\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\r\n       * propagate to the current scope and its children. Removal also implies that the current\r\n       * scope is eligible for garbage collection.\r\n       *\r\n       * The `$destroy()` is usually used by directives such as\r\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\r\n       * unrolling of the loop.\r\n       *\r\n       * Just before a scope is destroyed a `$destroy` event is broadcasted on this scope.\r\n       * Application code can register a `$destroy` event handler that will give it chance to\r\n       * perform any necessary cleanup.\r\n       */\r\n      $destroy: function() {\r\n        if ($rootScope == this) return; // we can't remove the root node;\r\n        var parent = this.$parent;\r\n\r\n        this.$broadcast('$destroy');\r\n\r\n        if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;\r\n        if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;\r\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\r\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$eval\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Executes the `expression` on the current scope returning the result. Any exceptions in the\r\n       * expression are propagated (uncaught). This is useful when evaluating engular expressions.\r\n       *\r\n       * # Example\r\n       * <pre>\r\n           var scope = ng.$rootScope.Scope();\r\n           scope.a = 1;\r\n           scope.b = 2;\r\n\r\n           expect(scope.$eval('a+b')).toEqual(3);\r\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\r\n       * </pre>\r\n       *\r\n       * @param {(string|function())=} expression An angular expression to be executed.\r\n       *\r\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\r\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\r\n       *\r\n       * @returns {*} The result of evaluating the expression.\r\n       */\r\n      $eval: function(expr, locals) {\r\n        return $parse(expr)(this, locals);\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$evalAsync\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Executes the expression on the current scope at a later point in time.\r\n       *\r\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only that:\r\n       *\r\n       *   - it will execute in the current script execution context (before any DOM rendering).\r\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\r\n       *     `expression` execution.\r\n       *\r\n       * Any exceptions from the execution of the expression are forwarded to the\r\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       *\r\n       * @param {(string|function())=} expression An angular expression to be executed.\r\n       *\r\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\r\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\r\n       *\r\n       */\r\n      $evalAsync: function(expr) {\r\n        this.$$asyncQueue.push(expr);\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$apply\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * `$apply()` is used to execute an expression in angular from outside of the angular framework.\r\n       * (For example from browser DOM events, setTimeout, XHR or third party libraries).\r\n       * Because we are calling into the angular framework we need to perform proper scope life-cycle\r\n       * of {@link ng.$exceptionHandler exception handling},\r\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\r\n       *\r\n       * ## Life cycle\r\n       *\r\n       * # Pseudo-Code of `$apply()`\r\n       * <pre>\r\n           function $apply(expr) {\r\n             try {\r\n               return $eval(expr);\r\n             } catch (e) {\r\n               $exceptionHandler(e);\r\n             } finally {\r\n               $root.$digest();\r\n             }\r\n           }\r\n       * </pre>\r\n       *\r\n       *\r\n       * Scope's `$apply()` method transitions through the following stages:\r\n       *\r\n       * 1. The {@link guide/expression expression} is executed using the\r\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\r\n       * 2. Any exceptions from the execution of the expression are forwarded to the\r\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the expression\r\n       *    was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\r\n       *\r\n       *\r\n       * @param {(string|function())=} exp An angular expression to be executed.\r\n       *\r\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\r\n       *    - `function(scope)`: execute the function with current `scope` parameter.\r\n       *\r\n       * @returns {*} The result of evaluating the expression.\r\n       */\r\n      $apply: function(expr) {\r\n        try {\r\n          beginPhase('$apply');\r\n          return this.$eval(expr);\r\n        } catch (e) {\r\n          $exceptionHandler(e);\r\n        } finally {\r\n          clearPhase();\r\n          try {\r\n            $rootScope.$digest();\r\n          } catch (e) {\r\n            $exceptionHandler(e);\r\n            throw e;\r\n          }\r\n        }\r\n      },\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$on\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Listen on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for discussion of\r\n       * event life cycle.\r\n       *\r\n       * @param {string} name Event name to listen on.\r\n       * @param {function(event)} listener Function to call when the event is emitted.\r\n       * @returns {function()} Returns a deregistration function for this listener.\r\n       *\r\n       * The event listener function format is: `function(event)`. The `event` object passed into the\r\n       * listener has the following attributes\r\n       *\r\n       *   - `targetScope` - {Scope}: the scope on which the event was `$emit`-ed or `$broadcast`-ed.\r\n       *   - `currentScope` - {Scope}: the current scope which is handling the event.\r\n       *   - `name` - {string}: Name of the event.\r\n       *   - `stopPropagation` - {function=}: calling `stopPropagation` function will cancel further event propagation\r\n       *     (available only for events that were `$emit`-ed).\r\n       *   - `preventDefault` - {function}: calling `preventDefault` sets `defaultPrevented` flag to true.\r\n       *   - `defaultPrevented` - {boolean}: true if `preventDefault` was called.\r\n       */\r\n      $on: function(name, listener) {\r\n        var namedListeners = this.$$listeners[name];\r\n        if (!namedListeners) {\r\n          this.$$listeners[name] = namedListeners = [];\r\n        }\r\n        namedListeners.push(listener);\r\n\r\n        return function() {\r\n          arrayRemove(namedListeners, listener);\r\n        };\r\n      },\r\n\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$emit\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\r\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\r\n       *\r\n       * The event life cycle starts at the scope on which `$emit` was called. All\r\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified.\r\n       * Afterwards, the event traverses upwards toward the root scope and calls all registered\r\n       * listeners along the way. The event will stop propagating if one of the listeners cancels it.\r\n       *\r\n       * Any exception emmited from the {@link ng.$rootScope.Scope#$on listeners} will be passed\r\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       *\r\n       * @param {string} name Event name to emit.\r\n       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.\r\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\r\n       */\r\n      $emit: function(name, args) {\r\n        var empty = [],\r\n            namedListeners,\r\n            scope = this,\r\n            stopPropagation = false,\r\n            event = {\r\n              name: name,\r\n              targetScope: scope,\r\n              stopPropagation: function() {stopPropagation = true;},\r\n              preventDefault: function() {\r\n                event.defaultPrevented = true;\r\n              },\r\n              defaultPrevented: false\r\n            },\r\n            listenerArgs = concat([event], arguments, 1),\r\n            i, length;\r\n\r\n        do {\r\n          namedListeners = scope.$$listeners[name] || empty;\r\n          event.currentScope = scope;\r\n          for (i=0, length=namedListeners.length; i<length; i++) {\r\n            try {\r\n              namedListeners[i].apply(null, listenerArgs);\r\n              if (stopPropagation) return event;\r\n            } catch (e) {\r\n              $exceptionHandler(e);\r\n            }\r\n          }\r\n          //traverse upwards\r\n          scope = scope.$parent;\r\n        } while (scope);\r\n\r\n        return event;\r\n      },\r\n\r\n\r\n      /**\r\n       * @ngdoc function\r\n       * @name ng.$rootScope.Scope#$broadcast\r\n       * @methodOf ng.$rootScope.Scope\r\n       * @function\r\n       *\r\n       * @description\r\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\r\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\r\n       *\r\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\r\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified.\r\n       * Afterwards, the event propagates to all direct and indirect scopes of the current scope and\r\n       * calls all registered listeners along the way. The event cannot be canceled.\r\n       *\r\n       * Any exception emmited from the {@link ng.$rootScope.Scope#$on listeners} will be passed\r\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\r\n       *\r\n       * @param {string} name Event name to emit.\r\n       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.\r\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\r\n       */\r\n      $broadcast: function(name, args) {\r\n        var target = this,\r\n            current = target,\r\n            next = target,\r\n            event = {\r\n              name: name,\r\n              targetScope: target,\r\n              preventDefault: function() {\r\n                event.defaultPrevented = true;\r\n              },\r\n              defaultPrevented: false\r\n            },\r\n            listenerArgs = concat([event], arguments, 1);\r\n\r\n        //down while you can, then up and next sibling or up and next sibling until back at root\r\n        do {\r\n          current = next;\r\n          event.currentScope = current;\r\n          forEach(current.$$listeners[name], function(listener) {\r\n            try {\r\n              listener.apply(null, listenerArgs);\r\n            } catch(e) {\r\n              $exceptionHandler(e);\r\n            }\r\n          });\r\n\r\n          // Insanity Warning: scope depth-first traversal\r\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\r\n          // this piece should be kept in sync with the traversal in $digest\r\n          if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {\r\n            while(current !== target && !(next = current.$$nextSibling)) {\r\n              current = current.$parent;\r\n            }\r\n          }\r\n        } while ((current = next));\r\n\r\n        return event;\r\n      }\r\n    };\r\n\r\n    var $rootScope = new Scope();\r\n\r\n    return $rootScope;\r\n\r\n\r\n    function beginPhase(phase) {\r\n      if ($rootScope.$$phase) {\r\n        throw Error($rootScope.$$phase + ' already in progress');\r\n      }\r\n\r\n      $rootScope.$$phase = phase;\r\n    }\r\n\r\n    function clearPhase() {\r\n      $rootScope.$$phase = null;\r\n    }\r\n\r\n    function compileToFn(exp, name) {\r\n      var fn = $parse(exp);\r\n      assertArgFn(fn, name);\r\n      return fn;\r\n    }\r\n\r\n    /**\r\n     * function used as an initial value for watchers.\r\n     * because it's uniqueue we can easily tell it apart from other values\r\n     */\r\n    function initWatchVal() {}\r\n  }];\r\n}\r\n\r\n/**\r\n * !!! This is an undocumented \"private\" service !!!\r\n *\r\n * @name ng.$sniffer\r\n * @requires $window\r\n *\r\n * @property {boolean} history Does the browser support html5 history api ?\r\n * @property {boolean} hashchange Does the browser support hashchange event ?\r\n *\r\n * @description\r\n * This is very simple implementation of testing browser's features.\r\n */\r\nfunction $SnifferProvider() {\r\n  this.$get = ['$window', function($window) {\r\n    var eventSupport = {},\r\n        android = int((/android (\\d+)/.exec(lowercase($window.navigator.userAgent)) || [])[1]);\r\n\r\n    return {\r\n      // Android has history.pushState, but it does not update location correctly\r\n      // so let's not use the history API at all.\r\n      // http://code.google.com/p/android/issues/detail?id=17471\r\n      // https://github.com/angular/angular.js/issues/904\r\n      history: !!($window.history && $window.history.pushState && !(android < 4)),\r\n      hashchange: 'onhashchange' in $window &&\r\n                  // IE8 compatible mode lies\r\n                  (!$window.document.documentMode || $window.document.documentMode > 7),\r\n      hasEvent: function(event) {\r\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\r\n        // it. In particular the event is not fired when backspace or delete key are pressed or\r\n        // when cut operation is performed.\r\n        if (event == 'input' && msie == 9) return false;\r\n\r\n        if (isUndefined(eventSupport[event])) {\r\n          var divElm = $window.document.createElement('div');\r\n          eventSupport[event] = 'on' + event in divElm;\r\n        }\r\n\r\n        return eventSupport[event];\r\n      },\r\n      // TODO(i): currently there is no way to feature detect CSP without triggering alerts\r\n      csp: false\r\n    };\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$window\r\n *\r\n * @description\r\n * A reference to the browser's `window` object. While `window`\r\n * is globally available in JavaScript, it causes testability problems, because\r\n * it is a global variable. In angular we always refer to it through the\r\n * `$window` service, so it may be overriden, removed or mocked for testing.\r\n *\r\n * All expressions are evaluated with respect to current scope so they don't\r\n * suffer from window globality.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <input ng-init=\"$window = $service('$window'); greeting='Hello World!'\" type=\"text\" ng-model=\"greeting\" />\r\n       <button ng-click=\"$window.alert(greeting)\">ALERT</button>\r\n     </doc:source>\r\n     <doc:scenario>\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nfunction $WindowProvider(){\r\n  this.$get = valueFn(window);\r\n}\r\n\r\n/**\r\n * Parse headers into key value object\r\n *\r\n * @param {string} headers Raw headers as a string\r\n * @returns {Object} Parsed headers as key value object\r\n */\r\nfunction parseHeaders(headers) {\r\n  var parsed = {}, key, val, i;\r\n\r\n  if (!headers) return parsed;\r\n\r\n  forEach(headers.split('\\n'), function(line) {\r\n    i = line.indexOf(':');\r\n    key = lowercase(trim(line.substr(0, i)));\r\n    val = trim(line.substr(i + 1));\r\n\r\n    if (key) {\r\n      if (parsed[key]) {\r\n        parsed[key] += ', ' + val;\r\n      } else {\r\n        parsed[key] = val;\r\n      }\r\n    }\r\n  });\r\n\r\n  return parsed;\r\n}\r\n\r\n\r\n/**\r\n * Returns a function that provides access to parsed headers.\r\n *\r\n * Headers are lazy parsed when first requested.\r\n * @see parseHeaders\r\n *\r\n * @param {(string|Object)} headers Headers to provide access to.\r\n * @returns {function(string=)} Returns a getter function which if called with:\r\n *\r\n *   - if called with single an argument returns a single header value or null\r\n *   - if called with no arguments returns an object containing all headers.\r\n */\r\nfunction headersGetter(headers) {\r\n  var headersObj = isObject(headers) ? headers : undefined;\r\n\r\n  return function(name) {\r\n    if (!headersObj) headersObj =  parseHeaders(headers);\r\n\r\n    if (name) {\r\n      return headersObj[lowercase(name)] || null;\r\n    }\r\n\r\n    return headersObj;\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * Chain all given functions\r\n *\r\n * This function is used for both request and response transforming\r\n *\r\n * @param {*} data Data to transform.\r\n * @param {function(string=)} headers Http headers getter fn.\r\n * @param {(function|Array.<function>)} fns Function or an array of functions.\r\n * @returns {*} Transformed data.\r\n */\r\nfunction transformData(data, headers, fns) {\r\n  if (isFunction(fns))\r\n    return fns(data, headers);\r\n\r\n  forEach(fns, function(fn) {\r\n    data = fn(data, headers);\r\n  });\r\n\r\n  return data;\r\n}\r\n\r\n\r\nfunction isSuccess(status) {\r\n  return 200 <= status && status < 300;\r\n}\r\n\r\n\r\nfunction $HttpProvider() {\r\n  var JSON_START = /^\\s*(\\[|\\{[^\\{])/,\r\n      JSON_END = /[\\}\\]]\\s*$/,\r\n      PROTECTION_PREFIX = /^\\)\\]\\}',?\\n/;\r\n\r\n  var $config = this.defaults = {\r\n    // transform incoming response data\r\n    transformResponse: [function(data) {\r\n      if (isString(data)) {\r\n        // strip json vulnerability protection prefix\r\n        data = data.replace(PROTECTION_PREFIX, '');\r\n        if (JSON_START.test(data) && JSON_END.test(data))\r\n          data = fromJson(data, true);\r\n      }\r\n      return data;\r\n    }],\r\n\r\n    // transform outgoing request data\r\n    transformRequest: [function(d) {\r\n      return isObject(d) && !isFile(d) ? toJson(d) : d;\r\n    }],\r\n\r\n    // default headers\r\n    headers: {\r\n      common: {\r\n        'Accept': 'application/json, text/plain, */*',\r\n        'X-Requested-With': 'XMLHttpRequest'\r\n      },\r\n      post: {'Content-Type': 'application/json;charset=utf-8'},\r\n      put:  {'Content-Type': 'application/json;charset=utf-8'}\r\n    }\r\n  };\r\n\r\n  var providerResponseInterceptors = this.responseInterceptors = [];\r\n\r\n  this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',\r\n      function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {\r\n\r\n    var defaultCache = $cacheFactory('$http'),\r\n        responseInterceptors = [];\r\n\r\n    forEach(providerResponseInterceptors, function(interceptor) {\r\n      responseInterceptors.push(\r\n          isString(interceptor)\r\n              ? $injector.get(interceptor)\r\n              : $injector.invoke(interceptor)\r\n      );\r\n    });\r\n\r\n\r\n    /**\r\n     * @ngdoc function\r\n     * @name ng.$http\r\n     * @requires $httpBacked\r\n     * @requires $browser\r\n     * @requires $cacheFactory\r\n     * @requires $rootScope\r\n     * @requires $q\r\n     * @requires $injector\r\n     *\r\n     * @description\r\n     * The `$http` service is a core Angular service that facilitates communication with the remote\r\n     * HTTP servers via browser's {@link https://developer.mozilla.org/en/xmlhttprequest\r\n     * XMLHttpRequest} object or via {@link http://en.wikipedia.org/wiki/JSONP JSONP}.\r\n     *\r\n     * For unit testing applications that use `$http` service, see\r\n     * {@link ngMock.$httpBackend $httpBackend mock}.\r\n     *\r\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\r\n     * $resource} service.\r\n     *\r\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\r\n     * the $q service. While for simple usage patters this doesn't matter much, for advanced usage,\r\n     * it is important to familiarize yourself with these apis and guarantees they provide.\r\n     *\r\n     *\r\n     * # General usage\r\n     * The `$http` service is a function which takes a single argument â€” a configuration object â€”\r\n     * that is used to generate an http request and returns  a {@link ng.$q promise}\r\n     * with two $http specific methods: `success` and `error`.\r\n     *\r\n     * <pre>\r\n     *   $http({method: 'GET', url: '/someUrl'}).\r\n     *     success(function(data, status, headers, config) {\r\n     *       // this callback will be called asynchronously\r\n     *       // when the response is available\r\n     *     }).\r\n     *     error(function(data, status, headers, config) {\r\n     *       // called asynchronously if an error occurs\r\n     *       // or server returns response with status\r\n     *       // code outside of the <200, 400) range\r\n     *     });\r\n     * </pre>\r\n     *\r\n     * Since the returned value of calling the $http function is a Promise object, you can also use\r\n     * the `then` method to register callbacks, and these callbacks will receive a single argument â€“\r\n     * an object representing the response. See the api signature and type info below for more\r\n     * details.\r\n     *\r\n     *\r\n     * # Shortcut methods\r\n     *\r\n     * Since all invocation of the $http service require definition of the http method and url and\r\n     * POST and PUT requests require response body/data to be provided as well, shortcut methods\r\n     * were created to simplify using the api:\r\n     *\r\n     * <pre>\r\n     *   $http.get('/someUrl').success(successCallback);\r\n     *   $http.post('/someUrl', data).success(successCallback);\r\n     * </pre>\r\n     *\r\n     * Complete list of shortcut methods:\r\n     *\r\n     * - {@link ng.$http#get $http.get}\r\n     * - {@link ng.$http#head $http.head}\r\n     * - {@link ng.$http#post $http.post}\r\n     * - {@link ng.$http#put $http.put}\r\n     * - {@link ng.$http#delete $http.delete}\r\n     * - {@link ng.$http#jsonp $http.jsonp}\r\n     *\r\n     *\r\n     * # Setting HTTP Headers\r\n     *\r\n     * The $http service will automatically add certain http headers to all requests. These defaults\r\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\r\n     * object, which currently contains this default configuration:\r\n     *\r\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\r\n     *   - `Accept: application/json, text/plain, * / *`\r\n     *   - `X-Requested-With: XMLHttpRequest`\r\n     * - `$httpProvider.defaults.headers.post`: (header defaults for HTTP POST requests)\r\n     *   - `Content-Type: application/json`\r\n     * - `$httpProvider.defaults.headers.put` (header defaults for HTTP PUT requests)\r\n     *   - `Content-Type: application/json`\r\n     *\r\n     * To add or overwrite these defaults, simply add or remove a property from this configuration\r\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\r\n     * with name equal to the lower-cased http method name, e.g.\r\n     * `$httpProvider.defaults.headers.get['My-Header']='value'`.\r\n     *\r\n     * Additionally, the defaults can be set at runtime via the `$http.defaults` object in a similar\r\n     * fassion as described above.\r\n     *\r\n     *\r\n     * # Transforming Requests and Responses\r\n     *\r\n     * Both requests and responses can be transformed using transform functions. By default, Angular\r\n     * applies these transformations:\r\n     *\r\n     * Request transformations:\r\n     *\r\n     * - if the `data` property of the request config object contains an object, serialize it into\r\n     *   JSON format.\r\n     *\r\n     * Response transformations:\r\n     *\r\n     *  - if XSRF prefix is detected, strip it (see Security Considerations section below)\r\n     *  - if json response is detected, deserialize it using a JSON parser\r\n     *\r\n     * To override these transformation locally, specify transform functions as `transformRequest`\r\n     * and/or `transformResponse` properties of the config object. To globally override the default\r\n     * transforms, override the `$httpProvider.defaults.transformRequest` and\r\n     * `$httpProvider.defaults.transformResponse` properties of the `$httpProvider`.\r\n     *\r\n     *\r\n     * # Caching\r\n     *\r\n     * To enable caching set the configuration property `cache` to `true`. When the cache is\r\n     * enabled, `$http` stores the response from the server in local cache. Next time the\r\n     * response is served from the cache without sending a request to the server.\r\n     *\r\n     * Note that even if the response is served from cache, delivery of the data is asynchronous in\r\n     * the same way that real requests are.\r\n     *\r\n     * If there are multiple GET requests for the same url that should be cached using the same\r\n     * cache, but the cache is not populated yet, only one request to the server will be made and\r\n     * the remaining requests will be fulfilled using the response for the first request.\r\n     *\r\n     *\r\n     * # Response interceptors\r\n     *\r\n     * Before you start creating interceptors, be sure to understand the\r\n     * {@link ng.$q $q and deferred/promise APIs}.\r\n     *\r\n     * For purposes of global error handling, authentication or any kind of synchronous or\r\n     * asynchronous preprocessing of received responses, it is desirable to be able to intercept\r\n     * responses for http requests before they are handed over to the application code that\r\n     * initiated these requests. The response interceptors leverage the {@link ng.$q\r\n     * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing.\r\n     *\r\n     * The interceptors are service factories that are registered with the $httpProvider by\r\n     * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and\r\n     * injected with dependencies (if specified) and returns the interceptor  â€” a function that\r\n     * takes a {@link ng.$q promise} and returns the original or a new promise.\r\n     *\r\n     * <pre>\r\n     *   // register the interceptor as a service\r\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\r\n     *     return function(promise) {\r\n     *       return promise.then(function(response) {\r\n     *         // do something on success\r\n     *       }, function(response) {\r\n     *         // do something on error\r\n     *         if (canRecover(response)) {\r\n     *           return responseOrNewPromise\r\n     *         }\r\n     *         return $q.reject(response);\r\n     *       });\r\n     *     }\r\n     *   });\r\n     *\r\n     *   $httpProvider.responseInterceptors.push('myHttpInterceptor');\r\n     *\r\n     *\r\n     *   // register the interceptor via an anonymous factory\r\n     *   $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {\r\n     *     return function(promise) {\r\n     *       // same as above\r\n     *     }\r\n     *   });\r\n     * </pre>\r\n     *\r\n     *\r\n     * # Security Considerations\r\n     *\r\n     * When designing web applications, consider security threats from:\r\n     *\r\n     * - {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx\r\n     *   JSON Vulnerability}\r\n     * - {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF}\r\n     *\r\n     * Both server and the client must cooperate in order to eliminate these threats. Angular comes\r\n     * pre-configured with strategies that address these issues, but for this to work backend server\r\n     * cooperation is required.\r\n     *\r\n     * ## JSON Vulnerability Protection\r\n     *\r\n     * A {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx\r\n     * JSON Vulnerability} allows third party web-site to turn your JSON resource URL into\r\n     * {@link http://en.wikipedia.org/wiki/JSON#JSONP JSONP} request under some conditions. To\r\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\r\n     * Angular will automatically strip the prefix before processing it as JSON.\r\n     *\r\n     * For example if your server needs to return:\r\n     * <pre>\r\n     * ['one','two']\r\n     * </pre>\r\n     *\r\n     * which is vulnerable to attack, your server can return:\r\n     * <pre>\r\n     * )]}',\r\n     * ['one','two']\r\n     * </pre>\r\n     *\r\n     * Angular will strip the prefix, before processing the JSON.\r\n     *\r\n     *\r\n     * ## Cross Site Request Forgery (XSRF) Protection\r\n     *\r\n     * {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} is a technique by which\r\n     * an unauthorized site can gain your user's private data. Angular provides following mechanism\r\n     * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie\r\n     * called `XSRF-TOKEN` and sets it as the HTTP header `X-XSRF-TOKEN`. Since only JavaScript that\r\n     * runs on your domain could read the cookie, your server can be assured that the XHR came from\r\n     * JavaScript running on your domain.\r\n     *\r\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\r\n     * cookie called `XSRF-TOKEN` on first HTTP GET request. On subsequent non-GET requests the\r\n     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\r\n     * that only JavaScript running on your domain could have read the token. The token must be\r\n     * unique for each user and must be verifiable by the server (to prevent the JavaScript making\r\n     * up its own tokens). We recommend that the token is a digest of your site's authentication\r\n     * cookie with {@link http://en.wikipedia.org/wiki/Rainbow_table salt for added security}.\r\n     *\r\n     *\r\n     * @param {object} config Object describing the request to be made and how it should be\r\n     *    processed. The object has following properties:\r\n     *\r\n     *    - **method** â€“ `{string}` â€“ HTTP method (e.g. 'GET', 'POST', etc)\r\n     *    - **url** â€“ `{string}` â€“ Absolute or relative URL of the resource that is being requested.\r\n     *    - **params** â€“ `{Object.<string|Object>}` â€“ Map of strings or objects which will be turned to\r\n     *      `?key1=value1&key2=value2` after the url. If the value is not a string, it will be JSONified.\r\n     *    - **data** â€“ `{string|Object}` â€“ Data to be sent as the request message data.\r\n     *    - **headers** â€“ `{Object}` â€“ Map of strings representing HTTP headers to send to the server.\r\n     *    - **transformRequest** â€“ `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` â€“\r\n     *      transform function or an array of such functions. The transform function takes the http\r\n     *      request body and headers and returns its transformed (typically serialized) version.\r\n     *    - **transformResponse** â€“ `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` â€“\r\n     *      transform function or an array of such functions. The transform function takes the http\r\n     *      response body and headers and returns its transformed (typically deserialized) version.\r\n     *    - **cache** â€“ `{boolean|Cache}` â€“ If true, a default $http cache will be used to cache the\r\n     *      GET request, otherwise if a cache instance built with\r\n     *      {@link ng.$cacheFactory $cacheFactory}, this cache will be used for\r\n     *      caching.\r\n     *    - **timeout** â€“ `{number}` â€“ timeout in milliseconds.\r\n     *    - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the\r\n     *      XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5\r\n     *      requests with credentials} for more information.\r\n     *\r\n     * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the\r\n     *   standard `then` method and two http specific methods: `success` and `error`. The `then`\r\n     *   method takes two arguments a success and an error callback which will be called with a\r\n     *   response object. The `success` and `error` methods take a single argument - a function that\r\n     *   will be called when the request succeeds or fails respectively. The arguments passed into\r\n     *   these functions are destructured representation of the response object passed into the\r\n     *   `then` method. The response object has these properties:\r\n     *\r\n     *   - **data** â€“ `{string|Object}` â€“ The response body transformed with the transform functions.\r\n     *   - **status** â€“ `{number}` â€“ HTTP status code of the response.\r\n     *   - **headers** â€“ `{function([headerName])}` â€“ Header getter function.\r\n     *   - **config** â€“ `{Object}` â€“ The configuration object that was used to generate the request.\r\n     *\r\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\r\n     *   requests. This is primarily meant to be used for debugging purposes.\r\n     *\r\n     *\r\n     * @example\r\n      <example>\r\n        <file name=\"index.html\">\r\n          <div ng-controller=\"FetchCtrl\">\r\n            <select ng-model=\"method\">\r\n              <option>GET</option>\r\n              <option>JSONP</option>\r\n            </select>\r\n            <input type=\"text\" ng-model=\"url\" size=\"80\"/>\r\n            <button ng-click=\"fetch()\">fetch</button><br>\r\n            <button ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\r\n            <button ng-click=\"updateModel('JSONP', 'http://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')\">Sample JSONP</button>\r\n            <button ng-click=\"updateModel('JSONP', 'http://angularjs.org/doesntexist&callback=JSON_CALLBACK')\">Invalid JSONP</button>\r\n            <pre>http status code: {{status}}</pre>\r\n            <pre>http response data: {{data}}</pre>\r\n          </div>\r\n        </file>\r\n        <file name=\"script.js\">\r\n          function FetchCtrl($scope, $http, $templateCache) {\r\n            $scope.method = 'GET';\r\n            $scope.url = 'http-hello.html';\r\n\r\n            $scope.fetch = function() {\r\n              $scope.code = null;\r\n              $scope.response = null;\r\n\r\n              $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\r\n                success(function(data, status) {\r\n                  $scope.status = status;\r\n                  $scope.data = data;\r\n                }).\r\n                error(function(data, status) {\r\n                  $scope.data = data || \"Request failed\";\r\n                  $scope.status = status;\r\n              });\r\n            };\r\n\r\n            $scope.updateModel = function(method, url) {\r\n              $scope.method = method;\r\n              $scope.url = url;\r\n            };\r\n          }\r\n        </file>\r\n        <file name=\"http-hello.html\">\r\n          Hello, $http!\r\n        </file>\r\n        <file name=\"scenario.js\">\r\n          it('should make an xhr GET request', function() {\r\n            element(':button:contains(\"Sample GET\")').click();\r\n            element(':button:contains(\"fetch\")').click();\r\n            expect(binding('status')).toBe('200');\r\n            expect(binding('data')).toMatch(/Hello, \\$http!/);\r\n          });\r\n\r\n          it('should make a JSONP request to angularjs.org', function() {\r\n            element(':button:contains(\"Sample JSONP\")').click();\r\n            element(':button:contains(\"fetch\")').click();\r\n            expect(binding('status')).toBe('200');\r\n            expect(binding('data')).toMatch(/Super Hero!/);\r\n          });\r\n\r\n          it('should make JSONP request to invalid URL and invoke the error handler',\r\n              function() {\r\n            element(':button:contains(\"Invalid JSONP\")').click();\r\n            element(':button:contains(\"fetch\")').click();\r\n            expect(binding('status')).toBe('0');\r\n            expect(binding('data')).toBe('Request failed');\r\n          });\r\n        </file>\r\n      </example>\r\n     */\r\n    function $http(config) {\r\n      config.method = uppercase(config.method);\r\n\r\n      var reqTransformFn = config.transformRequest || $config.transformRequest,\r\n          respTransformFn = config.transformResponse || $config.transformResponse,\r\n          defHeaders = $config.headers,\r\n          reqHeaders = extend({'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']},\r\n              defHeaders.common, defHeaders[lowercase(config.method)], config.headers),\r\n          reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn),\r\n          promise;\r\n\r\n      // strip content-type if data is undefined\r\n      if (isUndefined(config.data)) {\r\n        delete reqHeaders['Content-Type'];\r\n      }\r\n\r\n      // send request\r\n      promise = sendReq(config, reqData, reqHeaders);\r\n\r\n\r\n      // transform future response\r\n      promise = promise.then(transformResponse, transformResponse);\r\n\r\n      // apply interceptors\r\n      forEach(responseInterceptors, function(interceptor) {\r\n        promise = interceptor(promise);\r\n      });\r\n\r\n      promise.success = function(fn) {\r\n        promise.then(function(response) {\r\n          fn(response.data, response.status, response.headers, config);\r\n        });\r\n        return promise;\r\n      };\r\n\r\n      promise.error = function(fn) {\r\n        promise.then(null, function(response) {\r\n          fn(response.data, response.status, response.headers, config);\r\n        });\r\n        return promise;\r\n      };\r\n\r\n      return promise;\r\n\r\n      function transformResponse(response) {\r\n        // make a copy since the response must be cacheable\r\n        var resp = extend({}, response, {\r\n          data: transformData(response.data, response.headers, respTransformFn)\r\n        });\r\n        return (isSuccess(response.status))\r\n          ? resp\r\n          : $q.reject(resp);\r\n      }\r\n    }\r\n\r\n    $http.pendingRequests = [];\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#get\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `GET` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#delete\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `DELETE` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#head\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `HEAD` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#jsonp\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `JSONP` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request.\r\n     *                     Should contain `JSON_CALLBACK` string.\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n    createShortMethods('get', 'delete', 'head', 'jsonp');\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#post\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `POST` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {*} data Request content\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n\r\n    /**\r\n     * @ngdoc method\r\n     * @name ng.$http#put\r\n     * @methodOf ng.$http\r\n     *\r\n     * @description\r\n     * Shortcut method to perform `PUT` request\r\n     *\r\n     * @param {string} url Relative or absolute URL specifying the destination of the request\r\n     * @param {*} data Request content\r\n     * @param {Object=} config Optional configuration object\r\n     * @returns {HttpPromise} Future object\r\n     */\r\n    createShortMethodsWithData('post', 'put');\r\n\r\n        /**\r\n         * @ngdoc property\r\n         * @name ng.$http#defaults\r\n         * @propertyOf ng.$http\r\n         *\r\n         * @description\r\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\r\n         * default headers as well as request and response transformations.\r\n         *\r\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\r\n         */\r\n    $http.defaults = $config;\r\n\r\n\r\n    return $http;\r\n\r\n\r\n    function createShortMethods(names) {\r\n      forEach(arguments, function(name) {\r\n        $http[name] = function(url, config) {\r\n          return $http(extend(config || {}, {\r\n            method: name,\r\n            url: url\r\n          }));\r\n        };\r\n      });\r\n    }\r\n\r\n\r\n    function createShortMethodsWithData(name) {\r\n      forEach(arguments, function(name) {\r\n        $http[name] = function(url, data, config) {\r\n          return $http(extend(config || {}, {\r\n            method: name,\r\n            url: url,\r\n            data: data\r\n          }));\r\n        };\r\n      });\r\n    }\r\n\r\n\r\n    /**\r\n     * Makes the request\r\n     *\r\n     * !!! ACCESSES CLOSURE VARS:\r\n     * $httpBackend, $config, $log, $rootScope, defaultCache, $http.pendingRequests\r\n     */\r\n    function sendReq(config, reqData, reqHeaders) {\r\n      var deferred = $q.defer(),\r\n          promise = deferred.promise,\r\n          cache,\r\n          cachedResp,\r\n          url = buildUrl(config.url, config.params);\r\n\r\n      $http.pendingRequests.push(config);\r\n      promise.then(removePendingReq, removePendingReq);\r\n\r\n\r\n      if (config.cache && config.method == 'GET') {\r\n        cache = isObject(config.cache) ? config.cache : defaultCache;\r\n      }\r\n\r\n      if (cache) {\r\n        cachedResp = cache.get(url);\r\n        if (cachedResp) {\r\n          if (cachedResp.then) {\r\n            // cached request has already been sent, but there is no response yet\r\n            cachedResp.then(removePendingReq, removePendingReq);\r\n            return cachedResp;\r\n          } else {\r\n            // serving from cache\r\n            if (isArray(cachedResp)) {\r\n              resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2]));\r\n            } else {\r\n              resolvePromise(cachedResp, 200, {});\r\n            }\r\n          }\r\n        } else {\r\n          // put the promise for the non-transformed response into cache as a placeholder\r\n          cache.put(url, promise);\r\n        }\r\n      }\r\n\r\n      // if we won't have the response in cache, send the request to the backend\r\n      if (!cachedResp) {\r\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\r\n            config.withCredentials);\r\n      }\r\n\r\n      return promise;\r\n\r\n\r\n      /**\r\n       * Callback registered to $httpBackend():\r\n       *  - caches the response if desired\r\n       *  - resolves the raw $http promise\r\n       *  - calls $apply\r\n       */\r\n      function done(status, response, headersString) {\r\n        if (cache) {\r\n          if (isSuccess(status)) {\r\n            cache.put(url, [status, response, parseHeaders(headersString)]);\r\n          } else {\r\n            // remove promise from the cache\r\n            cache.remove(url);\r\n          }\r\n        }\r\n\r\n        resolvePromise(response, status, headersString);\r\n        $rootScope.$apply();\r\n      }\r\n\r\n\r\n      /**\r\n       * Resolves the raw $http promise.\r\n       */\r\n      function resolvePromise(response, status, headers) {\r\n        // normalize internal statuses to 0\r\n        status = Math.max(status, 0);\r\n\r\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\r\n          data: response,\r\n          status: status,\r\n          headers: headersGetter(headers),\r\n          config: config\r\n        });\r\n      }\r\n\r\n\r\n      function removePendingReq() {\r\n        var idx = indexOf($http.pendingRequests, config);\r\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\r\n      }\r\n    }\r\n\r\n\r\n    function buildUrl(url, params) {\r\n          if (!params) return url;\r\n          var parts = [];\r\n          forEachSorted(params, function(value, key) {\r\n            if (value == null || value == undefined) return;\r\n            if (isObject(value)) {\r\n              value = toJson(value);\r\n            }\r\n            parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n          });\r\n          return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');\r\n        }\r\n\r\n\r\n  }];\r\n}\r\nvar XHR = window.XMLHttpRequest || function() {\r\n  try { return new ActiveXObject(\"Msxml2.XMLHTTP.6.0\"); } catch (e1) {}\r\n  try { return new ActiveXObject(\"Msxml2.XMLHTTP.3.0\"); } catch (e2) {}\r\n  try { return new ActiveXObject(\"Msxml2.XMLHTTP\"); } catch (e3) {}\r\n  throw new Error(\"This browser does not support XMLHttpRequest.\");\r\n};\r\n\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$httpBackend\r\n * @requires $browser\r\n * @requires $window\r\n * @requires $document\r\n *\r\n * @description\r\n * HTTP backend used by the {@link ng.$http service} that delegates to\r\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\r\n *\r\n * You should never need to use this service directly, instead use the higher-level abstractions:\r\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\r\n *\r\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\r\n * $httpBackend} which can be trained with responses.\r\n */\r\nfunction $HttpBackendProvider() {\r\n  this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {\r\n    return createHttpBackend($browser, XHR, $browser.defer, $window.angular.callbacks,\r\n        $document[0], $window.location.protocol.replace(':', ''));\r\n  }];\r\n}\r\n\r\nfunction createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, locationProtocol) {\r\n  // TODO(vojta): fix the signature\r\n  return function(method, url, post, callback, headers, timeout, withCredentials) {\r\n    $browser.$$incOutstandingRequestCount();\r\n    url = url || $browser.url();\r\n\r\n    if (lowercase(method) == 'jsonp') {\r\n      var callbackId = '_' + (callbacks.counter++).toString(36);\r\n      callbacks[callbackId] = function(data) {\r\n        callbacks[callbackId].data = data;\r\n      };\r\n\r\n      jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),\r\n          function() {\r\n        if (callbacks[callbackId].data) {\r\n          completeRequest(callback, 200, callbacks[callbackId].data);\r\n        } else {\r\n          completeRequest(callback, -2);\r\n        }\r\n        delete callbacks[callbackId];\r\n      });\r\n    } else {\r\n      var xhr = new XHR();\r\n      xhr.open(method, url, true);\r\n      forEach(headers, function(value, key) {\r\n        if (value) xhr.setRequestHeader(key, value);\r\n      });\r\n\r\n      var status;\r\n\r\n      // In IE6 and 7, this might be called synchronously when xhr.send below is called and the\r\n      // response is in the cache. the promise api will ensure that to the app code the api is\r\n      // always async\r\n      xhr.onreadystatechange = function() {\r\n        if (xhr.readyState == 4) {\r\n          completeRequest(\r\n              callback, status || xhr.status, xhr.responseText, xhr.getAllResponseHeaders());\r\n        }\r\n      };\r\n\r\n      if (withCredentials) {\r\n        xhr.withCredentials = true;\r\n      }\r\n\r\n      xhr.send(post || '');\r\n\r\n      if (timeout > 0) {\r\n        $browserDefer(function() {\r\n          status = -1;\r\n          xhr.abort();\r\n        }, timeout);\r\n      }\r\n    }\r\n\r\n\r\n    function completeRequest(callback, status, response, headersString) {\r\n      // URL_MATCH is defined in src/service/location.js\r\n      var protocol = (url.match(URL_MATCH) || ['', locationProtocol])[1];\r\n\r\n      // fix status code for file protocol (it's always 0)\r\n      status = (protocol == 'file') ? (response ? 200 : 404) : status;\r\n\r\n      // normalize IE bug (http://bugs.jquery.com/ticket/1450)\r\n      status = status == 1223 ? 204 : status;\r\n\r\n      callback(status, response, headersString);\r\n      $browser.$$completeOutstandingRequest(noop);\r\n    }\r\n  };\r\n\r\n  function jsonpReq(url, done) {\r\n    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:\r\n    // - fetches local scripts via XHR and evals them\r\n    // - adds and immediately removes script elements from the document\r\n    var script = rawDocument.createElement('script'),\r\n        doneWrapper = function() {\r\n          rawDocument.body.removeChild(script);\r\n          if (done) done();\r\n        };\r\n\r\n    script.type = 'text/javascript';\r\n    script.src = url;\r\n\r\n    if (msie) {\r\n      script.onreadystatechange = function() {\r\n        if (/loaded|complete/.test(script.readyState)) doneWrapper();\r\n      };\r\n    } else {\r\n      script.onload = script.onerror = doneWrapper;\r\n    }\r\n\r\n    rawDocument.body.appendChild(script);\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$locale\r\n *\r\n * @description\r\n * $locale service provides localization rules for various Angular components. As of right now the\r\n * only public api is:\r\n *\r\n * * `id` â€“ `{string}` â€“ locale id formatted as `languageId-countryId` (e.g. `en-us`)\r\n */\r\nfunction $LocaleProvider(){\r\n  this.$get = function() {\r\n    return {\r\n      id: 'en-us',\r\n\r\n      NUMBER_FORMATS: {\r\n        DECIMAL_SEP: '.',\r\n        GROUP_SEP: ',',\r\n        PATTERNS: [\r\n          { // Decimal Pattern\r\n            minInt: 1,\r\n            minFrac: 0,\r\n            maxFrac: 3,\r\n            posPre: '',\r\n            posSuf: '',\r\n            negPre: '-',\r\n            negSuf: '',\r\n            gSize: 3,\r\n            lgSize: 3\r\n          },{ //Currency Pattern\r\n            minInt: 1,\r\n            minFrac: 2,\r\n            maxFrac: 2,\r\n            posPre: '\\u00A4',\r\n            posSuf: '',\r\n            negPre: '(\\u00A4',\r\n            negSuf: ')',\r\n            gSize: 3,\r\n            lgSize: 3\r\n          }\r\n        ],\r\n        CURRENCY_SYM: '$'\r\n      },\r\n\r\n      DATETIME_FORMATS: {\r\n        MONTH: 'January,February,March,April,May,June,July,August,September,October,November,December'\r\n                .split(','),\r\n        SHORTMONTH:  'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),\r\n        DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),\r\n        SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),\r\n        AMPMS: ['AM','PM'],\r\n        medium: 'MMM d, y h:mm:ss a',\r\n        short: 'M/d/yy h:mm a',\r\n        fullDate: 'EEEE, MMMM d, y',\r\n        longDate: 'MMMM d, y',\r\n        mediumDate: 'MMM d, y',\r\n        shortDate: 'M/d/yy',\r\n        mediumTime: 'h:mm:ss a',\r\n        shortTime: 'h:mm a'\r\n      },\r\n\r\n      pluralCat: function(num) {\r\n        if (num === 1) {\r\n          return 'one';\r\n        }\r\n        return 'other';\r\n      }\r\n    };\r\n  };\r\n}\r\n\r\nfunction $TimeoutProvider() {\r\n  this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',\r\n       function($rootScope,   $browser,   $q,   $exceptionHandler) {\r\n    var deferreds = {};\r\n\r\n\r\n     /**\r\n      * @ngdoc function\r\n      * @name ng.$timeout\r\n      * @requires $browser\r\n      *\r\n      * @description\r\n      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\r\n      * block and delegates any exceptions to\r\n      * {@link ng.$exceptionHandler $exceptionHandler} service.\r\n      *\r\n      * The return value of registering a timeout function is a promise which will be resolved when\r\n      * the timeout is reached and the timeout function is executed.\r\n      *\r\n      * To cancel a the timeout request, call `$timeout.cancel(promise)`.\r\n      *\r\n      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\r\n      * synchronously flush the queue of deferred functions.\r\n      *\r\n      * @param {function()} fn A function, who's execution should be delayed.\r\n      * @param {number=} [delay=0] Delay in milliseconds.\r\n      * @param {boolean=} [invokeApply=true] If set to false skips model dirty checking, otherwise\r\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\r\n      * @returns {*} Promise that will be resolved when the timeout is reached. The value this\r\n      *   promise will be resolved with is the return value of the `fn` function.\r\n      */\r\n    function timeout(fn, delay, invokeApply) {\r\n      var deferred = $q.defer(),\r\n          promise = deferred.promise,\r\n          skipApply = (isDefined(invokeApply) && !invokeApply),\r\n          timeoutId, cleanup;\r\n\r\n      timeoutId = $browser.defer(function() {\r\n        try {\r\n          deferred.resolve(fn());\r\n        } catch(e) {\r\n          deferred.reject(e);\r\n          $exceptionHandler(e);\r\n        }\r\n\r\n        if (!skipApply) $rootScope.$apply();\r\n      }, delay);\r\n\r\n      cleanup = function() {\r\n        delete deferreds[promise.$$timeoutId];\r\n      };\r\n\r\n      promise.$$timeoutId = timeoutId;\r\n      deferreds[timeoutId] = deferred;\r\n      promise.then(cleanup, cleanup);\r\n\r\n      return promise;\r\n    }\r\n\r\n\r\n     /**\r\n      * @ngdoc function\r\n      * @name ng.$timeout#cancel\r\n      * @methodOf ng.$timeout\r\n      *\r\n      * @description\r\n      * Cancels a task associated with the `promise`. As a result of this the promise will be\r\n      * resolved with a rejection.\r\n      *\r\n      * @param {Promise=} promise Promise returned by the `$timeout` function.\r\n      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\r\n      *   canceled.\r\n      */\r\n    timeout.cancel = function(promise) {\r\n      if (promise && promise.$$timeoutId in deferreds) {\r\n        deferreds[promise.$$timeoutId].reject('canceled');\r\n        return $browser.defer.cancel(promise.$$timeoutId);\r\n      }\r\n      return false;\r\n    };\r\n\r\n    return timeout;\r\n  }];\r\n}\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.$filterProvider\r\n * @description\r\n *\r\n * Filters are just functions which transform input to an output. However filters need to be Dependency Injected. To\r\n * achieve this a filter definition consists of a factory function which is annotated with dependencies and is\r\n * responsible for creating a the filter function.\r\n *\r\n * <pre>\r\n *   // Filter registration\r\n *   function MyModule($provide, $filterProvider) {\r\n *     // create a service to demonstrate injection (not always needed)\r\n *     $provide.value('greet', function(name){\r\n *       return 'Hello ' + name + '!';\r\n *     });\r\n *\r\n *     // register a filter factory which uses the\r\n *     // greet service to demonstrate DI.\r\n *     $filterProvider.register('greet', function(greet){\r\n *       // return the filter function which uses the greet service\r\n *       // to generate salutation\r\n *       return function(text) {\r\n *         // filters need to be forgiving so check input validity\r\n *         return text && greet(text) || text;\r\n *       };\r\n *     });\r\n *   }\r\n * </pre>\r\n *\r\n * The filter function is registered with the `$injector` under the filter name suffixe with `Filter`.\r\n * <pre>\r\n *   it('should be the same instance', inject(\r\n *     function($filterProvider) {\r\n *       $filterProvider.register('reverse', function(){\r\n *         return ...;\r\n *       });\r\n *     },\r\n *     function($filter, reverseFilter) {\r\n *       expect($filter('reverse')).toBe(reverseFilter);\r\n *     });\r\n * </pre>\r\n *\r\n *\r\n * For more information about how angular filters work, and how to create your own filters, see\r\n * {@link guide/dev_guide.templates.filters Understanding Angular Filters} in the angular Developer\r\n * Guide.\r\n */\r\n/**\r\n * @ngdoc method\r\n * @name ng.$filterProvider#register\r\n * @methodOf ng.$filterProvider\r\n * @description\r\n * Register filter factory function.\r\n *\r\n * @param {String} name Name of the filter.\r\n * @param {function} fn The filter factory function which is injectable.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.$filter\r\n * @function\r\n * @description\r\n * Filters are used for formatting data displayed to the user.\r\n *\r\n * The general syntax in templates is as follows:\r\n *\r\n *         {{ expression | [ filter_name ] }}\r\n *\r\n * @param {String} name Name of the filter function to retrieve\r\n * @return {Function} the filter function\r\n */\r\n$FilterProvider.$inject = ['$provide'];\r\nfunction $FilterProvider($provide) {\r\n  var suffix = 'Filter';\r\n\r\n  function register(name, factory) {\r\n    return $provide.factory(name + suffix, factory);\r\n  }\r\n  this.register = register;\r\n\r\n  this.$get = ['$injector', function($injector) {\r\n    return function(name) {\r\n      return $injector.get(name + suffix);\r\n    }\r\n  }];\r\n\r\n  ////////////////////////////////////////\r\n\r\n  register('currency', currencyFilter);\r\n  register('date', dateFilter);\r\n  register('filter', filterFilter);\r\n  register('json', jsonFilter);\r\n  register('limitTo', limitToFilter);\r\n  register('lowercase', lowercaseFilter);\r\n  register('number', numberFilter);\r\n  register('orderBy', orderByFilter);\r\n  register('uppercase', uppercaseFilter);\r\n}\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:filter\r\n * @function\r\n *\r\n * @description\r\n * Selects a subset of items from `array` and returns it as a new array.\r\n *\r\n * Note: This function is used to augment the `Array` type in Angular expressions. See\r\n * {@link ng.$filter} for more information about Angular arrays.\r\n *\r\n * @param {Array} array The source array.\r\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\r\n *   `array`.\r\n *\r\n *   Can be one of:\r\n *\r\n *   - `string`: Predicate that results in a substring match using the value of `expression`\r\n *     string. All strings or objects with string properties in `array` that contain this string\r\n *     will be returned. The predicate can be negated by prefixing the string with `!`.\r\n *\r\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\r\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\r\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\r\n *     property name `$` can be used (as in `{$:\"text\"}`) to accept a match against any\r\n *     property of the object. That's equivalent to the simple substring match with a `string`\r\n *     as described above.\r\n *\r\n *   - `function`: A predicate function can be used to write arbitrary filters. The function is\r\n *     called for each element of `array`. The final result is an array of those elements that\r\n *     the predicate returned true for.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\r\n                                {name:'Mary', phone:'800-BIG-MARY'},\r\n                                {name:'Mike', phone:'555-4321'},\r\n                                {name:'Adam', phone:'555-5678'},\r\n                                {name:'Julie', phone:'555-8765'}]\"></div>\r\n\r\n       Search: <input ng-model=\"searchText\">\r\n       <table id=\"searchTextResults\">\r\n         <tr><th>Name</th><th>Phone</th><tr>\r\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\r\n           <td>{{friend.name}}</td>\r\n           <td>{{friend.phone}}</td>\r\n         <tr>\r\n       </table>\r\n       <hr>\r\n       Any: <input ng-model=\"search.$\"> <br>\r\n       Name only <input ng-model=\"search.name\"><br>\r\n       Phone only <input ng-model=\"search.phone\"Ã¥><br>\r\n       <table id=\"searchObjResults\">\r\n         <tr><th>Name</th><th>Phone</th><tr>\r\n         <tr ng-repeat=\"friend in friends | filter:search\">\r\n           <td>{{friend.name}}</td>\r\n           <td>{{friend.phone}}</td>\r\n         <tr>\r\n       </table>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should search across all fields when filtering with a string', function() {\r\n         input('searchText').enter('m');\r\n         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).\r\n           toEqual(['Mary', 'Mike', 'Adam']);\r\n\r\n         input('searchText').enter('76');\r\n         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).\r\n           toEqual(['John', 'Julie']);\r\n       });\r\n\r\n       it('should search in specific fields when filtering with a predicate object', function() {\r\n         input('search.$').enter('i');\r\n         expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')).\r\n           toEqual(['Mary', 'Mike', 'Julie']);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nfunction filterFilter() {\r\n  return function(array, expression) {\r\n    if (!(array instanceof Array)) return array;\r\n    var predicates = [];\r\n    predicates.check = function(value) {\r\n      for (var j = 0; j < predicates.length; j++) {\r\n        if(!predicates[j](value)) {\r\n          return false;\r\n        }\r\n      }\r\n      return true;\r\n    };\r\n    var search = function(obj, text){\r\n      if (text.charAt(0) === '!') {\r\n        return !search(obj, text.substr(1));\r\n      }\r\n      switch (typeof obj) {\r\n        case \"boolean\":\r\n        case \"number\":\r\n        case \"string\":\r\n          return ('' + obj).toLowerCase().indexOf(text) > -1;\r\n        case \"object\":\r\n          for ( var objKey in obj) {\r\n            if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {\r\n              return true;\r\n            }\r\n          }\r\n          return false;\r\n        case \"array\":\r\n          for ( var i = 0; i < obj.length; i++) {\r\n            if (search(obj[i], text)) {\r\n              return true;\r\n            }\r\n          }\r\n          return false;\r\n        default:\r\n          return false;\r\n      }\r\n    };\r\n    switch (typeof expression) {\r\n      case \"boolean\":\r\n      case \"number\":\r\n      case \"string\":\r\n        expression = {$:expression};\r\n      case \"object\":\r\n        for (var key in expression) {\r\n          if (key == '$') {\r\n            (function() {\r\n              var text = (''+expression[key]).toLowerCase();\r\n              if (!text) return;\r\n              predicates.push(function(value) {\r\n                return search(value, text);\r\n              });\r\n            })();\r\n          } else {\r\n            (function() {\r\n              var path = key;\r\n              var text = (''+expression[key]).toLowerCase();\r\n              if (!text) return;\r\n              predicates.push(function(value) {\r\n                return search(getter(value, path), text);\r\n              });\r\n            })();\r\n          }\r\n        }\r\n        break;\r\n      case 'function':\r\n        predicates.push(expression);\r\n        break;\r\n      default:\r\n        return array;\r\n    }\r\n    var filtered = [];\r\n    for ( var j = 0; j < array.length; j++) {\r\n      var value = array[j];\r\n      if (predicates.check(value)) {\r\n        filtered.push(value);\r\n      }\r\n    }\r\n    return filtered;\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:currency\r\n * @function\r\n *\r\n * @description\r\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\r\n * symbol for current locale is used.\r\n *\r\n * @param {number} amount Input to filter.\r\n * @param {string=} symbol Currency symbol or identifier to be displayed.\r\n * @returns {string} Formatted number.\r\n *\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.amount = 1234.56;\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <input type=\"number\" ng-model=\"amount\"> <br>\r\n         default currency symbol ($): {{amount | currency}}<br>\r\n         custom currency identifier (USD$): {{amount | currency:\"USD$\"}}\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should init with 1234.56', function() {\r\n         expect(binding('amount | currency')).toBe('$1,234.56');\r\n         expect(binding('amount | currency:\"USD$\"')).toBe('USD$1,234.56');\r\n       });\r\n       it('should update', function() {\r\n         input('amount').enter('-1234');\r\n         expect(binding('amount | currency')).toBe('($1,234.00)');\r\n         expect(binding('amount | currency:\"USD$\"')).toBe('(USD$1,234.00)');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\ncurrencyFilter.$inject = ['$locale'];\r\nfunction currencyFilter($locale) {\r\n  var formats = $locale.NUMBER_FORMATS;\r\n  return function(amount, currencySymbol){\r\n    if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM;\r\n    return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).\r\n                replace(/\\u00A4/g, currencySymbol);\r\n  };\r\n}\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:number\r\n * @function\r\n *\r\n * @description\r\n * Formats a number as text.\r\n *\r\n * If the input is not a number an empty string is returned.\r\n *\r\n * @param {number|string} number Number to format.\r\n * @param {(number|string)=} [fractionSize=2] Number of decimal places to round the number to.\r\n * @returns {string} Number rounded to decimalPlaces and places a â€œ,â€ after each third digit.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.val = 1234.56789;\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         Enter number: <input ng-model='val'><br>\r\n         Default formatting: {{val | number}}<br>\r\n         No fractions: {{val | number:0}}<br>\r\n         Negative number: {{-val | number:4}}\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should format numbers', function() {\r\n         expect(binding('val | number')).toBe('1,234.568');\r\n         expect(binding('val | number:0')).toBe('1,235');\r\n         expect(binding('-val | number:4')).toBe('-1,234.5679');\r\n       });\r\n\r\n       it('should update', function() {\r\n         input('val').enter('3374.333');\r\n         expect(binding('val | number')).toBe('3,374.333');\r\n         expect(binding('val | number:0')).toBe('3,374');\r\n         expect(binding('-val | number:4')).toBe('-3,374.3330');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n\r\n\r\nnumberFilter.$inject = ['$locale'];\r\nfunction numberFilter($locale) {\r\n  var formats = $locale.NUMBER_FORMATS;\r\n  return function(number, fractionSize) {\r\n    return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\r\n      fractionSize);\r\n  };\r\n}\r\n\r\nvar DECIMAL_SEP = '.';\r\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\r\n  if (isNaN(number) || !isFinite(number)) return '';\r\n\r\n  var isNegative = number < 0;\r\n  number = Math.abs(number);\r\n  var numStr = number + '',\r\n      formatedText = '',\r\n      parts = [];\r\n\r\n  if (numStr.indexOf('e') !== -1) {\r\n    formatedText = numStr;\r\n  } else {\r\n    var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;\r\n\r\n    // determine fractionSize if it is not specified\r\n    if (isUndefined(fractionSize)) {\r\n      fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);\r\n    }\r\n\r\n    var pow = Math.pow(10, fractionSize);\r\n    number = Math.round(number * pow) / pow;\r\n    var fraction = ('' + number).split(DECIMAL_SEP);\r\n    var whole = fraction[0];\r\n    fraction = fraction[1] || '';\r\n\r\n    var pos = 0,\r\n        lgroup = pattern.lgSize,\r\n        group = pattern.gSize;\r\n\r\n    if (whole.length >= (lgroup + group)) {\r\n      pos = whole.length - lgroup;\r\n      for (var i = 0; i < pos; i++) {\r\n        if ((pos - i)%group === 0 && i !== 0) {\r\n          formatedText += groupSep;\r\n        }\r\n        formatedText += whole.charAt(i);\r\n      }\r\n    }\r\n\r\n    for (i = pos; i < whole.length; i++) {\r\n      if ((whole.length - i)%lgroup === 0 && i !== 0) {\r\n        formatedText += groupSep;\r\n      }\r\n      formatedText += whole.charAt(i);\r\n    }\r\n\r\n    // format fraction part.\r\n    while(fraction.length < fractionSize) {\r\n      fraction += '0';\r\n    }\r\n\r\n    if (fractionSize) formatedText += decimalSep + fraction.substr(0, fractionSize);\r\n  }\r\n\r\n  parts.push(isNegative ? pattern.negPre : pattern.posPre);\r\n  parts.push(formatedText);\r\n  parts.push(isNegative ? pattern.negSuf : pattern.posSuf);\r\n  return parts.join('');\r\n}\r\n\r\nfunction padNumber(num, digits, trim) {\r\n  var neg = '';\r\n  if (num < 0) {\r\n    neg =  '-';\r\n    num = -num;\r\n  }\r\n  num = '' + num;\r\n  while(num.length < digits) num = '0' + num;\r\n  if (trim)\r\n    num = num.substr(num.length - digits);\r\n  return neg + num;\r\n}\r\n\r\n\r\nfunction dateGetter(name, size, offset, trim) {\r\n  return function(date) {\r\n    var value = date['get' + name]();\r\n    if (offset > 0 || value > -offset)\r\n      value += offset;\r\n    if (value === 0 && offset == -12 ) value = 12;\r\n    return padNumber(value, size, trim);\r\n  };\r\n}\r\n\r\nfunction dateStrGetter(name, shortForm) {\r\n  return function(date, formats) {\r\n    var value = date['get' + name]();\r\n    var get = uppercase(shortForm ? ('SHORT' + name) : name);\r\n\r\n    return formats[get][value];\r\n  };\r\n}\r\n\r\nfunction timeZoneGetter(date) {\r\n  var offset = date.getTimezoneOffset();\r\n  return padNumber(offset / 60, 2) + padNumber(Math.abs(offset % 60), 2);\r\n}\r\n\r\nfunction ampmGetter(date, formats) {\r\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\r\n}\r\n\r\nvar DATE_FORMATS = {\r\n  yyyy: dateGetter('FullYear', 4),\r\n    yy: dateGetter('FullYear', 2, 0, true),\r\n     y: dateGetter('FullYear', 1),\r\n  MMMM: dateStrGetter('Month'),\r\n   MMM: dateStrGetter('Month', true),\r\n    MM: dateGetter('Month', 2, 1),\r\n     M: dateGetter('Month', 1, 1),\r\n    dd: dateGetter('Date', 2),\r\n     d: dateGetter('Date', 1),\r\n    HH: dateGetter('Hours', 2),\r\n     H: dateGetter('Hours', 1),\r\n    hh: dateGetter('Hours', 2, -12),\r\n     h: dateGetter('Hours', 1, -12),\r\n    mm: dateGetter('Minutes', 2),\r\n     m: dateGetter('Minutes', 1),\r\n    ss: dateGetter('Seconds', 2),\r\n     s: dateGetter('Seconds', 1),\r\n  EEEE: dateStrGetter('Day'),\r\n   EEE: dateStrGetter('Day', true),\r\n     a: ampmGetter,\r\n     Z: timeZoneGetter\r\n};\r\n\r\nvar DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,\r\n    NUMBER_STRING = /^\\d+$/;\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:date\r\n * @function\r\n *\r\n * @description\r\n *   Formats `date` to a string based on the requested `format`.\r\n *\r\n *   `format` string can be composed of the following elements:\r\n *\r\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\r\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\r\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\r\n *   * `'MMMM'`: Month in year (January-December)\r\n *   * `'MMM'`: Month in year (Jan-Dec)\r\n *   * `'MM'`: Month in year, padded (01-12)\r\n *   * `'M'`: Month in year (1-12)\r\n *   * `'dd'`: Day in month, padded (01-31)\r\n *   * `'d'`: Day in month (1-31)\r\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\r\n *   * `'EEE'`: Day in Week, (Sun-Sat)\r\n *   * `'HH'`: Hour in day, padded (00-23)\r\n *   * `'H'`: Hour in day (0-23)\r\n *   * `'hh'`: Hour in am/pm, padded (01-12)\r\n *   * `'h'`: Hour in am/pm, (1-12)\r\n *   * `'mm'`: Minute in hour, padded (00-59)\r\n *   * `'m'`: Minute in hour (0-59)\r\n *   * `'ss'`: Second in minute, padded (00-59)\r\n *   * `'s'`: Second in minute (0-59)\r\n *   * `'a'`: am/pm marker\r\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-1200)\r\n *\r\n *   `format` string can also be one of the following predefined\r\n *   {@link guide/i18n localizable formats}:\r\n *\r\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\r\n *     (e.g. Sep 3, 2010 12:05:08 pm)\r\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 pm)\r\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US  locale\r\n *     (e.g. Friday, September 3, 2010)\r\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010\r\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\r\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\r\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)\r\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)\r\n *\r\n *   `format` string can contain literal values. These need to be quoted with single quotes (e.g.\r\n *   `\"h 'in the morning'\"`). In order to output single quote, use two single quotes in a sequence\r\n *   (e.g. `\"h o''clock\"`).\r\n *\r\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\r\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and it's\r\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ).\r\n * @param {string=} format Formatting rules (see Description). If not specified,\r\n *    `mediumDate` is used.\r\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\r\n           {{1288323623006 | date:'medium'}}<br>\r\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\r\n          {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}<br>\r\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\r\n          {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}<br>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should format date', function() {\r\n         expect(binding(\"1288323623006 | date:'medium'\")).\r\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\r\n         expect(binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).\r\n            toMatch(/2010\\-10\\-2\\d \\d{2}:\\d{2}:\\d{2} \\-?\\d{4}/);\r\n         expect(binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).\r\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\ndateFilter.$inject = ['$locale'];\r\nfunction dateFilter($locale) {\r\n\r\n\r\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{3}))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d)))?$/;\r\n  function jsonStringToDate(string){\r\n    var match;\r\n    if (match = string.match(R_ISO8601_STR)) {\r\n      var date = new Date(0),\r\n          tzHour = 0,\r\n          tzMin  = 0;\r\n      if (match[9]) {\r\n        tzHour = int(match[9] + match[10]);\r\n        tzMin = int(match[9] + match[11]);\r\n      }\r\n      date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));\r\n      date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));\r\n      return date;\r\n    }\r\n    return string;\r\n  }\r\n\r\n\r\n  return function(date, format) {\r\n    var text = '',\r\n        parts = [],\r\n        fn, match;\r\n\r\n    format = format || 'mediumDate';\r\n    format = $locale.DATETIME_FORMATS[format] || format;\r\n    if (isString(date)) {\r\n      if (NUMBER_STRING.test(date)) {\r\n        date = int(date);\r\n      } else {\r\n        date = jsonStringToDate(date);\r\n      }\r\n    }\r\n\r\n    if (isNumber(date)) {\r\n      date = new Date(date);\r\n    }\r\n\r\n    if (!isDate(date)) {\r\n      return date;\r\n    }\r\n\r\n    while(format) {\r\n      match = DATE_FORMATS_SPLIT.exec(format);\r\n      if (match) {\r\n        parts = concat(parts, match, 1);\r\n        format = parts.pop();\r\n      } else {\r\n        parts.push(format);\r\n        format = null;\r\n      }\r\n    }\r\n\r\n    forEach(parts, function(value){\r\n      fn = DATE_FORMATS[value];\r\n      text += fn ? fn(date, $locale.DATETIME_FORMATS)\r\n                 : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\r\n    });\r\n\r\n    return text;\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:json\r\n * @function\r\n *\r\n * @description\r\n *   Allows you to convert a JavaScript object into JSON string.\r\n *\r\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\r\n *   the binding is automatically converted to JSON.\r\n *\r\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\r\n * @returns {string} JSON string.\r\n *\r\n *\r\n * @example:\r\n   <doc:example>\r\n     <doc:source>\r\n       <pre>{{ {'name':'value'} | json }}</pre>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should jsonify filtered objects', function() {\r\n         expect(binding(\"{'name':'value'}\")).toMatch(/\\{\\n  \"name\": ?\"value\"\\n}/);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n *\r\n */\r\nfunction jsonFilter() {\r\n  return function(object) {\r\n    return toJson(object, true);\r\n  };\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:lowercase\r\n * @function\r\n * @description\r\n * Converts string to lowercase.\r\n * @see angular.lowercase\r\n */\r\nvar lowercaseFilter = valueFn(lowercase);\r\n\r\n\r\n/**\r\n * @ngdoc filter\r\n * @name ng.filter:uppercase\r\n * @function\r\n * @description\r\n * Converts string to uppercase.\r\n * @see angular.uppercase\r\n */\r\nvar uppercaseFilter = valueFn(uppercase);\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.filter:limitTo\r\n * @function\r\n *\r\n * @description\r\n * Creates a new array containing only a specified number of elements in an array. The elements\r\n * are taken from either the beginning or the end of the source array, as specified by the\r\n * value and sign (positive or negative) of `limit`.\r\n *\r\n * Note: This function is used to augment the `Array` type in Angular expressions. See\r\n * {@link ng.$filter} for more information about Angular arrays.\r\n *\r\n * @param {Array} array Source array to be limited.\r\n * @param {string|Number} limit The length of the returned array. If the `limit` number is\r\n *     positive, `limit` number of items from the beginning of the source array are copied.\r\n *     If the number is negative, `limit` number  of items from the end of the source array are\r\n *     copied. The `limit` will be trimmed if it exceeds `array.length`\r\n * @returns {Array} A new sub-array of length `limit` or less if input array had less than `limit`\r\n *     elements.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.numbers = [1,2,3,4,5,6,7,8,9];\r\n           $scope.limit = 3;\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         Limit {{numbers}} to: <input type=\"integer\" ng-model=\"limit\">\r\n         <p>Output: {{ numbers | limitTo:limit }}</p>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should limit the numer array to first three items', function() {\r\n         expect(element('.doc-example-live input[ng-model=limit]').val()).toBe('3');\r\n         expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3]');\r\n       });\r\n\r\n       it('should update the output when -3 is entered', function() {\r\n         input('limit').enter(-3);\r\n         expect(binding('numbers | limitTo:limit')).toEqual('[7,8,9]');\r\n       });\r\n\r\n       it('should not exceed the maximum size of input array', function() {\r\n         input('limit').enter(100);\r\n         expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3,4,5,6,7,8,9]');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nfunction limitToFilter(){\r\n  return function(array, limit) {\r\n    if (!(array instanceof Array)) return array;\r\n    limit = int(limit);\r\n    var out = [],\r\n      i, n;\r\n\r\n    // check that array is iterable\r\n    if (!array || !(array instanceof Array))\r\n      return out;\r\n\r\n    // if abs(limit) exceeds maximum length, trim it\r\n    if (limit > array.length)\r\n      limit = array.length;\r\n    else if (limit < -array.length)\r\n      limit = -array.length;\r\n\r\n    if (limit > 0) {\r\n      i = 0;\r\n      n = limit;\r\n    } else {\r\n      i = array.length + limit;\r\n      n = array.length;\r\n    }\r\n\r\n    for (; i<n; i++) {\r\n      out.push(array[i]);\r\n    }\r\n\r\n    return out;\r\n  }\r\n}\r\n\r\n/**\r\n * @ngdoc function\r\n * @name ng.filter:orderBy\r\n * @function\r\n *\r\n * @description\r\n * Orders a specified `array` by the `expression` predicate.\r\n *\r\n * Note: this function is used to augment the `Array` type in Angular expressions. See\r\n * {@link ng.$filter} for more informaton about Angular arrays.\r\n *\r\n * @param {Array} array The array to sort.\r\n * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be\r\n *    used by the comparator to determine the order of elements.\r\n *\r\n *    Can be one of:\r\n *\r\n *    - `function`: Getter function. The result of this function will be sorted using the\r\n *      `<`, `=`, `>` operator.\r\n *    - `string`: An Angular expression which evaluates to an object to order by, such as 'name'\r\n *      to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control\r\n *      ascending or descending sort order (for example, +name or -name).\r\n *    - `Array`: An array of function or string predicates. The first predicate in the array\r\n *      is used for sorting, but when two items are equivalent, the next predicate is used.\r\n *\r\n * @param {boolean=} reverse Reverse the order the array.\r\n * @returns {Array} Sorted copy of the source array.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.friends =\r\n               [{name:'John', phone:'555-1212', age:10},\r\n                {name:'Mary', phone:'555-9876', age:19},\r\n                {name:'Mike', phone:'555-4321', age:21},\r\n                {name:'Adam', phone:'555-5678', age:35},\r\n                {name:'Julie', phone:'555-8765', age:29}]\r\n           $scope.predicate = '-age';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\r\n         <hr/>\r\n         [ <a href=\"\" ng-click=\"predicate=''\">unsorted</a> ]\r\n         <table class=\"friend\">\r\n           <tr>\r\n             <th><a href=\"\" ng-click=\"predicate = 'name'; reverse=false\">Name</a>\r\n                 (<a href ng-click=\"predicate = '-name'; reverse=false\">^</a>)</th>\r\n             <th><a href=\"\" ng-click=\"predicate = 'phone'; reverse=!reverse\">Phone Number</a></th>\r\n             <th><a href=\"\" ng-click=\"predicate = 'age'; reverse=!reverse\">Age</a></th>\r\n           <tr>\r\n           <tr ng-repeat=\"friend in friends | orderBy:predicate:reverse\">\r\n             <td>{{friend.name}}</td>\r\n             <td>{{friend.phone}}</td>\r\n             <td>{{friend.age}}</td>\r\n           <tr>\r\n         </table>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should be reverse ordered by aged', function() {\r\n         expect(binding('predicate')).toBe('-age');\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.age')).\r\n           toEqual(['35', '29', '21', '19', '10']);\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.name')).\r\n           toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']);\r\n       });\r\n\r\n       it('should reorder the table when user selects different predicate', function() {\r\n         element('.doc-example-live a:contains(\"Name\")').click();\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.name')).\r\n           toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']);\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.age')).\r\n           toEqual(['35', '10', '29', '19', '21']);\r\n\r\n         element('.doc-example-live a:contains(\"Phone\")').click();\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.phone')).\r\n           toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']);\r\n         expect(repeater('table.friend', 'friend in friends').column('friend.name')).\r\n           toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\norderByFilter.$inject = ['$parse'];\r\nfunction orderByFilter($parse){\r\n  return function(array, sortPredicate, reverseOrder) {\r\n    if (!(array instanceof Array)) return array;\r\n    if (!sortPredicate) return array;\r\n    sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];\r\n    sortPredicate = map(sortPredicate, function(predicate){\r\n      var descending = false, get = predicate || identity;\r\n      if (isString(predicate)) {\r\n        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {\r\n          descending = predicate.charAt(0) == '-';\r\n          predicate = predicate.substring(1);\r\n        }\r\n        get = $parse(predicate);\r\n      }\r\n      return reverseComparator(function(a,b){\r\n        return compare(get(a),get(b));\r\n      }, descending);\r\n    });\r\n    var arrayCopy = [];\r\n    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }\r\n    return arrayCopy.sort(reverseComparator(comparator, reverseOrder));\r\n\r\n    function comparator(o1, o2){\r\n      for ( var i = 0; i < sortPredicate.length; i++) {\r\n        var comp = sortPredicate[i](o1, o2);\r\n        if (comp !== 0) return comp;\r\n      }\r\n      return 0;\r\n    }\r\n    function reverseComparator(comp, descending) {\r\n      return toBoolean(descending)\r\n          ? function(a,b){return comp(b,a);}\r\n          : comp;\r\n    }\r\n    function compare(v1, v2){\r\n      var t1 = typeof v1;\r\n      var t2 = typeof v2;\r\n      if (t1 == t2) {\r\n        if (t1 == \"string\") v1 = v1.toLowerCase();\r\n        if (t1 == \"string\") v2 = v2.toLowerCase();\r\n        if (v1 === v2) return 0;\r\n        return v1 < v2 ? -1 : 1;\r\n      } else {\r\n        return t1 < t2 ? -1 : 1;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nfunction ngDirective(directive) {\r\n  if (isFunction(directive)) {\r\n    directive = {\r\n      link: directive\r\n    }\r\n  }\r\n  directive.restrict = directive.restrict || 'AC';\r\n  return valueFn(directive);\r\n}\r\n\r\n/*\r\n * Modifies the default behavior of html A tag, so that the default action is prevented when href\r\n * attribute is empty.\r\n *\r\n * The reasoning for this change is to allow easy creation of action links with `ngClick` directive\r\n * without changing the location or causing page reloads, e.g.:\r\n * <a href=\"\" ng-click=\"model.$save()\">Save</a>\r\n */\r\nvar htmlAnchorDirective = valueFn({\r\n  restrict: 'E',\r\n  compile: function(element, attr) {\r\n    // turn <a href ng-click=\"..\">link</a> into a link in IE\r\n    // but only if it doesn't have name attribute, in which case it's an anchor\r\n    if (!attr.href) {\r\n      attr.$set('href', '');\r\n    }\r\n\r\n    return function(scope, element) {\r\n      element.bind('click', function(event){\r\n        // if we have no href url, then don't navigate anywhere.\r\n        if (!element.attr('href')) {\r\n          event.preventDefault();\r\n        }\r\n      });\r\n    }\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngHref\r\n * @restrict A\r\n *\r\n * @description\r\n * Using Angular markup like {{hash}} in an href attribute makes\r\n * the page open to a wrong URL, if the user clicks that link before\r\n * angular has a chance to replace the {{hash}} with actual URL, the\r\n * link will be broken and will most likely return a 404 error.\r\n * The `ngHref` directive solves this problem.\r\n *\r\n * The buggy way to write it:\r\n * <pre>\r\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * The correct way to write it:\r\n * <pre>\r\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * @element A\r\n * @param {template} ngHref any string which can contain `{{}}` markup.\r\n *\r\n * @example\r\n * This example uses `link` variable inside `href` attribute:\r\n    <doc:example>\r\n      <doc:source>\r\n        <input ng-model=\"value\" /><br />\r\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\r\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\r\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\r\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\r\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\r\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should execute ng-click but not reload when href without value', function() {\r\n          element('#link-1').click();\r\n          expect(input('value').val()).toEqual('1');\r\n          expect(element('#link-1').attr('href')).toBe(\"\");\r\n        });\r\n\r\n        it('should execute ng-click but not reload when href empty string', function() {\r\n          element('#link-2').click();\r\n          expect(input('value').val()).toEqual('2');\r\n          expect(element('#link-2').attr('href')).toBe(\"\");\r\n        });\r\n\r\n        it('should execute ng-click and change url when ng-href specified', function() {\r\n          expect(element('#link-3').attr('href')).toBe(\"/123\");\r\n\r\n          element('#link-3').click();\r\n          expect(browser().window().path()).toEqual('/123');\r\n        });\r\n\r\n        it('should execute ng-click but not reload when href empty string and name specified', function() {\r\n          element('#link-4').click();\r\n          expect(input('value').val()).toEqual('4');\r\n          expect(element('#link-4').attr('href')).toBe('');\r\n        });\r\n\r\n        it('should execute ng-click but not reload when no href but name specified', function() {\r\n          element('#link-5').click();\r\n          expect(input('value').val()).toEqual('5');\r\n          expect(element('#link-5').attr('href')).toBe('');\r\n        });\r\n\r\n        it('should only change url when only ng-href', function() {\r\n          input('value').enter('6');\r\n          expect(element('#link-6').attr('href')).toBe('6');\r\n\r\n          element('#link-6').click();\r\n          expect(browser().location().url()).toEqual('/6');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSrc\r\n * @restrict A\r\n *\r\n * @description\r\n * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\r\n * work right: The browser will fetch from the URL with the literal\r\n * text `{{hash}}` until Angular replaces the expression inside\r\n * `{{hash}}`. The `ngSrc` directive solves this problem.\r\n *\r\n * The buggy way to write it:\r\n * <pre>\r\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * The correct way to write it:\r\n * <pre>\r\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n * </pre>\r\n *\r\n * @element IMG\r\n * @param {template} ngSrc any string which can contain `{{}}` markup.\r\n */\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngDisabled\r\n * @restrict A\r\n *\r\n * @description\r\n *\r\n * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:\r\n * <pre>\r\n * <div ng-init=\"scope = { isDisabled: false }\">\r\n *  <button disabled=\"{{scope.isDisabled}}\">Disabled</button>\r\n * </div>\r\n * </pre>\r\n *\r\n * The HTML specs do not require browsers to preserve the special attributes such as disabled.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngDisabled` directive.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should toggle button', function() {\r\n          expect(element('.doc-example-live :button').prop('disabled')).toBeFalsy();\r\n          input('checked').check();\r\n          expect(element('.doc-example-live :button').prop('disabled')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element INPUT\r\n * @param {expression} ngDisabled Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngChecked\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as checked.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngChecked` directive.\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Check me to check both: <input type=\"checkbox\" ng-model=\"master\"><br/>\r\n        <input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\">\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should check both checkBoxes', function() {\r\n          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeFalsy();\r\n          input('master').check();\r\n          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element INPUT\r\n * @param {expression} ngChecked Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMultiple\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as multiple.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngMultiple` directive.\r\n *\r\n * @example\r\n     <doc:example>\r\n       <doc:source>\r\n         Check me check multiple: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n         <select id=\"select\" ng-multiple=\"checked\">\r\n           <option>Misko</option>\r\n           <option>Igor</option>\r\n           <option>Vojta</option>\r\n           <option>Di</option>\r\n         </select>\r\n       </doc:source>\r\n       <doc:scenario>\r\n         it('should toggle multiple', function() {\r\n           expect(element('.doc-example-live #select').prop('multiple')).toBeFalsy();\r\n           input('checked').check();\r\n           expect(element('.doc-example-live #select').prop('multiple')).toBeTruthy();\r\n         });\r\n       </doc:scenario>\r\n     </doc:example>\r\n *\r\n * @element SELECT\r\n * @param {expression} ngMultiple Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngReadonly\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as readonly.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduce the `ngReadonly` directive.\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\"/>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should toggle readonly attr', function() {\r\n          expect(element('.doc-example-live :text').prop('readonly')).toBeFalsy();\r\n          input('checked').check();\r\n          expect(element('.doc-example-live :text').prop('readonly')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element INPUT\r\n * @param {string} expression Angular expression that will be evaluated.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSelected\r\n * @restrict A\r\n *\r\n * @description\r\n * The HTML specs do not require browsers to preserve the special attributes such as selected.\r\n * (The presence of them means true and absence means false)\r\n * This prevents the angular compiler from correctly retrieving the binding expression.\r\n * To solve this problem, we introduced the `ngSelected` directive.\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        Check me to select: <input type=\"checkbox\" ng-model=\"selected\"><br/>\r\n        <select>\r\n          <option>Hello!</option>\r\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\r\n        </select>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should select Greetings!', function() {\r\n          expect(element('.doc-example-live #greet').prop('selected')).toBeFalsy();\r\n          input('selected').check();\r\n          expect(element('.doc-example-live #greet').prop('selected')).toBeTruthy();\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n *\r\n * @element OPTION\r\n * @param {string} expression Angular expression that will be evaluated.\r\n */\r\n\r\n\r\nvar ngAttributeAliasDirectives = {};\r\n\r\n\r\n// boolean attrs are evaluated\r\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\r\n  var normalized = directiveNormalize('ng-' + attrName);\r\n  ngAttributeAliasDirectives[normalized] = function() {\r\n    return {\r\n      priority: 100,\r\n      compile: function() {\r\n        return function(scope, element, attr) {\r\n          scope.$watch(attr[normalized], function(value) {\r\n            attr.$set(attrName, !!value);\r\n          });\r\n        };\r\n      }\r\n    };\r\n  };\r\n});\r\n\r\n\r\n// ng-src, ng-href are interpolated\r\nforEach(['src', 'href'], function(attrName) {\r\n  var normalized = directiveNormalize('ng-' + attrName);\r\n  ngAttributeAliasDirectives[normalized] = function() {\r\n    return {\r\n      priority: 99, // it needs to run after the attributes are interpolated\r\n      link: function(scope, element, attr) {\r\n        attr.$observe(normalized, function(value) {\r\n          attr.$set(attrName, value);\r\n\r\n          // on IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\r\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\r\n          // to set the property as well to achieve the desired effect\r\n          if (msie) element.prop(attrName, value);\r\n        });\r\n      }\r\n    };\r\n  };\r\n});\r\n\r\nvar nullFormCtrl = {\r\n  $addControl: noop,\r\n  $removeControl: noop,\r\n  $setValidity: noop,\r\n  $setDirty: noop\r\n};\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.directive:form.FormController\r\n *\r\n * @property {boolean} $pristine True if user has not interacted with the form yet.\r\n * @property {boolean} $dirty True if user has already interacted with the form.\r\n * @property {boolean} $valid True if all of the containg forms and controls are valid.\r\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\r\n *\r\n * @property {Object} $error Is an object hash, containing references to all invalid controls or\r\n *  forms, where:\r\n *\r\n *  - keys are validation tokens (error names) â€” such as `REQUIRED`, `URL` or `EMAIL`),\r\n *  - values are arrays of controls or forms that are invalid with given error.\r\n *\r\n * @description\r\n * `FormController` keeps track of all its controls and nested forms as well as state of them,\r\n * such as being valid/invalid or dirty/pristine.\r\n *\r\n * Each {@link ng.directive:form form} directive creates an instance\r\n * of `FormController`.\r\n *\r\n */\r\n//asks for $scope to fool the BC controller module\r\nFormController.$inject = ['$element', '$attrs', '$scope'];\r\nfunction FormController(element, attrs) {\r\n  var form = this,\r\n      parentForm = element.parent().controller('form') || nullFormCtrl,\r\n      invalidCount = 0, // used to easily determine if we are valid\r\n      errors = form.$error = {};\r\n\r\n  // init state\r\n  form.$name = attrs.name;\r\n  form.$dirty = false;\r\n  form.$pristine = true;\r\n  form.$valid = true;\r\n  form.$invalid = false;\r\n\r\n  parentForm.$addControl(form);\r\n\r\n  // Setup initial state of the control\r\n  element.addClass(PRISTINE_CLASS);\r\n  toggleValidCss(true);\r\n\r\n  // convenience method for easy toggling of classes\r\n  function toggleValidCss(isValid, validationErrorKey) {\r\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\r\n    element.\r\n      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).\r\n      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\r\n  }\r\n\r\n  form.$addControl = function(control) {\r\n    if (control.$name && !form.hasOwnProperty(control.$name)) {\r\n      form[control.$name] = control;\r\n    }\r\n  };\r\n\r\n  form.$removeControl = function(control) {\r\n    if (control.$name && form[control.$name] === control) {\r\n      delete form[control.$name];\r\n    }\r\n    forEach(errors, function(queue, validationToken) {\r\n      form.$setValidity(validationToken, true, control);\r\n    });\r\n  };\r\n\r\n  form.$setValidity = function(validationToken, isValid, control) {\r\n    var queue = errors[validationToken];\r\n\r\n    if (isValid) {\r\n      if (queue) {\r\n        arrayRemove(queue, control);\r\n        if (!queue.length) {\r\n          invalidCount--;\r\n          if (!invalidCount) {\r\n            toggleValidCss(isValid);\r\n            form.$valid = true;\r\n            form.$invalid = false;\r\n          }\r\n          errors[validationToken] = false;\r\n          toggleValidCss(true, validationToken);\r\n          parentForm.$setValidity(validationToken, true, form);\r\n        }\r\n      }\r\n\r\n    } else {\r\n      if (!invalidCount) {\r\n        toggleValidCss(isValid);\r\n      }\r\n      if (queue) {\r\n        if (includes(queue, control)) return;\r\n      } else {\r\n        errors[validationToken] = queue = [];\r\n        invalidCount++;\r\n        toggleValidCss(false, validationToken);\r\n        parentForm.$setValidity(validationToken, false, form);\r\n      }\r\n      queue.push(control);\r\n\r\n      form.$valid = false;\r\n      form.$invalid = true;\r\n    }\r\n  };\r\n\r\n  form.$setDirty = function() {\r\n    element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);\r\n    form.$dirty = true;\r\n    form.$pristine = false;\r\n  };\r\n\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngForm\r\n * @restrict EAC\r\n *\r\n * @description\r\n * Nestable alias of {@link ng.directive:form `form`} directive. HTML\r\n * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\r\n * sub-group of controls needs to be determined.\r\n *\r\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\r\n *                       related scope, under this name.\r\n *\r\n */\r\n\r\n /**\r\n * @ngdoc directive\r\n * @name ng.directive:form\r\n * @restrict E\r\n *\r\n * @description\r\n * Directive that instantiates\r\n * {@link ng.directive:form.FormController FormController}.\r\n *\r\n * If `name` attribute is specified, the form controller is published onto the current scope under\r\n * this name.\r\n *\r\n * # Alias: {@link ng.directive:ngForm `ngForm`}\r\n *\r\n * In angular forms can be nested. This means that the outer form is valid when all of the child\r\n * forms are valid as well. However browsers do not allow nesting of `<form>` elements, for this\r\n * reason angular provides {@link ng.directive:ngForm `ngForm`} alias\r\n * which behaves identical to `<form>` but allows form nesting.\r\n *\r\n *\r\n * # CSS classes\r\n *  - `ng-valid` Is set if the form is valid.\r\n *  - `ng-invalid` Is set if the form is invalid.\r\n *  - `ng-pristine` Is set if the form is pristine.\r\n *  - `ng-dirty` Is set if the form is dirty.\r\n *\r\n *\r\n * # Submitting a form and preventing default action\r\n *\r\n * Since the role of forms in client-side Angular applications is different than in classical\r\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\r\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\r\n * to handle the form submission in application specific way.\r\n *\r\n * For this reason, Angular prevents the default action (form submission to the server) unless the\r\n * `<form>` element has an `action` attribute specified.\r\n *\r\n * You can use one of the following two ways to specify what javascript method should be called when\r\n * a form is submitted:\r\n *\r\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\r\n * - {@link ng.directive:ngClick ngClick} directive on the first\r\n  *  button or input field of type submit (input[type=submit])\r\n *\r\n * To prevent double execution of the handler, use only one of ngSubmit or ngClick directives. This\r\n * is because of the following form submission rules coming from the html spec:\r\n *\r\n * - If a form has only one input field then hitting enter in this field triggers form submit\r\n * (`ngSubmit`)\r\n * - if a form has has 2+ input fields and no buttons or input[type=submit] then hitting enter\r\n * doesn't trigger submit\r\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\r\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\r\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\r\n *\r\n * @param {string=} name Name of the form. If specified, the form controller will be published into\r\n *                       related scope, under this name.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.userType = 'guest';\r\n         }\r\n       </script>\r\n       <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n         userType: <input name=\"input\" ng-model=\"userType\" required>\r\n         <span class=\"error\" ng-show=\"myForm.input.$error.REQUIRED\">Required!</span><br>\r\n         <tt>userType = {{userType}}</tt><br>\r\n         <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>\r\n         <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>\r\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\r\n         <tt>myForm.$error.REQUIRED = {{!!myForm.$error.REQUIRED}}</tt><br>\r\n        </form>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should initialize to model', function() {\r\n         expect(binding('userType')).toEqual('guest');\r\n         expect(binding('myForm.input.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if empty', function() {\r\n         input('userType').enter('');\r\n         expect(binding('userType')).toEqual('');\r\n         expect(binding('myForm.input.$valid')).toEqual('false');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar formDirectiveDir = {\r\n  name: 'form',\r\n  restrict: 'E',\r\n  controller: FormController,\r\n  compile: function() {\r\n    return {\r\n      pre: function(scope, formElement, attr, controller) {\r\n        if (!attr.action) {\r\n          formElement.bind('submit', function(event) {\r\n            event.preventDefault();\r\n          });\r\n        }\r\n\r\n        var parentFormCtrl = formElement.parent().controller('form'),\r\n            alias = attr.name || attr.ngForm;\r\n\r\n        if (alias) {\r\n          scope[alias] = controller;\r\n        }\r\n        if (parentFormCtrl) {\r\n          formElement.bind('$destroy', function() {\r\n            parentFormCtrl.$removeControl(controller);\r\n            if (alias) {\r\n              scope[alias] = undefined;\r\n            }\r\n            extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\r\n          });\r\n        }\r\n      }\r\n    };\r\n  }\r\n};\r\n\r\nvar formDirective = valueFn(formDirectiveDir);\r\nvar ngFormDirective = valueFn(extend(copy(formDirectiveDir), {restrict: 'EAC'}));\r\n\r\nvar URL_REGEXP = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/;\r\nvar EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$/;\r\nvar NUMBER_REGEXP = /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/;\r\n\r\nvar inputType = {\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.text\r\n   *\r\n   * @description\r\n   * Standard HTML text input with angular data binding.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.text = 'guest';\r\n             $scope.word = /^\\w*$/;\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           Single word: <input type=\"text\" name=\"input\" ng-model=\"text\"\r\n                               ng-pattern=\"word\" required>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n             Required!</span>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\r\n             Single word only!</span>\r\n\r\n           <tt>text = {{text}}</tt><br/>\r\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n            expect(binding('text')).toEqual('guest');\r\n            expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n            input('text').enter('');\r\n            expect(binding('text')).toEqual('');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if multi word', function() {\r\n            input('text').enter('hello world');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'text': textInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.number\r\n   *\r\n   * @description\r\n   * Text input with number validation and transformation. Sets the `number` validation\r\n   * error if not a valid number.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} min Sets the `min` validation error key if the value entered is less then `min`.\r\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater then `min`.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.value = 12;\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           Number: <input type=\"number\" name=\"input\" ng-model=\"value\"\r\n                          min=\"0\" max=\"99\" required>\r\n           <span class=\"error\" ng-show=\"myForm.list.$error.required\">\r\n             Required!</span>\r\n           <span class=\"error\" ng-show=\"myForm.list.$error.number\">\r\n             Not valid number!</span>\r\n           <tt>value = {{value}}</tt><br/>\r\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n           expect(binding('value')).toEqual('12');\r\n           expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n           input('value').enter('');\r\n           expect(binding('value')).toEqual('');\r\n           expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if over max', function() {\r\n           input('value').enter('123');\r\n           expect(binding('value')).toEqual('');\r\n           expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'number': numberInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.url\r\n   *\r\n   * @description\r\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\r\n   * valid URL.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.text = 'http://google.com';\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           URL: <input type=\"url\" name=\"input\" ng-model=\"text\" required>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n             Required!</span>\r\n           <span class=\"error\" ng-show=\"myForm.input.$error.url\">\r\n             Not valid url!</span>\r\n           <tt>text = {{text}}</tt><br/>\r\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n            expect(binding('text')).toEqual('http://google.com');\r\n            expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n            input('text').enter('');\r\n            expect(binding('text')).toEqual('');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if not url', function() {\r\n            input('text').enter('xxx');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'url': urlInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.email\r\n   *\r\n   * @description\r\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\r\n   * address.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n   *    minlength.\r\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n   *    maxlength.\r\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n   *    patterns defined as scope expressions.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.text = 'me@example.com';\r\n           }\r\n         </script>\r\n           <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n             Email: <input type=\"email\" name=\"input\" ng-model=\"text\" required>\r\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n               Required!</span>\r\n             <span class=\"error\" ng-show=\"myForm.input.$error.email\">\r\n               Not valid email!</span>\r\n             <tt>text = {{text}}</tt><br/>\r\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\r\n           </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should initialize to model', function() {\r\n            expect(binding('text')).toEqual('me@example.com');\r\n            expect(binding('myForm.input.$valid')).toEqual('true');\r\n          });\r\n\r\n          it('should be invalid if empty', function() {\r\n            input('text').enter('');\r\n            expect(binding('text')).toEqual('');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n\r\n          it('should be invalid if not email', function() {\r\n            input('text').enter('xxx');\r\n            expect(binding('myForm.input.$valid')).toEqual('false');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'email': emailInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.radio\r\n   *\r\n   * @description\r\n   * HTML radio button.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string} value The value to which the expression should be set when selected.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.color = 'blue';\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           <input type=\"radio\" ng-model=\"color\" value=\"red\">  Red <br/>\r\n           <input type=\"radio\" ng-model=\"color\" value=\"green\"> Green <br/>\r\n           <input type=\"radio\" ng-model=\"color\" value=\"blue\"> Blue <br/>\r\n           <tt>color = {{color}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should change state', function() {\r\n            expect(binding('color')).toEqual('blue');\r\n\r\n            input('color').select('red');\r\n            expect(binding('color')).toEqual('red');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'radio': radioInputType,\r\n\r\n\r\n  /**\r\n   * @ngdoc inputType\r\n   * @name ng.directive:input.checkbox\r\n   *\r\n   * @description\r\n   * HTML checkbox.\r\n   *\r\n   * @param {string} ngModel Assignable angular expression to data-bind to.\r\n   * @param {string=} name Property name of the form under which the control is published.\r\n   * @param {string=} ngTrueValue The value to which the expression should be set when selected.\r\n   * @param {string=} ngFalseValue The value to which the expression should be set when not selected.\r\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n   *    interaction with the input element.\r\n   *\r\n   * @example\r\n      <doc:example>\r\n        <doc:source>\r\n         <script>\r\n           function Ctrl($scope) {\r\n             $scope.value1 = true;\r\n             $scope.value2 = 'YES'\r\n           }\r\n         </script>\r\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n           Value1: <input type=\"checkbox\" ng-model=\"value1\"> <br/>\r\n           Value2: <input type=\"checkbox\" ng-model=\"value2\"\r\n                          ng-true-value=\"YES\" ng-false-value=\"NO\"> <br/>\r\n           <tt>value1 = {{value1}}</tt><br/>\r\n           <tt>value2 = {{value2}}</tt><br/>\r\n          </form>\r\n        </doc:source>\r\n        <doc:scenario>\r\n          it('should change state', function() {\r\n            expect(binding('value1')).toEqual('true');\r\n            expect(binding('value2')).toEqual('YES');\r\n\r\n            input('value1').check();\r\n            input('value2').check();\r\n            expect(binding('value1')).toEqual('false');\r\n            expect(binding('value2')).toEqual('NO');\r\n          });\r\n        </doc:scenario>\r\n      </doc:example>\r\n   */\r\n  'checkbox': checkboxInputType,\r\n\r\n  'hidden': noop,\r\n  'button': noop,\r\n  'submit': noop,\r\n  'reset': noop\r\n};\r\n\r\n\r\nfunction isEmpty(value) {\r\n  return isUndefined(value) || value === '' || value === null || value !== value;\r\n}\r\n\r\n\r\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n\r\n  var listener = function() {\r\n    var value = trim(element.val());\r\n\r\n    if (ctrl.$viewValue !== value) {\r\n      scope.$apply(function() {\r\n        ctrl.$setViewValue(value);\r\n      });\r\n    }\r\n  };\r\n\r\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\r\n  // input event on backspace, delete or cut\r\n  if ($sniffer.hasEvent('input')) {\r\n    element.bind('input', listener);\r\n  } else {\r\n    var timeout;\r\n\r\n    element.bind('keydown', function(event) {\r\n      var key = event.keyCode;\r\n\r\n      // ignore\r\n      //    command            modifiers                   arrows\r\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\r\n\r\n      if (!timeout) {\r\n        timeout = $browser.defer(function() {\r\n          listener();\r\n          timeout = null;\r\n        });\r\n      }\r\n    });\r\n\r\n    // if user paste into input using mouse, we need \"change\" event to catch it\r\n    element.bind('change', listener);\r\n  }\r\n\r\n\r\n  ctrl.$render = function() {\r\n    element.val(isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);\r\n  };\r\n\r\n  // pattern validator\r\n  var pattern = attr.ngPattern,\r\n      patternValidator;\r\n\r\n  var validate = function(regexp, value) {\r\n    if (isEmpty(value) || regexp.test(value)) {\r\n      ctrl.$setValidity('pattern', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('pattern', false);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  if (pattern) {\r\n    if (pattern.match(/^\\/(.*)\\/$/)) {\r\n      pattern = new RegExp(pattern.substr(1, pattern.length - 2));\r\n      patternValidator = function(value) {\r\n        return validate(pattern, value)\r\n      };\r\n    } else {\r\n      patternValidator = function(value) {\r\n        var patternObj = scope.$eval(pattern);\r\n\r\n        if (!patternObj || !patternObj.test) {\r\n          throw new Error('Expected ' + pattern + ' to be a RegExp but was ' + patternObj);\r\n        }\r\n        return validate(patternObj, value);\r\n      };\r\n    }\r\n\r\n    ctrl.$formatters.push(patternValidator);\r\n    ctrl.$parsers.push(patternValidator);\r\n  }\r\n\r\n  // min length validator\r\n  if (attr.ngMinlength) {\r\n    var minlength = int(attr.ngMinlength);\r\n    var minLengthValidator = function(value) {\r\n      if (!isEmpty(value) && value.length < minlength) {\r\n        ctrl.$setValidity('minlength', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('minlength', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(minLengthValidator);\r\n    ctrl.$formatters.push(minLengthValidator);\r\n  }\r\n\r\n  // max length validator\r\n  if (attr.ngMaxlength) {\r\n    var maxlength = int(attr.ngMaxlength);\r\n    var maxLengthValidator = function(value) {\r\n      if (!isEmpty(value) && value.length > maxlength) {\r\n        ctrl.$setValidity('maxlength', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('maxlength', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(maxLengthValidator);\r\n    ctrl.$formatters.push(maxLengthValidator);\r\n  }\r\n}\r\n\r\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n  ctrl.$parsers.push(function(value) {\r\n    var empty = isEmpty(value);\r\n    if (empty || NUMBER_REGEXP.test(value)) {\r\n      ctrl.$setValidity('number', true);\r\n      return value === '' ? null : (empty ? value : parseFloat(value));\r\n    } else {\r\n      ctrl.$setValidity('number', false);\r\n      return undefined;\r\n    }\r\n  });\r\n\r\n  ctrl.$formatters.push(function(value) {\r\n    return isEmpty(value) ? '' : '' + value;\r\n  });\r\n\r\n  if (attr.min) {\r\n    var min = parseFloat(attr.min);\r\n    var minValidator = function(value) {\r\n      if (!isEmpty(value) && value < min) {\r\n        ctrl.$setValidity('min', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('min', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(minValidator);\r\n    ctrl.$formatters.push(minValidator);\r\n  }\r\n\r\n  if (attr.max) {\r\n    var max = parseFloat(attr.max);\r\n    var maxValidator = function(value) {\r\n      if (!isEmpty(value) && value > max) {\r\n        ctrl.$setValidity('max', false);\r\n        return undefined;\r\n      } else {\r\n        ctrl.$setValidity('max', true);\r\n        return value;\r\n      }\r\n    };\r\n\r\n    ctrl.$parsers.push(maxValidator);\r\n    ctrl.$formatters.push(maxValidator);\r\n  }\r\n\r\n  ctrl.$formatters.push(function(value) {\r\n\r\n    if (isEmpty(value) || isNumber(value)) {\r\n      ctrl.$setValidity('number', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('number', false);\r\n      return undefined;\r\n    }\r\n  });\r\n}\r\n\r\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n  var urlValidator = function(value) {\r\n    if (isEmpty(value) || URL_REGEXP.test(value)) {\r\n      ctrl.$setValidity('url', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('url', false);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  ctrl.$formatters.push(urlValidator);\r\n  ctrl.$parsers.push(urlValidator);\r\n}\r\n\r\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n  var emailValidator = function(value) {\r\n    if (isEmpty(value) || EMAIL_REGEXP.test(value)) {\r\n      ctrl.$setValidity('email', true);\r\n      return value;\r\n    } else {\r\n      ctrl.$setValidity('email', false);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  ctrl.$formatters.push(emailValidator);\r\n  ctrl.$parsers.push(emailValidator);\r\n}\r\n\r\nfunction radioInputType(scope, element, attr, ctrl) {\r\n  // make the name unique, if not defined\r\n  if (isUndefined(attr.name)) {\r\n    element.attr('name', nextUid());\r\n  }\r\n\r\n  element.bind('click', function() {\r\n    if (element[0].checked) {\r\n      scope.$apply(function() {\r\n        ctrl.$setViewValue(attr.value);\r\n      });\r\n    }\r\n  });\r\n\r\n  ctrl.$render = function() {\r\n    var value = attr.value;\r\n    element[0].checked = (value == ctrl.$viewValue);\r\n  };\r\n\r\n  attr.$observe('value', ctrl.$render);\r\n}\r\n\r\nfunction checkboxInputType(scope, element, attr, ctrl) {\r\n  var trueValue = attr.ngTrueValue,\r\n      falseValue = attr.ngFalseValue;\r\n\r\n  if (!isString(trueValue)) trueValue = true;\r\n  if (!isString(falseValue)) falseValue = false;\r\n\r\n  element.bind('click', function() {\r\n    scope.$apply(function() {\r\n      ctrl.$setViewValue(element[0].checked);\r\n    });\r\n  });\r\n\r\n  ctrl.$render = function() {\r\n    element[0].checked = ctrl.$viewValue;\r\n  };\r\n\r\n  ctrl.$formatters.push(function(value) {\r\n    return value === trueValue;\r\n  });\r\n\r\n  ctrl.$parsers.push(function(value) {\r\n    return value ? trueValue : falseValue;\r\n  });\r\n}\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:textarea\r\n * @restrict E\r\n *\r\n * @description\r\n * HTML textarea element control with angular data-binding. The data-binding and validation\r\n * properties of this element are exactly the same as those of the\r\n * {@link ng.directive:input input element}.\r\n *\r\n * @param {string} ngModel Assignable angular expression to data-bind to.\r\n * @param {string=} name Property name of the form under which the control is published.\r\n * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n *    minlength.\r\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n *    maxlength.\r\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n *    patterns defined as scope expressions.\r\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n *    interaction with the input element.\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:input\r\n * @restrict E\r\n *\r\n * @description\r\n * HTML input element control with angular data-binding. Input control follows HTML5 input types\r\n * and polyfills the HTML5 validation behavior for older browsers.\r\n *\r\n * @param {string} ngModel Assignable angular expression to data-bind to.\r\n * @param {string=} name Property name of the form under which the control is published.\r\n * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n *    minlength.\r\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n *    maxlength.\r\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n *    patterns defined as scope expressions.\r\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n *    interaction with the input element.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.user = {name: 'guest', last: 'visitor'};\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <form name=\"myForm\">\r\n           User name: <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\r\n           <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\r\n             Required!</span><br>\r\n           Last name: <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\r\n             ng-minlength=\"3\" ng-maxlength=\"10\">\r\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\r\n             Too short!</span>\r\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\r\n             Too long!</span><br>\r\n         </form>\r\n         <hr>\r\n         <tt>user = {{user}}</tt><br/>\r\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>\r\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>\r\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>\r\n         <tt>myForm.userName.$error = {{myForm.lastName.$error}}</tt><br>\r\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\r\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\r\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>\r\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>\r\n       </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should initialize to model', function() {\r\n          expect(binding('user')).toEqual('{\"name\":\"guest\",\"last\":\"visitor\"}');\r\n          expect(binding('myForm.userName.$valid')).toEqual('true');\r\n          expect(binding('myForm.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if empty when required', function() {\r\n          input('user.name').enter('');\r\n          expect(binding('user')).toEqual('{\"last\":\"visitor\"}');\r\n          expect(binding('myForm.userName.$valid')).toEqual('false');\r\n          expect(binding('myForm.$valid')).toEqual('false');\r\n        });\r\n\r\n        it('should be valid if empty when min length is set', function() {\r\n          input('user.last').enter('');\r\n          expect(binding('user')).toEqual('{\"name\":\"guest\",\"last\":\"\"}');\r\n          expect(binding('myForm.lastName.$valid')).toEqual('true');\r\n          expect(binding('myForm.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if less than required min length', function() {\r\n          input('user.last').enter('xx');\r\n          expect(binding('user')).toEqual('{\"name\":\"guest\"}');\r\n          expect(binding('myForm.lastName.$valid')).toEqual('false');\r\n          expect(binding('myForm.lastName.$error')).toMatch(/minlength/);\r\n          expect(binding('myForm.$valid')).toEqual('false');\r\n        });\r\n\r\n        it('should be invalid if longer than max length', function() {\r\n          input('user.last').enter('some ridiculously long name');\r\n          expect(binding('user'))\r\n            .toEqual('{\"name\":\"guest\"}');\r\n          expect(binding('myForm.lastName.$valid')).toEqual('false');\r\n          expect(binding('myForm.lastName.$error')).toMatch(/maxlength/);\r\n          expect(binding('myForm.$valid')).toEqual('false');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) {\r\n  return {\r\n    restrict: 'E',\r\n    require: '?ngModel',\r\n    link: function(scope, element, attr, ctrl) {\r\n      if (ctrl) {\r\n        (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer,\r\n                                                            $browser);\r\n      }\r\n    }\r\n  };\r\n}];\r\n\r\nvar VALID_CLASS = 'ng-valid',\r\n    INVALID_CLASS = 'ng-invalid',\r\n    PRISTINE_CLASS = 'ng-pristine',\r\n    DIRTY_CLASS = 'ng-dirty';\r\n\r\n/**\r\n * @ngdoc object\r\n * @name ng.directive:ngModel.NgModelController\r\n *\r\n * @property {string} $viewValue Actual string value in the view.\r\n * @property {*} $modelValue The value in the model, that the control is bound to.\r\n * @property {Array.<Function>} $parsers Whenever the control reads value from the DOM, it executes\r\n *     all of these functions to sanitize / convert the value as well as validate.\r\n *\r\n * @property {Array.<Function>} $formatters Whenever the model value changes, it executes all of\r\n *     these functions to convert the value as well as validate.\r\n *\r\n * @property {Object} $error An bject hash with all errors as keys.\r\n *\r\n * @property {boolean} $pristine True if user has not interacted with the control yet.\r\n * @property {boolean} $dirty True if user has already interacted with the control.\r\n * @property {boolean} $valid True if there is no error.\r\n * @property {boolean} $invalid True if at least one error on the control.\r\n *\r\n * @description\r\n *\r\n * `NgModelController` provides API for the `ng-model` directive. The controller contains\r\n * services for data-binding, validation, CSS update, value formatting and parsing. It\r\n * specifically does not contain any logic which deals with DOM rendering or listening to\r\n * DOM events. The `NgModelController` is meant to be extended by other directives where, the\r\n * directive provides DOM manipulation and the `NgModelController` provides the data-binding.\r\n *\r\n * This example shows how to use `NgModelController` with a custom control to achieve\r\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\r\n * collaborate together to achieve the desired result.\r\n *\r\n * <example module=\"customControl\">\r\n    <file name=\"style.css\">\r\n      [contenteditable] {\r\n        border: 1px solid black;\r\n        background-color: white;\r\n        min-height: 20px;\r\n      }\r\n\r\n      .ng-invalid {\r\n        border: 1px solid red;\r\n      }\r\n\r\n    </file>\r\n    <file name=\"script.js\">\r\n      angular.module('customControl', []).\r\n        directive('contenteditable', function() {\r\n          return {\r\n            restrict: 'A', // only activate on element attribute\r\n            require: '?ngModel', // get a hold of NgModelController\r\n            link: function(scope, element, attrs, ngModel) {\r\n              if(!ngModel) return; // do nothing if no ng-model\r\n\r\n              // Specify how UI should be updated\r\n              ngModel.$render = function() {\r\n                element.html(ngModel.$viewValue || '');\r\n              };\r\n\r\n              // Listen for change events to enable binding\r\n              element.bind('blur keyup change', function() {\r\n                scope.$apply(read);\r\n              });\r\n              read(); // initialize\r\n\r\n              // Write data to the model\r\n              function read() {\r\n                ngModel.$setViewValue(element.html());\r\n              }\r\n            }\r\n          };\r\n        });\r\n    </file>\r\n    <file name=\"index.html\">\r\n      <form name=\"myForm\">\r\n       <div contenteditable\r\n            name=\"myWidget\" ng-model=\"userContent\"\r\n            required>Change me!</div>\r\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\r\n       <hr>\r\n       <textarea ng-model=\"userContent\"></textarea>\r\n      </form>\r\n    </file>\r\n    <file name=\"scenario.js\">\r\n      it('should data-bind and become invalid', function() {\r\n        var contentEditable = element('[contenteditable]');\r\n\r\n        expect(contentEditable.text()).toEqual('Change me!');\r\n        input('userContent').enter('');\r\n        expect(contentEditable.text()).toEqual('');\r\n        expect(contentEditable.prop('className')).toMatch(/ng-invalid-required/);\r\n      });\r\n    </file>\r\n * </example>\r\n *\r\n */\r\nvar NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse',\r\n    function($scope, $exceptionHandler, $attr, $element, $parse) {\r\n  this.$viewValue = Number.NaN;\r\n  this.$modelValue = Number.NaN;\r\n  this.$parsers = [];\r\n  this.$formatters = [];\r\n  this.$viewChangeListeners = [];\r\n  this.$pristine = true;\r\n  this.$dirty = false;\r\n  this.$valid = true;\r\n  this.$invalid = false;\r\n  this.$name = $attr.name;\r\n\r\n  var ngModelGet = $parse($attr.ngModel),\r\n      ngModelSet = ngModelGet.assign;\r\n\r\n  if (!ngModelSet) {\r\n    throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + $attr.ngModel +\r\n        ' (' + startingTag($element) + ')');\r\n  }\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.directive:ngModel.NgModelController#$render\r\n   * @methodOf ng.directive:ngModel.NgModelController\r\n   *\r\n   * @description\r\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\r\n   * directive will implement this method.\r\n   */\r\n  this.$render = noop;\r\n\r\n  var parentForm = $element.inheritedData('$formController') || nullFormCtrl,\r\n      invalidCount = 0, // used to easily determine if we are valid\r\n      $error = this.$error = {}; // keep invalid keys here\r\n\r\n\r\n  // Setup initial state of the control\r\n  $element.addClass(PRISTINE_CLASS);\r\n  toggleValidCss(true);\r\n\r\n  // convenience method for easy toggling of classes\r\n  function toggleValidCss(isValid, validationErrorKey) {\r\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\r\n    $element.\r\n      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).\r\n      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\r\n  }\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.directive:ngModel.NgModelController#$setValidity\r\n   * @methodOf ng.directive:ngModel.NgModelController\r\n   *\r\n   * @description\r\n   * Change the validity state, and notifies the form when the control changes validity. (i.e. it\r\n   * does not notify form if given validator is already marked as invalid).\r\n   *\r\n   * This method should be called by validators - i.e. the parser or formatter functions.\r\n   *\r\n   * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign\r\n   *        to `$error[validationErrorKey]=isValid` so that it is available for data-binding.\r\n   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\r\n   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\r\n   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .\r\n   * @param {boolean} isValid Whether the current state is valid (true) or invalid (false).\r\n   */\r\n  this.$setValidity = function(validationErrorKey, isValid) {\r\n    if ($error[validationErrorKey] === !isValid) return;\r\n\r\n    if (isValid) {\r\n      if ($error[validationErrorKey]) invalidCount--;\r\n      if (!invalidCount) {\r\n        toggleValidCss(true);\r\n        this.$valid = true;\r\n        this.$invalid = false;\r\n      }\r\n    } else {\r\n      toggleValidCss(false);\r\n      this.$invalid = true;\r\n      this.$valid = false;\r\n      invalidCount++;\r\n    }\r\n\r\n    $error[validationErrorKey] = !isValid;\r\n    toggleValidCss(isValid, validationErrorKey);\r\n\r\n    parentForm.$setValidity(validationErrorKey, isValid, this);\r\n  };\r\n\r\n\r\n  /**\r\n   * @ngdoc function\r\n   * @name ng.directive:ngModel.NgModelController#$setViewValue\r\n   * @methodOf ng.directive:ngModel.NgModelController\r\n   *\r\n   * @description\r\n   * Read a value from view.\r\n   *\r\n   * This method should be called from within a DOM event handler.\r\n   * For example {@link ng.directive:input input} or\r\n   * {@link ng.directive:select select} directives call it.\r\n   *\r\n   * It internally calls all `formatters` and if resulted value is valid, updates the model and\r\n   * calls all registered change listeners.\r\n   *\r\n   * @param {string} value Value from the view.\r\n   */\r\n  this.$setViewValue = function(value) {\r\n    this.$viewValue = value;\r\n\r\n    // change to dirty\r\n    if (this.$pristine) {\r\n      this.$dirty = true;\r\n      this.$pristine = false;\r\n      $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);\r\n      parentForm.$setDirty();\r\n    }\r\n\r\n    forEach(this.$parsers, function(fn) {\r\n      value = fn(value);\r\n    });\r\n\r\n    if (this.$modelValue !== value) {\r\n      this.$modelValue = value;\r\n      ngModelSet($scope, value);\r\n      forEach(this.$viewChangeListeners, function(listener) {\r\n        try {\r\n          listener();\r\n        } catch(e) {\r\n          $exceptionHandler(e);\r\n        }\r\n      })\r\n    }\r\n  };\r\n\r\n  // model -> value\r\n  var ctrl = this;\r\n  $scope.$watch(ngModelGet, function(value) {\r\n\r\n    // ignore change from view\r\n    if (ctrl.$modelValue === value) return;\r\n\r\n    var formatters = ctrl.$formatters,\r\n        idx = formatters.length;\r\n\r\n    ctrl.$modelValue = value;\r\n    while(idx--) {\r\n      value = formatters[idx](value);\r\n    }\r\n\r\n    if (ctrl.$viewValue !== value) {\r\n      ctrl.$viewValue = value;\r\n      ctrl.$render();\r\n    }\r\n  });\r\n}];\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngModel\r\n *\r\n * @element input\r\n *\r\n * @description\r\n * Is directive that tells Angular to do two-way data binding. It works together with `input`,\r\n * `select`, `textarea`. You can easily write your own directives to use `ngModel` as well.\r\n *\r\n * `ngModel` is responsible for:\r\n *\r\n * - binding the view into the model, which other directives such as `input`, `textarea` or `select`\r\n *   require,\r\n * - providing validation behavior (i.e. required, number, email, url),\r\n * - keeping state of the control (valid/invalid, dirty/pristine, validation errors),\r\n * - setting related css class onto the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`),\r\n * - register the control with parent {@link ng.directive:form form}.\r\n *\r\n * For basic examples, how to use `ngModel`, see:\r\n *\r\n *  - {@link ng.directive:input input}\r\n *    - {@link ng.directive:input.text text}\r\n *    - {@link ng.directive:input.checkbox checkbox}\r\n *    - {@link ng.directive:input.radio radio}\r\n *    - {@link ng.directive:input.number number}\r\n *    - {@link ng.directive:input.email email}\r\n *    - {@link ng.directive:input.url url}\r\n *  - {@link ng.directive:select select}\r\n *  - {@link ng.directive:textarea textarea}\r\n *\r\n */\r\nvar ngModelDirective = function() {\r\n  return {\r\n    require: ['ngModel', '^?form'],\r\n    controller: NgModelController,\r\n    link: function(scope, element, attr, ctrls) {\r\n      // notify others, especially parent forms\r\n\r\n      var modelCtrl = ctrls[0],\r\n          formCtrl = ctrls[1] || nullFormCtrl;\r\n\r\n      formCtrl.$addControl(modelCtrl);\r\n\r\n      element.bind('$destroy', function() {\r\n        formCtrl.$removeControl(modelCtrl);\r\n      });\r\n    }\r\n  };\r\n};\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngChange\r\n * @restrict E\r\n *\r\n * @description\r\n * Evaluate given expression when user changes the input.\r\n * The expression is not evaluated when the value change is coming from the model.\r\n *\r\n * Note, this directive requires `ngModel` to be present.\r\n *\r\n * @element input\r\n *\r\n * @example\r\n * <doc:example>\r\n *   <doc:source>\r\n *     <script>\r\n *       function Controller($scope) {\r\n *         $scope.counter = 0;\r\n *         $scope.change = function() {\r\n *           $scope.counter++;\r\n *         };\r\n *       }\r\n *     </script>\r\n *     <div ng-controller=\"Controller\">\r\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\r\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\r\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\r\n *       debug = {{confirmed}}<br />\r\n *       counter = {{counter}}\r\n *     </div>\r\n *   </doc:source>\r\n *   <doc:scenario>\r\n *     it('should evaluate the expression if changing from view', function() {\r\n *       expect(binding('counter')).toEqual('0');\r\n *       element('#ng-change-example1').click();\r\n *       expect(binding('counter')).toEqual('1');\r\n *       expect(binding('confirmed')).toEqual('true');\r\n *     });\r\n *\r\n *     it('should not evaluate the expression if changing from model', function() {\r\n *       element('#ng-change-example2').click();\r\n *       expect(binding('counter')).toEqual('0');\r\n *       expect(binding('confirmed')).toEqual('true');\r\n *     });\r\n *   </doc:scenario>\r\n * </doc:example>\r\n */\r\nvar ngChangeDirective = valueFn({\r\n  require: 'ngModel',\r\n  link: function(scope, element, attr, ctrl) {\r\n    ctrl.$viewChangeListeners.push(function() {\r\n      scope.$eval(attr.ngChange);\r\n    });\r\n  }\r\n});\r\n\r\n\r\nvar requiredDirective = function() {\r\n  return {\r\n    require: '?ngModel',\r\n    link: function(scope, elm, attr, ctrl) {\r\n      if (!ctrl) return;\r\n      attr.required = true; // force truthy in case we are on non input element\r\n\r\n      var validator = function(value) {\r\n        if (attr.required && (isEmpty(value) || value === false)) {\r\n          ctrl.$setValidity('required', false);\r\n          return;\r\n        } else {\r\n          ctrl.$setValidity('required', true);\r\n          return value;\r\n        }\r\n      };\r\n\r\n      ctrl.$formatters.push(validator);\r\n      ctrl.$parsers.unshift(validator);\r\n\r\n      attr.$observe('required', function() {\r\n        validator(ctrl.$viewValue);\r\n      });\r\n    }\r\n  };\r\n};\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngList\r\n *\r\n * @description\r\n * Text input that converts between comma-seperated string into an array of strings.\r\n *\r\n * @element input\r\n * @param {string=} ngList optional delimiter that should be used to split the value. If\r\n *   specified in form `/something/` then the value will be converted into a regular expression.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.names = ['igor', 'misko', 'vojta'];\r\n         }\r\n       </script>\r\n       <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n         List: <input name=\"namesInput\" ng-model=\"names\" ng-list required>\r\n         <span class=\"error\" ng-show=\"myForm.list.$error.required\">\r\n           Required!</span>\r\n         <tt>names = {{names}}</tt><br/>\r\n         <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\r\n         <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\r\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n        </form>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should initialize to model', function() {\r\n          expect(binding('names')).toEqual('[\"igor\",\"misko\",\"vojta\"]');\r\n          expect(binding('myForm.namesInput.$valid')).toEqual('true');\r\n        });\r\n\r\n        it('should be invalid if empty', function() {\r\n          input('names').enter('');\r\n          expect(binding('names')).toEqual('[]');\r\n          expect(binding('myForm.namesInput.$valid')).toEqual('false');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngListDirective = function() {\r\n  return {\r\n    require: 'ngModel',\r\n    link: function(scope, element, attr, ctrl) {\r\n      var match = /\\/(.*)\\//.exec(attr.ngList),\r\n          separator = match && new RegExp(match[1]) || attr.ngList || ',';\r\n\r\n      var parse = function(viewValue) {\r\n        var list = [];\r\n\r\n        if (viewValue) {\r\n          forEach(viewValue.split(separator), function(value) {\r\n            if (value) list.push(trim(value));\r\n          });\r\n        }\r\n\r\n        return list;\r\n      };\r\n\r\n      ctrl.$parsers.push(parse);\r\n      ctrl.$formatters.push(function(value) {\r\n        if (isArray(value) && !equals(parse(ctrl.$viewValue), value)) {\r\n          return value.join(', ');\r\n        }\r\n\r\n        return undefined;\r\n      });\r\n    }\r\n  };\r\n};\r\n\r\n\r\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\r\n\r\nvar ngValueDirective = function() {\r\n  return {\r\n    priority: 100,\r\n    compile: function(tpl, tplAttr) {\r\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\r\n        return function(scope, elm, attr) {\r\n          attr.$set('value', scope.$eval(attr.ngValue));\r\n        };\r\n      } else {\r\n        return function(scope, elm, attr) {\r\n          scope.$watch(attr.ngValue, function(value) {\r\n            attr.$set('value', value, false);\r\n          });\r\n        };\r\n      }\r\n    }\r\n  };\r\n};\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngBind\r\n *\r\n * @description\r\n * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\r\n * with the value of a given expression, and to update the text content when the value of that\r\n * expression changes.\r\n *\r\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\r\n * `{{ expression }}` which is similar but less verbose.\r\n *\r\n * Once scenario in which the use of `ngBind` is prefered over `{{ expression }}` binding is when\r\n * it's desirable to put bindings into template that is momentarily displayed by the browser in its\r\n * raw state before Angular compiles it. Since `ngBind` is an element attribute, it makes the\r\n * bindings invisible to the user while the page is loading.\r\n *\r\n * An alternative solution to this problem would be using the\r\n * {@link ng.directive:ngCloak ngCloak} directive.\r\n *\r\n *\r\n * @element ANY\r\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\r\n *\r\n * @example\r\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.name = 'Whirled';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         Enter name: <input type=\"text\" ng-model=\"name\"><br>\r\n         Hello <span ng-bind=\"name\"></span>!\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-bind', function() {\r\n         expect(using('.doc-example-live').binding('name')).toBe('Whirled');\r\n         using('.doc-example-live').input('name').enter('world');\r\n         expect(using('.doc-example-live').binding('name')).toBe('world');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngBindDirective = ngDirective(function(scope, element, attr) {\r\n  element.addClass('ng-binding').data('$binding', attr.ngBind);\r\n  scope.$watch(attr.ngBind, function(value) {\r\n    element.text(value == undefined ? '' : value);\r\n  });\r\n});\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngBindTemplate\r\n *\r\n * @description\r\n * The `ngBindTemplate` directive specifies that the element\r\n * text should be replaced with the template in ngBindTemplate.\r\n * Unlike ngBind the ngBindTemplate can contain multiple `{{` `}}`\r\n * expressions. (This is required since some HTML elements\r\n * can not have SPAN elements such as TITLE, or OPTION to name a few.)\r\n *\r\n * @element ANY\r\n * @param {string} ngBindTemplate template of form\r\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\r\n *\r\n * @example\r\n * Try it here: enter text in text box and watch the greeting change.\r\n   <doc:example>\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.salutation = 'Hello';\r\n           $scope.name = 'World';\r\n         }\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n        Salutation: <input type=\"text\" ng-model=\"salutation\"><br>\r\n        Name: <input type=\"text\" ng-model=\"name\"><br>\r\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-bind', function() {\r\n         expect(using('.doc-example-live').binding('salutation')).\r\n           toBe('Hello');\r\n         expect(using('.doc-example-live').binding('name')).\r\n           toBe('World');\r\n         using('.doc-example-live').input('salutation').enter('Greetings');\r\n         using('.doc-example-live').input('name').enter('user');\r\n         expect(using('.doc-example-live').binding('salutation')).\r\n           toBe('Greetings');\r\n         expect(using('.doc-example-live').binding('name')).\r\n           toBe('user');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngBindTemplateDirective = ['$interpolate', function($interpolate) {\r\n  return function(scope, element, attr) {\r\n    // TODO: move this to scenario runner\r\n    var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\r\n    element.addClass('ng-binding').data('$binding', interpolateFn);\r\n    attr.$observe('ngBindTemplate', function(value) {\r\n      element.text(value);\r\n    });\r\n  }\r\n}];\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngBindHtmlUnsafe\r\n *\r\n * @description\r\n * Creates a binding that will innerHTML the result of evaluating the `expression` into the current\r\n * element. *The innerHTML-ed content will not be sanitized!* You should use this directive only if\r\n * {@link ngSanitize.directive:ngBindHtml ngBindHtml} directive is too\r\n * restrictive and when you absolutely trust the source of the content you are binding to.\r\n *\r\n * See {@link ngSanitize.$sanitize $sanitize} docs for examples.\r\n *\r\n * @element ANY\r\n * @param {expression} ngBindHtmlUnsafe {@link guide/expression Expression} to evaluate.\r\n */\r\nvar ngBindHtmlUnsafeDirective = [function() {\r\n  return function(scope, element, attr) {\r\n    element.addClass('ng-binding').data('$binding', attr.ngBindHtmlUnsafe);\r\n    scope.$watch(attr.ngBindHtmlUnsafe, function(value) {\r\n      element.html(value || '');\r\n    });\r\n  };\r\n}];\r\n\r\nfunction classDirective(name, selector) {\r\n  name = 'ngClass' + name;\r\n  return ngDirective(function(scope, element, attr) {\r\n    scope.$watch(attr[name], function(newVal, oldVal) {\r\n      if (selector === true || scope.$index % 2 === selector) {\r\n        if (oldVal && (newVal !== oldVal)) {\r\n           if (isObject(oldVal) && !isArray(oldVal))\r\n             oldVal = map(oldVal, function(v, k) { if (v) return k });\r\n           element.removeClass(isArray(oldVal) ? oldVal.join(' ') : oldVal);\r\n         }\r\n         if (isObject(newVal) && !isArray(newVal))\r\n            newVal = map(newVal, function(v, k) { if (v) return k });\r\n         if (newVal) element.addClass(isArray(newVal) ? newVal.join(' ') : newVal);      }\r\n    }, true);\r\n  });\r\n}\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClass\r\n *\r\n * @description\r\n * The `ngClass` allows you to set CSS class on HTML element dynamically by databinding an\r\n * expression that represents all classes to be added.\r\n *\r\n * The directive won't add duplicate classes if a particular class was already set.\r\n *\r\n * When the expression changes, the previously added classes are removed and only then the classes\r\n * new classes are added.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\r\n *   of the evaluation can be a string representing space delimited class\r\n *   names, an array, or a map of class names to boolean values.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n      <input type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\r\n      <input type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\r\n      <br>\r\n      <span ng-class=\"myVar\">Sample Text</span>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       .my-class {\r\n         color: red;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-class', function() {\r\n         expect(element('.doc-example-live span').prop('className')).not().\r\n           toMatch(/my-class/);\r\n\r\n         using('.doc-example-live').element(':button:first').click();\r\n\r\n         expect(element('.doc-example-live span').prop('className')).\r\n           toMatch(/my-class/);\r\n\r\n         using('.doc-example-live').element(':button:last').click();\r\n\r\n         expect(element('.doc-example-live span').prop('className')).not().\r\n           toMatch(/my-class/);\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngClassDirective = classDirective('', true);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClassOdd\r\n *\r\n * @description\r\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\r\n * {@link ng.directive:ngClass ngClass}, except it works in\r\n * conjunction with `ngRepeat` and takes affect only on odd (even) rows.\r\n *\r\n * This directive can be applied only within a scope of an\r\n * {@link ng.directive:ngRepeat ngRepeat}.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\r\n *   of the evaluation can be a string representing space delimited class names or an array.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\r\n          <li ng-repeat=\"name in names\">\r\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\r\n             {{name}}\r\n           </span>\r\n          </li>\r\n        </ol>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       .odd {\r\n         color: red;\r\n       }\r\n       .even {\r\n         color: blue;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-class-odd and ng-class-even', function() {\r\n         expect(element('.doc-example-live li:first span').prop('className')).\r\n           toMatch(/odd/);\r\n         expect(element('.doc-example-live li:last span').prop('className')).\r\n           toMatch(/even/);\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngClassOddDirective = classDirective('Odd', 0);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClassEven\r\n *\r\n * @description\r\n * The `ngClassOdd` and `ngClassEven` works exactly as\r\n * {@link ng.directive:ngClass ngClass}, except it works in\r\n * conjunction with `ngRepeat` and takes affect only on odd (even) rows.\r\n *\r\n * This directive can be applied only within a scope of an\r\n * {@link ng.directive:ngRepeat ngRepeat}.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\r\n *   result of the evaluation can be a string representing space delimited class names or an array.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\r\n          <li ng-repeat=\"name in names\">\r\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\r\n             {{name}} &nbsp; &nbsp; &nbsp;\r\n           </span>\r\n          </li>\r\n        </ol>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       .odd {\r\n         color: red;\r\n       }\r\n       .even {\r\n         color: blue;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-class-odd and ng-class-even', function() {\r\n         expect(element('.doc-example-live li:first span').prop('className')).\r\n           toMatch(/odd/);\r\n         expect(element('.doc-example-live li:last span').prop('className')).\r\n           toMatch(/even/);\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngClassEvenDirective = classDirective('Even', 1);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngCloak\r\n *\r\n * @description\r\n * The `ngCloak` directive is used to prevent the Angular html template from being briefly\r\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\r\n * directive to avoid the undesirable flicker effect caused by the html template display.\r\n *\r\n * The directive can be applied to the `<body>` element, but typically a fine-grained application is\r\n * prefered in order to benefit from progressive rendering of the browser view.\r\n *\r\n * `ngCloak` works in cooperation with a css rule that is embedded within `angular.js` and\r\n *  `angular.min.js` files. Following is the css rule:\r\n *\r\n * <pre>\r\n * [ng\\:cloak], [ng-cloak], .ng-cloak {\r\n *   display: none;\r\n * }\r\n * </pre>\r\n *\r\n * When this css rule is loaded by the browser, all html elements (including their children) that\r\n * are tagged with the `ng-cloak` directive are hidden. When Angular comes across this directive\r\n * during the compilation of the template it deletes the `ngCloak` element attribute, which\r\n * makes the compiled element visible.\r\n *\r\n * For the best result, `angular.js` script must be loaded in the head section of the html file;\r\n * alternatively, the css rule (above) must be included in the external stylesheet of the\r\n * application.\r\n *\r\n * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they\r\n * cannot match the `[ng\\:cloak]` selector. To work around this limitation, you must add the css\r\n * class `ngCloak` in addition to `ngCloak` directive as shown in the example below.\r\n *\r\n * @element ANY\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\r\n        <div id=\"template2\" ng-cloak class=\"ng-cloak\">{{ 'hello IE7' }}</div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should remove the template directive and css class', function() {\r\n         expect(element('.doc-example-live #template1').attr('ng-cloak')).\r\n           not().toBeDefined();\r\n         expect(element('.doc-example-live #template2').attr('ng-cloak')).\r\n           not().toBeDefined();\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n *\r\n */\r\nvar ngCloakDirective = ngDirective({\r\n  compile: function(element, attr) {\r\n    attr.$set('ngCloak', undefined);\r\n    element.removeClass('ng-cloak');\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngController\r\n *\r\n * @description\r\n * The `ngController` directive assigns behavior to a scope. This is a key aspect of how angular\r\n * supports the principles behind the Model-View-Controller design pattern.\r\n *\r\n * MVC components in angular:\r\n *\r\n * * Model â€” The Model is data in scope properties; scopes are attached to the DOM.\r\n * * View â€” The template (HTML with data bindings) is rendered into the View.\r\n * * Controller â€” The `ngController` directive specifies a Controller class; the class has\r\n *   methods that typically express the business logic behind the application.\r\n *\r\n * Note that an alternative way to define controllers is via the `{@link ng.$route}`\r\n * service.\r\n *\r\n * @element ANY\r\n * @scope\r\n * @param {expression} ngController Name of a globally accessible constructor function or an\r\n *     {@link guide/expression expression} that on the current scope evaluates to a\r\n *     constructor function.\r\n *\r\n * @example\r\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\r\n * greeting are methods declared on the controller (see source tab). These methods can\r\n * easily be called from the angular markup. Notice that the scope becomes the `this` for the\r\n * controller's instance. This allows for easy access to the view data from the controller. Also\r\n * notice that any changes to the data are automatically reflected in the View without the need\r\n * for a manual update.\r\n   <doc:example>\r\n     <doc:source>\r\n      <script>\r\n        function SettingsController($scope) {\r\n          $scope.name = \"John Smith\";\r\n          $scope.contacts = [\r\n            {type:'phone', value:'408 555 1212'},\r\n            {type:'email', value:'john.smith@example.org'} ];\r\n\r\n          $scope.greet = function() {\r\n           alert(this.name);\r\n          };\r\n\r\n          $scope.addContact = function() {\r\n           this.contacts.push({type:'email', value:'yourname@example.org'});\r\n          };\r\n\r\n          $scope.removeContact = function(contactToRemove) {\r\n           var index = this.contacts.indexOf(contactToRemove);\r\n           this.contacts.splice(index, 1);\r\n          };\r\n\r\n          $scope.clearContact = function(contact) {\r\n           contact.type = 'phone';\r\n           contact.value = '';\r\n          };\r\n        }\r\n      </script>\r\n      <div ng-controller=\"SettingsController\">\r\n        Name: <input type=\"text\" ng-model=\"name\"/>\r\n        [ <a href=\"\" ng-click=\"greet()\">greet</a> ]<br/>\r\n        Contact:\r\n        <ul>\r\n          <li ng-repeat=\"contact in contacts\">\r\n            <select ng-model=\"contact.type\">\r\n               <option>phone</option>\r\n               <option>email</option>\r\n            </select>\r\n            <input type=\"text\" ng-model=\"contact.value\"/>\r\n            [ <a href=\"\" ng-click=\"clearContact(contact)\">clear</a>\r\n            | <a href=\"\" ng-click=\"removeContact(contact)\">X</a> ]\r\n          </li>\r\n          <li>[ <a href=\"\" ng-click=\"addContact()\">add</a> ]</li>\r\n       </ul>\r\n      </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check controller', function() {\r\n         expect(element('.doc-example-live div>:input').val()).toBe('John Smith');\r\n         expect(element('.doc-example-live li:nth-child(1) input').val())\r\n           .toBe('408 555 1212');\r\n         expect(element('.doc-example-live li:nth-child(2) input').val())\r\n           .toBe('john.smith@example.org');\r\n\r\n         element('.doc-example-live li:first a:contains(\"clear\")').click();\r\n         expect(element('.doc-example-live li:first input').val()).toBe('');\r\n\r\n         element('.doc-example-live li:last a:contains(\"add\")').click();\r\n         expect(element('.doc-example-live li:nth-child(3) input').val())\r\n           .toBe('yourname@example.org');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngControllerDirective = [function() {\r\n  return {\r\n    scope: true,\r\n    controller: '@'\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngCsp\r\n * @priority 1000\r\n *\r\n * @description\r\n * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.\r\n * This directive should be used on the root element of the application (typically the `<html>`\r\n * element or other element with the {@link ng.directive:ngApp ngApp}\r\n * directive).\r\n *\r\n * If enabled the performance of template expression evaluator will suffer slightly, so don't enable\r\n * this mode unless you need it.\r\n *\r\n * @element html\r\n */\r\n\r\nvar ngCspDirective = ['$sniffer', function($sniffer) {\r\n  return {\r\n    priority: 1000,\r\n    compile: function() {\r\n      $sniffer.csp = true;\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngClick\r\n *\r\n * @description\r\n * The ngClick allows you to specify custom behavior when\r\n * element is clicked.\r\n *\r\n * @element ANY\r\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\r\n * click. (Event object is available as `$event`)\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\r\n        Increment\r\n      </button>\r\n      count: {{count}}\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-click', function() {\r\n         expect(binding('count')).toBe('0');\r\n         element('.doc-example-live :button').click();\r\n         expect(binding('count')).toBe('1');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n/*\r\n * A directive that allows creation of custom onclick handlers that are defined as angular\r\n * expressions and are compiled and executed within the current scope.\r\n *\r\n * Events that are handled via these handler are always configured not to propagate further.\r\n */\r\nvar ngEventDirectives = {};\r\nforEach(\r\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave'.split(' '),\r\n  function(name) {\r\n    var directiveName = directiveNormalize('ng-' + name);\r\n    ngEventDirectives[directiveName] = ['$parse', function($parse) {\r\n      return function(scope, element, attr) {\r\n        var fn = $parse(attr[directiveName]);\r\n        element.bind(lowercase(name), function(event) {\r\n          scope.$apply(function() {\r\n            fn(scope, {$event:event});\r\n          });\r\n        });\r\n      };\r\n    }];\r\n  }\r\n);\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngDblclick\r\n *\r\n * @description\r\n * The `ngDblclick` directive allows you to specify custom behavior on dblclick event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\r\n * dblclick. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMousedown\r\n *\r\n * @description\r\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\r\n * mousedown. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseup\r\n *\r\n * @description\r\n * Specify custom behavior on mouseup event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\r\n * mouseup. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseover\r\n *\r\n * @description\r\n * Specify custom behavior on mouseover event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\r\n * mouseover. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseenter\r\n *\r\n * @description\r\n * Specify custom behavior on mouseenter event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\r\n * mouseenter. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMouseleave\r\n *\r\n * @description\r\n * Specify custom behavior on mouseleave event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\r\n * mouseleave. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngMousemove\r\n *\r\n * @description\r\n * Specify custom behavior on mousemove event.\r\n *\r\n * @element ANY\r\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\r\n * mousemove. (Event object is available as `$event`)\r\n *\r\n * @example\r\n * See {@link ng.directive:ngClick ngClick}\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSubmit\r\n *\r\n * @description\r\n * Enables binding angular expressions to onsubmit events.\r\n *\r\n * Additionally it prevents the default action (which for form means sending the request to the\r\n * server and reloading the current page).\r\n *\r\n * @element form\r\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n      <script>\r\n        function Ctrl($scope) {\r\n          $scope.list = [];\r\n          $scope.text = 'hello';\r\n          $scope.submit = function() {\r\n            if (this.text) {\r\n              this.list.push(this.text);\r\n              this.text = '';\r\n            }\r\n          };\r\n        }\r\n      </script>\r\n      <form ng-submit=\"submit()\" ng-controller=\"Ctrl\">\r\n        Enter text and hit enter:\r\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\r\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\r\n        <pre>list={{list}}</pre>\r\n      </form>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-submit', function() {\r\n         expect(binding('list')).toBe('[]');\r\n         element('.doc-example-live #submit').click();\r\n         expect(binding('list')).toBe('[\"hello\"]');\r\n         expect(input('text').val()).toBe('');\r\n       });\r\n       it('should ignore empty strings', function() {\r\n         expect(binding('list')).toBe('[]');\r\n         element('.doc-example-live #submit').click();\r\n         element('.doc-example-live #submit').click();\r\n         expect(binding('list')).toBe('[\"hello\"]');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngSubmitDirective = ngDirective(function(scope, element, attrs) {\r\n  element.bind('submit', function() {\r\n    scope.$apply(attrs.ngSubmit);\r\n  });\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngInclude\r\n * @restrict ECA\r\n *\r\n * @description\r\n * Fetches, compiles and includes an external HTML fragment.\r\n *\r\n * Keep in mind that Same Origin Policy applies to included resources\r\n * (e.g. ngInclude won't work for cross-domain requests on all browsers and for\r\n *  file:// access on some browsers).\r\n *\r\n * @scope\r\n *\r\n * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\r\n *                 make sure you wrap it in quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\r\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\r\n *\r\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\r\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\r\n *\r\n *                  - If the attribute is not set, disable scrolling.\r\n *                  - If the attribute is set without value, enable scrolling.\r\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\r\n *\r\n * @example\r\n  <example>\r\n    <file name=\"index.html\">\r\n     <div ng-controller=\"Ctrl\">\r\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\r\n        <option value=\"\">(blank)</option>\r\n       </select>\r\n       url of the template: <tt>{{template.url}}</tt>\r\n       <hr/>\r\n       <div ng-include src=\"template.url\"></div>\r\n     </div>\r\n    </file>\r\n    <file name=\"script.js\">\r\n      function Ctrl($scope) {\r\n        $scope.templates =\r\n          [ { name: 'template1.html', url: 'template1.html'}\r\n          , { name: 'template2.html', url: 'template2.html'} ];\r\n        $scope.template = $scope.templates[0];\r\n      }\r\n     </file>\r\n    <file name=\"template1.html\">\r\n      Content of template1.html\r\n    </file>\r\n    <file name=\"template2.html\">\r\n      Content of template2.html\r\n    </file>\r\n    <file name=\"scenario.js\">\r\n      it('should load template1.html', function() {\r\n       expect(element('.doc-example-live [ng-include]').text()).\r\n         toMatch(/Content of template1.html/);\r\n      });\r\n      it('should load template2.html', function() {\r\n       select('template').option('1');\r\n       expect(element('.doc-example-live [ng-include]').text()).\r\n         toMatch(/Content of template2.html/);\r\n      });\r\n      it('should change to blank', function() {\r\n       select('template').option('');\r\n       expect(element('.doc-example-live [ng-include]').text()).toEqual('');\r\n      });\r\n    </file>\r\n  </example>\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc event\r\n * @name ng.directive:ngInclude#$includeContentLoaded\r\n * @eventOf ng.directive:ngInclude\r\n * @eventType emit on the current ngInclude scope\r\n * @description\r\n * Emitted every time the ngInclude content is reloaded.\r\n */\r\nvar ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile',\r\n                  function($http,   $templateCache,   $anchorScroll,   $compile) {\r\n  return {\r\n    restrict: 'ECA',\r\n    terminal: true,\r\n    compile: function(element, attr) {\r\n      var srcExp = attr.ngInclude || attr.src,\r\n          onloadExp = attr.onload || '',\r\n          autoScrollExp = attr.autoscroll;\r\n\r\n      return function(scope, element) {\r\n        var changeCounter = 0,\r\n            childScope;\r\n\r\n        var clearContent = function() {\r\n          if (childScope) {\r\n            childScope.$destroy();\r\n            childScope = null;\r\n          }\r\n\r\n          element.html('');\r\n        };\r\n\r\n        scope.$watch(srcExp, function(src) {\r\n          var thisChangeId = ++changeCounter;\r\n\r\n          if (src) {\r\n            $http.get(src, {cache: $templateCache}).success(function(response) {\r\n              if (thisChangeId !== changeCounter) return;\r\n\r\n              if (childScope) childScope.$destroy();\r\n              childScope = scope.$new();\r\n\r\n              element.html(response);\r\n              $compile(element.contents())(childScope);\r\n\r\n              if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {\r\n                $anchorScroll();\r\n              }\r\n\r\n              childScope.$emit('$includeContentLoaded');\r\n              scope.$eval(onloadExp);\r\n            }).error(function() {\r\n              if (thisChangeId === changeCounter) clearContent();\r\n            });\r\n          } else clearContent();\r\n        });\r\n      };\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngInit\r\n *\r\n * @description\r\n * The `ngInit` directive specifies initialization tasks to be executed\r\n *  before the template enters execution mode during bootstrap.\r\n *\r\n * @element ANY\r\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n    <div ng-init=\"greeting='Hello'; person='World'\">\r\n      {{greeting}} {{person}}!\r\n    </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check greeting', function() {\r\n         expect(binding('greeting')).toBe('Hello');\r\n         expect(binding('person')).toBe('World');\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\nvar ngInitDirective = ngDirective({\r\n  compile: function() {\r\n    return {\r\n      pre: function(scope, element, attrs) {\r\n        scope.$eval(attrs.ngInit);\r\n      }\r\n    }\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngNonBindable\r\n * @priority 1000\r\n *\r\n * @description\r\n * Sometimes it is necessary to write code which looks like bindings but which should be left alone\r\n * by angular. Use `ngNonBindable` to make angular ignore a chunk of HTML.\r\n *\r\n * @element ANY\r\n *\r\n * @example\r\n * In this example there are two location where a simple binding (`{{}}`) is present, but the one\r\n * wrapped in `ngNonBindable` is left alone.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <div>Normal: {{1 + 2}}</div>\r\n        <div ng-non-bindable>Ignored: {{1 + 2}}</div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n       it('should check ng-non-bindable', function() {\r\n         expect(using('.doc-example-live').binding('1 + 2')).toBe('3');\r\n         expect(using('.doc-example-live').element('div:last').text()).\r\n           toMatch(/1 \\+ 2/);\r\n       });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngPluralize\r\n * @restrict EA\r\n *\r\n * @description\r\n * # Overview\r\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\r\n * These rules are bundled with angular.js and the rules can be overridden\r\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\r\n * by specifying the mappings between\r\n * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\r\n * plural categories} and the strings to be displayed.\r\n *\r\n * # Plural categories and explicit number rules\r\n * There are two\r\n * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\r\n * plural categories} in Angular's default en-US locale: \"one\" and \"other\".\r\n *\r\n * While a pural category may match many numbers (for example, in en-US locale, \"other\" can match\r\n * any number that is not 1), an explicit number rule can only match one number. For example, the\r\n * explicit number rule for \"3\" matches the number 3. You will see the use of plural categories\r\n * and explicit number rules throughout later parts of this documentation.\r\n *\r\n * # Configuring ngPluralize\r\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\r\n * You can also provide an optional attribute, `offset`.\r\n *\r\n * The value of the `count` attribute can be either a string or an {@link guide/expression\r\n * Angular expression}; these are evaluated on the current scope for its bound value.\r\n *\r\n * The `when` attribute specifies the mappings between plural categories and the actual\r\n * string to be displayed. The value of the attribute should be a JSON object so that Angular\r\n * can interpret it correctly.\r\n *\r\n * The following example shows how to configure ngPluralize:\r\n *\r\n * <pre>\r\n * <ng-pluralize count=\"personCount\"\r\n                 when=\"{'0': 'Nobody is viewing.',\r\n *                      'one': '1 person is viewing.',\r\n *                      'other': '{} people are viewing.'}\">\r\n * </ng-pluralize>\r\n *</pre>\r\n *\r\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\r\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\r\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\r\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\r\n * show \"a dozen people are viewing\".\r\n *\r\n * You can use a set of closed braces(`{}`) as a placeholder for the number that you want substituted\r\n * into pluralized strings. In the previous example, Angular will replace `{}` with\r\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\r\n * for <span ng-non-bindable>{{numberExpression}}</span>.\r\n *\r\n * # Configuring ngPluralize with offset\r\n * The `offset` attribute allows further customization of pluralized text, which can result in\r\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\r\n * you might display \"John, Kate and 2 others are viewing this document\".\r\n * The offset attribute allows you to offset a number by any desired value.\r\n * Let's take a look at an example:\r\n *\r\n * <pre>\r\n * <ng-pluralize count=\"personCount\" offset=2\r\n *               when=\"{'0': 'Nobody is viewing.',\r\n *                      '1': '{{person1}} is viewing.',\r\n *                      '2': '{{person1}} and {{person2}} are viewing.',\r\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\r\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\r\n * </ng-pluralize>\r\n * </pre>\r\n *\r\n * Notice that we are still using two plural categories(one, other), but we added\r\n * three explicit number rules 0, 1 and 2.\r\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\r\n * When three people view the document, no explicit number rule is found, so\r\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\r\n * In this case, plural category 'one' is matched and \"John, Marry and one other person are viewing\"\r\n * is shown.\r\n *\r\n * Note that when you specify offsets, you must provide explicit number rules for\r\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\r\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\r\n * plural categories \"one\" and \"other\".\r\n *\r\n * @param {string|expression} count The variable to be bounded to.\r\n * @param {string} when The mapping between plural category to its correspoding strings.\r\n * @param {number=} offset Offset to deduct from the total number.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <script>\r\n          function Ctrl($scope) {\r\n            $scope.person1 = 'Igor';\r\n            $scope.person2 = 'Misko';\r\n            $scope.personCount = 1;\r\n          }\r\n        </script>\r\n        <div ng-controller=\"Ctrl\">\r\n          Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /><br/>\r\n          Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /><br/>\r\n          Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /><br/>\r\n\r\n          <!--- Example with simple pluralization rules for en locale --->\r\n          Without Offset:\r\n          <ng-pluralize count=\"personCount\"\r\n                        when=\"{'0': 'Nobody is viewing.',\r\n                               'one': '1 person is viewing.',\r\n                               'other': '{} people are viewing.'}\">\r\n          </ng-pluralize><br>\r\n\r\n          <!--- Example with offset --->\r\n          With Offset(2):\r\n          <ng-pluralize count=\"personCount\" offset=2\r\n                        when=\"{'0': 'Nobody is viewing.',\r\n                               '1': '{{person1}} is viewing.',\r\n                               '2': '{{person1}} and {{person2}} are viewing.',\r\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\r\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\r\n          </ng-pluralize>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should show correct pluralized string', function() {\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                             toBe('1 person is viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                                                toBe('Igor is viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('0');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                               toBe('Nobody is viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                                              toBe('Nobody is viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('2');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                            toBe('2 people are viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                              toBe('Igor and Misko are viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('3');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                            toBe('3 people are viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                              toBe('Igor, Misko and one other person are viewing.');\r\n\r\n          using('.doc-example-live').input('personCount').enter('4');\r\n          expect(element('.doc-example-live ng-pluralize:first').text()).\r\n                                            toBe('4 people are viewing.');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n                              toBe('Igor, Misko and 2 other people are viewing.');\r\n        });\r\n\r\n        it('should show data-binded names', function() {\r\n          using('.doc-example-live').input('personCount').enter('4');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n              toBe('Igor, Misko and 2 other people are viewing.');\r\n\r\n          using('.doc-example-live').input('person1').enter('Di');\r\n          using('.doc-example-live').input('person2').enter('Vojta');\r\n          expect(element('.doc-example-live ng-pluralize:last').text()).\r\n              toBe('Di, Vojta and 2 other people are viewing.');\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {\r\n  var BRACE = /{}/g;\r\n  return {\r\n    restrict: 'EA',\r\n    link: function(scope, element, attr) {\r\n      var numberExp = attr.count,\r\n          whenExp = element.attr(attr.$attr.when), // this is because we have {{}} in attrs\r\n          offset = attr.offset || 0,\r\n          whens = scope.$eval(whenExp),\r\n          whensExpFns = {};\r\n\r\n      forEach(whens, function(expression, key) {\r\n        whensExpFns[key] =\r\n          $interpolate(expression.replace(BRACE, '{{' + numberExp + '-' + offset + '}}'));\r\n      });\r\n\r\n      scope.$watch(function() {\r\n        var value = parseFloat(scope.$eval(numberExp));\r\n\r\n        if (!isNaN(value)) {\r\n          //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,\r\n          //check it against pluralization rules in $locale service\r\n          if (!whens[value]) value = $locale.pluralCat(value - offset);\r\n           return whensExpFns[value](scope, element, true);\r\n        } else {\r\n          return '';\r\n        }\r\n      }, function(newVal) {\r\n        element.text(newVal);\r\n      });\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngRepeat\r\n *\r\n * @description\r\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\r\n * instance gets its own scope, where the given loop variable is set to the current collection item,\r\n * and `$index` is set to the item index or key.\r\n *\r\n * Special properties are exposed on the local scope of each template instance, including:\r\n *\r\n *   * `$index` â€“ `{number}` â€“ iterator offset of the repeated element (0..length-1)\r\n *   * `$first` â€“ `{boolean}` â€“ true if the repeated element is first in the iterator.\r\n *   * `$middle` â€“ `{boolean}` â€“ true if the repeated element is between the first and last in the iterator.\r\n *   * `$last` â€“ `{boolean}` â€“ true if the repeated element is last in the iterator.\r\n *\r\n *\r\n * @element ANY\r\n * @scope\r\n * @priority 1000\r\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. Two\r\n *   formats are currently supported:\r\n *\r\n *   * `variable in expression` â€“ where variable is the user defined loop variable and `expression`\r\n *     is a scope expression giving the collection to enumerate.\r\n *\r\n *     For example: `track in cd.tracks`.\r\n *\r\n *   * `(key, value) in expression` â€“ where `key` and `value` can be any user defined identifiers,\r\n *     and `expression` is the scope expression giving the collection to enumerate.\r\n *\r\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\r\n *\r\n * @example\r\n * This example initializes the scope to a list of names and\r\n * then uses `ngRepeat` to display every person:\r\n    <doc:example>\r\n      <doc:source>\r\n        <div ng-init=\"friends = [{name:'John', age:25}, {name:'Mary', age:28}]\">\r\n          I have {{friends.length}} friends. They are:\r\n          <ul>\r\n            <li ng-repeat=\"friend in friends\">\r\n              [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\r\n            </li>\r\n          </ul>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n         it('should check ng-repeat', function() {\r\n           var r = using('.doc-example-live').repeater('ul li');\r\n           expect(r.count()).toBe(2);\r\n           expect(r.row(0)).toEqual([\"1\",\"John\",\"25\"]);\r\n           expect(r.row(1)).toEqual([\"2\",\"Mary\",\"28\"]);\r\n         });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar ngRepeatDirective = ngDirective({\r\n  transclude: 'element',\r\n  priority: 1000,\r\n  terminal: true,\r\n  compile: function(element, attr, linker) {\r\n    return function(scope, iterStartElement, attr){\r\n      var expression = attr.ngRepeat;\r\n      var match = expression.match(/^\\s*(.+)\\s+in\\s+(.*)\\s*$/),\r\n        lhs, rhs, valueIdent, keyIdent;\r\n      if (! match) {\r\n        throw Error(\"Expected ngRepeat in form of '_item_ in _collection_' but got '\" +\r\n          expression + \"'.\");\r\n      }\r\n      lhs = match[1];\r\n      rhs = match[2];\r\n      match = lhs.match(/^(?:([\\$\\w]+)|\\(([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\))$/);\r\n      if (!match) {\r\n        throw Error(\"'item' in 'item in collection' should be identifier or (key, value) but got '\" +\r\n            lhs + \"'.\");\r\n      }\r\n      valueIdent = match[3] || match[1];\r\n      keyIdent = match[2];\r\n\r\n      // Store a list of elements from previous run. This is a hash where key is the item from the\r\n      // iterator, and the value is an array of objects with following properties.\r\n      //   - scope: bound scope\r\n      //   - element: previous element.\r\n      //   - index: position\r\n      // We need an array of these objects since the same object can be returned from the iterator.\r\n      // We expect this to be a rare case.\r\n      var lastOrder = new HashQueueMap();\r\n      scope.$watch(function(scope){\r\n        var index, length,\r\n            collection = scope.$eval(rhs),\r\n            collectionLength = size(collection, true),\r\n            childScope,\r\n            // Same as lastOrder but it has the current state. It will become the\r\n            // lastOrder on the next iteration.\r\n            nextOrder = new HashQueueMap(),\r\n            key, value, // key/value of iteration\r\n            array, last,       // last object information {scope, element, index}\r\n            cursor = iterStartElement;     // current position of the node\r\n\r\n        if (!isArray(collection)) {\r\n          // if object, extract keys, sort them and use to determine order of iteration over obj props\r\n          array = [];\r\n          for(key in collection) {\r\n            if (collection.hasOwnProperty(key) && key.charAt(0) != '$') {\r\n              array.push(key);\r\n            }\r\n          }\r\n          array.sort();\r\n        } else {\r\n          array = collection || [];\r\n        }\r\n\r\n        // we are not using forEach for perf reasons (trying to avoid #call)\r\n        for (index = 0, length = array.length; index < length; index++) {\r\n          key = (collection === array) ? index : array[index];\r\n          value = collection[key];\r\n          last = lastOrder.shift(value);\r\n          if (last) {\r\n            // if we have already seen this object, then we need to reuse the\r\n            // associated scope/element\r\n            childScope = last.scope;\r\n            nextOrder.push(value, last);\r\n\r\n            if (index === last.index) {\r\n              // do nothing\r\n              cursor = last.element;\r\n            } else {\r\n              // existing item which got moved\r\n              last.index = index;\r\n              // This may be a noop, if the element is next, but I don't know of a good way to\r\n              // figure this out,  since it would require extra DOM access, so let's just hope that\r\n              // the browsers realizes that it is noop, and treats it as such.\r\n              cursor.after(last.element);\r\n              cursor = last.element;\r\n            }\r\n          } else {\r\n            // new item which we don't know about\r\n            childScope = scope.$new();\r\n          }\r\n\r\n          childScope[valueIdent] = value;\r\n          if (keyIdent) childScope[keyIdent] = key;\r\n          childScope.$index = index;\r\n\r\n          childScope.$first = (index === 0);\r\n          childScope.$last = (index === (collectionLength - 1));\r\n          childScope.$middle = !(childScope.$first || childScope.$last);\r\n\r\n          if (!last) {\r\n            linker(childScope, function(clone){\r\n              cursor.after(clone);\r\n              last = {\r\n                  scope: childScope,\r\n                  element: (cursor = clone),\r\n                  index: index\r\n                };\r\n              nextOrder.push(value, last);\r\n            });\r\n          }\r\n        }\r\n\r\n        //shrink children\r\n        for (key in lastOrder) {\r\n          if (lastOrder.hasOwnProperty(key)) {\r\n            array = lastOrder[key];\r\n            while(array.length) {\r\n              value = array.pop();\r\n              value.element.remove();\r\n              value.scope.$destroy();\r\n            }\r\n          }\r\n        }\r\n\r\n        lastOrder = nextOrder;\r\n      });\r\n    };\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngShow\r\n *\r\n * @description\r\n * The `ngShow` and `ngHide` directives show or hide a portion of the DOM tree (HTML)\r\n * conditionally.\r\n *\r\n * @element ANY\r\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy\r\n *     then the element is shown or hidden respectively.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n        Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        Show: <span ng-show=\"checked\">I show up when your checkbox is checked.</span> <br/>\r\n        Hide: <span ng-hide=\"checked\">I hide when your checkbox is checked.</span>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-show / ng-hide', function() {\r\n         expect(element('.doc-example-live span:first:hidden').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:visible').count()).toEqual(1);\r\n\r\n         input('checked').check();\r\n\r\n         expect(element('.doc-example-live span:first:visible').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:hidden').count()).toEqual(1);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n//TODO(misko): refactor to remove element from the DOM\r\nvar ngShowDirective = ngDirective(function(scope, element, attr){\r\n  scope.$watch(attr.ngShow, function(value){\r\n    element.css('display', toBoolean(value) ? '' : 'none');\r\n  });\r\n});\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngHide\r\n *\r\n * @description\r\n * The `ngHide` and `ngShow` directives hide or show a portion\r\n * of the HTML conditionally.\r\n *\r\n * @element ANY\r\n * @param {expression} ngHide If the {@link guide/expression expression} truthy then\r\n *     the element is shown or hidden respectively.\r\n *\r\n * @example\r\n   <doc:example>\r\n     <doc:source>\r\n        Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n        Show: <span ng-show=\"checked\">I show up when you checkbox is checked?</span> <br/>\r\n        Hide: <span ng-hide=\"checked\">I hide when you checkbox is checked?</span>\r\n     </doc:source>\r\n     <doc:scenario>\r\n       it('should check ng-show / ng-hide', function() {\r\n         expect(element('.doc-example-live span:first:hidden').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:visible').count()).toEqual(1);\r\n\r\n         input('checked').check();\r\n\r\n         expect(element('.doc-example-live span:first:visible').count()).toEqual(1);\r\n         expect(element('.doc-example-live span:last:hidden').count()).toEqual(1);\r\n       });\r\n     </doc:scenario>\r\n   </doc:example>\r\n */\r\n//TODO(misko): refactor to remove element from the DOM\r\nvar ngHideDirective = ngDirective(function(scope, element, attr){\r\n  scope.$watch(attr.ngHide, function(value){\r\n    element.css('display', toBoolean(value) ? 'none' : '');\r\n  });\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngStyle\r\n *\r\n * @description\r\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\r\n *\r\n * @element ANY\r\n * @param {expression} ngStyle {@link guide/expression Expression} which evals to an\r\n *      object whose keys are CSS style names and values are corresponding values for those CSS\r\n *      keys.\r\n *\r\n * @example\r\n   <example>\r\n     <file name=\"index.html\">\r\n        <input type=\"button\" value=\"set\" ng-click=\"myStyle={color:'red'}\">\r\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\r\n        <br/>\r\n        <span ng-style=\"myStyle\">Sample Text</span>\r\n        <pre>myStyle={{myStyle}}</pre>\r\n     </file>\r\n     <file name=\"style.css\">\r\n       span {\r\n         color: black;\r\n       }\r\n     </file>\r\n     <file name=\"scenario.js\">\r\n       it('should check ng-style', function() {\r\n         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');\r\n         element('.doc-example-live :button[value=set]').click();\r\n         expect(element('.doc-example-live span').css('color')).toBe('rgb(255, 0, 0)');\r\n         element('.doc-example-live :button[value=clear]').click();\r\n         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');\r\n       });\r\n     </file>\r\n   </example>\r\n */\r\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\r\n  scope.$watch(attr.ngStyle, function(newStyles, oldStyles) {\r\n    if (oldStyles && (newStyles !== oldStyles)) {\r\n      forEach(oldStyles, function(val, style) { element.css(style, '');});\r\n    }\r\n    if (newStyles) element.css(newStyles);\r\n  }, true);\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngSwitch\r\n * @restrict EA\r\n *\r\n * @description\r\n * Conditionally change the DOM structure.\r\n *\r\n * @usageContent\r\n * <ANY ng-switch-when=\"matchValue1\">...</ANY>\r\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\r\n *   ...\r\n *   <ANY ng-switch-default>...</ANY>\r\n *\r\n * @scope\r\n * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.\r\n * @paramDescription\r\n * On child elments add:\r\n *\r\n * * `ngSwitchWhen`: the case statement to match against. If match then this\r\n *   case will be displayed.\r\n * * `ngSwitchDefault`: the default case when no other casses match.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <script>\r\n          function Ctrl($scope) {\r\n            $scope.items = ['settings', 'home', 'other'];\r\n            $scope.selection = $scope.items[0];\r\n          }\r\n        </script>\r\n        <div ng-controller=\"Ctrl\">\r\n          <select ng-model=\"selection\" ng-options=\"item for item in items\">\r\n          </select>\r\n          <tt>selection={{selection}}</tt>\r\n          <hr/>\r\n          <div ng-switch on=\"selection\" >\r\n            <div ng-switch-when=\"settings\">Settings Div</div>\r\n            <span ng-switch-when=\"home\">Home Span</span>\r\n            <span ng-switch-default>default</span>\r\n          </div>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n        it('should start in settings', function() {\r\n         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Settings Div/);\r\n        });\r\n        it('should change to home', function() {\r\n         select('selection').option('home');\r\n         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Home Span/);\r\n        });\r\n        it('should select deafault', function() {\r\n         select('selection').option('other');\r\n         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/default/);\r\n        });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\nvar NG_SWITCH = 'ng-switch';\r\nvar ngSwitchDirective = valueFn({\r\n  restrict: 'EA',\r\n  compile: function(element, attr) {\r\n    var watchExpr = attr.ngSwitch || attr.on,\r\n        cases = {};\r\n\r\n    element.data(NG_SWITCH, cases);\r\n    return function(scope, element){\r\n      var selectedTransclude,\r\n          selectedElement,\r\n          selectedScope;\r\n\r\n      scope.$watch(watchExpr, function(value) {\r\n        if (selectedElement) {\r\n          selectedScope.$destroy();\r\n          selectedElement.remove();\r\n          selectedElement = selectedScope = null;\r\n        }\r\n        if ((selectedTransclude = cases['!' + value] || cases['?'])) {\r\n          scope.$eval(attr.change);\r\n          selectedScope = scope.$new();\r\n          selectedTransclude(selectedScope, function(caseElement) {\r\n            selectedElement = caseElement;\r\n            element.append(caseElement);\r\n          });\r\n        }\r\n      });\r\n    };\r\n  }\r\n});\r\n\r\nvar ngSwitchWhenDirective = ngDirective({\r\n  transclude: 'element',\r\n  priority: 500,\r\n  compile: function(element, attrs, transclude) {\r\n    var cases = element.inheritedData(NG_SWITCH);\r\n    assertArg(cases);\r\n    cases['!' + attrs.ngSwitchWhen] = transclude;\r\n  }\r\n});\r\n\r\nvar ngSwitchDefaultDirective = ngDirective({\r\n  transclude: 'element',\r\n  priority: 500,\r\n  compile: function(element, attrs, transclude) {\r\n    var cases = element.inheritedData(NG_SWITCH);\r\n    assertArg(cases);\r\n    cases['?'] = transclude;\r\n  }\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngTransclude\r\n *\r\n * @description\r\n * Insert the transcluded DOM here.\r\n *\r\n * @element ANY\r\n *\r\n * @example\r\n   <doc:example module=\"transclude\">\r\n     <doc:source>\r\n       <script>\r\n         function Ctrl($scope) {\r\n           $scope.title = 'Lorem Ipsum';\r\n           $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\r\n         }\r\n\r\n         angular.module('transclude', [])\r\n          .directive('pane', function(){\r\n             return {\r\n               restrict: 'E',\r\n               transclude: true,\r\n               scope: 'isolate',\r\n               locals: { title:'bind' },\r\n               template: '<div style=\"border: 1px solid black;\">' +\r\n                           '<div style=\"background-color: gray\">{{title}}</div>' +\r\n                           '<div ng-transclude></div>' +\r\n                         '</div>'\r\n             };\r\n         });\r\n       </script>\r\n       <div ng-controller=\"Ctrl\">\r\n         <input ng-model=\"title\"><br>\r\n         <textarea ng-model=\"text\"></textarea> <br/>\r\n         <pane title=\"{{title}}\">{{text}}</pane>\r\n       </div>\r\n     </doc:source>\r\n     <doc:scenario>\r\n        it('should have transcluded', function() {\r\n          input('title').enter('TITLE');\r\n          input('text').enter('TEXT');\r\n          expect(binding('title')).toEqual('TITLE');\r\n          expect(binding('text')).toEqual('TEXT');\r\n        });\r\n     </doc:scenario>\r\n   </doc:example>\r\n *\r\n */\r\nvar ngTranscludeDirective = ngDirective({\r\n  controller: ['$transclude', '$element', function($transclude, $element) {\r\n    $transclude(function(clone) {\r\n      $element.append(clone);\r\n    });\r\n  }]\r\n});\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:ngView\r\n * @restrict ECA\r\n *\r\n * @description\r\n * # Overview\r\n * `ngView` is a directive that complements the {@link ng.$route $route} service by\r\n * including the rendered template of the current route into the main layout (`index.html`) file.\r\n * Every time the current route changes, the included view changes with it according to the\r\n * configuration of the `$route` service.\r\n *\r\n * @scope\r\n * @example\r\n    <example module=\"ngView\">\r\n      <file name=\"index.html\">\r\n        <div ng-controller=\"MainCntl\">\r\n          Choose:\r\n          <a href=\"Book/Moby\">Moby</a> |\r\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\r\n          <a href=\"Book/Gatsby\">Gatsby</a> |\r\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\r\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\r\n\r\n          <div ng-view></div>\r\n          <hr />\r\n\r\n          <pre>$location.path() = {{$location.path()}}</pre>\r\n          <pre>$route.current.template = {{$route.current.template}}</pre>\r\n          <pre>$route.current.params = {{$route.current.params}}</pre>\r\n          <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\r\n          <pre>$routeParams = {{$routeParams}}</pre>\r\n        </div>\r\n      </file>\r\n\r\n      <file name=\"book.html\">\r\n        controller: {{name}}<br />\r\n        Book Id: {{params.bookId}}<br />\r\n      </file>\r\n\r\n      <file name=\"chapter.html\">\r\n        controller: {{name}}<br />\r\n        Book Id: {{params.bookId}}<br />\r\n        Chapter Id: {{params.chapterId}}\r\n      </file>\r\n\r\n      <file name=\"script.js\">\r\n        angular.module('ngView', [], function($routeProvider, $locationProvider) {\r\n          $routeProvider.when('/Book/:bookId', {\r\n            templateUrl: 'book.html',\r\n            controller: BookCntl\r\n          });\r\n          $routeProvider.when('/Book/:bookId/ch/:chapterId', {\r\n            templateUrl: 'chapter.html',\r\n            controller: ChapterCntl\r\n          });\r\n\r\n          // configure html5 to get links working on jsfiddle\r\n          $locationProvider.html5Mode(true);\r\n        });\r\n\r\n        function MainCntl($scope, $route, $routeParams, $location) {\r\n          $scope.$route = $route;\r\n          $scope.$location = $location;\r\n          $scope.$routeParams = $routeParams;\r\n        }\r\n\r\n        function BookCntl($scope, $routeParams) {\r\n          $scope.name = \"BookCntl\";\r\n          $scope.params = $routeParams;\r\n        }\r\n\r\n        function ChapterCntl($scope, $routeParams) {\r\n          $scope.name = \"ChapterCntl\";\r\n          $scope.params = $routeParams;\r\n        }\r\n      </file>\r\n\r\n      <file name=\"scenario.js\">\r\n        it('should load and compile correct template', function() {\r\n          element('a:contains(\"Moby: Ch1\")').click();\r\n          var content = element('.doc-example-live [ng-view]').text();\r\n          expect(content).toMatch(/controller\\: ChapterCntl/);\r\n          expect(content).toMatch(/Book Id\\: Moby/);\r\n          expect(content).toMatch(/Chapter Id\\: 1/);\r\n\r\n          element('a:contains(\"Scarlet\")').click();\r\n          content = element('.doc-example-live [ng-view]').text();\r\n          expect(content).toMatch(/controller\\: BookCntl/);\r\n          expect(content).toMatch(/Book Id\\: Scarlet/);\r\n        });\r\n      </file>\r\n    </example>\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc event\r\n * @name ng.directive:ngView#$viewContentLoaded\r\n * @eventOf ng.directive:ngView\r\n * @eventType emit on the current ngView scope\r\n * @description\r\n * Emitted every time the ngView content is reloaded.\r\n */\r\nvar ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$compile',\r\n                       '$controller',\r\n               function($http,   $templateCache,   $route,   $anchorScroll,   $compile,\r\n                        $controller) {\r\n  return {\r\n    restrict: 'ECA',\r\n    terminal: true,\r\n    link: function(scope, element, attr) {\r\n      var lastScope,\r\n          onloadExp = attr.onload || '';\r\n\r\n      scope.$on('$routeChangeSuccess', update);\r\n      update();\r\n\r\n\r\n      function destroyLastScope() {\r\n        if (lastScope) {\r\n          lastScope.$destroy();\r\n          lastScope = null;\r\n        }\r\n      }\r\n\r\n      function clearContent() {\r\n        element.html('');\r\n        destroyLastScope();\r\n      }\r\n\r\n      function update() {\r\n        var locals = $route.current && $route.current.locals,\r\n            template = locals && locals.$template;\r\n\r\n        if (template) {\r\n          element.html(template);\r\n          destroyLastScope();\r\n\r\n          var link = $compile(element.contents()),\r\n              current = $route.current,\r\n              controller;\r\n\r\n          lastScope = current.scope = scope.$new();\r\n          if (current.controller) {\r\n            locals.$scope = lastScope;\r\n            controller = $controller(current.controller, locals);\r\n            element.contents().data('$ngControllerController', controller);\r\n          }\r\n\r\n          link(lastScope);\r\n          lastScope.$emit('$viewContentLoaded');\r\n          lastScope.$eval(onloadExp);\r\n\r\n          // $anchorScroll might listen on event...\r\n          $anchorScroll();\r\n        } else {\r\n          clearContent();\r\n        }\r\n      }\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:script\r\n *\r\n * @description\r\n * Load content of a script tag, with type `text/ng-template`, into `$templateCache`, so that the\r\n * template can be used by `ngInclude`, `ngView` or directive templates.\r\n *\r\n * @restrict E\r\n * @param {'text/ng-template'} type must be set to `'text/ng-template'`\r\n *\r\n * @example\r\n  <doc:example>\r\n    <doc:source>\r\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\r\n        Content of the template.\r\n      </script>\r\n\r\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\r\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\r\n    </doc:source>\r\n    <doc:scenario>\r\n      it('should load template defined inside script tag', function() {\r\n        element('#tpl-link').click();\r\n        expect(element('#tpl-content').text()).toMatch(/Content of the template/);\r\n      });\r\n    </doc:scenario>\r\n  </doc:example>\r\n */\r\nvar scriptDirective = ['$templateCache', function($templateCache) {\r\n  return {\r\n    restrict: 'E',\r\n    terminal: true,\r\n    compile: function(element, attr) {\r\n      if (attr.type == 'text/ng-template') {\r\n        var templateUrl = attr.id,\r\n            // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent\r\n            text = element[0].text;\r\n\r\n        $templateCache.put(templateUrl, text);\r\n      }\r\n    }\r\n  };\r\n}];\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ng.directive:select\r\n * @restrict E\r\n *\r\n * @description\r\n * HTML `SELECT` element with angular data-binding.\r\n *\r\n * # `ngOptions`\r\n *\r\n * Optionally `ngOptions` attribute can be used to dynamically generate a list of `<option>`\r\n * elements for a `<select>` element using an array or an object obtained by evaluating the\r\n * `ngOptions` expression.\r\n *ËË\r\n * When an item in the select menu is select, the value of array element or object property\r\n * represented by the selected option will be bound to the model identified by the `ngModel`\r\n * directive of the parent select element.\r\n *\r\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\r\n * be nested into the `<select>` element. This element will then represent `null` or \"not selected\"\r\n * option. See example below for demonstration.\r\n *\r\n * Note: `ngOptions` provides iterator facility for `<option>` element which should be used instead\r\n * of {@link ng.directive:ngRepeat ngRepeat} when you want the\r\n * `select` model to be bound to a non-string value. This is because an option element can currently\r\n * be bound to string values only.\r\n *\r\n * @param {string} name assignable expression to data-bind to.\r\n * @param {string=} required The control is considered valid only if value is entered.\r\n * @param {comprehension_expression=} ngOptions in one of the following forms:\r\n *\r\n *   * for array data sources:\r\n *     * `label` **`for`** `value` **`in`** `array`\r\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\r\n *     * `label`  **`group by`** `group` **`for`** `value` **`in`** `array`\r\n *     * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array`\r\n *   * for object data sources:\r\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\r\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\r\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\r\n *     * `select` **`as`** `label` **`group by`** `group`\r\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\r\n *\r\n * Where:\r\n *\r\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\r\n *   * `value`: local variable which will refer to each item in the `array` or each property value\r\n *      of `object` during iteration.\r\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\r\n *   * `label`: The result of this expression will be the label for `<option>` element. The\r\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\r\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\r\n *      element. If not specified, `select` expression will default to `value`.\r\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\r\n *      DOM element.\r\n *\r\n * @example\r\n    <doc:example>\r\n      <doc:source>\r\n        <script>\r\n        function MyCntrl($scope) {\r\n          $scope.colors = [\r\n            {name:'black', shade:'dark'},\r\n            {name:'white', shade:'light'},\r\n            {name:'red', shade:'dark'},\r\n            {name:'blue', shade:'dark'},\r\n            {name:'yellow', shade:'light'}\r\n          ];\r\n          $scope.color = $scope.colors[2]; // red\r\n        }\r\n        </script>\r\n        <div ng-controller=\"MyCntrl\">\r\n          <ul>\r\n            <li ng-repeat=\"color in colors\">\r\n              Name: <input ng-model=\"color.name\">\r\n              [<a href ng-click=\"colors.splice($index, 1)\">X</a>]\r\n            </li>\r\n            <li>\r\n              [<a href ng-click=\"colors.push({})\">add</a>]\r\n            </li>\r\n          </ul>\r\n          <hr/>\r\n          Color (null not allowed):\r\n          <select ng-model=\"color\" ng-options=\"c.name for c in colors\"></select><br>\r\n\r\n          Color (null allowed):\r\n          <span  class=\"nullable\">\r\n            <select ng-model=\"color\" ng-options=\"c.name for c in colors\">\r\n              <option value=\"\">-- chose color --</option>\r\n            </select>\r\n          </span><br/>\r\n\r\n          Color grouped by shade:\r\n          <select ng-model=\"color\" ng-options=\"c.name group by c.shade for c in colors\">\r\n          </select><br/>\r\n\r\n\r\n          Select <a href ng-click=\"color={name:'not in list'}\">bogus</a>.<br>\r\n          <hr/>\r\n          Currently selected: {{ {selected_color:color}  }}\r\n          <div style=\"border:solid 1px black; height:20px\"\r\n               ng-style=\"{'background-color':color.name}\">\r\n          </div>\r\n        </div>\r\n      </doc:source>\r\n      <doc:scenario>\r\n         it('should check ng-options', function() {\r\n           expect(binding('{selected_color:color}')).toMatch('red');\r\n           select('color').option('0');\r\n           expect(binding('{selected_color:color}')).toMatch('black');\r\n           using('.nullable').select('color').option('');\r\n           expect(binding('{selected_color:color}')).toMatch('null');\r\n         });\r\n      </doc:scenario>\r\n    </doc:example>\r\n */\r\n\r\nvar ngOptionsDirective = valueFn({ terminal: true });\r\nvar selectDirective = ['$compile', '$parse', function($compile,   $parse) {\r\n                         //00001111100000000000222200000000000000000000003333000000000000044444444444444444000000000555555555555555550000000666666666666666660000000000000007777\r\n  var NG_OPTIONS_REGEXP = /^\\s*(.*?)(?:\\s+as\\s+(.*?))?(?:\\s+group\\s+by\\s+(.*))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*)|(?:\\(\\s*([\\$\\w][\\$\\w\\d]*)\\s*,\\s*([\\$\\w][\\$\\w\\d]*)\\s*\\)))\\s+in\\s+(.*)$/,\r\n      nullModelCtrl = {$setViewValue: noop};\r\n\r\n  return {\r\n    restrict: 'E',\r\n    require: ['select', '?ngModel'],\r\n    controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {\r\n      var self = this,\r\n          optionsMap = {},\r\n          ngModelCtrl = nullModelCtrl,\r\n          nullOption,\r\n          unknownOption;\r\n\r\n\r\n      self.databound = $attrs.ngModel;\r\n\r\n\r\n      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {\r\n        ngModelCtrl = ngModelCtrl_;\r\n        nullOption = nullOption_;\r\n        unknownOption = unknownOption_;\r\n      }\r\n\r\n\r\n      self.addOption = function(value) {\r\n        optionsMap[value] = true;\r\n\r\n        if (ngModelCtrl.$viewValue == value) {\r\n          $element.val(value);\r\n          if (unknownOption.parent()) unknownOption.remove();\r\n        }\r\n      };\r\n\r\n\r\n      self.removeOption = function(value) {\r\n        if (this.hasOption(value)) {\r\n          delete optionsMap[value];\r\n          if (ngModelCtrl.$viewValue == value) {\r\n            this.renderUnknownOption(value);\r\n          }\r\n        }\r\n      };\r\n\r\n\r\n      self.renderUnknownOption = function(val) {\r\n        var unknownVal = '? ' + hashKey(val) + ' ?';\r\n        unknownOption.val(unknownVal);\r\n        $element.prepend(unknownOption);\r\n        $element.val(unknownVal);\r\n        unknownOption.prop('selected', true); // needed for IE\r\n      }\r\n\r\n\r\n      self.hasOption = function(value) {\r\n        return optionsMap.hasOwnProperty(value);\r\n      }\r\n\r\n      $scope.$on('$destroy', function() {\r\n        // disable unknown option so that we don't do work when the whole select is being destroyed\r\n        self.renderUnknownOption = noop;\r\n      });\r\n    }],\r\n\r\n    link: function(scope, element, attr, ctrls) {\r\n      // if ngModel is not defined, we don't need to do anything\r\n      if (!ctrls[1]) return;\r\n\r\n      var selectCtrl = ctrls[0],\r\n          ngModelCtrl = ctrls[1],\r\n          multiple = attr.multiple,\r\n          optionsExp = attr.ngOptions,\r\n          nullOption = false, // if false, user will not be able to select it (used by ngOptions)\r\n          emptyOption,\r\n          // we can't just jqLite('<option>') since jqLite is not smart enough\r\n          // to create it in <select> and IE barfs otherwise.\r\n          optionTemplate = jqLite(document.createElement('option')),\r\n          optGroupTemplate =jqLite(document.createElement('optgroup')),\r\n          unknownOption = optionTemplate.clone();\r\n\r\n      // find \"null\" option\r\n      for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {\r\n        if (children[i].value == '') {\r\n          emptyOption = nullOption = children.eq(i);\r\n          break;\r\n        }\r\n      }\r\n\r\n      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);\r\n\r\n      // required validator\r\n      if (multiple && (attr.required || attr.ngRequired)) {\r\n        var requiredValidator = function(value) {\r\n          ngModelCtrl.$setValidity('required', !attr.required || (value && value.length));\r\n          return value;\r\n        };\r\n\r\n        ngModelCtrl.$parsers.push(requiredValidator);\r\n        ngModelCtrl.$formatters.unshift(requiredValidator);\r\n\r\n        attr.$observe('required', function() {\r\n          requiredValidator(ngModelCtrl.$viewValue);\r\n        });\r\n      }\r\n\r\n      if (optionsExp) Options(scope, element, ngModelCtrl);\r\n      else if (multiple) Multiple(scope, element, ngModelCtrl);\r\n      else Single(scope, element, ngModelCtrl, selectCtrl);\r\n\r\n\r\n      ////////////////////////////\r\n\r\n\r\n\r\n      function Single(scope, selectElement, ngModelCtrl, selectCtrl) {\r\n        ngModelCtrl.$render = function() {\r\n          var viewValue = ngModelCtrl.$viewValue;\r\n\r\n          if (selectCtrl.hasOption(viewValue)) {\r\n            if (unknownOption.parent()) unknownOption.remove();\r\n            selectElement.val(viewValue);\r\n            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy\r\n          } else {\r\n            if (isUndefined(viewValue) && emptyOption) {\r\n              selectElement.val('');\r\n            } else {\r\n              selectCtrl.renderUnknownOption(viewValue);\r\n            }\r\n          }\r\n        };\r\n\r\n        selectElement.bind('change', function() {\r\n          scope.$apply(function() {\r\n            if (unknownOption.parent()) unknownOption.remove();\r\n            ngModelCtrl.$setViewValue(selectElement.val());\r\n          });\r\n        });\r\n      }\r\n\r\n      function Multiple(scope, selectElement, ctrl) {\r\n        var lastView;\r\n        ctrl.$render = function() {\r\n          var items = new HashMap(ctrl.$viewValue);\r\n          forEach(selectElement.children(), function(option) {\r\n            option.selected = isDefined(items.get(option.value));\r\n          });\r\n        };\r\n\r\n        // we have to do it on each watch since ngModel watches reference, but\r\n        // we need to work of an array, so we need to see if anything was inserted/removed\r\n        scope.$watch(function() {\r\n          if (!equals(lastView, ctrl.$viewValue)) {\r\n            lastView = copy(ctrl.$viewValue);\r\n            ctrl.$render();\r\n          }\r\n        });\r\n\r\n        selectElement.bind('change', function() {\r\n          scope.$apply(function() {\r\n            var array = [];\r\n            forEach(selectElement.children(), function(option) {\r\n              if (option.selected) {\r\n                array.push(option.value);\r\n              }\r\n            });\r\n            ctrl.$setViewValue(array);\r\n          });\r\n        });\r\n      }\r\n\r\n      function Options(scope, selectElement, ctrl) {\r\n        var match;\r\n\r\n        if (! (match = optionsExp.match(NG_OPTIONS_REGEXP))) {\r\n          throw Error(\r\n            \"Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\" +\r\n            \" but got '\" + optionsExp + \"'.\");\r\n        }\r\n\r\n        var displayFn = $parse(match[2] || match[1]),\r\n            valueName = match[4] || match[6],\r\n            keyName = match[5],\r\n            groupByFn = $parse(match[3] || ''),\r\n            valueFn = $parse(match[2] ? match[1] : valueName),\r\n            valuesFn = $parse(match[7]),\r\n            // This is an array of array of existing option groups in DOM. We try to reuse these if possible\r\n            // optionGroupsCache[0] is the options with no option group\r\n            // optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element\r\n            optionGroupsCache = [[{element: selectElement, label:''}]];\r\n\r\n        if (nullOption) {\r\n          // compile the element since there might be bindings in it\r\n          $compile(nullOption)(scope);\r\n\r\n          // remove the class, which is added automatically because we recompile the element and it\r\n          // becomes the compilation root\r\n          nullOption.removeClass('ng-scope');\r\n\r\n          // we need to remove it before calling selectElement.html('') because otherwise IE will\r\n          // remove the label from the element. wtf?\r\n          nullOption.remove();\r\n        }\r\n\r\n        // clear contents, we'll add what's needed based on the model\r\n        selectElement.html('');\r\n\r\n        selectElement.bind('change', function() {\r\n          scope.$apply(function() {\r\n            var optionGroup,\r\n                collection = valuesFn(scope) || [],\r\n                locals = {},\r\n                key, value, optionElement, index, groupIndex, length, groupLength;\r\n\r\n            if (multiple) {\r\n              value = [];\r\n              for (groupIndex = 0, groupLength = optionGroupsCache.length;\r\n                   groupIndex < groupLength;\r\n                   groupIndex++) {\r\n                // list of options for that group. (first item has the parent)\r\n                optionGroup = optionGroupsCache[groupIndex];\r\n\r\n                for(index = 1, length = optionGroup.length; index < length; index++) {\r\n                  if ((optionElement = optionGroup[index].element)[0].selected) {\r\n                    key = optionElement.val();\r\n                    if (keyName) locals[keyName] = key;\r\n                    locals[valueName] = collection[key];\r\n                    value.push(valueFn(scope, locals));\r\n                  }\r\n                }\r\n              }\r\n            } else {\r\n              key = selectElement.val();\r\n              if (key == '?') {\r\n                value = undefined;\r\n              } else if (key == ''){\r\n                value = null;\r\n              } else {\r\n                locals[valueName] = collection[key];\r\n                if (keyName) locals[keyName] = key;\r\n                value = valueFn(scope, locals);\r\n              }\r\n            }\r\n            ctrl.$setViewValue(value);\r\n          });\r\n        });\r\n\r\n        ctrl.$render = render;\r\n\r\n        // TODO(vojta): can't we optimize this ?\r\n        scope.$watch(render);\r\n\r\n        function render() {\r\n          var optionGroups = {'':[]}, // Temporary location for the option groups before we render them\r\n              optionGroupNames = [''],\r\n              optionGroupName,\r\n              optionGroup,\r\n              option,\r\n              existingParent, existingOptions, existingOption,\r\n              modelValue = ctrl.$modelValue,\r\n              values = valuesFn(scope) || [],\r\n              keys = keyName ? sortedKeys(values) : values,\r\n              groupLength, length,\r\n              groupIndex, index,\r\n              locals = {},\r\n              selected,\r\n              selectedSet = false, // nothing is selected yet\r\n              lastElement,\r\n              element;\r\n\r\n          if (multiple) {\r\n            selectedSet = new HashMap(modelValue);\r\n          } else if (modelValue === null || nullOption) {\r\n            // if we are not multiselect, and we are null then we have to add the nullOption\r\n            optionGroups[''].push({selected:modelValue === null, id:'', label:''});\r\n            selectedSet = true;\r\n          }\r\n\r\n          // We now build up the list of options we need (we merge later)\r\n          for (index = 0; length = keys.length, index < length; index++) {\r\n               locals[valueName] = values[keyName ? locals[keyName]=keys[index]:index];\r\n               optionGroupName = groupByFn(scope, locals) || '';\r\n            if (!(optionGroup = optionGroups[optionGroupName])) {\r\n              optionGroup = optionGroups[optionGroupName] = [];\r\n              optionGroupNames.push(optionGroupName);\r\n            }\r\n            if (multiple) {\r\n              selected = selectedSet.remove(valueFn(scope, locals)) != undefined;\r\n            } else {\r\n              selected = modelValue === valueFn(scope, locals);\r\n              selectedSet = selectedSet || selected; // see if at least one item is selected\r\n            }\r\n            optionGroup.push({\r\n              id: keyName ? keys[index] : index,   // either the index into array or key from object\r\n              label: displayFn(scope, locals) || '', // what will be seen by the user\r\n              selected: selected                   // determine if we should be selected\r\n            });\r\n          }\r\n          if (!multiple && !selectedSet) {\r\n            // nothing was selected, we have to insert the undefined item\r\n            optionGroups[''].unshift({id:'?', label:'', selected:true});\r\n          }\r\n\r\n          // Now we need to update the list of DOM nodes to match the optionGroups we computed above\r\n          for (groupIndex = 0, groupLength = optionGroupNames.length;\r\n               groupIndex < groupLength;\r\n               groupIndex++) {\r\n            // current option group name or '' if no group\r\n            optionGroupName = optionGroupNames[groupIndex];\r\n\r\n            // list of options for that group. (first item has the parent)\r\n            optionGroup = optionGroups[optionGroupName];\r\n\r\n            if (optionGroupsCache.length <= groupIndex) {\r\n              // we need to grow the optionGroups\r\n              existingParent = {\r\n                element: optGroupTemplate.clone().attr('label', optionGroupName),\r\n                label: optionGroup.label\r\n              };\r\n              existingOptions = [existingParent];\r\n              optionGroupsCache.push(existingOptions);\r\n              selectElement.append(existingParent.element);\r\n            } else {\r\n              existingOptions = optionGroupsCache[groupIndex];\r\n              existingParent = existingOptions[0];  // either SELECT (no group) or OPTGROUP element\r\n\r\n              // update the OPTGROUP label if not the same.\r\n              if (existingParent.label != optionGroupName) {\r\n                existingParent.element.attr('label', existingParent.label = optionGroupName);\r\n              }\r\n            }\r\n\r\n            lastElement = null;  // start at the beginning\r\n            for(index = 0, length = optionGroup.length; index < length; index++) {\r\n              option = optionGroup[index];\r\n              if ((existingOption = existingOptions[index+1])) {\r\n                // reuse elements\r\n                lastElement = existingOption.element;\r\n                if (existingOption.label !== option.label) {\r\n                  lastElement.text(existingOption.label = option.label);\r\n                }\r\n                if (existingOption.id !== option.id) {\r\n                  lastElement.val(existingOption.id = option.id);\r\n                }\r\n                if (existingOption.element.selected !== option.selected) {\r\n                  lastElement.prop('selected', (existingOption.selected = option.selected));\r\n                }\r\n              } else {\r\n                // grow elements\r\n\r\n                // if it's a null option\r\n                if (option.id === '' && nullOption) {\r\n                  // put back the pre-compiled element\r\n                  element = nullOption;\r\n                } else {\r\n                  // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but\r\n                  // in this version of jQuery on some browser the .text() returns a string\r\n                  // rather then the element.\r\n                  (element = optionTemplate.clone())\r\n                      .val(option.id)\r\n                      .attr('selected', option.selected)\r\n                      .text(option.label);\r\n                }\r\n\r\n                existingOptions.push(existingOption = {\r\n                    element: element,\r\n                    label: option.label,\r\n                    id: option.id,\r\n                    selected: option.selected\r\n                });\r\n                if (lastElement) {\r\n                  lastElement.after(element);\r\n                } else {\r\n                  existingParent.element.append(element);\r\n                }\r\n                lastElement = element;\r\n              }\r\n            }\r\n            // remove any excessive OPTIONs in a group\r\n            index++; // increment since the existingOptions[0] is parent element not OPTION\r\n            while(existingOptions.length > index) {\r\n              existingOptions.pop().element.remove();\r\n            }\r\n          }\r\n          // remove any excessive OPTGROUPs from select\r\n          while(optionGroupsCache.length > groupIndex) {\r\n            optionGroupsCache.pop()[0].element.remove();\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}];\r\n\r\nvar optionDirective = ['$interpolate', function($interpolate) {\r\n  var nullSelectCtrl = {\r\n    addOption: noop,\r\n    removeOption: noop\r\n  };\r\n\r\n  return {\r\n    restrict: 'E',\r\n    priority: 100,\r\n    require: '^select',\r\n    compile: function(element, attr) {\r\n      if (isUndefined(attr.value)) {\r\n        var interpolateFn = $interpolate(element.text(), true);\r\n        if (!interpolateFn) {\r\n          attr.$set('value', element.text());\r\n        }\r\n      }\r\n\r\n      return function (scope, element, attr, selectCtrl) {\r\n        if (selectCtrl.databound) {\r\n          // For some reason Opera defaults to true and if not overridden this messes up the repeater.\r\n          // We don't want the view to drive the initialization of the model anyway.\r\n          element.prop('selected', false);\r\n        } else {\r\n          selectCtrl = nullSelectCtrl;\r\n        }\r\n\r\n        if (interpolateFn) {\r\n          scope.$watch(interpolateFn, function(newVal, oldVal) {\r\n            attr.$set('value', newVal);\r\n            if (newVal !== oldVal) selectCtrl.removeOption(oldVal);\r\n            selectCtrl.addOption(newVal);\r\n          });\r\n        } else {\r\n          selectCtrl.addOption(attr.value);\r\n        }\r\n\r\n        element.bind('$destroy', function() {\r\n          selectCtrl.removeOption(attr.value);\r\n        });\r\n      };\r\n    }\r\n  }\r\n}];\r\n\r\nvar styleDirective = valueFn({\r\n  restrict: 'E',\r\n  terminal: true\r\n});\r\n  //try to bind to jquery now so that one can write angular.element().read()\r\n  //but we will rebind on bootstrap again.\r\n  bindJQuery();\r\n\r\n  publishExternalAPI(angular);\r\n\r\n  jqLite(document).ready(function() {\r\n    angularInit(document, bootstrap);\r\n  });\r\n\r\n})(window, document);\r\nangular.element(document).find('head').append('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none;}ng\\\\:form{display:block;}</style>');"
  },
  {
    "path": "servers/www/assets/js/vendor/backbone.js",
    "content": "//     Backbone.js 0.9.2\r\n\r\n//     (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.\r\n//     Backbone may be freely distributed under the MIT license.\r\n//     For all details and documentation:\r\n//     http://backbonejs.org\r\n\r\n(function(){\r\n\r\n  // Initial Setup\r\n  // -------------\r\n\r\n  // Save a reference to the global object (`window` in the browser, `global`\r\n  // on the server).\r\n  var root = this;\r\n\r\n  // Save the previous value of the `Backbone` variable, so that it can be\r\n  // restored later on, if `noConflict` is used.\r\n  var previousBackbone = root.Backbone;\r\n\r\n  // Create a local reference to slice/splice.\r\n  var slice = Array.prototype.slice;\r\n  var splice = Array.prototype.splice;\r\n\r\n  // The top-level namespace. All public Backbone classes and modules will\r\n  // be attached to this. Exported for both CommonJS and the browser.\r\n  var Backbone;\r\n  if (typeof exports !== 'undefined') {\r\n    Backbone = exports;\r\n  } else {\r\n    Backbone = root.Backbone = {};\r\n  }\r\n\r\n  // Current version of the library. Keep in sync with `package.json`.\r\n  Backbone.VERSION = '0.9.2';\r\n\r\n  // Require Underscore, if we're on the server, and it's not already present.\r\n  var _ = root._;\r\n  if (!_ && (typeof require !== 'undefined')) _ = require('underscore');\r\n\r\n  // For Backbone's purposes, jQuery, Zepto, or Ender owns the `$` variable.\r\n  var $ = root.jQuery || root.Zepto || root.ender;\r\n\r\n  // Set the JavaScript library that will be used for DOM manipulation and\r\n  // Ajax calls (a.k.a. the `$` variable). By default Backbone will use: jQuery,\r\n  // Zepto, or Ender; but the `setDomLibrary()` method lets you inject an\r\n  // alternate JavaScript library (or a mock library for testing your views\r\n  // outside of a browser).\r\n  Backbone.setDomLibrary = function(lib) {\r\n    $ = lib;\r\n  };\r\n\r\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\r\n  // to its previous owner. Returns a reference to this Backbone object.\r\n  Backbone.noConflict = function() {\r\n    root.Backbone = previousBackbone;\r\n    return this;\r\n  };\r\n\r\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\r\n  // will fake `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\r\n  // set a `X-Http-Method-Override` header.\r\n  Backbone.emulateHTTP = false;\r\n\r\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\r\n  // `application/json` requests ... will encode the body as\r\n  // `application/x-www-form-urlencoded` instead and will send the model in a\r\n  // form param named `model`.\r\n  Backbone.emulateJSON = false;\r\n\r\n  // Backbone.Events\r\n  // -----------------\r\n\r\n  // Regular expression used to split event strings\r\n  var eventSplitter = /\\s+/;\r\n\r\n  // A module that can be mixed in to *any object* in order to provide it with\r\n  // custom events. You may bind with `on` or remove with `off` callback functions\r\n  // to an event; trigger`-ing an event fires all callbacks in succession.\r\n  //\r\n  //     var object = {};\r\n  //     _.extend(object, Backbone.Events);\r\n  //     object.on('expand', function(){ alert('expanded'); });\r\n  //     object.trigger('expand');\r\n  //\r\n  var Events = Backbone.Events = {\r\n\r\n    // Bind one or more space separated events, `events`, to a `callback`\r\n    // function. Passing `\"all\"` will bind the callback to all events fired.\r\n    on: function(events, callback, context) {\r\n\r\n      var calls, event, node, tail, list;\r\n      if (!callback) return this;\r\n      events = events.split(eventSplitter);\r\n      calls = this._callbacks || (this._callbacks = {});\r\n\r\n      // Create an immutable callback list, allowing traversal during\r\n      // modification.  The tail is an empty object that will always be used\r\n      // as the next node.\r\n      while (event = events.shift()) {\r\n        list = calls[event];\r\n        node = list ? list.tail : {};\r\n        node.next = tail = {};\r\n        node.context = context;\r\n        node.callback = callback;\r\n        calls[event] = {tail: tail, next: list ? list.next : node};\r\n      }\r\n\r\n      return this;\r\n    },\r\n\r\n    // Remove one or many callbacks. If `context` is null, removes all callbacks\r\n    // with that function. If `callback` is null, removes all callbacks for the\r\n    // event. If `events` is null, removes all bound callbacks for all events.\r\n    off: function(events, callback, context) {\r\n      var event, calls, node, tail, cb, ctx;\r\n\r\n      // No events, or removing *all* events.\r\n      if (!(calls = this._callbacks)) return;\r\n      if (!(events || callback || context)) {\r\n        delete this._callbacks;\r\n        return this;\r\n      }\r\n\r\n      // Loop through the listed events and contexts, splicing them out of the\r\n      // linked list of callbacks if appropriate.\r\n      events = events ? events.split(eventSplitter) : _.keys(calls);\r\n      while (event = events.shift()) {\r\n        node = calls[event];\r\n        delete calls[event];\r\n        if (!node || !(callback || context)) continue;\r\n        // Create a new list, omitting the indicated callbacks.\r\n        tail = node.tail;\r\n        while ((node = node.next) !== tail) {\r\n          cb = node.callback;\r\n          ctx = node.context;\r\n          if ((callback && cb !== callback) || (context && ctx !== context)) {\r\n            this.on(event, cb, ctx);\r\n          }\r\n        }\r\n      }\r\n\r\n      return this;\r\n    },\r\n\r\n    // Trigger one or many events, firing all bound callbacks. Callbacks are\r\n    // passed the same arguments as `trigger` is, apart from the event name\r\n    // (unless you're listening on `\"all\"`, which will cause your callback to\r\n    // receive the true name of the event as the first argument).\r\n    trigger: function(events) {\r\n      var event, node, calls, tail, args, all, rest;\r\n      if (!(calls = this._callbacks)) return this;\r\n      all = calls.all;\r\n      events = events.split(eventSplitter);\r\n      rest = slice.call(arguments, 1);\r\n\r\n      // For each event, walk through the linked list of callbacks twice,\r\n      // first to trigger the event, then to trigger any `\"all\"` callbacks.\r\n      while (event = events.shift()) {\r\n        if (node = calls[event]) {\r\n          tail = node.tail;\r\n          while ((node = node.next) !== tail) {\r\n            node.callback.apply(node.context || this, rest);\r\n          }\r\n        }\r\n        if (node = all) {\r\n          tail = node.tail;\r\n          args = [event].concat(rest);\r\n          while ((node = node.next) !== tail) {\r\n            node.callback.apply(node.context || this, args);\r\n          }\r\n        }\r\n      }\r\n\r\n      return this;\r\n    }\r\n\r\n  };\r\n\r\n  // Aliases for backwards compatibility.\r\n  Events.bind   = Events.on;\r\n  Events.unbind = Events.off;\r\n\r\n  // Backbone.Model\r\n  // --------------\r\n\r\n  // Create a new model, with defined attributes. A client id (`cid`)\r\n  // is automatically generated and assigned for you.\r\n  var Model = Backbone.Model = function(attributes, options) {\r\n    var defaults;\r\n    attributes || (attributes = {});\r\n    if (options && options.parse) attributes = this.parse(attributes);\r\n    if (defaults = getValue(this, 'defaults')) {\r\n      attributes = _.extend({}, defaults, attributes);\r\n    }\r\n    if (options && options.collection) this.collection = options.collection;\r\n    this.attributes = {};\r\n    this._escapedAttributes = {};\r\n    this.cid = _.uniqueId('c');\r\n    this.changed = {};\r\n    this._silent = {};\r\n    this._pending = {};\r\n    this.set(attributes, {silent: true});\r\n    // Reset change tracking.\r\n    this.changed = {};\r\n    this._silent = {};\r\n    this._pending = {};\r\n    this._previousAttributes = _.clone(this.attributes);\r\n    this.initialize.apply(this, arguments);\r\n  };\r\n\r\n  // Attach all inheritable methods to the Model prototype.\r\n  _.extend(Model.prototype, Events, {\r\n\r\n    // A hash of attributes whose current and previous value differ.\r\n    changed: null,\r\n\r\n    // A hash of attributes that have silently changed since the last time\r\n    // `change` was called.  Will become pending attributes on the next call.\r\n    _silent: null,\r\n\r\n    // A hash of attributes that have changed since the last `'change'` event\r\n    // began.\r\n    _pending: null,\r\n\r\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\r\n    // CouchDB users may want to set this to `\"_id\"`.\r\n    idAttribute: 'id',\r\n\r\n    // Initialize is an empty function by default. Override it with your own\r\n    // initialization logic.\r\n    initialize: function(){},\r\n\r\n    // Return a copy of the model's `attributes` object.\r\n    toJSON: function(options) {\r\n      return _.clone(this.attributes);\r\n    },\r\n\r\n    // Get the value of an attribute.\r\n    get: function(attr) {\r\n      return this.attributes[attr];\r\n    },\r\n\r\n    // Get the HTML-escaped value of an attribute.\r\n    escape: function(attr) {\r\n      var html;\r\n      if (html = this._escapedAttributes[attr]) return html;\r\n      var val = this.get(attr);\r\n      return this._escapedAttributes[attr] = _.escape(val == null ? '' : '' + val);\r\n    },\r\n\r\n    // Returns `true` if the attribute contains a value that is not null\r\n    // or undefined.\r\n    has: function(attr) {\r\n      return this.get(attr) != null;\r\n    },\r\n\r\n    // Set a hash of model attributes on the object, firing `\"change\"` unless\r\n    // you choose to silence it.\r\n    set: function(key, value, options) {\r\n      var attrs, attr, val;\r\n\r\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\r\n      if (_.isObject(key) || key == null) {\r\n        attrs = key;\r\n        options = value;\r\n      } else {\r\n        attrs = {};\r\n        attrs[key] = value;\r\n      }\r\n\r\n      // Extract attributes and options.\r\n      options || (options = {});\r\n      if (!attrs) return this;\r\n      if (attrs instanceof Model) attrs = attrs.attributes;\r\n      if (options.unset) for (attr in attrs) attrs[attr] = void 0;\r\n\r\n      // Run validation.\r\n      if (!this._validate(attrs, options)) return false;\r\n\r\n      // Check for changes of `id`.\r\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\r\n\r\n      var changes = options.changes = {};\r\n      var now = this.attributes;\r\n      var escaped = this._escapedAttributes;\r\n      var prev = this._previousAttributes || {};\r\n\r\n      // For each `set` attribute...\r\n      for (attr in attrs) {\r\n        val = attrs[attr];\r\n\r\n        // If the new and current value differ, record the change.\r\n        if (!_.isEqual(now[attr], val) || (options.unset && _.has(now, attr))) {\r\n          delete escaped[attr];\r\n          (options.silent ? this._silent : changes)[attr] = true;\r\n        }\r\n\r\n        // Update or delete the current value.\r\n        options.unset ? delete now[attr] : now[attr] = val;\r\n\r\n        // If the new and previous value differ, record the change.  If not,\r\n        // then remove changes for this attribute.\r\n        if (!_.isEqual(prev[attr], val) || (_.has(now, attr) != _.has(prev, attr))) {\r\n          this.changed[attr] = val;\r\n          if (!options.silent) this._pending[attr] = true;\r\n        } else {\r\n          delete this.changed[attr];\r\n          delete this._pending[attr];\r\n        }\r\n      }\r\n\r\n      // Fire the `\"change\"` events.\r\n      if (!options.silent) this.change(options);\r\n      return this;\r\n    },\r\n\r\n    // Remove an attribute from the model, firing `\"change\"` unless you choose\r\n    // to silence it. `unset` is a noop if the attribute doesn't exist.\r\n    unset: function(attr, options) {\r\n      (options || (options = {})).unset = true;\r\n      return this.set(attr, null, options);\r\n    },\r\n\r\n    // Clear all attributes on the model, firing `\"change\"` unless you choose\r\n    // to silence it.\r\n    clear: function(options) {\r\n      (options || (options = {})).unset = true;\r\n      return this.set(_.clone(this.attributes), options);\r\n    },\r\n\r\n    // Fetch the model from the server. If the server's representation of the\r\n    // model differs from its current attributes, they will be overriden,\r\n    // triggering a `\"change\"` event.\r\n    fetch: function(options) {\r\n      options = options ? _.clone(options) : {};\r\n      var model = this;\r\n      var success = options.success;\r\n      options.success = function(resp, status, xhr) {\r\n        if (!model.set(model.parse(resp, xhr), options)) return false;\r\n        if (success) success(model, resp);\r\n      };\r\n      options.error = Backbone.wrapError(options.error, model, options);\r\n      return (this.sync || Backbone.sync).call(this, 'read', this, options);\r\n    },\r\n\r\n    // Set a hash of model attributes, and sync the model to the server.\r\n    // If the server returns an attributes hash that differs, the model's\r\n    // state will be `set` again.\r\n    save: function(key, value, options) {\r\n      var attrs, current;\r\n\r\n      // Handle both `(\"key\", value)` and `({key: value})` -style calls.\r\n      if (_.isObject(key) || key == null) {\r\n        attrs = key;\r\n        options = value;\r\n      } else {\r\n        attrs = {};\r\n        attrs[key] = value;\r\n      }\r\n      options = options ? _.clone(options) : {};\r\n\r\n      // If we're \"wait\"-ing to set changed attributes, validate early.\r\n      if (options.wait) {\r\n        if (!this._validate(attrs, options)) return false;\r\n        current = _.clone(this.attributes);\r\n      }\r\n\r\n      // Regular saves `set` attributes before persisting to the server.\r\n      var silentOptions = _.extend({}, options, {silent: true});\r\n      if (attrs && !this.set(attrs, options.wait ? silentOptions : options)) {\r\n        return false;\r\n      }\r\n\r\n      // After a successful server-side save, the client is (optionally)\r\n      // updated with the server-side state.\r\n      var model = this;\r\n      var success = options.success;\r\n      options.success = function(resp, status, xhr) {\r\n        var serverAttrs = model.parse(resp, xhr);\r\n        if (options.wait) {\r\n          delete options.wait;\r\n          serverAttrs = _.extend(attrs || {}, serverAttrs);\r\n        }\r\n        if (!model.set(serverAttrs, options)) return false;\r\n        if (success) {\r\n          success(model, resp);\r\n        } else {\r\n          model.trigger('sync', model, resp, options);\r\n        }\r\n      };\r\n\r\n      // Finish configuring and sending the Ajax request.\r\n      options.error = Backbone.wrapError(options.error, model, options);\r\n      var method = this.isNew() ? 'create' : 'update';\r\n      var xhr = (this.sync || Backbone.sync).call(this, method, this, options);\r\n      if (options.wait) this.set(current, silentOptions);\r\n      return xhr;\r\n    },\r\n\r\n    // Destroy this model on the server if it was already persisted.\r\n    // Optimistically removes the model from its collection, if it has one.\r\n    // If `wait: true` is passed, waits for the server to respond before removal.\r\n    destroy: function(options) {\r\n      options = options ? _.clone(options) : {};\r\n      var model = this;\r\n      var success = options.success;\r\n\r\n      var triggerDestroy = function() {\r\n        model.trigger('destroy', model, model.collection, options);\r\n      };\r\n\r\n      if (this.isNew()) {\r\n        triggerDestroy();\r\n        return false;\r\n      }\r\n\r\n      options.success = function(resp) {\r\n        if (options.wait) triggerDestroy();\r\n        if (success) {\r\n          success(model, resp);\r\n        } else {\r\n          model.trigger('sync', model, resp, options);\r\n        }\r\n      };\r\n\r\n      options.error = Backbone.wrapError(options.error, model, options);\r\n      var xhr = (this.sync || Backbone.sync).call(this, 'delete', this, options);\r\n      if (!options.wait) triggerDestroy();\r\n      return xhr;\r\n    },\r\n\r\n    // Default URL for the model's representation on the server -- if you're\r\n    // using Backbone's restful methods, override this to change the endpoint\r\n    // that will be called.\r\n    url: function() {\r\n      var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') || urlError();\r\n      if (this.isNew()) return base;\r\n      return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id);\r\n    },\r\n\r\n    // **parse** converts a response into the hash of attributes to be `set` on\r\n    // the model. The default implementation is just to pass the response along.\r\n    parse: function(resp, xhr) {\r\n      return resp;\r\n    },\r\n\r\n    // Create a new model with identical attributes to this one.\r\n    clone: function() {\r\n      return new this.constructor(this.attributes);\r\n    },\r\n\r\n    // A model is new if it has never been saved to the server, and lacks an id.\r\n    isNew: function() {\r\n      return this.id == null;\r\n    },\r\n\r\n    // Call this method to manually fire a `\"change\"` event for this model and\r\n    // a `\"change:attribute\"` event for each changed attribute.\r\n    // Calling this will cause all objects observing the model to update.\r\n    change: function(options) {\r\n      options || (options = {});\r\n      var changing = this._changing;\r\n      this._changing = true;\r\n\r\n      // Silent changes become pending changes.\r\n      for (var attr in this._silent) this._pending[attr] = true;\r\n\r\n      // Silent changes are triggered.\r\n      var changes = _.extend({}, options.changes, this._silent);\r\n      this._silent = {};\r\n      for (var attr in changes) {\r\n        this.trigger('change:' + attr, this, this.get(attr), options);\r\n      }\r\n      if (changing) return this;\r\n\r\n      // Continue firing `\"change\"` events while there are pending changes.\r\n      while (!_.isEmpty(this._pending)) {\r\n        this._pending = {};\r\n        this.trigger('change', this, options);\r\n        // Pending and silent changes still remain.\r\n        for (var attr in this.changed) {\r\n          if (this._pending[attr] || this._silent[attr]) continue;\r\n          delete this.changed[attr];\r\n        }\r\n        this._previousAttributes = _.clone(this.attributes);\r\n      }\r\n\r\n      this._changing = false;\r\n      return this;\r\n    },\r\n\r\n    // Determine if the model has changed since the last `\"change\"` event.\r\n    // If you specify an attribute name, determine if that attribute has changed.\r\n    hasChanged: function(attr) {\r\n      if (!arguments.length) return !_.isEmpty(this.changed);\r\n      return _.has(this.changed, attr);\r\n    },\r\n\r\n    // Return an object containing all the attributes that have changed, or\r\n    // false if there are no changed attributes. Useful for determining what\r\n    // parts of a view need to be updated and/or what attributes need to be\r\n    // persisted to the server. Unset attributes will be set to undefined.\r\n    // You can also pass an attributes object to diff against the model,\r\n    // determining if there *would be* a change.\r\n    changedAttributes: function(diff) {\r\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\r\n      var val, changed = false, old = this._previousAttributes;\r\n      for (var attr in diff) {\r\n        if (_.isEqual(old[attr], (val = diff[attr]))) continue;\r\n        (changed || (changed = {}))[attr] = val;\r\n      }\r\n      return changed;\r\n    },\r\n\r\n    // Get the previous value of an attribute, recorded at the time the last\r\n    // `\"change\"` event was fired.\r\n    previous: function(attr) {\r\n      if (!arguments.length || !this._previousAttributes) return null;\r\n      return this._previousAttributes[attr];\r\n    },\r\n\r\n    // Get all of the attributes of the model at the time of the previous\r\n    // `\"change\"` event.\r\n    previousAttributes: function() {\r\n      return _.clone(this._previousAttributes);\r\n    },\r\n\r\n    // Check if the model is currently in a valid state. It's only possible to\r\n    // get into an *invalid* state if you're using silent changes.\r\n    isValid: function() {\r\n      return !this.validate(this.attributes);\r\n    },\r\n\r\n    // Run validation against the next complete set of model attributes,\r\n    // returning `true` if all is well. If a specific `error` callback has\r\n    // been passed, call that instead of firing the general `\"error\"` event.\r\n    _validate: function(attrs, options) {\r\n      if (options.silent || !this.validate) return true;\r\n      attrs = _.extend({}, this.attributes, attrs);\r\n      var error = this.validate(attrs, options);\r\n      if (!error) return true;\r\n      if (options && options.error) {\r\n        options.error(this, error, options);\r\n      } else {\r\n        this.trigger('error', this, error, options);\r\n      }\r\n      return false;\r\n    }\r\n\r\n  });\r\n\r\n  // Backbone.Collection\r\n  // -------------------\r\n\r\n  // Provides a standard collection class for our sets of models, ordered\r\n  // or unordered. If a `comparator` is specified, the Collection will maintain\r\n  // its models in sort order, as they're added and removed.\r\n  var Collection = Backbone.Collection = function(models, options) {\r\n    options || (options = {});\r\n    if (options.model) this.model = options.model;\r\n    if (options.comparator) this.comparator = options.comparator;\r\n    this._reset();\r\n    this.initialize.apply(this, arguments);\r\n    if (models) this.reset(models, {silent: true, parse: options.parse});\r\n  };\r\n\r\n  // Define the Collection's inheritable methods.\r\n  _.extend(Collection.prototype, Events, {\r\n\r\n    // The default model for a collection is just a **Backbone.Model**.\r\n    // This should be overridden in most cases.\r\n    model: Model,\r\n\r\n    // Initialize is an empty function by default. Override it with your own\r\n    // initialization logic.\r\n    initialize: function(){},\r\n\r\n    // The JSON representation of a Collection is an array of the\r\n    // models' attributes.\r\n    toJSON: function(options) {\r\n      return this.map(function(model){ return model.toJSON(options); });\r\n    },\r\n\r\n    // Add a model, or list of models to the set. Pass **silent** to avoid\r\n    // firing the `add` event for every new model.\r\n    add: function(models, options) {\r\n      var i, index, length, model, cid, id, cids = {}, ids = {}, dups = [];\r\n      options || (options = {});\r\n      models = _.isArray(models) ? models.slice() : [models];\r\n\r\n      // Begin by turning bare objects into model references, and preventing\r\n      // invalid models or duplicate models from being added.\r\n      for (i = 0, length = models.length; i < length; i++) {\r\n        if (!(model = models[i] = this._prepareModel(models[i], options))) {\r\n          throw new Error(\"Can't add an invalid model to a collection\");\r\n        }\r\n        cid = model.cid;\r\n        id = model.id;\r\n        if (cids[cid] || this._byCid[cid] || ((id != null) && (ids[id] || this._byId[id]))) {\r\n          dups.push(i);\r\n          continue;\r\n        }\r\n        cids[cid] = ids[id] = model;\r\n      }\r\n\r\n      // Remove duplicates.\r\n      i = dups.length;\r\n      while (i--) {\r\n        models.splice(dups[i], 1);\r\n      }\r\n\r\n      // Listen to added models' events, and index models for lookup by\r\n      // `id` and by `cid`.\r\n      for (i = 0, length = models.length; i < length; i++) {\r\n        (model = models[i]).on('all', this._onModelEvent, this);\r\n        this._byCid[model.cid] = model;\r\n        if (model.id != null) this._byId[model.id] = model;\r\n      }\r\n\r\n      // Insert models into the collection, re-sorting if needed, and triggering\r\n      // `add` events unless silenced.\r\n      this.length += length;\r\n      index = options.at != null ? options.at : this.models.length;\r\n      splice.apply(this.models, [index, 0].concat(models));\r\n      if (this.comparator) this.sort({silent: true});\r\n      if (options.silent) return this;\r\n      for (i = 0, length = this.models.length; i < length; i++) {\r\n        if (!cids[(model = this.models[i]).cid]) continue;\r\n        options.index = i;\r\n        model.trigger('add', model, this, options);\r\n      }\r\n      return this;\r\n    },\r\n\r\n    // Remove a model, or a list of models from the set. Pass silent to avoid\r\n    // firing the `remove` event for every model removed.\r\n    remove: function(models, options) {\r\n      var i, l, index, model;\r\n      options || (options = {});\r\n      models = _.isArray(models) ? models.slice() : [models];\r\n      for (i = 0, l = models.length; i < l; i++) {\r\n        model = this.getByCid(models[i]) || this.get(models[i]);\r\n        if (!model) continue;\r\n        delete this._byId[model.id];\r\n        delete this._byCid[model.cid];\r\n        index = this.indexOf(model);\r\n        this.models.splice(index, 1);\r\n        this.length--;\r\n        if (!options.silent) {\r\n          options.index = index;\r\n          model.trigger('remove', model, this, options);\r\n        }\r\n        this._removeReference(model);\r\n      }\r\n      return this;\r\n    },\r\n\r\n    // Add a model to the end of the collection.\r\n    push: function(model, options) {\r\n      model = this._prepareModel(model, options);\r\n      this.add(model, options);\r\n      return model;\r\n    },\r\n\r\n    // Remove a model from the end of the collection.\r\n    pop: function(options) {\r\n      var model = this.at(this.length - 1);\r\n      this.remove(model, options);\r\n      return model;\r\n    },\r\n\r\n    // Add a model to the beginning of the collection.\r\n    unshift: function(model, options) {\r\n      model = this._prepareModel(model, options);\r\n      this.add(model, _.extend({at: 0}, options));\r\n      return model;\r\n    },\r\n\r\n    // Remove a model from the beginning of the collection.\r\n    shift: function(options) {\r\n      var model = this.at(0);\r\n      this.remove(model, options);\r\n      return model;\r\n    },\r\n\r\n    // Get a model from the set by id.\r\n    get: function(id) {\r\n      if (id == null) return void 0;\r\n      return this._byId[id.id != null ? id.id : id];\r\n    },\r\n\r\n    // Get a model from the set by client id.\r\n    getByCid: function(cid) {\r\n      return cid && this._byCid[cid.cid || cid];\r\n    },\r\n\r\n    // Get the model at the given index.\r\n    at: function(index) {\r\n      return this.models[index];\r\n    },\r\n\r\n    // Return models with matching attributes. Useful for simple cases of `filter`.\r\n    where: function(attrs) {\r\n      if (_.isEmpty(attrs)) return [];\r\n      return this.filter(function(model) {\r\n        for (var key in attrs) {\r\n          if (attrs[key] !== model.get(key)) return false;\r\n        }\r\n        return true;\r\n      });\r\n    },\r\n\r\n    // Force the collection to re-sort itself. You don't need to call this under\r\n    // normal circumstances, as the set will maintain sort order as each item\r\n    // is added.\r\n    sort: function(options) {\r\n      options || (options = {});\r\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\r\n      var boundComparator = _.bind(this.comparator, this);\r\n      if (this.comparator.length == 1) {\r\n        this.models = this.sortBy(boundComparator);\r\n      } else {\r\n        this.models.sort(boundComparator);\r\n      }\r\n      if (!options.silent) this.trigger('reset', this, options);\r\n      return this;\r\n    },\r\n\r\n    // Pluck an attribute from each model in the collection.\r\n    pluck: function(attr) {\r\n      return _.map(this.models, function(model){ return model.get(attr); });\r\n    },\r\n\r\n    // When you have more items than you want to add or remove individually,\r\n    // you can reset the entire set with a new list of models, without firing\r\n    // any `add` or `remove` events. Fires `reset` when finished.\r\n    reset: function(models, options) {\r\n      models  || (models = []);\r\n      options || (options = {});\r\n      for (var i = 0, l = this.models.length; i < l; i++) {\r\n        this._removeReference(this.models[i]);\r\n      }\r\n      this._reset();\r\n      this.add(models, _.extend({silent: true}, options));\r\n      if (!options.silent) this.trigger('reset', this, options);\r\n      return this;\r\n    },\r\n\r\n    // Fetch the default set of models for this collection, resetting the\r\n    // collection when they arrive. If `add: true` is passed, appends the\r\n    // models to the collection instead of resetting.\r\n    fetch: function(options) {\r\n      options = options ? _.clone(options) : {};\r\n      if (options.parse === undefined) options.parse = true;\r\n      var collection = this;\r\n      var success = options.success;\r\n      options.success = function(resp, status, xhr) {\r\n        collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);\r\n        if (success) success(collection, resp);\r\n      };\r\n      options.error = Backbone.wrapError(options.error, collection, options);\r\n      return (this.sync || Backbone.sync).call(this, 'read', this, options);\r\n    },\r\n\r\n    // Create a new instance of a model in this collection. Add the model to the\r\n    // collection immediately, unless `wait: true` is passed, in which case we\r\n    // wait for the server to agree.\r\n    create: function(model, options) {\r\n      var coll = this;\r\n      options = options ? _.clone(options) : {};\r\n      model = this._prepareModel(model, options);\r\n      if (!model) return false;\r\n      if (!options.wait) coll.add(model, options);\r\n      var success = options.success;\r\n      options.success = function(nextModel, resp, xhr) {\r\n        if (options.wait) coll.add(nextModel, options);\r\n        if (success) {\r\n          success(nextModel, resp);\r\n        } else {\r\n          nextModel.trigger('sync', model, resp, options);\r\n        }\r\n      };\r\n      model.save(null, options);\r\n      return model;\r\n    },\r\n\r\n    // **parse** converts a response into a list of models to be added to the\r\n    // collection. The default implementation is just to pass it through.\r\n    parse: function(resp, xhr) {\r\n      return resp;\r\n    },\r\n\r\n    // Proxy to _'s chain. Can't be proxied the same way the rest of the\r\n    // underscore methods are proxied because it relies on the underscore\r\n    // constructor.\r\n    chain: function () {\r\n      return _(this.models).chain();\r\n    },\r\n\r\n    // Reset all internal state. Called when the collection is reset.\r\n    _reset: function(options) {\r\n      this.length = 0;\r\n      this.models = [];\r\n      this._byId  = {};\r\n      this._byCid = {};\r\n    },\r\n\r\n    // Prepare a model or hash of attributes to be added to this collection.\r\n    _prepareModel: function(model, options) {\r\n      options || (options = {});\r\n      if (!(model instanceof Model)) {\r\n        var attrs = model;\r\n        options.collection = this;\r\n        model = new this.model(attrs, options);\r\n        if (!model._validate(model.attributes, options)) model = false;\r\n      } else if (!model.collection) {\r\n        model.collection = this;\r\n      }\r\n      return model;\r\n    },\r\n\r\n    // Internal method to remove a model's ties to a collection.\r\n    _removeReference: function(model) {\r\n      if (this == model.collection) {\r\n        delete model.collection;\r\n      }\r\n      model.off('all', this._onModelEvent, this);\r\n    },\r\n\r\n    // Internal method called every time a model in the set fires an event.\r\n    // Sets need to update their indexes when models change ids. All other\r\n    // events simply proxy through. \"add\" and \"remove\" events that originate\r\n    // in other collections are ignored.\r\n    _onModelEvent: function(event, model, collection, options) {\r\n      if ((event == 'add' || event == 'remove') && collection != this) return;\r\n      if (event == 'destroy') {\r\n        this.remove(model, options);\r\n      }\r\n      if (model && event === 'change:' + model.idAttribute) {\r\n        delete this._byId[model.previous(model.idAttribute)];\r\n        this._byId[model.id] = model;\r\n      }\r\n      this.trigger.apply(this, arguments);\r\n    }\r\n\r\n  });\r\n\r\n  // Underscore methods that we want to implement on the Collection.\r\n  var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find',\r\n    'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any',\r\n    'include', 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex',\r\n    'toArray', 'size', 'first', 'initial', 'rest', 'last', 'without', 'indexOf',\r\n    'shuffle', 'lastIndexOf', 'isEmpty', 'groupBy'];\r\n\r\n  // Mix in each Underscore method as a proxy to `Collection#models`.\r\n  _.each(methods, function(method) {\r\n    Collection.prototype[method] = function() {\r\n      return _[method].apply(_, [this.models].concat(_.toArray(arguments)));\r\n    };\r\n  });\r\n\r\n  // Backbone.Router\r\n  // -------------------\r\n\r\n  // Routers map faux-URLs to actions, and fire events when routes are\r\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\r\n  var Router = Backbone.Router = function(options) {\r\n    options || (options = {});\r\n    if (options.routes) this.routes = options.routes;\r\n    this._bindRoutes();\r\n    this.initialize.apply(this, arguments);\r\n  };\r\n\r\n  // Cached regular expressions for matching named param parts and splatted\r\n  // parts of route strings.\r\n  var namedParam    = /:\\w+/g;\r\n  var splatParam    = /\\*\\w+/g;\r\n  var escapeRegExp  = /[-[\\]{}()+?.,\\\\^$|#\\s]/g;\r\n\r\n  // Set up all inheritable **Backbone.Router** properties and methods.\r\n  _.extend(Router.prototype, Events, {\r\n\r\n    // Initialize is an empty function by default. Override it with your own\r\n    // initialization logic.\r\n    initialize: function(){},\r\n\r\n    // Manually bind a single named route to a callback. For example:\r\n    //\r\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\r\n    //       ...\r\n    //     });\r\n    //\r\n    route: function(route, name, callback) {\r\n      Backbone.history || (Backbone.history = new History);\r\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\r\n      if (!callback) callback = this[name];\r\n      Backbone.history.route(route, _.bind(function(fragment) {\r\n        var args = this._extractParameters(route, fragment);\r\n        callback && callback.apply(this, args);\r\n        this.trigger.apply(this, ['route:' + name].concat(args));\r\n        Backbone.history.trigger('route', this, name, args);\r\n      }, this));\r\n      return this;\r\n    },\r\n\r\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\r\n    navigate: function(fragment, options) {\r\n      Backbone.history.navigate(fragment, options);\r\n    },\r\n\r\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\r\n    // order of the routes here to support behavior where the most general\r\n    // routes can be defined at the bottom of the route map.\r\n    _bindRoutes: function() {\r\n      if (!this.routes) return;\r\n      var routes = [];\r\n      for (var route in this.routes) {\r\n        routes.unshift([route, this.routes[route]]);\r\n      }\r\n      for (var i = 0, l = routes.length; i < l; i++) {\r\n        this.route(routes[i][0], routes[i][1], this[routes[i][1]]);\r\n      }\r\n    },\r\n\r\n    // Convert a route string into a regular expression, suitable for matching\r\n    // against the current location hash.\r\n    _routeToRegExp: function(route) {\r\n      route = route.replace(escapeRegExp, '\\\\$&')\r\n                   .replace(namedParam, '([^\\/]+)')\r\n                   .replace(splatParam, '(.*?)');\r\n      return new RegExp('^' + route + '$');\r\n    },\r\n\r\n    // Given a route, and a URL fragment that it matches, return the array of\r\n    // extracted parameters.\r\n    _extractParameters: function(route, fragment) {\r\n      return route.exec(fragment).slice(1);\r\n    }\r\n\r\n  });\r\n\r\n  // Backbone.History\r\n  // ----------------\r\n\r\n  // Handles cross-browser history management, based on URL fragments. If the\r\n  // browser does not support `onhashchange`, falls back to polling.\r\n  var History = Backbone.History = function() {\r\n    this.handlers = [];\r\n    _.bindAll(this, 'checkUrl');\r\n  };\r\n\r\n  // Cached regex for cleaning leading hashes and slashes .\r\n  var routeStripper = /^[#\\/]/;\r\n\r\n  // Cached regex for detecting MSIE.\r\n  var isExplorer = /msie [\\w.]+/;\r\n\r\n  // Has the history handling already been started?\r\n  History.started = false;\r\n\r\n  // Set up all inheritable **Backbone.History** properties and methods.\r\n  _.extend(History.prototype, Events, {\r\n\r\n    // The default interval to poll for hash changes, if necessary, is\r\n    // twenty times a second.\r\n    interval: 50,\r\n\r\n    // Gets the true hash value. Cannot use location.hash directly due to bug\r\n    // in Firefox where location.hash will always be decoded.\r\n    getHash: function(windowOverride) {\r\n      var loc = windowOverride ? windowOverride.location : window.location;\r\n      var match = loc.href.match(/#(.*)$/);\r\n      return match ? match[1] : '';\r\n    },\r\n\r\n    // Get the cross-browser normalized URL fragment, either from the URL,\r\n    // the hash, or the override.\r\n    getFragment: function(fragment, forcePushState) {\r\n      if (fragment == null) {\r\n        if (this._hasPushState || forcePushState) {\r\n          fragment = window.location.pathname;\r\n          var search = window.location.search;\r\n          if (search) fragment += search;\r\n        } else {\r\n          fragment = this.getHash();\r\n        }\r\n      }\r\n      if (!fragment.indexOf(this.options.root)) fragment = fragment.substr(this.options.root.length);\r\n      return fragment.replace(routeStripper, '');\r\n    },\r\n\r\n    // Start the hash change handling, returning `true` if the current URL matches\r\n    // an existing route, and `false` otherwise.\r\n    start: function(options) {\r\n      if (History.started) throw new Error(\"Backbone.history has already been started\");\r\n      History.started = true;\r\n\r\n      // Figure out the initial configuration. Do we need an iframe?\r\n      // Is pushState desired ... is it available?\r\n      this.options          = _.extend({}, {root: '/'}, this.options, options);\r\n      this._wantsHashChange = this.options.hashChange !== false;\r\n      this._wantsPushState  = !!this.options.pushState;\r\n      this._hasPushState    = !!(this.options.pushState && window.history && window.history.pushState);\r\n      var fragment          = this.getFragment();\r\n      var docMode           = document.documentMode;\r\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\r\n\r\n      if (oldIE) {\r\n        this.iframe = $('<iframe src=\"javascript:0\" tabindex=\"-1\" />').hide().appendTo('body')[0].contentWindow;\r\n        this.navigate(fragment);\r\n      }\r\n\r\n      // Depending on whether we're using pushState or hashes, and whether\r\n      // 'onhashchange' is supported, determine how we check the URL state.\r\n      if (this._hasPushState) {\r\n        $(window).bind('popstate', this.checkUrl);\r\n      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {\r\n        $(window).bind('hashchange', this.checkUrl);\r\n      } else if (this._wantsHashChange) {\r\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\r\n      }\r\n\r\n      // Determine if we need to change the base url, for a pushState link\r\n      // opened by a non-pushState browser.\r\n      this.fragment = fragment;\r\n      var loc = window.location;\r\n      var atRoot  = loc.pathname == this.options.root;\r\n\r\n      // If we've started off with a route from a `pushState`-enabled browser,\r\n      // but we're currently in a browser that doesn't support it...\r\n      if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) {\r\n        this.fragment = this.getFragment(null, true);\r\n        window.location.replace(this.options.root + '#' + this.fragment);\r\n        // Return immediately as browser will do redirect to new url\r\n        return true;\r\n\r\n      // Or if we've started out with a hash-based route, but we're currently\r\n      // in a browser where it could be `pushState`-based instead...\r\n      } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {\r\n        this.fragment = this.getHash().replace(routeStripper, '');\r\n        window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment);\r\n      }\r\n\r\n      if (!this.options.silent) {\r\n        return this.loadUrl();\r\n      }\r\n    },\r\n\r\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\r\n    // but possibly useful for unit testing Routers.\r\n    stop: function() {\r\n      $(window).unbind('popstate', this.checkUrl).unbind('hashchange', this.checkUrl);\r\n      clearInterval(this._checkUrlInterval);\r\n      History.started = false;\r\n    },\r\n\r\n    // Add a route to be tested when the fragment changes. Routes added later\r\n    // may override previous routes.\r\n    route: function(route, callback) {\r\n      this.handlers.unshift({route: route, callback: callback});\r\n    },\r\n\r\n    // Checks the current URL to see if it has changed, and if it has,\r\n    // calls `loadUrl`, normalizing across the hidden iframe.\r\n    checkUrl: function(e) {\r\n      var current = this.getFragment();\r\n      if (current == this.fragment && this.iframe) current = this.getFragment(this.getHash(this.iframe));\r\n      if (current == this.fragment) return false;\r\n      if (this.iframe) this.navigate(current);\r\n      this.loadUrl() || this.loadUrl(this.getHash());\r\n    },\r\n\r\n    // Attempt to load the current URL fragment. If a route succeeds with a\r\n    // match, returns `true`. If no defined routes matches the fragment,\r\n    // returns `false`.\r\n    loadUrl: function(fragmentOverride) {\r\n      var fragment = this.fragment = this.getFragment(fragmentOverride);\r\n      var matched = _.any(this.handlers, function(handler) {\r\n        if (handler.route.test(fragment)) {\r\n          handler.callback(fragment);\r\n          return true;\r\n        }\r\n      });\r\n      return matched;\r\n    },\r\n\r\n    // Save a fragment into the hash history, or replace the URL state if the\r\n    // 'replace' option is passed. You are responsible for properly URL-encoding\r\n    // the fragment in advance.\r\n    //\r\n    // The options object can contain `trigger: true` if you wish to have the\r\n    // route callback be fired (not usually desirable), or `replace: true`, if\r\n    // you wish to modify the current URL without adding an entry to the history.\r\n    navigate: function(fragment, options) {\r\n      if (!History.started) return false;\r\n      if (!options || options === true) options = {trigger: options};\r\n      var frag = (fragment || '').replace(routeStripper, '');\r\n      if (this.fragment == frag) return;\r\n\r\n      // If pushState is available, we use it to set the fragment as a real URL.\r\n      if (this._hasPushState) {\r\n        if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag;\r\n        this.fragment = frag;\r\n        window.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, frag);\r\n\r\n      // If hash changes haven't been explicitly disabled, update the hash\r\n      // fragment to store history.\r\n      } else if (this._wantsHashChange) {\r\n        this.fragment = frag;\r\n        this._updateHash(window.location, frag, options.replace);\r\n        if (this.iframe && (frag != this.getFragment(this.getHash(this.iframe)))) {\r\n          // Opening and closing the iframe tricks IE7 and earlier to push a history entry on hash-tag change.\r\n          // When replace is true, we don't want this.\r\n          if(!options.replace) this.iframe.document.open().close();\r\n          this._updateHash(this.iframe.location, frag, options.replace);\r\n        }\r\n\r\n      // If you've told us that you explicitly don't want fallback hashchange-\r\n      // based history, then `navigate` becomes a page refresh.\r\n      } else {\r\n        window.location.assign(this.options.root + fragment);\r\n      }\r\n      if (options.trigger) this.loadUrl(fragment);\r\n    },\r\n\r\n    // Update the hash location, either replacing the current entry, or adding\r\n    // a new one to the browser history.\r\n    _updateHash: function(location, fragment, replace) {\r\n      if (replace) {\r\n        location.replace(location.toString().replace(/(javascript:|#).*$/, '') + '#' + fragment);\r\n      } else {\r\n        location.hash = fragment;\r\n      }\r\n    }\r\n  });\r\n\r\n  // Backbone.View\r\n  // -------------\r\n\r\n  // Creating a Backbone.View creates its initial element outside of the DOM,\r\n  // if an existing element is not provided...\r\n  var View = Backbone.View = function(options) {\r\n    this.cid = _.uniqueId('view');\r\n    this._configure(options || {});\r\n    this._ensureElement();\r\n    this.initialize.apply(this, arguments);\r\n    this.delegateEvents();\r\n  };\r\n\r\n  // Cached regex to split keys for `delegate`.\r\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\r\n\r\n  // List of view options to be merged as properties.\r\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName'];\r\n\r\n  // Set up all inheritable **Backbone.View** properties and methods.\r\n  _.extend(View.prototype, Events, {\r\n\r\n    // The default `tagName` of a View's element is `\"div\"`.\r\n    tagName: 'div',\r\n\r\n    // jQuery delegate for element lookup, scoped to DOM elements within the\r\n    // current view. This should be prefered to global lookups where possible.\r\n    $: function(selector) {\r\n      return this.$el.find(selector);\r\n    },\r\n\r\n    // Initialize is an empty function by default. Override it with your own\r\n    // initialization logic.\r\n    initialize: function(){},\r\n\r\n    // **render** is the core function that your view should override, in order\r\n    // to populate its element (`this.el`), with the appropriate HTML. The\r\n    // convention is for **render** to always return `this`.\r\n    render: function() {\r\n      return this;\r\n    },\r\n\r\n    // Remove this view from the DOM. Note that the view isn't present in the\r\n    // DOM by default, so calling this method may be a no-op.\r\n    remove: function() {\r\n      this.$el.remove();\r\n      return this;\r\n    },\r\n\r\n    // For small amounts of DOM Elements, where a full-blown template isn't\r\n    // needed, use **make** to manufacture elements, one at a time.\r\n    //\r\n    //     var el = this.make('li', {'class': 'row'}, this.model.escape('title'));\r\n    //\r\n    make: function(tagName, attributes, content) {\r\n      var el = document.createElement(tagName);\r\n      if (attributes) $(el).attr(attributes);\r\n      if (content) $(el).html(content);\r\n      return el;\r\n    },\r\n\r\n    // Change the view's element (`this.el` property), including event\r\n    // re-delegation.\r\n    setElement: function(element, delegate) {\r\n      if (this.$el) this.undelegateEvents();\r\n      this.$el = (element instanceof $) ? element : $(element);\r\n      this.el = this.$el[0];\r\n      if (delegate !== false) this.delegateEvents();\r\n      return this;\r\n    },\r\n\r\n    // Set callbacks, where `this.events` is a hash of\r\n    //\r\n    // *{\"event selector\": \"callback\"}*\r\n    //\r\n    //     {\r\n    //       'mousedown .title':  'edit',\r\n    //       'click .button':     'save'\r\n    //       'click .open':       function(e) { ... }\r\n    //     }\r\n    //\r\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\r\n    // Uses event delegation for efficiency.\r\n    // Omitting the selector binds the event to `this.el`.\r\n    // This only works for delegate-able events: not `focus`, `blur`, and\r\n    // not `change`, `submit`, and `reset` in Internet Explorer.\r\n    delegateEvents: function(events) {\r\n      if (!(events || (events = getValue(this, 'events')))) return;\r\n      this.undelegateEvents();\r\n      for (var key in events) {\r\n        var method = events[key];\r\n        if (!_.isFunction(method)) method = this[events[key]];\r\n        if (!method) throw new Error('Method \"' + events[key] + '\" does not exist');\r\n        var match = key.match(delegateEventSplitter);\r\n        var eventName = match[1], selector = match[2];\r\n        method = _.bind(method, this);\r\n        eventName += '.delegateEvents' + this.cid;\r\n        if (selector === '') {\r\n          this.$el.bind(eventName, method);\r\n        } else {\r\n          this.$el.delegate(selector, eventName, method);\r\n        }\r\n      }\r\n    },\r\n\r\n    // Clears all callbacks previously bound to the view with `delegateEvents`.\r\n    // You usually don't need to use this, but may wish to if you have multiple\r\n    // Backbone views attached to the same DOM element.\r\n    undelegateEvents: function() {\r\n      this.$el.unbind('.delegateEvents' + this.cid);\r\n    },\r\n\r\n    // Performs the initial configuration of a View with a set of options.\r\n    // Keys with special meaning *(model, collection, id, className)*, are\r\n    // attached directly to the view.\r\n    _configure: function(options) {\r\n      if (this.options) options = _.extend({}, this.options, options);\r\n      for (var i = 0, l = viewOptions.length; i < l; i++) {\r\n        var attr = viewOptions[i];\r\n        if (options[attr]) this[attr] = options[attr];\r\n      }\r\n      this.options = options;\r\n    },\r\n\r\n    // Ensure that the View has a DOM element to render into.\r\n    // If `this.el` is a string, pass it through `$()`, take the first\r\n    // matching element, and re-assign it to `el`. Otherwise, create\r\n    // an element from the `id`, `className` and `tagName` properties.\r\n    _ensureElement: function() {\r\n      if (!this.el) {\r\n        var attrs = getValue(this, 'attributes') || {};\r\n        if (this.id) attrs.id = this.id;\r\n        if (this.className) attrs['class'] = this.className;\r\n        this.setElement(this.make(this.tagName, attrs), false);\r\n      } else {\r\n        this.setElement(this.el, false);\r\n      }\r\n    }\r\n\r\n  });\r\n\r\n  // The self-propagating extend function that Backbone classes use.\r\n  var extend = function (protoProps, classProps) {\r\n    var child = inherits(this, protoProps, classProps);\r\n    child.extend = this.extend;\r\n    return child;\r\n  };\r\n\r\n  // Set up inheritance for the model, collection, and view.\r\n  Model.extend = Collection.extend = Router.extend = View.extend = extend;\r\n\r\n  // Backbone.sync\r\n  // -------------\r\n\r\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\r\n  var methodMap = {\r\n    'create': 'POST',\r\n    'update': 'PUT',\r\n    'delete': 'DELETE',\r\n    'read':   'GET'\r\n  };\r\n\r\n  // Override this function to change the manner in which Backbone persists\r\n  // models to the server. You will be passed the type of request, and the\r\n  // model in question. By default, makes a RESTful Ajax request\r\n  // to the model's `url()`. Some possible customizations could be:\r\n  //\r\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\r\n  // * Send up the models as XML instead of JSON.\r\n  // * Persist models via WebSockets instead of Ajax.\r\n  //\r\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\r\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\r\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\r\n  // instead of `application/json` with the model in a param named `model`.\r\n  // Useful when interfacing with server-side languages like **PHP** that make\r\n  // it difficult to read the body of `PUT` requests.\r\n  Backbone.sync = function(method, model, options) {\r\n    var type = methodMap[method];\r\n\r\n    // Default options, unless specified.\r\n    options || (options = {});\r\n\r\n    // Default JSON-request options.\r\n    var params = {type: type, dataType: 'json'};\r\n\r\n    // Ensure that we have a URL.\r\n    if (!options.url) {\r\n      params.url = getValue(model, 'url') || urlError();\r\n    }\r\n\r\n    // Ensure that we have the appropriate request data.\r\n    if (!options.data && model && (method == 'create' || method == 'update')) {\r\n      params.contentType = 'application/json';\r\n      params.data = JSON.stringify(model.toJSON());\r\n    }\r\n\r\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\r\n    if (Backbone.emulateJSON) {\r\n      params.contentType = 'application/x-www-form-urlencoded';\r\n      params.data = params.data ? {model: params.data} : {};\r\n    }\r\n\r\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\r\n    // And an `X-HTTP-Method-Override` header.\r\n    if (Backbone.emulateHTTP) {\r\n      if (type === 'PUT' || type === 'DELETE') {\r\n        if (Backbone.emulateJSON) params.data._method = type;\r\n        params.type = 'POST';\r\n        params.beforeSend = function(xhr) {\r\n          xhr.setRequestHeader('X-HTTP-Method-Override', type);\r\n        };\r\n      }\r\n    }\r\n\r\n    // Don't process data on a non-GET request.\r\n    if (params.type !== 'GET' && !Backbone.emulateJSON) {\r\n      params.processData = false;\r\n    }\r\n\r\n    // Make the request, allowing the user to override any Ajax options.\r\n    return $.ajax(_.extend(params, options));\r\n  };\r\n\r\n  // Wrap an optional error callback with a fallback error event.\r\n  Backbone.wrapError = function(onError, originalModel, options) {\r\n    return function(model, resp) {\r\n      resp = model === originalModel ? resp : model;\r\n      if (onError) {\r\n        onError(originalModel, resp, options);\r\n      } else {\r\n        originalModel.trigger('error', originalModel, resp, options);\r\n      }\r\n    };\r\n  };\r\n\r\n  // Helpers\r\n  // -------\r\n\r\n  // Shared empty constructor function to aid in prototype-chain creation.\r\n  var ctor = function(){};\r\n\r\n  // Helper function to correctly set up the prototype chain, for subclasses.\r\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\r\n  // class properties to be extended.\r\n  var inherits = function(parent, protoProps, staticProps) {\r\n    var child;\r\n\r\n    // The constructor function for the new subclass is either defined by you\r\n    // (the \"constructor\" property in your `extend` definition), or defaulted\r\n    // by us to simply call the parent's constructor.\r\n    if (protoProps && protoProps.hasOwnProperty('constructor')) {\r\n      child = protoProps.constructor;\r\n    } else {\r\n      child = function(){ parent.apply(this, arguments); };\r\n    }\r\n\r\n    // Inherit class (static) properties from parent.\r\n    _.extend(child, parent);\r\n\r\n    // Set the prototype chain to inherit from `parent`, without calling\r\n    // `parent`'s constructor function.\r\n    ctor.prototype = parent.prototype;\r\n    child.prototype = new ctor();\r\n\r\n    // Add prototype properties (instance properties) to the subclass,\r\n    // if supplied.\r\n    if (protoProps) _.extend(child.prototype, protoProps);\r\n\r\n    // Add static properties to the constructor function, if supplied.\r\n    if (staticProps) _.extend(child, staticProps);\r\n\r\n    // Correctly set child's `prototype.constructor`.\r\n    child.prototype.constructor = child;\r\n\r\n    // Set a convenience property in case the parent's prototype is needed later.\r\n    child.__super__ = parent.prototype;\r\n\r\n    return child;\r\n  };\r\n\r\n  // Helper function to get a value from a Backbone object as a property\r\n  // or as a function.\r\n  var getValue = function(object, prop) {\r\n    if (!(object && object[prop])) return null;\r\n    return _.isFunction(object[prop]) ? object[prop]() : object[prop];\r\n  };\r\n\r\n  // Throw an error when a URL is needed, and none is supplied.\r\n  var urlError = function() {\r\n    throw new Error('A \"url\" property or function must be specified');\r\n  };\r\n\r\n}).call(this);"
  },
  {
    "path": "servers/www/assets/js/vendor/beautify.js",
    "content": "/*\r\n\r\n Style HTML\r\n---------------\r\n\r\n  Written by Nochum Sossonko, (nsossonko@hotmail.com)\r\n\r\n  Based on code initially developed by: Einar Lielmanis, <elfz@laacz.lv>\r\n    http://jsbeautifier.org/\r\n\r\n\r\n  You are free to use this in any way you want, in case you find this useful or working for you.\r\n\r\n  Usage:\r\n    style_html(html_source);\r\n\r\n    style_html(html_source, options);\r\n\r\n  The options are:\r\n    indent_size (default 4)          — indentation size,\r\n    indent_char (default space)      — character to indent with,\r\n    max_char (default 70)            -  maximum amount of characters per line,\r\n    brace_style (default \"collapse\") - \"collapse\" | \"expand\" | \"end-expand\"\r\n            put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line.\r\n    unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted\r\n    indent_scripts (default normal)  - \"keep\"|\"separate\"|\"normal\"\r\n\r\n    e.g.\r\n\r\n    style_html(html_source, {\r\n      'indent_size': 2,\r\n      'indent_char': ' ',\r\n      'max_char': 78,\r\n      'brace_style': 'expand',\r\n      'unformatted': ['a', 'sub', 'sup', 'b', 'i', 'u']\r\n    });\r\n*/\r\n\r\nfunction style_html(html_source, options) {\r\n//Wrapper function to invoke all the necessary constructors and deal with the output.\r\n\r\n  var multi_parser,\r\n      indent_size,\r\n      indent_character,\r\n      max_char,\r\n      brace_style;\r\n\r\n  options = options || {};\r\n  indent_size = options.indent_size || 4;\r\n  indent_character = options.indent_char || ' ';\r\n  brace_style = options.brace_style || 'collapse';\r\n  max_char = options.max_char == 0 ? Infinity : options.max_char || 70;\r\n  unformatted = options.unformatted || ['a', 'span', 'bdo', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'sub', 'sup', 'tt', 'i', 'b', 'big', 'small', 'u', 's', 'strike', 'font', 'ins', 'del', 'pre', 'address', 'dt', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\r\n\r\n  function Parser() {\r\n\r\n    this.pos = 0; //Parser position\r\n    this.token = '';\r\n    this.current_mode = 'CONTENT'; //reflects the current Parser mode: TAG/CONTENT\r\n    this.tags = { //An object to hold tags, their position, and their parent-tags, initiated with default values\r\n      parent: 'parent1',\r\n      parentcount: 1,\r\n      parent1: ''\r\n    };\r\n    this.tag_type = '';\r\n    this.token_text = this.last_token = this.last_text = this.token_type = '';\r\n\r\n    this.Utils = { //Uilities made available to the various functions\r\n      whitespace: \"\\n\\r\\t \".split(''),\r\n      single_token: 'br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed'.split(','), //all the single tags for HTML\r\n      extra_liners: 'head,body,/html'.split(','), //for tags that need a line of whitespace before them\r\n      in_array: function (what, arr) {\r\n        for (var i=0; i<arr.length; i++) {\r\n          if (what === arr[i]) {\r\n            return true;\r\n          }\r\n        }\r\n        return false;\r\n      }\r\n    }\r\n\r\n    this.get_content = function () { //function to capture regular content between tags\r\n\r\n      var input_char = '',\r\n          content = [],\r\n          space = false; //if a space is needed\r\n\r\n      while (this.input.charAt(this.pos) !== '<') {\r\n        if (this.pos >= this.input.length) {\r\n          return content.length?content.join(''):['', 'TK_EOF'];\r\n        }\r\n\r\n        input_char = this.input.charAt(this.pos);\r\n        this.pos++;\r\n        this.line_char_count++;\r\n\r\n        if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\r\n          if (content.length) {\r\n            space = true;\r\n          }\r\n          this.line_char_count--;\r\n          continue; //don't want to insert unnecessary space\r\n        }\r\n        else if (space) {\r\n          if (this.line_char_count >= this.max_char) { //insert a line when the max_char is reached\r\n            content.push('\\n');\r\n            for (var i=0; i<this.indent_level; i++) {\r\n              content.push(this.indent_string);\r\n            }\r\n            this.line_char_count = 0;\r\n          }\r\n          else{\r\n            content.push(' ');\r\n            this.line_char_count++;\r\n          }\r\n          space = false;\r\n        }\r\n        content.push(input_char); //letter at-a-time (or string) inserted to an array\r\n      }\r\n      return content.length?content.join(''):'';\r\n    }\r\n\r\n    this.get_contents_to = function (name) { //get the full content of a script or style to pass to js_beautify\r\n      if (this.pos == this.input.length) {\r\n        return ['', 'TK_EOF'];\r\n      }\r\n      var input_char = '';\r\n      var content = '';\r\n      var reg_match = new RegExp('\\<\\/' + name + '\\\\s*\\>', 'igm');\r\n      reg_match.lastIndex = this.pos;\r\n      var reg_array = reg_match.exec(this.input);\r\n      var end_script = reg_array?reg_array.index:this.input.length; //absolute end of script\r\n      if(this.pos < end_script) { //get everything in between the script tags\r\n        content = this.input.substring(this.pos, end_script);\r\n        this.pos = end_script;\r\n      }\r\n      return content;\r\n    }\r\n\r\n    this.record_tag = function (tag){ //function to record a tag and its parent in this.tags Object\r\n      if (this.tags[tag + 'count']) { //check for the existence of this tag type\r\n        this.tags[tag + 'count']++;\r\n        this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\r\n      }\r\n      else { //otherwise initialize this tag type\r\n        this.tags[tag + 'count'] = 1;\r\n        this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\r\n      }\r\n      this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent; //set the parent (i.e. in the case of a div this.tags.div1parent)\r\n      this.tags.parent = tag + this.tags[tag + 'count']; //and make this the current parent (i.e. in the case of a div 'div1')\r\n    }\r\n\r\n    this.retrieve_tag = function (tag) { //function to retrieve the opening tag to the corresponding closer\r\n      if (this.tags[tag + 'count']) { //if the openener is not in the Object we ignore it\r\n        var temp_parent = this.tags.parent; //check to see if it's a closable tag.\r\n        while (temp_parent) { //till we reach '' (the initial value);\r\n          if (tag + this.tags[tag + 'count'] === temp_parent) { //if this is it use it\r\n            break;\r\n          }\r\n          temp_parent = this.tags[temp_parent + 'parent']; //otherwise keep on climbing up the DOM Tree\r\n        }\r\n        if (temp_parent) { //if we caught something\r\n          this.indent_level = this.tags[tag + this.tags[tag + 'count']]; //set the indent_level accordingly\r\n          this.tags.parent = this.tags[temp_parent + 'parent']; //and set the current parent\r\n        }\r\n        delete this.tags[tag + this.tags[tag + 'count'] + 'parent']; //delete the closed tags parent reference...\r\n        delete this.tags[tag + this.tags[tag + 'count']]; //...and the tag itself\r\n        if (this.tags[tag + 'count'] == 1) {\r\n          delete this.tags[tag + 'count'];\r\n        }\r\n        else {\r\n          this.tags[tag + 'count']--;\r\n        }\r\n      }\r\n    }\r\n\r\n    this.get_tag = function () { //function to get a full tag and parse its type\r\n      var input_char = '',\r\n          content = [],\r\n          space = false,\r\n          tag_start, tag_end;\r\n\r\n      do {\r\n        if (this.pos >= this.input.length) {\r\n          return content.length?content.join(''):['', 'TK_EOF'];\r\n        }\r\n\r\n        input_char = this.input.charAt(this.pos);\r\n        this.pos++;\r\n        this.line_char_count++;\r\n\r\n        if (this.Utils.in_array(input_char, this.Utils.whitespace)) { //don't want to insert unnecessary space\r\n          space = true;\r\n          this.line_char_count--;\r\n          continue;\r\n        }\r\n\r\n        if (input_char === \"'\" || input_char === '\"') {\r\n          if (!content[1] || content[1] !== '!') { //if we're in a comment strings don't get treated specially\r\n            input_char += this.get_unformatted(input_char);\r\n            space = true;\r\n          }\r\n        }\r\n\r\n        if (input_char === '=') { //no space before =\r\n          space = false;\r\n        }\r\n\r\n        if (content.length && content[content.length-1] !== '=' && input_char !== '>'\r\n            && space) { //no space after = or before >\r\n          if (this.line_char_count >= this.max_char) {\r\n            this.print_newline(false, content);\r\n            this.line_char_count = 0;\r\n          }\r\n          else {\r\n            content.push(' ');\r\n            this.line_char_count++;\r\n          }\r\n          space = false;\r\n        }\r\n        if (input_char === '<') {\r\n            tag_start = this.pos - 1;\r\n        }\r\n        content.push(input_char); //inserts character at-a-time (or string)\r\n      } while (input_char !== '>');\r\n\r\n      var tag_complete = content.join('');\r\n      var tag_index;\r\n      if (tag_complete.indexOf(' ') != -1) { //if there's whitespace, thats where the tag name ends\r\n        tag_index = tag_complete.indexOf(' ');\r\n      }\r\n      else { //otherwise go with the tag ending\r\n        tag_index = tag_complete.indexOf('>');\r\n      }\r\n      var tag_check = tag_complete.substring(1, tag_index).toLowerCase();\r\n      if (tag_complete.charAt(tag_complete.length-2) === '/' ||\r\n          this.Utils.in_array(tag_check, this.Utils.single_token)) { //if this tag name is a single tag type (either in the list or has a closing /)\r\n        this.tag_type = 'SINGLE';\r\n      }\r\n      else if (tag_check === 'script') { //for later script handling\r\n        this.record_tag(tag_check);\r\n        this.tag_type = 'SCRIPT';\r\n      }\r\n      else if (tag_check === 'style') { //for future style handling (for now it justs uses get_content)\r\n        this.record_tag(tag_check);\r\n        this.tag_type = 'STYLE';\r\n      }\r\n      else if (this.Utils.in_array(tag_check, unformatted)) { // do not reformat the \"unformatted\" tags\r\n        var comment = this.get_unformatted('</'+tag_check+'>', tag_complete); //...delegate to get_unformatted function\r\n        content.push(comment);\r\n        // Preserve collapsed whitespace either before or after this tag.\r\n        if (tag_start > 0 && this.Utils.in_array(this.input.charAt(tag_start - 1), this.Utils.whitespace)){\r\n            content.splice(0, 0, this.input.charAt(tag_start - 1));\r\n        }\r\n        tag_end = this.pos - 1;\r\n        if (this.Utils.in_array(this.input.charAt(tag_end + 1), this.Utils.whitespace)){\r\n            content.push(this.input.charAt(tag_end + 1));\r\n        }\r\n        this.tag_type = 'SINGLE';\r\n      }\r\n      else if (tag_check.charAt(0) === '!') { //peek for <!-- comment\r\n        if (tag_check.indexOf('[if') != -1) { //peek for <!--[if conditional comment\r\n          if (tag_complete.indexOf('!IE') != -1) { //this type needs a closing --> so...\r\n            var comment = this.get_unformatted('-->', tag_complete); //...delegate to get_unformatted\r\n            content.push(comment);\r\n          }\r\n          this.tag_type = 'START';\r\n        }\r\n        else if (tag_check.indexOf('[endif') != -1) {//peek for <!--[endif end conditional comment\r\n          this.tag_type = 'END';\r\n          this.unindent();\r\n        }\r\n        else if (tag_check.indexOf('[cdata[') != -1) { //if it's a <[cdata[ comment...\r\n          var comment = this.get_unformatted(']]>', tag_complete); //...delegate to get_unformatted function\r\n          content.push(comment);\r\n          this.tag_type = 'SINGLE'; //<![CDATA[ comments are treated like single tags\r\n        }\r\n        else {\r\n          var comment = this.get_unformatted('-->', tag_complete);\r\n          content.push(comment);\r\n          this.tag_type = 'SINGLE';\r\n        }\r\n      }\r\n      else {\r\n        if (tag_check.charAt(0) === '/') { //this tag is a double tag so check for tag-ending\r\n          this.retrieve_tag(tag_check.substring(1)); //remove it and all ancestors\r\n          this.tag_type = 'END';\r\n        }\r\n        else { //otherwise it's a start-tag\r\n          this.record_tag(tag_check); //push it on the tag stack\r\n          this.tag_type = 'START';\r\n        }\r\n        if (this.Utils.in_array(tag_check, this.Utils.extra_liners)) { //check if this double needs an extra line\r\n          this.print_newline(true, this.output);\r\n        }\r\n      }\r\n      return content.join(''); //returns fully formatted tag\r\n    }\r\n\r\n    this.get_unformatted = function (delimiter, orig_tag) { //function to return unformatted content in its entirety\r\n\r\n      if (orig_tag && orig_tag.indexOf(delimiter) != -1) {\r\n        return '';\r\n      }\r\n      var input_char = '';\r\n      var content = '';\r\n      var space = true;\r\n      do {\r\n\r\n        if (this.pos >= this.input.length) {\r\n          return content;\r\n        }\r\n\r\n        input_char = this.input.charAt(this.pos);\r\n        this.pos++\r\n\r\n        if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\r\n          if (!space) {\r\n            this.line_char_count--;\r\n            continue;\r\n          }\r\n          if (input_char === '\\n' || input_char === '\\r') {\r\n            content += '\\n';\r\n            /*  Don't change tab indention for unformatted blocks.  If using code for html editing, this will greatly affect <pre> tags if they are specified in the 'unformatted array'\r\n            for (var i=0; i<this.indent_level; i++) {\r\n              content += this.indent_string;\r\n            }\r\n            space = false; //...and make sure other indentation is erased\r\n            */\r\n            this.line_char_count = 0;\r\n            continue;\r\n          }\r\n        }\r\n        content += input_char;\r\n        this.line_char_count++;\r\n        space = true;\r\n\r\n\r\n      } while (content.indexOf(delimiter) == -1);\r\n      return content;\r\n    }\r\n\r\n    this.get_token = function () { //initial handler for token-retrieval\r\n      var token;\r\n\r\n      if (this.last_token === 'TK_TAG_SCRIPT' || this.last_token === 'TK_TAG_STYLE') { //check if we need to format javascript\r\n       var type = this.last_token.substr(7)\r\n       token = this.get_contents_to(type);\r\n        if (typeof token !== 'string') {\r\n          return token;\r\n        }\r\n        return [token, 'TK_' + type];\r\n      }\r\n      if (this.current_mode === 'CONTENT') {\r\n        token = this.get_content();\r\n        if (typeof token !== 'string') {\r\n          return token;\r\n        }\r\n        else {\r\n          return [token, 'TK_CONTENT'];\r\n        }\r\n      }\r\n\r\n      if (this.current_mode === 'TAG') {\r\n        token = this.get_tag();\r\n        if (typeof token !== 'string') {\r\n          return token;\r\n        }\r\n        else {\r\n          var tag_name_type = 'TK_TAG_' + this.tag_type;\r\n          return [token, tag_name_type];\r\n        }\r\n      }\r\n    }\r\n\r\n    this.get_full_indent = function (level) {\r\n      level = this.indent_level + level || 0;\r\n      if (level < 1)\r\n        return '';\r\n\r\n      return Array(level + 1).join(this.indent_string);\r\n    }\r\n\r\n\r\n    this.printer = function (js_source, indent_character, indent_size, max_char, brace_style) { //handles input/output and some other printing functions\r\n\r\n      this.input = js_source || ''; //gets the input for the Parser\r\n      this.output = [];\r\n      this.indent_character = indent_character;\r\n      this.indent_string = '';\r\n      this.indent_size = indent_size;\r\n      this.brace_style = brace_style;\r\n      this.indent_level = 0;\r\n      this.max_char = max_char;\r\n      this.line_char_count = 0; //count to see if max_char was exceeded\r\n\r\n      for (var i=0; i<this.indent_size; i++) {\r\n        this.indent_string += this.indent_character;\r\n      }\r\n\r\n      this.print_newline = function (ignore, arr) {\r\n        this.line_char_count = 0;\r\n        if (!arr || !arr.length) {\r\n          return;\r\n        }\r\n        if (!ignore) { //we might want the extra line\r\n          while (this.Utils.in_array(arr[arr.length-1], this.Utils.whitespace)) {\r\n            arr.pop();\r\n          }\r\n        }\r\n        arr.push('\\n');\r\n        for (var i=0; i<this.indent_level; i++) {\r\n          arr.push(this.indent_string);\r\n        }\r\n      }\r\n\r\n      this.print_token = function (text) {\r\n        this.output.push(text);\r\n      }\r\n\r\n      this.indent = function () {\r\n        this.indent_level++;\r\n      }\r\n\r\n      this.unindent = function () {\r\n        if (this.indent_level > 0) {\r\n          this.indent_level--;\r\n        }\r\n      }\r\n    }\r\n    return this;\r\n  }\r\n\r\n  /*_____________________--------------------_____________________*/\r\n\r\n  multi_parser = new Parser(); //wrapping functions Parser\r\n  multi_parser.printer(html_source, indent_character, indent_size, max_char, brace_style); //initialize starting values\r\n\r\n  while (true) {\r\n      var t = multi_parser.get_token();\r\n      multi_parser.token_text = t[0];\r\n      multi_parser.token_type = t[1];\r\n\r\n    if (multi_parser.token_type === 'TK_EOF') {\r\n      break;\r\n    }\r\n\r\n    switch (multi_parser.token_type) {\r\n      case 'TK_TAG_START':\r\n        multi_parser.print_newline(false, multi_parser.output);\r\n        multi_parser.print_token(multi_parser.token_text);\r\n        multi_parser.indent();\r\n        multi_parser.current_mode = 'CONTENT';\r\n        break;\r\n      case 'TK_TAG_STYLE':\r\n      case 'TK_TAG_SCRIPT':\r\n        multi_parser.print_newline(false, multi_parser.output);\r\n        multi_parser.print_token(multi_parser.token_text);\r\n        multi_parser.current_mode = 'CONTENT';\r\n        break;\r\n      case 'TK_TAG_END':\r\n        //Print new line only if the tag has no content and has child\r\n        if (multi_parser.last_token === 'TK_CONTENT' && multi_parser.last_text === '') {\r\n            var tag_name = multi_parser.token_text.match(/\\w+/)[0];\r\n            var tag_extracted_from_last_output = multi_parser.output[multi_parser.output.length -1].match(/<\\s*(\\w+)/);\r\n            if (tag_extracted_from_last_output === null || tag_extracted_from_last_output[1] !== tag_name)\r\n                multi_parser.print_newline(true, multi_parser.output);\r\n        }\r\n        multi_parser.print_token(multi_parser.token_text);\r\n        multi_parser.current_mode = 'CONTENT';\r\n        break;\r\n      case 'TK_TAG_SINGLE':\r\n        // Don't add a newline before elements that should remain unformatted.\r\n        var tag_check = multi_parser.token_text.match(/^\\s*<([a-z]+)/i);\r\n        if (!tag_check || !multi_parser.Utils.in_array(tag_check[1], unformatted)){\r\n            multi_parser.print_newline(false, multi_parser.output);\r\n        }\r\n        multi_parser.print_token(multi_parser.token_text);\r\n        multi_parser.current_mode = 'CONTENT';\r\n        break;\r\n      case 'TK_CONTENT':\r\n        if (multi_parser.token_text !== '') {\r\n          multi_parser.print_token(multi_parser.token_text);\r\n        }\r\n        multi_parser.current_mode = 'TAG';\r\n        break;\r\n      case 'TK_STYLE':\r\n      case 'TK_SCRIPT':\r\n        if (multi_parser.token_text !== '') {\r\n          multi_parser.output.push('\\n');\r\n          var text = multi_parser.token_text;\r\n          if (multi_parser.token_type == 'TK_SCRIPT') {\r\n            var _beautifier = typeof js_beautify == 'function' && js_beautify;\r\n          } else if (multi_parser.token_type == 'TK_STYLE') {\r\n            var _beautifier = typeof css_beautify == 'function' && css_beautify;\r\n          }\r\n\r\n          if (options.indent_scripts == \"keep\") {\r\n            var script_indent_level = 0;\r\n          } else if (options.indent_scripts == \"separate\") {\r\n            var script_indent_level = -multi_parser.indent_level;\r\n          } else {\r\n            var script_indent_level = 1;\r\n          }\r\n\r\n          var indentation = multi_parser.get_full_indent(script_indent_level);\r\n          if (_beautifier) {\r\n            // call the Beautifier if avaliable\r\n            text = _beautifier(text.replace(/^\\s*/, indentation), options);\r\n          } else {\r\n            // simply indent the string otherwise\r\n            var white = text.match(/^\\s*/)[0];\r\n            var _level = white.match(/[^\\n\\r]*$/)[0].split(multi_parser.indent_string).length - 1;\r\n            var reindent = multi_parser.get_full_indent(script_indent_level -_level);\r\n            text = text.replace(/^\\s*/, indentation)\r\n                   .replace(/\\r\\n|\\r|\\n/g, '\\n' + reindent)\r\n                   .replace(/\\s*$/, '');\r\n          }\r\n          if (text) {\r\n            multi_parser.print_token(text);\r\n            multi_parser.print_newline(true, multi_parser.output);\r\n          }\r\n        }\r\n        multi_parser.current_mode = 'TAG';\r\n        break;\r\n    }\r\n    multi_parser.last_token = multi_parser.token_type;\r\n    multi_parser.last_text = multi_parser.token_text;\r\n  }\r\n  return multi_parser.output.join('');\r\n}\r\n"
  },
  {
    "path": "servers/www/assets/js/vendor/handlebars.js",
    "content": "// lib/handlebars/base.js\r\nvar Handlebars = {};\r\n\r\nHandlebars.VERSION = \"1.0.beta.6\";\r\n\r\nHandlebars.helpers  = {};\r\nHandlebars.partials = {};\r\n\r\nHandlebars.registerHelper = function(name, fn, inverse) {\r\n  if(inverse) { fn.not = inverse; }\r\n  this.helpers[name] = fn;\r\n};\r\n\r\nHandlebars.registerPartial = function(name, str) {\r\n  this.partials[name] = str;\r\n};\r\n\r\nHandlebars.registerHelper('helperMissing', function(arg) {\r\n  if(arguments.length === 2) {\r\n    return undefined;\r\n  } else {\r\n    throw new Error(\"Could not find property '\" + arg + \"'\");\r\n  }\r\n});\r\n\r\nvar toString = Object.prototype.toString, functionType = \"[object Function]\";\r\n\r\nHandlebars.registerHelper('blockHelperMissing', function(context, options) {\r\n  var inverse = options.inverse || function() {}, fn = options.fn;\r\n\r\n\r\n  var ret = \"\";\r\n  var type = toString.call(context);\r\n\r\n  if(type === functionType) { context = context.call(this); }\r\n\r\n  if(context === true) {\r\n    return fn(this);\r\n  } else if(context === false || context == null) {\r\n    return inverse(this);\r\n  } else if(type === \"[object Array]\") {\r\n    if(context.length > 0) {\r\n      for(var i=0, j=context.length; i<j; i++) {\r\n        ret = ret + fn(context[i]);\r\n      }\r\n    } else {\r\n      ret = inverse(this);\r\n    }\r\n    return ret;\r\n  } else {\r\n    return fn(context);\r\n  }\r\n});\r\n\r\nHandlebars.registerHelper('each', function(context, options) {\r\n  var fn = options.fn, inverse = options.inverse;\r\n  var ret = \"\";\r\n\r\n  if(context && context.length > 0) {\r\n    for(var i=0, j=context.length; i<j; i++) {\r\n      ret = ret + fn(context[i]);\r\n    }\r\n  } else {\r\n    ret = inverse(this);\r\n  }\r\n  return ret;\r\n});\r\n\r\nHandlebars.registerHelper('if', function(context, options) {\r\n  var type = toString.call(context);\r\n  if(type === functionType) { context = context.call(this); }\r\n\r\n  if(!context || Handlebars.Utils.isEmpty(context)) {\r\n    return options.inverse(this);\r\n  } else {\r\n    return options.fn(this);\r\n  }\r\n});\r\n\r\nHandlebars.registerHelper('unless', function(context, options) {\r\n  var fn = options.fn, inverse = options.inverse;\r\n  options.fn = inverse;\r\n  options.inverse = fn;\r\n\r\n  return Handlebars.helpers['if'].call(this, context, options);\r\n});\r\n\r\nHandlebars.registerHelper('with', function(context, options) {\r\n  return options.fn(context);\r\n});\r\n\r\nHandlebars.registerHelper('log', function(context) {\r\n  Handlebars.log(context);\r\n});\r\n;\r\n// lib/handlebars/compiler/parser.js\r\n/* Jison generated parser */\r\nvar handlebars = (function(){\r\n\r\nvar parser = {trace: function trace() { },\r\nyy: {},\r\nsymbols_: {\"error\":2,\"root\":3,\"program\":4,\"EOF\":5,\"statements\":6,\"simpleInverse\":7,\"statement\":8,\"openInverse\":9,\"closeBlock\":10,\"openBlock\":11,\"mustache\":12,\"partial\":13,\"CONTENT\":14,\"COMMENT\":15,\"OPEN_BLOCK\":16,\"inMustache\":17,\"CLOSE\":18,\"OPEN_INVERSE\":19,\"OPEN_ENDBLOCK\":20,\"path\":21,\"OPEN\":22,\"OPEN_UNESCAPED\":23,\"OPEN_PARTIAL\":24,\"params\":25,\"hash\":26,\"param\":27,\"STRING\":28,\"INTEGER\":29,\"BOOLEAN\":30,\"hashSegments\":31,\"hashSegment\":32,\"ID\":33,\"EQUALS\":34,\"pathSegments\":35,\"SEP\":36,\"$accept\":0,\"$end\":1},\r\nterminals_: {2:\"error\",5:\"EOF\",14:\"CONTENT\",15:\"COMMENT\",16:\"OPEN_BLOCK\",18:\"CLOSE\",19:\"OPEN_INVERSE\",20:\"OPEN_ENDBLOCK\",22:\"OPEN\",23:\"OPEN_UNESCAPED\",24:\"OPEN_PARTIAL\",28:\"STRING\",29:\"INTEGER\",30:\"BOOLEAN\",33:\"ID\",34:\"EQUALS\",36:\"SEP\"},\r\nproductions_: [0,[3,2],[4,3],[4,1],[4,0],[6,1],[6,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[7,2],[17,3],[17,2],[17,2],[17,1],[25,2],[25,1],[27,1],[27,1],[27,1],[27,1],[26,1],[31,2],[31,1],[32,3],[32,3],[32,3],[32,3],[21,1],[35,3],[35,1]],\r\nperformAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {\r\n\r\nvar $0 = $$.length - 1;\r\nswitch (yystate) {\r\ncase 1: return $$[$0-1] \r\nbreak;\r\ncase 2: this.$ = new yy.ProgramNode($$[$0-2], $$[$0]) \r\nbreak;\r\ncase 3: this.$ = new yy.ProgramNode($$[$0]) \r\nbreak;\r\ncase 4: this.$ = new yy.ProgramNode([]) \r\nbreak;\r\ncase 5: this.$ = [$$[$0]] \r\nbreak;\r\ncase 6: $$[$0-1].push($$[$0]); this.$ = $$[$0-1] \r\nbreak;\r\ncase 7: this.$ = new yy.InverseNode($$[$0-2], $$[$0-1], $$[$0]) \r\nbreak;\r\ncase 8: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0]) \r\nbreak;\r\ncase 9: this.$ = $$[$0] \r\nbreak;\r\ncase 10: this.$ = $$[$0] \r\nbreak;\r\ncase 11: this.$ = new yy.ContentNode($$[$0]) \r\nbreak;\r\ncase 12: this.$ = new yy.CommentNode($$[$0]) \r\nbreak;\r\ncase 13: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]) \r\nbreak;\r\ncase 14: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]) \r\nbreak;\r\ncase 15: this.$ = $$[$0-1] \r\nbreak;\r\ncase 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]) \r\nbreak;\r\ncase 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true) \r\nbreak;\r\ncase 18: this.$ = new yy.PartialNode($$[$0-1]) \r\nbreak;\r\ncase 19: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1]) \r\nbreak;\r\ncase 20: \r\nbreak;\r\ncase 21: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]] \r\nbreak;\r\ncase 22: this.$ = [[$$[$0-1]].concat($$[$0]), null] \r\nbreak;\r\ncase 23: this.$ = [[$$[$0-1]], $$[$0]] \r\nbreak;\r\ncase 24: this.$ = [[$$[$0]], null] \r\nbreak;\r\ncase 25: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; \r\nbreak;\r\ncase 26: this.$ = [$$[$0]] \r\nbreak;\r\ncase 27: this.$ = $$[$0] \r\nbreak;\r\ncase 28: this.$ = new yy.StringNode($$[$0]) \r\nbreak;\r\ncase 29: this.$ = new yy.IntegerNode($$[$0]) \r\nbreak;\r\ncase 30: this.$ = new yy.BooleanNode($$[$0]) \r\nbreak;\r\ncase 31: this.$ = new yy.HashNode($$[$0]) \r\nbreak;\r\ncase 32: $$[$0-1].push($$[$0]); this.$ = $$[$0-1] \r\nbreak;\r\ncase 33: this.$ = [$$[$0]] \r\nbreak;\r\ncase 34: this.$ = [$$[$0-2], $$[$0]] \r\nbreak;\r\ncase 35: this.$ = [$$[$0-2], new yy.StringNode($$[$0])] \r\nbreak;\r\ncase 36: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])] \r\nbreak;\r\ncase 37: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])] \r\nbreak;\r\ncase 38: this.$ = new yy.IdNode($$[$0]) \r\nbreak;\r\ncase 39: $$[$0-2].push($$[$0]); this.$ = $$[$0-2]; \r\nbreak;\r\ncase 40: this.$ = [$$[$0]] \r\nbreak;\r\n}\r\n},\r\ntable: [{3:1,4:2,5:[2,4],6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{1:[3]},{5:[1,16]},{5:[2,3],7:17,8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,19],20:[2,3],22:[1,13],23:[1,14],24:[1,15]},{5:[2,5],14:[2,5],15:[2,5],16:[2,5],19:[2,5],20:[2,5],22:[2,5],23:[2,5],24:[2,5]},{4:20,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{4:21,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],24:[2,9]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],24:[2,10]},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],24:[2,11]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],24:[2,12]},{17:22,21:23,33:[1,25],35:24},{17:26,21:23,33:[1,25],35:24},{17:27,21:23,33:[1,25],35:24},{17:28,21:23,33:[1,25],35:24},{21:29,33:[1,25],35:24},{1:[2,1]},{6:30,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{5:[2,6],14:[2,6],15:[2,6],16:[2,6],19:[2,6],20:[2,6],22:[2,6],23:[2,6],24:[2,6]},{17:22,18:[1,31],21:23,33:[1,25],35:24},{10:32,20:[1,33]},{10:34,20:[1,33]},{18:[1,35]},{18:[2,24],21:40,25:36,26:37,27:38,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,38],28:[2,38],29:[2,38],30:[2,38],33:[2,38],36:[1,46]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],36:[2,40]},{18:[1,47]},{18:[1,48]},{18:[1,49]},{18:[1,50],21:51,33:[1,25],35:24},{5:[2,2],8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,2],22:[1,13],23:[1,14],24:[1,15]},{14:[2,20],15:[2,20],16:[2,20],19:[2,20],22:[2,20],23:[2,20],24:[2,20]},{5:[2,7],14:[2,7],15:[2,7],16:[2,7],19:[2,7],20:[2,7],22:[2,7],23:[2,7],24:[2,7]},{21:52,33:[1,25],35:24},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],24:[2,8]},{14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],24:[2,14]},{18:[2,22],21:40,26:53,27:54,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,23]},{18:[2,26],28:[2,26],29:[2,26],30:[2,26],33:[2,26]},{18:[2,31],32:55,33:[1,56]},{18:[2,27],28:[2,27],29:[2,27],30:[2,27],33:[2,27]},{18:[2,28],28:[2,28],29:[2,28],30:[2,28],33:[2,28]},{18:[2,29],28:[2,29],29:[2,29],30:[2,29],33:[2,29]},{18:[2,30],28:[2,30],29:[2,30],30:[2,30],33:[2,30]},{18:[2,33],33:[2,33]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],34:[1,57],36:[2,40]},{33:[1,58]},{14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],24:[2,13]},{5:[2,16],14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],24:[2,16]},{5:[2,17],14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],24:[2,17]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],24:[2,18]},{18:[1,59]},{18:[1,60]},{18:[2,21]},{18:[2,25],28:[2,25],29:[2,25],30:[2,25],33:[2,25]},{18:[2,32],33:[2,32]},{34:[1,57]},{21:61,28:[1,62],29:[1,63],30:[1,64],33:[1,25],35:24},{18:[2,39],28:[2,39],29:[2,39],30:[2,39],33:[2,39],36:[2,39]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],24:[2,19]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],24:[2,15]},{18:[2,34],33:[2,34]},{18:[2,35],33:[2,35]},{18:[2,36],33:[2,36]},{18:[2,37],33:[2,37]}],\r\ndefaultActions: {16:[2,1],37:[2,23],53:[2,21]},\r\nparseError: function parseError(str, hash) {\r\n    throw new Error(str);\r\n},\r\nparse: function parse(input) {\r\n    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = \"\", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\r\n    this.lexer.setInput(input);\r\n    this.lexer.yy = this.yy;\r\n    this.yy.lexer = this.lexer;\r\n    if (typeof this.lexer.yylloc == \"undefined\")\r\n        this.lexer.yylloc = {};\r\n    var yyloc = this.lexer.yylloc;\r\n    lstack.push(yyloc);\r\n    if (typeof this.yy.parseError === \"function\")\r\n        this.parseError = this.yy.parseError;\r\n    function popStack(n) {\r\n        stack.length = stack.length - 2 * n;\r\n        vstack.length = vstack.length - n;\r\n        lstack.length = lstack.length - n;\r\n    }\r\n    function lex() {\r\n        var token;\r\n        token = self.lexer.lex() || 1;\r\n        if (typeof token !== \"number\") {\r\n            token = self.symbols_[token] || token;\r\n        }\r\n        return token;\r\n    }\r\n    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\r\n    while (true) {\r\n        state = stack[stack.length - 1];\r\n        if (this.defaultActions[state]) {\r\n            action = this.defaultActions[state];\r\n        } else {\r\n            if (symbol == null)\r\n                symbol = lex();\r\n            action = table[state] && table[state][symbol];\r\n        }\r\n        if (typeof action === \"undefined\" || !action.length || !action[0]) {\r\n            if (!recovering) {\r\n                expected = [];\r\n                for (p in table[state])\r\n                    if (this.terminals_[p] && p > 2) {\r\n                        expected.push(\"'\" + this.terminals_[p] + \"'\");\r\n                    }\r\n                var errStr = \"\";\r\n                if (this.lexer.showPosition) {\r\n                    errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + expected.join(\", \") + \", got '\" + this.terminals_[symbol] + \"'\";\r\n                } else {\r\n                    errStr = \"Parse error on line \" + (yylineno + 1) + \": Unexpected \" + (symbol == 1?\"end of input\":\"'\" + (this.terminals_[symbol] || symbol) + \"'\");\r\n                }\r\n                this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});\r\n            }\r\n        }\r\n        if (action[0] instanceof Array && action.length > 1) {\r\n            throw new Error(\"Parse Error: multiple actions possible at state: \" + state + \", token: \" + symbol);\r\n        }\r\n        switch (action[0]) {\r\n        case 1:\r\n            stack.push(symbol);\r\n            vstack.push(this.lexer.yytext);\r\n            lstack.push(this.lexer.yylloc);\r\n            stack.push(action[1]);\r\n            symbol = null;\r\n            if (!preErrorSymbol) {\r\n                yyleng = this.lexer.yyleng;\r\n                yytext = this.lexer.yytext;\r\n                yylineno = this.lexer.yylineno;\r\n                yyloc = this.lexer.yylloc;\r\n                if (recovering > 0)\r\n                    recovering--;\r\n            } else {\r\n                symbol = preErrorSymbol;\r\n                preErrorSymbol = null;\r\n            }\r\n            break;\r\n        case 2:\r\n            len = this.productions_[action[1]][1];\r\n            yyval.$ = vstack[vstack.length - len];\r\n            yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};\r\n            r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\r\n            if (typeof r !== \"undefined\") {\r\n                return r;\r\n            }\r\n            if (len) {\r\n                stack = stack.slice(0, -1 * len * 2);\r\n                vstack = vstack.slice(0, -1 * len);\r\n                lstack = lstack.slice(0, -1 * len);\r\n            }\r\n            stack.push(this.productions_[action[1]][0]);\r\n            vstack.push(yyval.$);\r\n            lstack.push(yyval._$);\r\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\r\n            stack.push(newState);\r\n            break;\r\n        case 3:\r\n            return true;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n};/* Jison generated lexer */\r\nvar lexer = (function(){\r\n\r\nvar lexer = ({EOF:1,\r\nparseError:function parseError(str, hash) {\r\n        if (this.yy.parseError) {\r\n            this.yy.parseError(str, hash);\r\n        } else {\r\n            throw new Error(str);\r\n        }\r\n    },\r\nsetInput:function (input) {\r\n        this._input = input;\r\n        this._more = this._less = this.done = false;\r\n        this.yylineno = this.yyleng = 0;\r\n        this.yytext = this.matched = this.match = '';\r\n        this.conditionStack = ['INITIAL'];\r\n        this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};\r\n        return this;\r\n    },\r\ninput:function () {\r\n        var ch = this._input[0];\r\n        this.yytext+=ch;\r\n        this.yyleng++;\r\n        this.match+=ch;\r\n        this.matched+=ch;\r\n        var lines = ch.match(/\\n/);\r\n        if (lines) this.yylineno++;\r\n        this._input = this._input.slice(1);\r\n        return ch;\r\n    },\r\nunput:function (ch) {\r\n        this._input = ch + this._input;\r\n        return this;\r\n    },\r\nmore:function () {\r\n        this._more = true;\r\n        return this;\r\n    },\r\npastInput:function () {\r\n        var past = this.matched.substr(0, this.matched.length - this.match.length);\r\n        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\r\n    },\r\nupcomingInput:function () {\r\n        var next = this.match;\r\n        if (next.length < 20) {\r\n            next += this._input.substr(0, 20-next.length);\r\n        }\r\n        return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\\n/g, \"\");\r\n    },\r\nshowPosition:function () {\r\n        var pre = this.pastInput();\r\n        var c = new Array(pre.length + 1).join(\"-\");\r\n        return pre + this.upcomingInput() + \"\\n\" + c+\"^\";\r\n    },\r\nnext:function () {\r\n        if (this.done) {\r\n            return this.EOF;\r\n        }\r\n        if (!this._input) this.done = true;\r\n\r\n        var token,\r\n            match,\r\n            col,\r\n            lines;\r\n        if (!this._more) {\r\n            this.yytext = '';\r\n            this.match = '';\r\n        }\r\n        var rules = this._currentRules();\r\n        for (var i=0;i < rules.length; i++) {\r\n            match = this._input.match(this.rules[rules[i]]);\r\n            if (match) {\r\n                lines = match[0].match(/\\n.*/g);\r\n                if (lines) this.yylineno += lines.length;\r\n                this.yylloc = {first_line: this.yylloc.last_line,\r\n                               last_line: this.yylineno+1,\r\n                               first_column: this.yylloc.last_column,\r\n                               last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}\r\n                this.yytext += match[0];\r\n                this.match += match[0];\r\n                this.matches = match;\r\n                this.yyleng = this.yytext.length;\r\n                this._more = false;\r\n                this._input = this._input.slice(match[0].length);\r\n                this.matched += match[0];\r\n                token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);\r\n                if (token) return token;\r\n                else return;\r\n            }\r\n        }\r\n        if (this._input === \"\") {\r\n            return this.EOF;\r\n        } else {\r\n            this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\\n'+this.showPosition(), \r\n                    {text: \"\", token: null, line: this.yylineno});\r\n        }\r\n    },\r\nlex:function lex() {\r\n        var r = this.next();\r\n        if (typeof r !== 'undefined') {\r\n            return r;\r\n        } else {\r\n            return this.lex();\r\n        }\r\n    },\r\nbegin:function begin(condition) {\r\n        this.conditionStack.push(condition);\r\n    },\r\npopState:function popState() {\r\n        return this.conditionStack.pop();\r\n    },\r\n_currentRules:function _currentRules() {\r\n        return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;\r\n    },\r\ntopState:function () {\r\n        return this.conditionStack[this.conditionStack.length-2];\r\n    },\r\npushState:function begin(condition) {\r\n        this.begin(condition);\r\n    }});\r\nlexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\r\n\r\nvar YYSTATE=YY_START\r\nswitch($avoiding_name_collisions) {\r\ncase 0:\r\n                                   if(yy_.yytext.slice(-1) !== \"\\\\\") this.begin(\"mu\");\r\n                                   if(yy_.yytext.slice(-1) === \"\\\\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin(\"emu\");\r\n                                   if(yy_.yytext) return 14;\r\n                                 \r\nbreak;\r\ncase 1: return 14; \r\nbreak;\r\ncase 2: this.popState(); return 14; \r\nbreak;\r\ncase 3: return 24; \r\nbreak;\r\ncase 4: return 16; \r\nbreak;\r\ncase 5: return 20; \r\nbreak;\r\ncase 6: return 19; \r\nbreak;\r\ncase 7: return 19; \r\nbreak;\r\ncase 8: return 23; \r\nbreak;\r\ncase 9: return 23; \r\nbreak;\r\ncase 10: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; \r\nbreak;\r\ncase 11: return 22; \r\nbreak;\r\ncase 12: return 34; \r\nbreak;\r\ncase 13: return 33; \r\nbreak;\r\ncase 14: return 33; \r\nbreak;\r\ncase 15: return 36; \r\nbreak;\r\ncase 16: /*ignore whitespace*/ \r\nbreak;\r\ncase 17: this.popState(); return 18; \r\nbreak;\r\ncase 18: this.popState(); return 18; \r\nbreak;\r\ncase 19: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\\\\"/g,'\"'); return 28; \r\nbreak;\r\ncase 20: return 30; \r\nbreak;\r\ncase 21: return 30; \r\nbreak;\r\ncase 22: return 29; \r\nbreak;\r\ncase 23: return 33; \r\nbreak;\r\ncase 24: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 33; \r\nbreak;\r\ncase 25: return 'INVALID'; \r\nbreak;\r\ncase 26: return 5; \r\nbreak;\r\n}\r\n};\r\nlexer.rules = [/^[^\\x00]*?(?=(\\{\\{))/,/^[^\\x00]+/,/^[^\\x00]{2,}?(?=(\\{\\{))/,/^\\{\\{>/,/^\\{\\{#/,/^\\{\\{\\//,/^\\{\\{\\^/,/^\\{\\{\\s*else\\b/,/^\\{\\{\\{/,/^\\{\\{&/,/^\\{\\{![\\s\\S]*?\\}\\}/,/^\\{\\{/,/^=/,/^\\.(?=[} ])/,/^\\.\\./,/^[\\/.]/,/^\\s+/,/^\\}\\}\\}/,/^\\}\\}/,/^\"(\\\\[\"]|[^\"])*\"/,/^true(?=[}\\s])/,/^false(?=[}\\s])/,/^[0-9]+(?=[}\\s])/,/^[a-zA-Z0-9_$-]+(?=[=}\\s\\/.])/,/^\\[[^\\]]*\\]/,/^./,/^$/];\r\nlexer.conditions = {\"mu\":{\"rules\":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],\"inclusive\":false},\"emu\":{\"rules\":[2],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,26],\"inclusive\":true}};return lexer;})()\r\nparser.lexer = lexer;\r\nreturn parser;\r\n})();\r\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\r\nexports.parser = handlebars;\r\nexports.parse = function () { return handlebars.parse.apply(handlebars, arguments); }\r\nexports.main = function commonjsMain(args) {\r\n    if (!args[1])\r\n        throw new Error('Usage: '+args[0]+' FILE');\r\n    if (typeof process !== 'undefined') {\r\n        var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), \"utf8\");\r\n    } else {\r\n        var cwd = require(\"file\").path(require(\"file\").cwd());\r\n        var source = cwd.join(args[1]).read({charset: \"utf-8\"});\r\n    }\r\n    return exports.parser.parse(source);\r\n}\r\nif (typeof module !== 'undefined' && require.main === module) {\r\n  exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require(\"system\").args);\r\n}\r\n};\r\n;\r\n// lib/handlebars/compiler/base.js\r\nHandlebars.Parser = handlebars;\r\n\r\nHandlebars.parse = function(string) {\r\n  Handlebars.Parser.yy = Handlebars.AST;\r\n  return Handlebars.Parser.parse(string);\r\n};\r\n\r\nHandlebars.print = function(ast) {\r\n  return new Handlebars.PrintVisitor().accept(ast);\r\n};\r\n\r\nHandlebars.logger = {\r\n  DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,\r\n\r\n  // override in the host environment\r\n  log: function(level, str) {}\r\n};\r\n\r\nHandlebars.log = function(level, str) { Handlebars.logger.log(level, str); };\r\n;\r\n// lib/handlebars/compiler/ast.js\r\n(function() {\r\n\r\n  Handlebars.AST = {};\r\n\r\n  Handlebars.AST.ProgramNode = function(statements, inverse) {\r\n    this.type = \"program\";\r\n    this.statements = statements;\r\n    if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); }\r\n  };\r\n\r\n  Handlebars.AST.MustacheNode = function(params, hash, unescaped) {\r\n    this.type = \"mustache\";\r\n    this.id = params[0];\r\n    this.params = params.slice(1);\r\n    this.hash = hash;\r\n    this.escaped = !unescaped;\r\n  };\r\n\r\n  Handlebars.AST.PartialNode = function(id, context) {\r\n    this.type    = \"partial\";\r\n\r\n    // TODO: disallow complex IDs\r\n\r\n    this.id      = id;\r\n    this.context = context;\r\n  };\r\n\r\n  var verifyMatch = function(open, close) {\r\n    if(open.original !== close.original) {\r\n      throw new Handlebars.Exception(open.original + \" doesn't match \" + close.original);\r\n    }\r\n  };\r\n\r\n  Handlebars.AST.BlockNode = function(mustache, program, close) {\r\n    verifyMatch(mustache.id, close);\r\n    this.type = \"block\";\r\n    this.mustache = mustache;\r\n    this.program  = program;\r\n  };\r\n\r\n  Handlebars.AST.InverseNode = function(mustache, program, close) {\r\n    verifyMatch(mustache.id, close);\r\n    this.type = \"inverse\";\r\n    this.mustache = mustache;\r\n    this.program  = program;\r\n  };\r\n\r\n  Handlebars.AST.ContentNode = function(string) {\r\n    this.type = \"content\";\r\n    this.string = string;\r\n  };\r\n\r\n  Handlebars.AST.HashNode = function(pairs) {\r\n    this.type = \"hash\";\r\n    this.pairs = pairs;\r\n  };\r\n\r\n  Handlebars.AST.IdNode = function(parts) {\r\n    this.type = \"ID\";\r\n    this.original = parts.join(\".\");\r\n\r\n    var dig = [], depth = 0;\r\n\r\n    for(var i=0,l=parts.length; i<l; i++) {\r\n      var part = parts[i];\r\n\r\n      if(part === \"..\") { depth++; }\r\n      else if(part === \".\" || part === \"this\") { this.isScoped = true; }\r\n      else { dig.push(part); }\r\n    }\r\n\r\n    this.parts    = dig;\r\n    this.string   = dig.join('.');\r\n    this.depth    = depth;\r\n    this.isSimple = (dig.length === 1) && (depth === 0);\r\n  };\r\n\r\n  Handlebars.AST.StringNode = function(string) {\r\n    this.type = \"STRING\";\r\n    this.string = string;\r\n  };\r\n\r\n  Handlebars.AST.IntegerNode = function(integer) {\r\n    this.type = \"INTEGER\";\r\n    this.integer = integer;\r\n  };\r\n\r\n  Handlebars.AST.BooleanNode = function(bool) {\r\n    this.type = \"BOOLEAN\";\r\n    this.bool = bool;\r\n  };\r\n\r\n  Handlebars.AST.CommentNode = function(comment) {\r\n    this.type = \"comment\";\r\n    this.comment = comment;\r\n  };\r\n\r\n})();;\r\n// lib/handlebars/utils.js\r\nHandlebars.Exception = function(message) {\r\n  var tmp = Error.prototype.constructor.apply(this, arguments);\r\n\r\n  for (var p in tmp) {\r\n    if (tmp.hasOwnProperty(p)) { this[p] = tmp[p]; }\r\n  }\r\n\r\n  this.message = tmp.message;\r\n};\r\nHandlebars.Exception.prototype = new Error;\r\n\r\n// Build out our basic SafeString type\r\nHandlebars.SafeString = function(string) {\r\n  this.string = string;\r\n};\r\nHandlebars.SafeString.prototype.toString = function() {\r\n  return this.string.toString();\r\n};\r\n\r\n(function() {\r\n  var escape = {\r\n    \"<\": \"&lt;\",\r\n    \">\": \"&gt;\",\r\n    '\"': \"&quot;\",\r\n    \"'\": \"&#x27;\",\r\n    \"`\": \"&#x60;\"\r\n  };\r\n\r\n  var badChars = /&(?!\\w+;)|[<>\"'`]/g;\r\n  var possible = /[&<>\"'`]/;\r\n\r\n  var escapeChar = function(chr) {\r\n    return escape[chr] || \"&amp;\";\r\n  };\r\n\r\n  Handlebars.Utils = {\r\n    escapeExpression: function(string) {\r\n      // don't escape SafeStrings, since they're already safe\r\n      if (string instanceof Handlebars.SafeString) {\r\n        return string.toString();\r\n      } else if (string == null || string === false) {\r\n        return \"\";\r\n      }\r\n\r\n      if(!possible.test(string)) { return string; }\r\n      return string.replace(badChars, escapeChar);\r\n    },\r\n\r\n    isEmpty: function(value) {\r\n      if (typeof value === \"undefined\") {\r\n        return true;\r\n      } else if (value === null) {\r\n        return true;\r\n      } else if (value === false) {\r\n        return true;\r\n      } else if(Object.prototype.toString.call(value) === \"[object Array]\" && value.length === 0) {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    }\r\n  };\r\n})();;\r\n// lib/handlebars/compiler/compiler.js\r\nHandlebars.Compiler = function() {};\r\nHandlebars.JavaScriptCompiler = function() {};\r\n\r\n(function(Compiler, JavaScriptCompiler) {\r\n  Compiler.OPCODE_MAP = {\r\n    appendContent: 1,\r\n    getContext: 2,\r\n    lookupWithHelpers: 3,\r\n    lookup: 4,\r\n    append: 5,\r\n    invokeMustache: 6,\r\n    appendEscaped: 7,\r\n    pushString: 8,\r\n    truthyOrFallback: 9,\r\n    functionOrFallback: 10,\r\n    invokeProgram: 11,\r\n    invokePartial: 12,\r\n    push: 13,\r\n    assignToHash: 15,\r\n    pushStringParam: 16\r\n  };\r\n\r\n  Compiler.MULTI_PARAM_OPCODES = {\r\n    appendContent: 1,\r\n    getContext: 1,\r\n    lookupWithHelpers: 2,\r\n    lookup: 1,\r\n    invokeMustache: 3,\r\n    pushString: 1,\r\n    truthyOrFallback: 1,\r\n    functionOrFallback: 1,\r\n    invokeProgram: 3,\r\n    invokePartial: 1,\r\n    push: 1,\r\n    assignToHash: 1,\r\n    pushStringParam: 1\r\n  };\r\n\r\n  Compiler.DISASSEMBLE_MAP = {};\r\n\r\n  for(var prop in Compiler.OPCODE_MAP) {\r\n    var value = Compiler.OPCODE_MAP[prop];\r\n    Compiler.DISASSEMBLE_MAP[value] = prop;\r\n  }\r\n\r\n  Compiler.multiParamSize = function(code) {\r\n    return Compiler.MULTI_PARAM_OPCODES[Compiler.DISASSEMBLE_MAP[code]];\r\n  };\r\n\r\n  Compiler.prototype = {\r\n    compiler: Compiler,\r\n\r\n    disassemble: function() {\r\n      var opcodes = this.opcodes, opcode, nextCode;\r\n      var out = [], str, name, value;\r\n\r\n      for(var i=0, l=opcodes.length; i<l; i++) {\r\n        opcode = opcodes[i];\r\n\r\n        if(opcode === 'DECLARE') {\r\n          name = opcodes[++i];\r\n          value = opcodes[++i];\r\n          out.push(\"DECLARE \" + name + \" = \" + value);\r\n        } else {\r\n          str = Compiler.DISASSEMBLE_MAP[opcode];\r\n\r\n          var extraParams = Compiler.multiParamSize(opcode);\r\n          var codes = [];\r\n\r\n          for(var j=0; j<extraParams; j++) {\r\n            nextCode = opcodes[++i];\r\n\r\n            if(typeof nextCode === \"string\") {\r\n              nextCode = \"\\\"\" + nextCode.replace(\"\\n\", \"\\\\n\") + \"\\\"\";\r\n            }\r\n\r\n            codes.push(nextCode);\r\n          }\r\n\r\n          str = str + \" \" + codes.join(\" \");\r\n\r\n          out.push(str);\r\n        }\r\n      }\r\n\r\n      return out.join(\"\\n\");\r\n    },\r\n\r\n    guid: 0,\r\n\r\n    compile: function(program, options) {\r\n      this.children = [];\r\n      this.depths = {list: []};\r\n      this.options = options;\r\n\r\n      // These changes will propagate to the other compiler components\r\n      var knownHelpers = this.options.knownHelpers;\r\n      this.options.knownHelpers = {\r\n        'helperMissing': true,\r\n        'blockHelperMissing': true,\r\n        'each': true,\r\n        'if': true,\r\n        'unless': true,\r\n        'with': true,\r\n        'log': true\r\n      };\r\n      if (knownHelpers) {\r\n        for (var name in knownHelpers) {\r\n          this.options.knownHelpers[name] = knownHelpers[name];\r\n        }\r\n      }\r\n\r\n      return this.program(program);\r\n    },\r\n\r\n    accept: function(node) {\r\n      return this[node.type](node);\r\n    },\r\n\r\n    program: function(program) {\r\n      var statements = program.statements, statement;\r\n      this.opcodes = [];\r\n\r\n      for(var i=0, l=statements.length; i<l; i++) {\r\n        statement = statements[i];\r\n        this[statement.type](statement);\r\n      }\r\n      this.isSimple = l === 1;\r\n\r\n      this.depths.list = this.depths.list.sort(function(a, b) {\r\n        return a - b;\r\n      });\r\n\r\n      return this;\r\n    },\r\n\r\n    compileProgram: function(program) {\r\n      var result = new this.compiler().compile(program, this.options);\r\n      var guid = this.guid++;\r\n\r\n      this.usePartial = this.usePartial || result.usePartial;\r\n\r\n      this.children[guid] = result;\r\n\r\n      for(var i=0, l=result.depths.list.length; i<l; i++) {\r\n        depth = result.depths.list[i];\r\n\r\n        if(depth < 2) { continue; }\r\n        else { this.addDepth(depth - 1); }\r\n      }\r\n\r\n      return guid;\r\n    },\r\n\r\n    block: function(block) {\r\n      var mustache = block.mustache;\r\n      var depth, child, inverse, inverseGuid;\r\n\r\n      var params = this.setupStackForMustache(mustache);\r\n\r\n      var programGuid = this.compileProgram(block.program);\r\n\r\n      if(block.program.inverse) {\r\n        inverseGuid = this.compileProgram(block.program.inverse);\r\n        this.declare('inverse', inverseGuid);\r\n      }\r\n\r\n      this.opcode('invokeProgram', programGuid, params.length, !!mustache.hash);\r\n      this.declare('inverse', null);\r\n      this.opcode('append');\r\n    },\r\n\r\n    inverse: function(block) {\r\n      var params = this.setupStackForMustache(block.mustache);\r\n\r\n      var programGuid = this.compileProgram(block.program);\r\n\r\n      this.declare('inverse', programGuid);\r\n\r\n      this.opcode('invokeProgram', null, params.length, !!block.mustache.hash);\r\n      this.declare('inverse', null);\r\n      this.opcode('append');\r\n    },\r\n\r\n    hash: function(hash) {\r\n      var pairs = hash.pairs, pair, val;\r\n\r\n      this.opcode('push', '{}');\r\n\r\n      for(var i=0, l=pairs.length; i<l; i++) {\r\n        pair = pairs[i];\r\n        val  = pair[1];\r\n\r\n        this.accept(val);\r\n        this.opcode('assignToHash', pair[0]);\r\n      }\r\n    },\r\n\r\n    partial: function(partial) {\r\n      var id = partial.id;\r\n      this.usePartial = true;\r\n\r\n      if(partial.context) {\r\n        this.ID(partial.context);\r\n      } else {\r\n        this.opcode('push', 'depth0');\r\n      }\r\n\r\n      this.opcode('invokePartial', id.original);\r\n      this.opcode('append');\r\n    },\r\n\r\n    content: function(content) {\r\n      this.opcode('appendContent', content.string);\r\n    },\r\n\r\n    mustache: function(mustache) {\r\n      var params = this.setupStackForMustache(mustache);\r\n\r\n      this.opcode('invokeMustache', params.length, mustache.id.original, !!mustache.hash);\r\n\r\n      if(mustache.escaped && !this.options.noEscape) {\r\n        this.opcode('appendEscaped');\r\n      } else {\r\n        this.opcode('append');\r\n      }\r\n    },\r\n\r\n    ID: function(id) {\r\n      this.addDepth(id.depth);\r\n\r\n      this.opcode('getContext', id.depth);\r\n\r\n      this.opcode('lookupWithHelpers', id.parts[0] || null, id.isScoped || false);\r\n\r\n      for(var i=1, l=id.parts.length; i<l; i++) {\r\n        this.opcode('lookup', id.parts[i]);\r\n      }\r\n    },\r\n\r\n    STRING: function(string) {\r\n      this.opcode('pushString', string.string);\r\n    },\r\n\r\n    INTEGER: function(integer) {\r\n      this.opcode('push', integer.integer);\r\n    },\r\n\r\n    BOOLEAN: function(bool) {\r\n      this.opcode('push', bool.bool);\r\n    },\r\n\r\n    comment: function() {},\r\n\r\n    // HELPERS\r\n    pushParams: function(params) {\r\n      var i = params.length, param;\r\n\r\n      while(i--) {\r\n        param = params[i];\r\n\r\n        if(this.options.stringParams) {\r\n          if(param.depth) {\r\n            this.addDepth(param.depth);\r\n          }\r\n\r\n          this.opcode('getContext', param.depth || 0);\r\n          this.opcode('pushStringParam', param.string);\r\n        } else {\r\n          this[param.type](param);\r\n        }\r\n      }\r\n    },\r\n\r\n    opcode: function(name, val1, val2, val3) {\r\n      this.opcodes.push(Compiler.OPCODE_MAP[name]);\r\n      if(val1 !== undefined) { this.opcodes.push(val1); }\r\n      if(val2 !== undefined) { this.opcodes.push(val2); }\r\n      if(val3 !== undefined) { this.opcodes.push(val3); }\r\n    },\r\n\r\n    declare: function(name, value) {\r\n      this.opcodes.push('DECLARE');\r\n      this.opcodes.push(name);\r\n      this.opcodes.push(value);\r\n    },\r\n\r\n    addDepth: function(depth) {\r\n      if(depth === 0) { return; }\r\n\r\n      if(!this.depths[depth]) {\r\n        this.depths[depth] = true;\r\n        this.depths.list.push(depth);\r\n      }\r\n    },\r\n\r\n    setupStackForMustache: function(mustache) {\r\n      var params = mustache.params;\r\n\r\n      this.pushParams(params);\r\n\r\n      if(mustache.hash) {\r\n        this.hash(mustache.hash);\r\n      }\r\n\r\n      this.ID(mustache.id);\r\n\r\n      return params;\r\n    }\r\n  };\r\n\r\n  JavaScriptCompiler.prototype = {\r\n    // PUBLIC API: You can override these methods in a subclass to provide\r\n    // alternative compiled forms for name lookup and buffering semantics\r\n    nameLookup: function(parent, name, type) {\r\n  \t\tif (/^[0-9]+$/.test(name)) {\r\n        return parent + \"[\" + name + \"]\";\r\n      } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {\r\n\t    \treturn parent + \".\" + name;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn parent + \"['\" + name + \"']\";\r\n      }\r\n    },\r\n\r\n    appendToBuffer: function(string) {\r\n      if (this.environment.isSimple) {\r\n        return \"return \" + string + \";\";\r\n      } else {\r\n        return \"buffer += \" + string + \";\";\r\n      }\r\n    },\r\n\r\n    initializeBuffer: function() {\r\n      return this.quotedString(\"\");\r\n    },\r\n\r\n    namespace: \"Handlebars\",\r\n    // END PUBLIC API\r\n\r\n    compile: function(environment, options, context, asObject) {\r\n      this.environment = environment;\r\n      this.options = options || {};\r\n\r\n      this.name = this.environment.name;\r\n      this.isChild = !!context;\r\n      this.context = context || {\r\n        programs: [],\r\n        aliases: { self: 'this' },\r\n        registers: {list: []}\r\n      };\r\n\r\n      this.preamble();\r\n\r\n      this.stackSlot = 0;\r\n      this.stackVars = [];\r\n\r\n      this.compileChildren(environment, options);\r\n\r\n      var opcodes = environment.opcodes, opcode;\r\n\r\n      this.i = 0;\r\n\r\n      for(l=opcodes.length; this.i<l; this.i++) {\r\n        opcode = this.nextOpcode(0);\r\n\r\n        if(opcode[0] === 'DECLARE') {\r\n          this.i = this.i + 2;\r\n          this[opcode[1]] = opcode[2];\r\n        } else {\r\n          this.i = this.i + opcode[1].length;\r\n          this[opcode[0]].apply(this, opcode[1]);\r\n        }\r\n      }\r\n\r\n      return this.createFunctionContext(asObject);\r\n    },\r\n\r\n    nextOpcode: function(n) {\r\n      var opcodes = this.environment.opcodes, opcode = opcodes[this.i + n], name, val;\r\n      var extraParams, codes;\r\n\r\n      if(opcode === 'DECLARE') {\r\n        name = opcodes[this.i + 1];\r\n        val  = opcodes[this.i + 2];\r\n        return ['DECLARE', name, val];\r\n      } else {\r\n        name = Compiler.DISASSEMBLE_MAP[opcode];\r\n\r\n        extraParams = Compiler.multiParamSize(opcode);\r\n        codes = [];\r\n\r\n        for(var j=0; j<extraParams; j++) {\r\n          codes.push(opcodes[this.i + j + 1 + n]);\r\n        }\r\n\r\n        return [name, codes];\r\n      }\r\n    },\r\n\r\n    eat: function(opcode) {\r\n      this.i = this.i + opcode.length;\r\n    },\r\n\r\n    preamble: function() {\r\n      var out = [];\r\n\r\n      // this register will disambiguate helper lookup from finding a function in\r\n      // a context. This is necessary for mustache compatibility, which requires\r\n      // that context functions in blocks are evaluated by blockHelperMissing, and\r\n      // then proceed as if the resulting value was provided to blockHelperMissing.\r\n      this.useRegister('foundHelper');\r\n\r\n      if (!this.isChild) {\r\n        var namespace = this.namespace;\r\n        var copies = \"helpers = helpers || \" + namespace + \".helpers;\";\r\n        if(this.environment.usePartial) { copies = copies + \" partials = partials || \" + namespace + \".partials;\"; }\r\n        out.push(copies);\r\n      } else {\r\n        out.push('');\r\n      }\r\n\r\n      if (!this.environment.isSimple) {\r\n        out.push(\", buffer = \" + this.initializeBuffer());\r\n      } else {\r\n        out.push(\"\");\r\n      }\r\n\r\n      // track the last context pushed into place to allow skipping the\r\n      // getContext opcode when it would be a noop\r\n      this.lastContext = 0;\r\n      this.source = out;\r\n    },\r\n\r\n    createFunctionContext: function(asObject) {\r\n      var locals = this.stackVars;\r\n      if (!this.isChild) {\r\n        locals = locals.concat(this.context.registers.list);\r\n      }\r\n\r\n      if(locals.length > 0) {\r\n        this.source[1] = this.source[1] + \", \" + locals.join(\", \");\r\n      }\r\n\r\n      // Generate minimizer alias mappings\r\n      if (!this.isChild) {\r\n        var aliases = []\r\n        for (var alias in this.context.aliases) {\r\n          this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias];\r\n        }\r\n      }\r\n\r\n      if (this.source[1]) {\r\n        this.source[1] = \"var \" + this.source[1].substring(2) + \";\";\r\n      }\r\n\r\n      // Merge children\r\n      if (!this.isChild) {\r\n        this.source[1] += '\\n' + this.context.programs.join('\\n') + '\\n';\r\n      }\r\n\r\n      if (!this.environment.isSimple) {\r\n        this.source.push(\"return buffer;\");\r\n      }\r\n\r\n      var params = this.isChild ? [\"depth0\", \"data\"] : [\"Handlebars\", \"depth0\", \"helpers\", \"partials\", \"data\"];\r\n\r\n      for(var i=0, l=this.environment.depths.list.length; i<l; i++) {\r\n        params.push(\"depth\" + this.environment.depths.list[i]);\r\n      }\r\n\r\n      if (asObject) {\r\n        params.push(this.source.join(\"\\n  \"));\r\n\r\n        return Function.apply(this, params);\r\n      } else {\r\n        var functionSource = 'function ' + (this.name || '') + '(' + params.join(',') + ') {\\n  ' + this.source.join(\"\\n  \") + '}';\r\n        Handlebars.log(Handlebars.logger.DEBUG, functionSource + \"\\n\\n\");\r\n        return functionSource;\r\n      }\r\n    },\r\n\r\n    appendContent: function(content) {\r\n      this.source.push(this.appendToBuffer(this.quotedString(content)));\r\n    },\r\n\r\n    append: function() {\r\n      var local = this.popStack();\r\n      this.source.push(\"if(\" + local + \" || \" + local + \" === 0) { \" + this.appendToBuffer(local) + \" }\");\r\n      if (this.environment.isSimple) {\r\n        this.source.push(\"else { \" + this.appendToBuffer(\"''\") + \" }\");\r\n      }\r\n    },\r\n\r\n    appendEscaped: function() {\r\n      var opcode = this.nextOpcode(1), extra = \"\";\r\n      this.context.aliases.escapeExpression = 'this.escapeExpression';\r\n\r\n      if(opcode[0] === 'appendContent') {\r\n        extra = \" + \" + this.quotedString(opcode[1][0]);\r\n        this.eat(opcode);\r\n      }\r\n\r\n      this.source.push(this.appendToBuffer(\"escapeExpression(\" + this.popStack() + \")\" + extra));\r\n    },\r\n\r\n    getContext: function(depth) {\r\n      if(this.lastContext !== depth) {\r\n        this.lastContext = depth;\r\n      }\r\n    },\r\n\r\n    lookupWithHelpers: function(name, isScoped) {\r\n      if(name) {\r\n        var topStack = this.nextStack();\r\n\r\n        this.usingKnownHelper = false;\r\n\r\n        var toPush;\r\n        if (!isScoped && this.options.knownHelpers[name]) {\r\n          toPush = topStack + \" = \" + this.nameLookup('helpers', name, 'helper');\r\n          this.usingKnownHelper = true;\r\n        } else if (isScoped || this.options.knownHelpersOnly) {\r\n          toPush = topStack + \" = \" + this.nameLookup('depth' + this.lastContext, name, 'context');\r\n        } else {\r\n          this.register('foundHelper', this.nameLookup('helpers', name, 'helper'));\r\n          toPush = topStack + \" = foundHelper || \" + this.nameLookup('depth' + this.lastContext, name, 'context');\r\n        }\r\n\r\n        toPush += ';';\r\n        this.source.push(toPush);\r\n      } else {\r\n        this.pushStack('depth' + this.lastContext);\r\n      }\r\n    },\r\n\r\n    lookup: function(name) {\r\n      var topStack = this.topStack();\r\n      this.source.push(topStack + \" = (\" + topStack + \" === null || \" + topStack + \" === undefined || \" + topStack + \" === false ? \" +\r\n \t\t\t\ttopStack + \" : \" + this.nameLookup(topStack, name, 'context') + \");\");\r\n    },\r\n\r\n    pushStringParam: function(string) {\r\n      this.pushStack('depth' + this.lastContext);\r\n      this.pushString(string);\r\n    },\r\n\r\n    pushString: function(string) {\r\n      this.pushStack(this.quotedString(string));\r\n    },\r\n\r\n    push: function(name) {\r\n      this.pushStack(name);\r\n    },\r\n\r\n    invokeMustache: function(paramSize, original, hasHash) {\r\n      this.populateParams(paramSize, this.quotedString(original), \"{}\", null, hasHash, function(nextStack, helperMissingString, id) {\r\n        if (!this.usingKnownHelper) {\r\n          this.context.aliases.helperMissing = 'helpers.helperMissing';\r\n          this.context.aliases.undef = 'void 0';\r\n          this.source.push(\"else if(\" + id + \"=== undef) { \" + nextStack + \" = helperMissing.call(\" + helperMissingString + \"); }\");\r\n          if (nextStack !== id) {\r\n            this.source.push(\"else { \" + nextStack + \" = \" + id + \"; }\");\r\n          }\r\n        }\r\n      });\r\n    },\r\n\r\n    invokeProgram: function(guid, paramSize, hasHash) {\r\n      var inverse = this.programExpression(this.inverse);\r\n      var mainProgram = this.programExpression(guid);\r\n\r\n      this.populateParams(paramSize, null, mainProgram, inverse, hasHash, function(nextStack, helperMissingString, id) {\r\n        if (!this.usingKnownHelper) {\r\n          this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';\r\n          this.source.push(\"else { \" + nextStack + \" = blockHelperMissing.call(\" + helperMissingString + \"); }\");\r\n        }\r\n      });\r\n    },\r\n\r\n    populateParams: function(paramSize, helperId, program, inverse, hasHash, fn) {\r\n      var needsRegister = hasHash || this.options.stringParams || inverse || this.options.data;\r\n      var id = this.popStack(), nextStack;\r\n      var params = [], param, stringParam, stringOptions;\r\n\r\n      if (needsRegister) {\r\n        this.register('tmp1', program);\r\n        stringOptions = 'tmp1';\r\n      } else {\r\n        stringOptions = '{ hash: {} }';\r\n      }\r\n\r\n      if (needsRegister) {\r\n        var hash = (hasHash ? this.popStack() : '{}');\r\n        this.source.push('tmp1.hash = ' + hash + ';');\r\n      }\r\n\r\n      if(this.options.stringParams) {\r\n        this.source.push('tmp1.contexts = [];');\r\n      }\r\n\r\n      for(var i=0; i<paramSize; i++) {\r\n        param = this.popStack();\r\n        params.push(param);\r\n\r\n        if(this.options.stringParams) {\r\n          this.source.push('tmp1.contexts.push(' + this.popStack() + ');');\r\n        }\r\n      }\r\n\r\n      if(inverse) {\r\n        this.source.push('tmp1.fn = tmp1;');\r\n        this.source.push('tmp1.inverse = ' + inverse + ';');\r\n      }\r\n\r\n      if(this.options.data) {\r\n        this.source.push('tmp1.data = data;');\r\n      }\r\n\r\n      params.push(stringOptions);\r\n\r\n      this.populateCall(params, id, helperId || id, fn, program !== '{}');\r\n    },\r\n\r\n    populateCall: function(params, id, helperId, fn, program) {\r\n      var paramString = [\"depth0\"].concat(params).join(\", \");\r\n      var helperMissingString = [\"depth0\"].concat(helperId).concat(params).join(\", \");\r\n\r\n      var nextStack = this.nextStack();\r\n\r\n      if (this.usingKnownHelper) {\r\n        this.source.push(nextStack + \" = \" + id + \".call(\" + paramString + \");\");\r\n      } else {\r\n        this.context.aliases.functionType = '\"function\"';\r\n        var condition = program ? \"foundHelper && \" : \"\"\r\n        this.source.push(\"if(\" + condition + \"typeof \" + id + \" === functionType) { \" + nextStack + \" = \" + id + \".call(\" + paramString + \"); }\");\r\n      }\r\n      fn.call(this, nextStack, helperMissingString, id);\r\n      this.usingKnownHelper = false;\r\n    },\r\n\r\n    invokePartial: function(context) {\r\n      params = [this.nameLookup('partials', context, 'partial'), \"'\" + context + \"'\", this.popStack(), \"helpers\", \"partials\"];\r\n\r\n      if (this.options.data) {\r\n        params.push(\"data\");\r\n      }\r\n\r\n      this.pushStack(\"self.invokePartial(\" + params.join(\", \") + \");\");\r\n    },\r\n\r\n    assignToHash: function(key) {\r\n      var value = this.popStack();\r\n      var hash = this.topStack();\r\n\r\n      this.source.push(hash + \"['\" + key + \"'] = \" + value + \";\");\r\n    },\r\n\r\n    // HELPERS\r\n\r\n    compiler: JavaScriptCompiler,\r\n\r\n    compileChildren: function(environment, options) {\r\n      var children = environment.children, child, compiler;\r\n\r\n      for(var i=0, l=children.length; i<l; i++) {\r\n        child = children[i];\r\n        compiler = new this.compiler();\r\n\r\n        this.context.programs.push('');     // Placeholder to prevent name conflicts for nested children\r\n        var index = this.context.programs.length;\r\n        child.index = index;\r\n        child.name = 'program' + index;\r\n        this.context.programs[index] = compiler.compile(child, options, this.context);\r\n      }\r\n    },\r\n\r\n    programExpression: function(guid) {\r\n      if(guid == null) { return \"self.noop\"; }\r\n\r\n      var child = this.environment.children[guid],\r\n          depths = child.depths.list;\r\n      var programParams = [child.index, child.name, \"data\"];\r\n\r\n      for(var i=0, l = depths.length; i<l; i++) {\r\n        depth = depths[i];\r\n\r\n        if(depth === 1) { programParams.push(\"depth0\"); }\r\n        else { programParams.push(\"depth\" + (depth - 1)); }\r\n      }\r\n\r\n      if(depths.length === 0) {\r\n        return \"self.program(\" + programParams.join(\", \") + \")\";\r\n      } else {\r\n        programParams.shift();\r\n        return \"self.programWithDepth(\" + programParams.join(\", \") + \")\";\r\n      }\r\n    },\r\n\r\n    register: function(name, val) {\r\n      this.useRegister(name);\r\n      this.source.push(name + \" = \" + val + \";\");\r\n    },\r\n\r\n    useRegister: function(name) {\r\n      if(!this.context.registers[name]) {\r\n        this.context.registers[name] = true;\r\n        this.context.registers.list.push(name);\r\n      }\r\n    },\r\n\r\n    pushStack: function(item) {\r\n      this.source.push(this.nextStack() + \" = \" + item + \";\");\r\n      return \"stack\" + this.stackSlot;\r\n    },\r\n\r\n    nextStack: function() {\r\n      this.stackSlot++;\r\n      if(this.stackSlot > this.stackVars.length) { this.stackVars.push(\"stack\" + this.stackSlot); }\r\n      return \"stack\" + this.stackSlot;\r\n    },\r\n\r\n    popStack: function() {\r\n      return \"stack\" + this.stackSlot--;\r\n    },\r\n\r\n    topStack: function() {\r\n      return \"stack\" + this.stackSlot;\r\n    },\r\n\r\n    quotedString: function(str) {\r\n      return '\"' + str\r\n        .replace(/\\\\/g, '\\\\\\\\')\r\n        .replace(/\"/g, '\\\\\"')\r\n        .replace(/\\n/g, '\\\\n')\r\n        .replace(/\\r/g, '\\\\r') + '\"';\r\n    }\r\n  };\r\n\r\n  var reservedWords = (\r\n    \"break else new var\" +\r\n    \" case finally return void\" +\r\n    \" catch for switch while\" +\r\n    \" continue function this with\" +\r\n    \" default if throw\" +\r\n    \" delete in try\" +\r\n    \" do instanceof typeof\" +\r\n    \" abstract enum int short\" +\r\n    \" boolean export interface static\" +\r\n    \" byte extends long super\" +\r\n    \" char final native synchronized\" +\r\n    \" class float package throws\" +\r\n    \" const goto private transient\" +\r\n    \" debugger implements protected volatile\" +\r\n    \" double import public let yield\"\r\n  ).split(\" \");\r\n\r\n  var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};\r\n\r\n  for(var i=0, l=reservedWords.length; i<l; i++) {\r\n    compilerWords[reservedWords[i]] = true;\r\n  }\r\n\r\n\tJavaScriptCompiler.isValidJavaScriptVariableName = function(name) {\r\n\t\tif(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n})(Handlebars.Compiler, Handlebars.JavaScriptCompiler);\r\n\r\nHandlebars.precompile = function(string, options) {\r\n  options = options || {};\r\n\r\n  var ast = Handlebars.parse(string);\r\n  var environment = new Handlebars.Compiler().compile(ast, options);\r\n  return new Handlebars.JavaScriptCompiler().compile(environment, options);\r\n};\r\n\r\nHandlebars.compile = function(string, options) {\r\n  options = options || {};\r\n\r\n  var compiled;\r\n  function compile() {\r\n    var ast = Handlebars.parse(string);\r\n    var environment = new Handlebars.Compiler().compile(ast, options);\r\n    var templateSpec = new Handlebars.JavaScriptCompiler().compile(environment, options, undefined, true);\r\n    return Handlebars.template(templateSpec);\r\n  }\r\n\r\n  // Template is only compiled on first use and cached after that point.\r\n  return function(context, options) {\r\n    if (!compiled) {\r\n      compiled = compile();\r\n    }\r\n    return compiled.call(this, context, options);\r\n  };\r\n};\r\n;\r\n// lib/handlebars/runtime.js\r\nHandlebars.VM = {\r\n  template: function(templateSpec) {\r\n    // Just add water\r\n    var container = {\r\n      escapeExpression: Handlebars.Utils.escapeExpression,\r\n      invokePartial: Handlebars.VM.invokePartial,\r\n      programs: [],\r\n      program: function(i, fn, data) {\r\n        var programWrapper = this.programs[i];\r\n        if(data) {\r\n          return Handlebars.VM.program(fn, data);\r\n        } else if(programWrapper) {\r\n          return programWrapper;\r\n        } else {\r\n          programWrapper = this.programs[i] = Handlebars.VM.program(fn);\r\n          return programWrapper;\r\n        }\r\n      },\r\n      programWithDepth: Handlebars.VM.programWithDepth,\r\n      noop: Handlebars.VM.noop\r\n    };\r\n\r\n    return function(context, options) {\r\n      options = options || {};\r\n      return templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);\r\n    };\r\n  },\r\n\r\n  programWithDepth: function(fn, data, $depth) {\r\n    var args = Array.prototype.slice.call(arguments, 2);\r\n\r\n    return function(context, options) {\r\n      options = options || {};\r\n\r\n      return fn.apply(this, [context, options.data || data].concat(args));\r\n    };\r\n  },\r\n  program: function(fn, data) {\r\n    return function(context, options) {\r\n      options = options || {};\r\n\r\n      return fn(context, options.data || data);\r\n    };\r\n  },\r\n  noop: function() { return \"\"; },\r\n  invokePartial: function(partial, name, context, helpers, partials, data) {\r\n    options = { helpers: helpers, partials: partials, data: data };\r\n\r\n    if(partial === undefined) {\r\n      throw new Handlebars.Exception(\"The partial \" + name + \" could not be found\");\r\n    } else if(partial instanceof Function) {\r\n      return partial(context, options);\r\n    } else if (!Handlebars.compile) {\r\n      throw new Handlebars.Exception(\"The partial \" + name + \" could not be compiled when running in runtime-only mode\");\r\n    } else {\r\n      partials[name] = Handlebars.compile(partial);\r\n      return partials[name](context, options);\r\n    }\r\n  }\r\n};\r\n\r\nHandlebars.template = Handlebars.VM.template;\r\n;\r\n"
  },
  {
    "path": "servers/www/assets/js/vendor/jquery.cookie.js",
    "content": "/*!\r\n * jQuery Cookie Plugin\r\n * https://github.com/carhartl/jquery-cookie\r\n *\r\n * Copyright 2011, Klaus Hartl\r\n * Dual licensed under the MIT or GPL Version 2 licenses.\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.opensource.org/licenses/GPL-2.0\r\n */\r\n(function($) {\r\n    $.cookie = function(key, value, options) {\r\n\r\n        // key and at least value given, set cookie...\r\n        if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {\r\n            options = $.extend({}, options);\r\n\r\n            if (value === null || value === undefined) {\r\n                options.expires = -1;\r\n            }\r\n\r\n            if (typeof options.expires === 'number') {\r\n                var days = options.expires, t = options.expires = new Date();\r\n                t.setDate(t.getDate() + days);\r\n            }\r\n\r\n            value = String(value);\r\n\r\n            return (document.cookie = [\r\n                encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),\r\n                options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE\r\n                options.path    ? '; path=' + options.path : '',\r\n                options.domain  ? '; domain=' + options.domain : '',\r\n                options.secure  ? '; secure' : ''\r\n            ].join(''));\r\n        }\r\n\r\n        // key and possibly options given, get cookie...\r\n        options = value || {};\r\n        var decode = options.raw ? function(s) { return s; } : decodeURIComponent;\r\n\r\n        var pairs = document.cookie.split('; ');\r\n        for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {\r\n            if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as \"c; \", e.g. without \"=\" as opposed to EOMB, thus pair[1] may be undefined\r\n        }\r\n        return null;\r\n    };\r\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/jquery.history.js",
    "content": "(function(a,b){\"use strict\";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!=\"undefined\")throw new Error(\"History.js Adapter has already been loaded...\");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!=\"undefined\"&&c.init()})(window),function(a,b){\"use strict\";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!=\"undefined\")throw new Error(\"History.js Core has already been loaded...\");m.init=function(){return typeof m.Adapter==\"undefined\"?!1:(typeof m.initCore!=\"undefined\"&&m.initCore(),typeof m.initHtml4!=\"undefined\"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!=\"undefined\")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!=\"undefined\"&&b!==null){for(a=0;a<b.length;a++)j(b[a]);m.intervalList=null}},m.debug=function(){(m.options.debug||!1)&&m.log.apply(m,arguments)},m.log=function(){var a=typeof c!=\"undefined\"&&typeof c.log!=\"undefined\"&&typeof c.log.apply!=\"undefined\",b=d.getElementById(\"log\"),e,f,g,h,i;a?(h=Array.prototype.slice.call(arguments),e=h.shift(),typeof c.debug!=\"undefined\"?c.debug.apply(c,[e,h]):c.log.apply(c,[e,h])):e=\"\\n\"+arguments[0]+\"\\n\";for(f=1,g=arguments.length;f<g;++f){i=arguments[f];if(typeof i==\"object\"&&typeof k!=\"undefined\")try{i=k.stringify(i)}catch(j){}e+=\"\\n\"+i+\"\\n\"}return b?(b.value+=e+\"\\n-----\\n\",b.scrollTop=b.scrollHeight-b.clientHeight):a||l(e),!0},m.getInternetExplorerMajorVersion=function(){var a=m.getInternetExplorerMajorVersion.cached=typeof m.getInternetExplorerMajorVersion.cached!=\"undefined\"?m.getInternetExplorerMajorVersion.cached:function(){var a=3,b=d.createElement(\"div\"),c=b.getElementsByTagName(\"i\");while((b.innerHTML=\"<!--[if gt IE \"+ ++a+\"]><i></i><![endif]-->\")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!=\"undefined\"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!(\"onhashchange\"in a||\"onhashchange\"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor===\"Apple Computer, Inc.\"&&/AppleWebKit\\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor===\"Apple Computer, Inc.\"&&/AppleWebKit\\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+\"//\"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=\":\"+d.location.port;return a+=\"/\",a},m.getBaseHref=function(){var a=d.getElementsByTagName(\"base\"),b=null,c=\"\";return a.length===1&&(b=a[0],c=b.href.replace(/[^\\/]+$/,\"\")),c=c.replace(/\\/+$/,\"\"),c&&(c+=\"/\"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\\/+$/,\"\").replace(/[^\\/]+$/,function(a,b,c){return/\\./.test(a)?a:a+\"/\"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\\?].*/,\"\").replace(/[^\\/]+$/,function(a,b,c){return/[^\\/]$/.test(a)?\"\":a}).replace(/\\/+$/,\"\")+\"/\";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b==\"undefined\"?!0:b,/[a-z]+\\:\\/\\//.test(a)||(d===\"/\"?c=m.getRootUrl()+a.replace(/^\\/+/,\"\"):d===\"#\"?c=m.getPageUrl().replace(/#.*/,\"\")+a:d===\"?\"?c=m.getPageUrl().replace(/[\\?#].*/,\"\")+a:b?c=m.getBaseUrl()+a.replace(/^(\\.\\/)+/,\"\"):c=m.getBasePageUrl()+a.replace(/^(\\.\\/)+/,\"\")),c.replace(/\\#$/,\"\")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,\"\")),b=b.replace(d,\"/\"),m.isTraditionalAnchor(b)&&(b=\"./\"+b),b=b.replace(/^(\\.\\/)+/g,\"./\").replace(/\\#$/,\"\"),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a==\"undefined\"&&(a=!0),typeof b==\"undefined\"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!=\"undefined\")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!=\"undefined\")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\\D/g,\"\");if(typeof m.idToState[b]==\"undefined\"&&typeof m.store.idToState[b]==\"undefined\")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!=\"object\")a={};if(typeof a.normalized!=\"undefined\")return a;if(!a.data||typeof a.data!=\"object\")a.data={};b={},b.normalized=!0,b.title=a.title||\"\",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\\??\\&_suid.*/,\"\"),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\\??\\&_suid.*/,\"\"),/\\?/.test(b.hash)||(b.hash+=\"?\"),b.hash+=\"&_suid=\"+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||\"\"):\"\",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\\/\\?\\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a==\"undefined\"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,\"\").replace(/#.*/,\"\");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+\"#\"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\\%21/g,\"!\").replace(/\\%26/g,\"&\").replace(/\\%3D/g,\"=\").replace(/\\%3F/g,\"?\")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,\"$2\");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName(\"title\")[0].innerHTML=b.replace(\"<\",\"&lt;\").replace(\">\",\"&gt;\").replace(\" & \",\" &amp; \")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!=\"undefined\"?m.busy.flag=a:typeof m.busy.flag==\"undefined\"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a==\"function\"&&(a={callback:a}),typeof b!=\"undefined\"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,\"popstate\"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error(\"History.go: History.go requires a positive or negative integer passed.\");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,\"anchorchange\"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData(\"state\",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,\"statechange\"),m.busy(!1),!0))},m.Adapter.bind(a,\"popstate\",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error(\"History.js does not support states with fragement-identifiers (hashes/anchors).\");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,\"popstate\")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error(\"History.js does not support states with fragement-identifiers (hashes/anchors).\");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,\"popstate\")),!0};if(f){try{m.store=k.parse(f.getItem(\"History.store\"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,\"beforeunload\",m.clearAllIntervals),m.Adapter.bind(a,\"unload\",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem(\"History.store\"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem(\"History.store\",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,\"beforeunload\",m.onUnload),m.Adapter.bind(a,\"unload\",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor===\"Apple Computer, Inc.\"||(e.appCodeName||\"\")===\"Mozilla\")m.Adapter.bind(a,\"hashchange\",function(){m.Adapter.trigger(a,\"popstate\")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,\"hashchange\")})}},m.init()}(window)"
  },
  {
    "path": "servers/www/assets/js/vendor/jquery.js",
    "content": "/*!\r\n * jQuery JavaScript Library v1.7.2\r\n * http://jquery.com/\r\n *\r\n * Copyright 2011, John Resig\r\n * Dual licensed under the MIT or GPL Version 2 licenses.\r\n * http://jquery.org/license\r\n *\r\n * Includes Sizzle.js\r\n * http://sizzlejs.com/\r\n * Copyright 2011, The Dojo Foundation\r\n * Released under the MIT, BSD, and GPL Licenses.\r\n *\r\n * Date: Wed Mar 21 12:46:34 2012 -0700\r\n */\r\n(function( window, undefined ) {\r\n\r\n// Use the correct document accordingly with window argument (sandbox)\r\nvar document = window.document,\r\n  navigator = window.navigator,\r\n\tlocation = window.location;\r\nvar jQuery = (function() {\r\n\r\n// Define a local copy of jQuery\r\nvar jQuery = function( selector, context ) {\r\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\r\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\r\n\t},\r\n\r\n\t// Map over jQuery in case of overwrite\r\n\t_jQuery = window.jQuery,\r\n\r\n\t// Map over the $ in case of overwrite\r\n\t_$ = window.$,\r\n\r\n\t// A central reference to the root jQuery(document)\r\n\trootjQuery,\r\n\r\n\t// A simple way to check for HTML strings or ID strings\r\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\r\n\tquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\r\n\r\n\t// Check if a string has a non-whitespace character in it\r\n\trnotwhite = /\\S/,\r\n\r\n\t// Used for trimming whitespace\r\n\ttrimLeft = /^\\s+/,\r\n\ttrimRight = /\\s+$/,\r\n\r\n\t// Match a standalone tag\r\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\r\n\r\n\t// JSON RegExp\r\n\trvalidchars = /^[\\],:{}\\s]*$/,\r\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\r\n\trvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\r\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\r\n\r\n\t// Useragent RegExp\r\n\trwebkit = /(webkit)[ \\/]([\\w.]+)/,\r\n\tropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\r\n\trmsie = /(msie) ([\\w.]+)/,\r\n\trmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\r\n\r\n\t// Matches dashed string for camelizing\r\n\trdashAlpha = /-([a-z]|[0-9])/ig,\r\n\trmsPrefix = /^-ms-/,\r\n\r\n\t// Used by jQuery.camelCase as callback to replace()\r\n\tfcamelCase = function( all, letter ) {\r\n\t\treturn ( letter + \"\" ).toUpperCase();\r\n\t},\r\n\r\n\t// Keep a UserAgent string for use with jQuery.browser\r\n\tuserAgent = navigator.userAgent,\r\n\r\n\t// For matching the engine and version of the browser\r\n\tbrowserMatch,\r\n\r\n\t// The deferred used on DOM ready\r\n\treadyList,\r\n\r\n\t// The ready event handler\r\n\tDOMContentLoaded,\r\n\r\n\t// Save a reference to some core methods\r\n\ttoString = Object.prototype.toString,\r\n\thasOwn = Object.prototype.hasOwnProperty,\r\n\tpush = Array.prototype.push,\r\n\tslice = Array.prototype.slice,\r\n\ttrim = String.prototype.trim,\r\n\tindexOf = Array.prototype.indexOf,\r\n\r\n\t// [[Class]] -> type pairs\r\n\tclass2type = {};\r\n\r\njQuery.fn = jQuery.prototype = {\r\n\tconstructor: jQuery,\r\n\tinit: function( selector, context, rootjQuery ) {\r\n\t\tvar match, elem, ret, doc;\r\n\r\n\t\t// Handle $(\"\"), $(null), or $(undefined)\r\n\t\tif ( !selector ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// Handle $(DOMElement)\r\n\t\tif ( selector.nodeType ) {\r\n\t\t\tthis.context = this[0] = selector;\r\n\t\t\tthis.length = 1;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// The body element only exists once, optimize finding it\r\n\t\tif ( selector === \"body\" && !context && document.body ) {\r\n\t\t\tthis.context = document;\r\n\t\t\tthis[0] = document.body;\r\n\t\t\tthis.selector = selector;\r\n\t\t\tthis.length = 1;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// Handle HTML strings\r\n\t\tif ( typeof selector === \"string\" ) {\r\n\t\t\t// Are we dealing with HTML string or an ID?\r\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\r\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\r\n\t\t\t\tmatch = [ null, selector, null ];\r\n\r\n\t\t\t} else {\r\n\t\t\t\tmatch = quickExpr.exec( selector );\r\n\t\t\t}\r\n\r\n\t\t\t// Verify a match, and that no context was specified for #id\r\n\t\t\tif ( match && (match[1] || !context) ) {\r\n\r\n\t\t\t\t// HANDLE: $(html) -> $(array)\r\n\t\t\t\tif ( match[1] ) {\r\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\r\n\t\t\t\t\tdoc = ( context ? context.ownerDocument || context : document );\r\n\r\n\t\t\t\t\t// If a single string is passed in and it's a single tag\r\n\t\t\t\t\t// just do a createElement and skip the rest\r\n\t\t\t\t\tret = rsingleTag.exec( selector );\r\n\r\n\t\t\t\t\tif ( ret ) {\r\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\r\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\r\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tret = jQuery.buildFragment( [ match[1] ], [ doc ] );\r\n\t\t\t\t\t\tselector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn jQuery.merge( this, selector );\r\n\r\n\t\t\t\t// HANDLE: $(\"#id\")\r\n\t\t\t\t} else {\r\n\t\t\t\t\telem = document.getElementById( match[2] );\r\n\r\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\t\tif ( elem && elem.parentNode ) {\r\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\r\n\t\t\t\t\t\t// by name instead of ID\r\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\r\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\r\n\t\t\t\t\t\tthis.length = 1;\r\n\t\t\t\t\t\tthis[0] = elem;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.context = document;\r\n\t\t\t\t\tthis.selector = selector;\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\r\n\t\t\t// HANDLE: $(expr, $(...))\r\n\t\t\t} else if ( !context || context.jquery ) {\r\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\r\n\r\n\t\t\t// HANDLE: $(expr, context)\r\n\t\t\t// (which is just equivalent to: $(context).find(expr)\r\n\t\t\t} else {\r\n\t\t\t\treturn this.constructor( context ).find( selector );\r\n\t\t\t}\r\n\r\n\t\t// HANDLE: $(function)\r\n\t\t// Shortcut for document ready\r\n\t\t} else if ( jQuery.isFunction( selector ) ) {\r\n\t\t\treturn rootjQuery.ready( selector );\r\n\t\t}\r\n\r\n\t\tif ( selector.selector !== undefined ) {\r\n\t\t\tthis.selector = selector.selector;\r\n\t\t\tthis.context = selector.context;\r\n\t\t}\r\n\r\n\t\treturn jQuery.makeArray( selector, this );\r\n\t},\r\n\r\n\t// Start with an empty selector\r\n\tselector: \"\",\r\n\r\n\t// The current version of jQuery being used\r\n\tjquery: \"1.7.2\",\r\n\r\n\t// The default length of a jQuery object is 0\r\n\tlength: 0,\r\n\r\n\t// The number of elements contained in the matched element set\r\n\tsize: function() {\r\n\t\treturn this.length;\r\n\t},\r\n\r\n\ttoArray: function() {\r\n\t\treturn slice.call( this, 0 );\r\n\t},\r\n\r\n\t// Get the Nth element in the matched element set OR\r\n\t// Get the whole matched element set as a clean array\r\n\tget: function( num ) {\r\n\t\treturn num == null ?\r\n\r\n\t\t\t// Return a 'clean' array\r\n\t\t\tthis.toArray() :\r\n\r\n\t\t\t// Return just the object\r\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\r\n\t},\r\n\r\n\t// Take an array of elements and push it onto the stack\r\n\t// (returning the new matched element set)\r\n\tpushStack: function( elems, name, selector ) {\r\n\t\t// Build a new jQuery matched element set\r\n\t\tvar ret = this.constructor();\r\n\r\n\t\tif ( jQuery.isArray( elems ) ) {\r\n\t\t\tpush.apply( ret, elems );\r\n\r\n\t\t} else {\r\n\t\t\tjQuery.merge( ret, elems );\r\n\t\t}\r\n\r\n\t\t// Add the old object onto the stack (as a reference)\r\n\t\tret.prevObject = this;\r\n\r\n\t\tret.context = this.context;\r\n\r\n\t\tif ( name === \"find\" ) {\r\n\t\t\tret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\r\n\t\t} else if ( name ) {\r\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\r\n\t\t}\r\n\r\n\t\t// Return the newly-formed element set\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t// Execute a callback for every element in the matched set.\r\n\t// (You can seed the arguments with an array of args, but this is\r\n\t// only used internally.)\r\n\teach: function( callback, args ) {\r\n\t\treturn jQuery.each( this, callback, args );\r\n\t},\r\n\r\n\tready: function( fn ) {\r\n\t\t// Attach the listeners\r\n\t\tjQuery.bindReady();\r\n\r\n\t\t// Add the callback\r\n\t\treadyList.add( fn );\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\teq: function( i ) {\r\n\t\ti = +i;\r\n\t\treturn i === -1 ?\r\n\t\t\tthis.slice( i ) :\r\n\t\t\tthis.slice( i, i + 1 );\r\n\t},\r\n\r\n\tfirst: function() {\r\n\t\treturn this.eq( 0 );\r\n\t},\r\n\r\n\tlast: function() {\r\n\t\treturn this.eq( -1 );\r\n\t},\r\n\r\n\tslice: function() {\r\n\t\treturn this.pushStack( slice.apply( this, arguments ),\r\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\r\n\t},\r\n\r\n\tmap: function( callback ) {\r\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\r\n\t\t\treturn callback.call( elem, i, elem );\r\n\t\t}));\r\n\t},\r\n\r\n\tend: function() {\r\n\t\treturn this.prevObject || this.constructor(null);\r\n\t},\r\n\r\n\t// For internal use only.\r\n\t// Behaves like an Array's method, not like a jQuery method.\r\n\tpush: push,\r\n\tsort: [].sort,\r\n\tsplice: [].splice\r\n};\r\n\r\n// Give the init function the jQuery prototype for later instantiation\r\njQuery.fn.init.prototype = jQuery.fn;\r\n\r\njQuery.extend = jQuery.fn.extend = function() {\r\n\tvar options, name, src, copy, copyIsArray, clone,\r\n\t\ttarget = arguments[0] || {},\r\n\t\ti = 1,\r\n\t\tlength = arguments.length,\r\n\t\tdeep = false;\r\n\r\n\t// Handle a deep copy situation\r\n\tif ( typeof target === \"boolean\" ) {\r\n\t\tdeep = target;\r\n\t\ttarget = arguments[1] || {};\r\n\t\t// skip the boolean and the target\r\n\t\ti = 2;\r\n\t}\r\n\r\n\t// Handle case when target is a string or something (possible in deep copy)\r\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\r\n\t\ttarget = {};\r\n\t}\r\n\r\n\t// extend jQuery itself if only one argument is passed\r\n\tif ( length === i ) {\r\n\t\ttarget = this;\r\n\t\t--i;\r\n\t}\r\n\r\n\tfor ( ; i < length; i++ ) {\r\n\t\t// Only deal with non-null/undefined values\r\n\t\tif ( (options = arguments[ i ]) != null ) {\r\n\t\t\t// Extend the base object\r\n\t\t\tfor ( name in options ) {\r\n\t\t\t\tsrc = target[ name ];\r\n\t\t\t\tcopy = options[ name ];\r\n\r\n\t\t\t\t// Prevent never-ending loop\r\n\t\t\t\tif ( target === copy ) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Recurse if we're merging plain objects or arrays\r\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\r\n\t\t\t\t\tif ( copyIsArray ) {\r\n\t\t\t\t\t\tcopyIsArray = false;\r\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Never move original objects, clone them\r\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\r\n\r\n\t\t\t\t// Don't bring in undefined values\r\n\t\t\t\t} else if ( copy !== undefined ) {\r\n\t\t\t\t\ttarget[ name ] = copy;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Return the modified object\r\n\treturn target;\r\n};\r\n\r\njQuery.extend({\r\n\tnoConflict: function( deep ) {\r\n\t\tif ( window.$ === jQuery ) {\r\n\t\t\twindow.$ = _$;\r\n\t\t}\r\n\r\n\t\tif ( deep && window.jQuery === jQuery ) {\r\n\t\t\twindow.jQuery = _jQuery;\r\n\t\t}\r\n\r\n\t\treturn jQuery;\r\n\t},\r\n\r\n\t// Is the DOM ready to be used? Set to true once it occurs.\r\n\tisReady: false,\r\n\r\n\t// A counter to track how many items to wait for before\r\n\t// the ready event fires. See #6781\r\n\treadyWait: 1,\r\n\r\n\t// Hold (or release) the ready event\r\n\tholdReady: function( hold ) {\r\n\t\tif ( hold ) {\r\n\t\t\tjQuery.readyWait++;\r\n\t\t} else {\r\n\t\t\tjQuery.ready( true );\r\n\t\t}\r\n\t},\r\n\r\n\t// Handle when the DOM is ready\r\n\tready: function( wait ) {\r\n\t\t// Either a released hold or an DOMready/load event and not yet ready\r\n\t\tif ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\r\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\r\n\t\t\tif ( !document.body ) {\r\n\t\t\t\treturn setTimeout( jQuery.ready, 1 );\r\n\t\t\t}\r\n\r\n\t\t\t// Remember that the DOM is ready\r\n\t\t\tjQuery.isReady = true;\r\n\r\n\t\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\r\n\t\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// If there are functions bound, to execute\r\n\t\t\treadyList.fireWith( document, [ jQuery ] );\r\n\r\n\t\t\t// Trigger any bound ready events\r\n\t\t\tif ( jQuery.fn.trigger ) {\r\n\t\t\t\tjQuery( document ).trigger( \"ready\" ).off( \"ready\" );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tbindReady: function() {\r\n\t\tif ( readyList ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treadyList = jQuery.Callbacks( \"once memory\" );\r\n\r\n\t\t// Catch cases where $(document).ready() is called after the\r\n\t\t// browser event has already occurred.\r\n\t\tif ( document.readyState === \"complete\" ) {\r\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\r\n\t\t\treturn setTimeout( jQuery.ready, 1 );\r\n\t\t}\r\n\r\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\r\n\t\tif ( document.addEventListener ) {\r\n\t\t\t// Use the handy event callback\r\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\r\n\r\n\t\t\t// A fallback to window.onload, that will always work\r\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\r\n\r\n\t\t// If IE event model is used\r\n\t\t} else if ( document.attachEvent ) {\r\n\t\t\t// ensure firing before onload,\r\n\t\t\t// maybe late but safe also for iframes\r\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\r\n\r\n\t\t\t// A fallback to window.onload, that will always work\r\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\r\n\r\n\t\t\t// If IE and not a frame\r\n\t\t\t// continually check to see if the document is ready\r\n\t\t\tvar toplevel = false;\r\n\r\n\t\t\ttry {\r\n\t\t\t\ttoplevel = window.frameElement == null;\r\n\t\t\t} catch(e) {}\r\n\r\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\r\n\t\t\t\tdoScrollCheck();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// See test/unit/core.js for details concerning isFunction.\r\n\t// Since version 1.3, DOM methods and functions like alert\r\n\t// aren't supported. They return false on IE (#2968).\r\n\tisFunction: function( obj ) {\r\n\t\treturn jQuery.type(obj) === \"function\";\r\n\t},\r\n\r\n\tisArray: Array.isArray || function( obj ) {\r\n\t\treturn jQuery.type(obj) === \"array\";\r\n\t},\r\n\r\n\tisWindow: function( obj ) {\r\n\t\treturn obj != null && obj == obj.window;\r\n\t},\r\n\r\n\tisNumeric: function( obj ) {\r\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\r\n\t},\r\n\r\n\ttype: function( obj ) {\r\n\t\treturn obj == null ?\r\n\t\t\tString( obj ) :\r\n\t\t\tclass2type[ toString.call(obj) ] || \"object\";\r\n\t},\r\n\r\n\tisPlainObject: function( obj ) {\r\n\t\t// Must be an Object.\r\n\t\t// Because of IE, we also have to check the presence of the constructor property.\r\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\r\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// Not own constructor property must be Object\r\n\t\t\tif ( obj.constructor &&\r\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\r\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} catch ( e ) {\r\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Own properties are enumerated firstly, so to speed up,\r\n\t\t// if last one is own, then all properties are own.\r\n\r\n\t\tvar key;\r\n\t\tfor ( key in obj ) {}\r\n\r\n\t\treturn key === undefined || hasOwn.call( obj, key );\r\n\t},\r\n\r\n\tisEmptyObject: function( obj ) {\r\n\t\tfor ( var name in obj ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\terror: function( msg ) {\r\n\t\tthrow new Error( msg );\r\n\t},\r\n\r\n\tparseJSON: function( data ) {\r\n\t\tif ( typeof data !== \"string\" || !data ) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\r\n\t\tdata = jQuery.trim( data );\r\n\r\n\t\t// Attempt to parse using the native JSON parser first\r\n\t\tif ( window.JSON && window.JSON.parse ) {\r\n\t\t\treturn window.JSON.parse( data );\r\n\t\t}\r\n\r\n\t\t// Make sure the incoming data is actual JSON\r\n\t\t// Logic borrowed from http://json.org/json2.js\r\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\r\n\t\t\t.replace( rvalidtokens, \"]\" )\r\n\t\t\t.replace( rvalidbraces, \"\")) ) {\r\n\r\n\t\t\treturn ( new Function( \"return \" + data ) )();\r\n\r\n\t\t}\r\n\t\tjQuery.error( \"Invalid JSON: \" + data );\r\n\t},\r\n\r\n\t// Cross-browser xml parsing\r\n\tparseXML: function( data ) {\r\n\t\tif ( typeof data !== \"string\" || !data ) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tvar xml, tmp;\r\n\t\ttry {\r\n\t\t\tif ( window.DOMParser ) { // Standard\r\n\t\t\t\ttmp = new DOMParser();\r\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\r\n\t\t\t} else { // IE\r\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\r\n\t\t\t\txml.async = \"false\";\r\n\t\t\t\txml.loadXML( data );\r\n\t\t\t}\r\n\t\t} catch( e ) {\r\n\t\t\txml = undefined;\r\n\t\t}\r\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\r\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\r\n\t\t}\r\n\t\treturn xml;\r\n\t},\r\n\r\n\tnoop: function() {},\r\n\r\n\t// Evaluates a script in a global context\r\n\t// Workarounds based on findings by Jim Driscoll\r\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\r\n\tglobalEval: function( data ) {\r\n\t\tif ( data && rnotwhite.test( data ) ) {\r\n\t\t\t// We use execScript on Internet Explorer\r\n\t\t\t// We use an anonymous function so that context is window\r\n\t\t\t// rather than jQuery in Firefox\r\n\t\t\t( window.execScript || function( data ) {\r\n\t\t\t\twindow[ \"eval\" ].call( window, data );\r\n\t\t\t} )( data );\r\n\t\t}\r\n\t},\r\n\r\n\t// Convert dashed to camelCase; used by the css and data modules\r\n\t// Microsoft forgot to hump their vendor prefix (#9572)\r\n\tcamelCase: function( string ) {\r\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\r\n\t},\r\n\r\n\tnodeName: function( elem, name ) {\r\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\r\n\t},\r\n\r\n\t// args is for internal usage only\r\n\teach: function( object, callback, args ) {\r\n\t\tvar name, i = 0,\r\n\t\t\tlength = object.length,\r\n\t\t\tisObj = length === undefined || jQuery.isFunction( object );\r\n\r\n\t\tif ( args ) {\r\n\t\t\tif ( isObj ) {\r\n\t\t\t\tfor ( name in object ) {\r\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; i < length; ) {\r\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// A special, fast, case for the most common use of each\r\n\t\t} else {\r\n\t\t\tif ( isObj ) {\r\n\t\t\t\tfor ( name in object ) {\r\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; i < length; ) {\r\n\t\t\t\t\tif ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn object;\r\n\t},\r\n\r\n\t// Use native String.trim function wherever possible\r\n\ttrim: trim ?\r\n\t\tfunction( text ) {\r\n\t\t\treturn text == null ?\r\n\t\t\t\t\"\" :\r\n\t\t\t\ttrim.call( text );\r\n\t\t} :\r\n\r\n\t\t// Otherwise use our own trimming functionality\r\n\t\tfunction( text ) {\r\n\t\t\treturn text == null ?\r\n\t\t\t\t\"\" :\r\n\t\t\t\ttext.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\r\n\t\t},\r\n\r\n\t// results is for internal usage only\r\n\tmakeArray: function( array, results ) {\r\n\t\tvar ret = results || [];\r\n\r\n\t\tif ( array != null ) {\r\n\t\t\t// The window, strings (and functions) also have 'length'\r\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\r\n\t\t\tvar type = jQuery.type( array );\r\n\r\n\t\t\tif ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\r\n\t\t\t\tpush.call( ret, array );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery.merge( ret, array );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\tinArray: function( elem, array, i ) {\r\n\t\tvar len;\r\n\r\n\t\tif ( array ) {\r\n\t\t\tif ( indexOf ) {\r\n\t\t\t\treturn indexOf.call( array, elem, i );\r\n\t\t\t}\r\n\r\n\t\t\tlen = array.length;\r\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\r\n\r\n\t\t\tfor ( ; i < len; i++ ) {\r\n\t\t\t\t// Skip accessing in sparse arrays\r\n\t\t\t\tif ( i in array && array[ i ] === elem ) {\r\n\t\t\t\t\treturn i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn -1;\r\n\t},\r\n\r\n\tmerge: function( first, second ) {\r\n\t\tvar i = first.length,\r\n\t\t\tj = 0;\r\n\r\n\t\tif ( typeof second.length === \"number\" ) {\r\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\r\n\t\t\t\tfirst[ i++ ] = second[ j ];\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\twhile ( second[j] !== undefined ) {\r\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfirst.length = i;\r\n\r\n\t\treturn first;\r\n\t},\r\n\r\n\tgrep: function( elems, callback, inv ) {\r\n\t\tvar ret = [], retVal;\r\n\t\tinv = !!inv;\r\n\r\n\t\t// Go through the array, only saving the items\r\n\t\t// that pass the validator function\r\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\r\n\t\t\tretVal = !!callback( elems[ i ], i );\r\n\t\t\tif ( inv !== retVal ) {\r\n\t\t\t\tret.push( elems[ i ] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t// arg is for internal usage only\r\n\tmap: function( elems, callback, arg ) {\r\n\t\tvar value, key, ret = [],\r\n\t\t\ti = 0,\r\n\t\t\tlength = elems.length,\r\n\t\t\t// jquery objects are treated as arrays\r\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\r\n\r\n\t\t// Go through the array, translating each of the items to their\r\n\t\tif ( isArray ) {\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\r\n\r\n\t\t\t\tif ( value != null ) {\r\n\t\t\t\t\tret[ ret.length ] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// Go through every key on the object,\r\n\t\t} else {\r\n\t\t\tfor ( key in elems ) {\r\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\r\n\r\n\t\t\t\tif ( value != null ) {\r\n\t\t\t\t\tret[ ret.length ] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Flatten any nested arrays\r\n\t\treturn ret.concat.apply( [], ret );\r\n\t},\r\n\r\n\t// A global GUID counter for objects\r\n\tguid: 1,\r\n\r\n\t// Bind a function to a context, optionally partially applying any\r\n\t// arguments.\r\n\tproxy: function( fn, context ) {\r\n\t\tif ( typeof context === \"string\" ) {\r\n\t\t\tvar tmp = fn[ context ];\r\n\t\t\tcontext = fn;\r\n\t\t\tfn = tmp;\r\n\t\t}\r\n\r\n\t\t// Quick check to determine if target is callable, in the spec\r\n\t\t// this throws a TypeError, but we will just return undefined.\r\n\t\tif ( !jQuery.isFunction( fn ) ) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\t// Simulated bind\r\n\t\tvar args = slice.call( arguments, 2 ),\r\n\t\t\tproxy = function() {\r\n\t\t\t\treturn fn.apply( context, args.concat( slice.call( arguments ) ) );\r\n\t\t\t};\r\n\r\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\r\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\r\n\r\n\t\treturn proxy;\r\n\t},\r\n\r\n\t// Mutifunctional method to get and set values to a collection\r\n\t// The value/s can optionally be executed if it's a function\r\n\taccess: function( elems, fn, key, value, chainable, emptyGet, pass ) {\r\n\t\tvar exec,\r\n\t\t\tbulk = key == null,\r\n\t\t\ti = 0,\r\n\t\t\tlength = elems.length;\r\n\r\n\t\t// Sets many values\r\n\t\tif ( key && typeof key === \"object\" ) {\r\n\t\t\tfor ( i in key ) {\r\n\t\t\t\tjQuery.access( elems, fn, i, key[i], 1, emptyGet, value );\r\n\t\t\t}\r\n\t\t\tchainable = 1;\r\n\r\n\t\t// Sets one value\r\n\t\t} else if ( value !== undefined ) {\r\n\t\t\t// Optionally, function values get executed if exec is true\r\n\t\t\texec = pass === undefined && jQuery.isFunction( value );\r\n\r\n\t\t\tif ( bulk ) {\r\n\t\t\t\t// Bulk operations only iterate when executing function values\r\n\t\t\t\tif ( exec ) {\r\n\t\t\t\t\texec = fn;\r\n\t\t\t\t\tfn = function( elem, key, value ) {\r\n\t\t\t\t\t\treturn exec.call( jQuery( elem ), value );\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t// Otherwise they run against the entire set\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfn.call( elems, value );\r\n\t\t\t\t\tfn = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( fn ) {\r\n\t\t\t\tfor (; i < length; i++ ) {\r\n\t\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tchainable = 1;\r\n\t\t}\r\n\r\n\t\treturn chainable ?\r\n\t\t\telems :\r\n\r\n\t\t\t// Gets\r\n\t\t\tbulk ?\r\n\t\t\t\tfn.call( elems ) :\r\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\r\n\t},\r\n\r\n\tnow: function() {\r\n\t\treturn ( new Date() ).getTime();\r\n\t},\r\n\r\n\t// Use of jQuery.browser is frowned upon.\r\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\r\n\tuaMatch: function( ua ) {\r\n\t\tua = ua.toLowerCase();\r\n\r\n\t\tvar match = rwebkit.exec( ua ) ||\r\n\t\t\tropera.exec( ua ) ||\r\n\t\t\trmsie.exec( ua ) ||\r\n\t\t\tua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\r\n\t\t\t[];\r\n\r\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\r\n\t},\r\n\r\n\tsub: function() {\r\n\t\tfunction jQuerySub( selector, context ) {\r\n\t\t\treturn new jQuerySub.fn.init( selector, context );\r\n\t\t}\r\n\t\tjQuery.extend( true, jQuerySub, this );\r\n\t\tjQuerySub.superclass = this;\r\n\t\tjQuerySub.fn = jQuerySub.prototype = this();\r\n\t\tjQuerySub.fn.constructor = jQuerySub;\r\n\t\tjQuerySub.sub = this.sub;\r\n\t\tjQuerySub.fn.init = function init( selector, context ) {\r\n\t\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\r\n\t\t\t\tcontext = jQuerySub( context );\r\n\t\t\t}\r\n\r\n\t\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\r\n\t\t};\r\n\t\tjQuerySub.fn.init.prototype = jQuerySub.fn;\r\n\t\tvar rootjQuerySub = jQuerySub(document);\r\n\t\treturn jQuerySub;\r\n\t},\r\n\r\n\tbrowser: {}\r\n});\r\n\r\n// Populate the class2type map\r\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\r\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\r\n});\r\n\r\nbrowserMatch = jQuery.uaMatch( userAgent );\r\nif ( browserMatch.browser ) {\r\n\tjQuery.browser[ browserMatch.browser ] = true;\r\n\tjQuery.browser.version = browserMatch.version;\r\n}\r\n\r\n// Deprecated, use jQuery.browser.webkit instead\r\nif ( jQuery.browser.webkit ) {\r\n\tjQuery.browser.safari = true;\r\n}\r\n\r\n// IE doesn't match non-breaking spaces with \\s\r\nif ( rnotwhite.test( \"\\xA0\" ) ) {\r\n\ttrimLeft = /^[\\s\\xA0]+/;\r\n\ttrimRight = /[\\s\\xA0]+$/;\r\n}\r\n\r\n// All jQuery objects should point back to these\r\nrootjQuery = jQuery(document);\r\n\r\n// Cleanup functions for the document ready method\r\nif ( document.addEventListener ) {\r\n\tDOMContentLoaded = function() {\r\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\r\n\t\tjQuery.ready();\r\n\t};\r\n\r\n} else if ( document.attachEvent ) {\r\n\tDOMContentLoaded = function() {\r\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\r\n\t\tif ( document.readyState === \"complete\" ) {\r\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\r\n\t\t\tjQuery.ready();\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// The DOM ready check for Internet Explorer\r\nfunction doScrollCheck() {\r\n\tif ( jQuery.isReady ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttry {\r\n\t\t// If IE is used, use the trick by Diego Perini\r\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\r\n\t\tdocument.documentElement.doScroll(\"left\");\r\n\t} catch(e) {\r\n\t\tsetTimeout( doScrollCheck, 1 );\r\n\t\treturn;\r\n\t}\r\n\r\n\t// and execute any waiting functions\r\n\tjQuery.ready();\r\n}\r\n\r\nreturn jQuery;\r\n\r\n})();\r\n\r\n\r\n// String to Object flags format cache\r\nvar flagsCache = {};\r\n\r\n// Convert String-formatted flags into Object-formatted ones and store in cache\r\nfunction createFlags( flags ) {\r\n\tvar object = flagsCache[ flags ] = {},\r\n\t\ti, length;\r\n\tflags = flags.split( /\\s+/ );\r\n\tfor ( i = 0, length = flags.length; i < length; i++ ) {\r\n\t\tobject[ flags[i] ] = true;\r\n\t}\r\n\treturn object;\r\n}\r\n\r\n/*\r\n * Create a callback list using the following parameters:\r\n *\r\n *\tflags:\tan optional list of space-separated flags that will change how\r\n *\t\t\tthe callback list behaves\r\n *\r\n * By default a callback list will act like an event callback list and can be\r\n * \"fired\" multiple times.\r\n *\r\n * Possible flags:\r\n *\r\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\r\n *\r\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\r\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\r\n *\t\t\t\t\tvalues (like a Deferred)\r\n *\r\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\r\n *\r\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\r\n *\r\n */\r\njQuery.Callbacks = function( flags ) {\r\n\r\n\t// Convert flags from String-formatted to Object-formatted\r\n\t// (we check in cache first)\r\n\tflags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};\r\n\r\n\tvar // Actual callback list\r\n\t\tlist = [],\r\n\t\t// Stack of fire calls for repeatable lists\r\n\t\tstack = [],\r\n\t\t// Last fire value (for non-forgettable lists)\r\n\t\tmemory,\r\n\t\t// Flag to know if list was already fired\r\n\t\tfired,\r\n\t\t// Flag to know if list is currently firing\r\n\t\tfiring,\r\n\t\t// First callback to fire (used internally by add and fireWith)\r\n\t\tfiringStart,\r\n\t\t// End of the loop when firing\r\n\t\tfiringLength,\r\n\t\t// Index of currently firing callback (modified by remove if needed)\r\n\t\tfiringIndex,\r\n\t\t// Add one or several callbacks to the list\r\n\t\tadd = function( args ) {\r\n\t\t\tvar i,\r\n\t\t\t\tlength,\r\n\t\t\t\telem,\r\n\t\t\t\ttype,\r\n\t\t\t\tactual;\r\n\t\t\tfor ( i = 0, length = args.length; i < length; i++ ) {\r\n\t\t\t\telem = args[ i ];\r\n\t\t\t\ttype = jQuery.type( elem );\r\n\t\t\t\tif ( type === \"array\" ) {\r\n\t\t\t\t\t// Inspect recursively\r\n\t\t\t\t\tadd( elem );\r\n\t\t\t\t} else if ( type === \"function\" ) {\r\n\t\t\t\t\t// Add if not in unique mode and callback is not in\r\n\t\t\t\t\tif ( !flags.unique || !self.has( elem ) ) {\r\n\t\t\t\t\t\tlist.push( elem );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// Fire callbacks\r\n\t\tfire = function( context, args ) {\r\n\t\t\targs = args || [];\r\n\t\t\tmemory = !flags.memory || [ context, args ];\r\n\t\t\tfired = true;\r\n\t\t\tfiring = true;\r\n\t\t\tfiringIndex = firingStart || 0;\r\n\t\t\tfiringStart = 0;\r\n\t\t\tfiringLength = list.length;\r\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\r\n\t\t\t\tif ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {\r\n\t\t\t\t\tmemory = true; // Mark as halted\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfiring = false;\r\n\t\t\tif ( list ) {\r\n\t\t\t\tif ( !flags.once ) {\r\n\t\t\t\t\tif ( stack && stack.length ) {\r\n\t\t\t\t\t\tmemory = stack.shift();\r\n\t\t\t\t\t\tself.fireWith( memory[ 0 ], memory[ 1 ] );\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if ( memory === true ) {\r\n\t\t\t\t\tself.disable();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlist = [];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// Actual Callbacks object\r\n\t\tself = {\r\n\t\t\t// Add a callback or a collection of callbacks to the list\r\n\t\t\tadd: function() {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\tvar length = list.length;\r\n\t\t\t\t\tadd( arguments );\r\n\t\t\t\t\t// Do we need to add the callbacks to the\r\n\t\t\t\t\t// current firing batch?\r\n\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\tfiringLength = list.length;\r\n\t\t\t\t\t// With memory, if we're not firing then\r\n\t\t\t\t\t// we should call right away, unless previous\r\n\t\t\t\t\t// firing was halted (stopOnFalse)\r\n\t\t\t\t\t} else if ( memory && memory !== true ) {\r\n\t\t\t\t\t\tfiringStart = length;\r\n\t\t\t\t\t\tfire( memory[ 0 ], memory[ 1 ] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Remove a callback from the list\r\n\t\t\tremove: function() {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\tvar args = arguments,\r\n\t\t\t\t\t\targIndex = 0,\r\n\t\t\t\t\t\targLength = args.length;\r\n\t\t\t\t\tfor ( ; argIndex < argLength ; argIndex++ ) {\r\n\t\t\t\t\t\tfor ( var i = 0; i < list.length; i++ ) {\r\n\t\t\t\t\t\t\tif ( args[ argIndex ] === list[ i ] ) {\r\n\t\t\t\t\t\t\t\t// Handle firingIndex and firingLength\r\n\t\t\t\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\t\t\t\tif ( i <= firingLength ) {\r\n\t\t\t\t\t\t\t\t\t\tfiringLength--;\r\n\t\t\t\t\t\t\t\t\t\tif ( i <= firingIndex ) {\r\n\t\t\t\t\t\t\t\t\t\t\tfiringIndex--;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// Remove the element\r\n\t\t\t\t\t\t\t\tlist.splice( i--, 1 );\r\n\t\t\t\t\t\t\t\t// If we have some unicity property then\r\n\t\t\t\t\t\t\t\t// we only need to do this once\r\n\t\t\t\t\t\t\t\tif ( flags.unique ) {\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Control if a given callback is in the list\r\n\t\t\thas: function( fn ) {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\tvar i = 0,\r\n\t\t\t\t\t\tlength = list.length;\r\n\t\t\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\t\t\tif ( fn === list[ i ] ) {\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t},\r\n\t\t\t// Remove all callbacks from the list\r\n\t\t\tempty: function() {\r\n\t\t\t\tlist = [];\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Have the list do nothing anymore\r\n\t\t\tdisable: function() {\r\n\t\t\t\tlist = stack = memory = undefined;\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Is it disabled?\r\n\t\t\tdisabled: function() {\r\n\t\t\t\treturn !list;\r\n\t\t\t},\r\n\t\t\t// Lock the list in its current state\r\n\t\t\tlock: function() {\r\n\t\t\t\tstack = undefined;\r\n\t\t\t\tif ( !memory || memory === true ) {\r\n\t\t\t\t\tself.disable();\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Is it locked?\r\n\t\t\tlocked: function() {\r\n\t\t\t\treturn !stack;\r\n\t\t\t},\r\n\t\t\t// Call all callbacks with the given context and arguments\r\n\t\t\tfireWith: function( context, args ) {\r\n\t\t\t\tif ( stack ) {\r\n\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\tif ( !flags.once ) {\r\n\t\t\t\t\t\t\tstack.push( [ context, args ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if ( !( flags.once && memory ) ) {\r\n\t\t\t\t\t\tfire( context, args );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Call all the callbacks with the given arguments\r\n\t\t\tfire: function() {\r\n\t\t\t\tself.fireWith( this, arguments );\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// To know if the callbacks have already been called at least once\r\n\t\t\tfired: function() {\r\n\t\t\t\treturn !!fired;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\treturn self;\r\n};\r\n\r\n\r\n\r\n\r\nvar // Static reference to slice\r\n\tsliceDeferred = [].slice;\r\n\r\njQuery.extend({\r\n\r\n\tDeferred: function( func ) {\r\n\t\tvar doneList = jQuery.Callbacks( \"once memory\" ),\r\n\t\t\tfailList = jQuery.Callbacks( \"once memory\" ),\r\n\t\t\tprogressList = jQuery.Callbacks( \"memory\" ),\r\n\t\t\tstate = \"pending\",\r\n\t\t\tlists = {\r\n\t\t\t\tresolve: doneList,\r\n\t\t\t\treject: failList,\r\n\t\t\t\tnotify: progressList\r\n\t\t\t},\r\n\t\t\tpromise = {\r\n\t\t\t\tdone: doneList.add,\r\n\t\t\t\tfail: failList.add,\r\n\t\t\t\tprogress: progressList.add,\r\n\r\n\t\t\t\tstate: function() {\r\n\t\t\t\t\treturn state;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Deprecated\r\n\t\t\t\tisResolved: doneList.fired,\r\n\t\t\t\tisRejected: failList.fired,\r\n\r\n\t\t\t\tthen: function( doneCallbacks, failCallbacks, progressCallbacks ) {\r\n\t\t\t\t\tdeferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\t\t\t\talways: function() {\r\n\t\t\t\t\tdeferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\t\t\t\tpipe: function( fnDone, fnFail, fnProgress ) {\r\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\r\n\t\t\t\t\t\tjQuery.each( {\r\n\t\t\t\t\t\t\tdone: [ fnDone, \"resolve\" ],\r\n\t\t\t\t\t\t\tfail: [ fnFail, \"reject\" ],\r\n\t\t\t\t\t\t\tprogress: [ fnProgress, \"notify\" ]\r\n\t\t\t\t\t\t}, function( handler, data ) {\r\n\t\t\t\t\t\t\tvar fn = data[ 0 ],\r\n\t\t\t\t\t\t\t\taction = data[ 1 ],\r\n\t\t\t\t\t\t\t\treturned;\r\n\t\t\t\t\t\t\tif ( jQuery.isFunction( fn ) ) {\r\n\t\t\t\t\t\t\t\tdeferred[ handler ](function() {\r\n\t\t\t\t\t\t\t\t\treturned = fn.apply( this, arguments );\r\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\r\n\t\t\t\t\t\t\t\t\t\treturned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tdeferred[ handler ]( newDefer[ action ] );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}).promise();\r\n\t\t\t\t},\r\n\t\t\t\t// Get a promise for this deferred\r\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\r\n\t\t\t\tpromise: function( obj ) {\r\n\t\t\t\t\tif ( obj == null ) {\r\n\t\t\t\t\t\tobj = promise;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor ( var key in promise ) {\r\n\t\t\t\t\t\t\tobj[ key ] = promise[ key ];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn obj;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tdeferred = promise.promise({}),\r\n\t\t\tkey;\r\n\r\n\t\tfor ( key in lists ) {\r\n\t\t\tdeferred[ key ] = lists[ key ].fire;\r\n\t\t\tdeferred[ key + \"With\" ] = lists[ key ].fireWith;\r\n\t\t}\r\n\r\n\t\t// Handle state\r\n\t\tdeferred.done( function() {\r\n\t\t\tstate = \"resolved\";\r\n\t\t}, failList.disable, progressList.lock ).fail( function() {\r\n\t\t\tstate = \"rejected\";\r\n\t\t}, doneList.disable, progressList.lock );\r\n\r\n\t\t// Call given func if any\r\n\t\tif ( func ) {\r\n\t\t\tfunc.call( deferred, deferred );\r\n\t\t}\r\n\r\n\t\t// All done!\r\n\t\treturn deferred;\r\n\t},\r\n\r\n\t// Deferred helper\r\n\twhen: function( firstParam ) {\r\n\t\tvar args = sliceDeferred.call( arguments, 0 ),\r\n\t\t\ti = 0,\r\n\t\t\tlength = args.length,\r\n\t\t\tpValues = new Array( length ),\r\n\t\t\tcount = length,\r\n\t\t\tpCount = length,\r\n\t\t\tdeferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\r\n\t\t\t\tfirstParam :\r\n\t\t\t\tjQuery.Deferred(),\r\n\t\t\tpromise = deferred.promise();\r\n\t\tfunction resolveFunc( i ) {\r\n\t\t\treturn function( value ) {\r\n\t\t\t\targs[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\r\n\t\t\t\tif ( !( --count ) ) {\r\n\t\t\t\t\tdeferred.resolveWith( deferred, args );\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t\tfunction progressFunc( i ) {\r\n\t\t\treturn function( value ) {\r\n\t\t\t\tpValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\r\n\t\t\t\tdeferred.notifyWith( promise, pValues );\r\n\t\t\t};\r\n\t\t}\r\n\t\tif ( length > 1 ) {\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tif ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {\r\n\t\t\t\t\targs[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t--count;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ( !count ) {\r\n\t\t\t\tdeferred.resolveWith( deferred, args );\r\n\t\t\t}\r\n\t\t} else if ( deferred !== firstParam ) {\r\n\t\t\tdeferred.resolveWith( deferred, length ? [ firstParam ] : [] );\r\n\t\t}\r\n\t\treturn promise;\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\njQuery.support = (function() {\r\n\r\n\tvar support,\r\n\t\tall,\r\n\t\ta,\r\n\t\tselect,\r\n\t\topt,\r\n\t\tinput,\r\n\t\tfragment,\r\n\t\ttds,\r\n\t\tevents,\r\n\t\teventName,\r\n\t\ti,\r\n\t\tisSupported,\r\n\t\tdiv = document.createElement( \"div\" ),\r\n\t\tdocumentElement = document.documentElement;\r\n\r\n\t// Preliminary tests\r\n\tdiv.setAttribute(\"className\", \"t\");\r\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\r\n\r\n\tall = div.getElementsByTagName( \"*\" );\r\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\r\n\r\n\t// Can't get basic test support\r\n\tif ( !all || !all.length || !a ) {\r\n\t\treturn {};\r\n\t}\r\n\r\n\t// First batch of supports tests\r\n\tselect = document.createElement( \"select\" );\r\n\topt = select.appendChild( document.createElement(\"option\") );\r\n\tinput = div.getElementsByTagName( \"input\" )[ 0 ];\r\n\r\n\tsupport = {\r\n\t\t// IE strips leading whitespace when .innerHTML is used\r\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\r\n\r\n\t\t// Make sure that tbody elements aren't automatically inserted\r\n\t\t// IE will insert them into empty tables\r\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\r\n\r\n\t\t// Make sure that link elements get serialized correctly by innerHTML\r\n\t\t// This requires a wrapper element in IE\r\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\r\n\r\n\t\t// Get the style information from getAttribute\r\n\t\t// (IE uses .cssText instead)\r\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\r\n\r\n\t\t// Make sure that URLs aren't manipulated\r\n\t\t// (IE normalizes it by default)\r\n\t\threfNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\r\n\r\n\t\t// Make sure that element opacity exists\r\n\t\t// (IE uses filter instead)\r\n\t\t// Use a regex to work around a WebKit issue. See #5145\r\n\t\topacity: /^0.55/.test( a.style.opacity ),\r\n\r\n\t\t// Verify style float existence\r\n\t\t// (IE uses styleFloat instead of cssFloat)\r\n\t\tcssFloat: !!a.style.cssFloat,\r\n\r\n\t\t// Make sure that if no value is specified for a checkbox\r\n\t\t// that it defaults to \"on\".\r\n\t\t// (WebKit defaults to \"\" instead)\r\n\t\tcheckOn: ( input.value === \"on\" ),\r\n\r\n\t\t// Make sure that a selected-by-default option has a working selected property.\r\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\r\n\t\toptSelected: opt.selected,\r\n\r\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\r\n\t\tgetSetAttribute: div.className !== \"t\",\r\n\r\n\t\t// Tests for enctype support on a form(#6743)\r\n\t\tenctype: !!document.createElement(\"form\").enctype,\r\n\r\n\t\t// Makes sure cloning an html5 element does not cause problems\r\n\t\t// Where outerHTML is undefined, this still works\r\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\r\n\r\n\t\t// Will be defined later\r\n\t\tsubmitBubbles: true,\r\n\t\tchangeBubbles: true,\r\n\t\tfocusinBubbles: false,\r\n\t\tdeleteExpando: true,\r\n\t\tnoCloneEvent: true,\r\n\t\tinlineBlockNeedsLayout: false,\r\n\t\tshrinkWrapBlocks: false,\r\n\t\treliableMarginRight: true,\r\n\t\tpixelMargin: true\r\n\t};\r\n\r\n\t// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead\r\n\tjQuery.boxModel = support.boxModel = (document.compatMode === \"CSS1Compat\");\r\n\r\n\t// Make sure checked status is properly cloned\r\n\tinput.checked = true;\r\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\r\n\r\n\t// Make sure that the options inside disabled selects aren't marked as disabled\r\n\t// (WebKit marks them as disabled)\r\n\tselect.disabled = true;\r\n\tsupport.optDisabled = !opt.disabled;\r\n\r\n\t// Test to see if it's possible to delete an expando from an element\r\n\t// Fails in Internet Explorer\r\n\ttry {\r\n\t\tdelete div.test;\r\n\t} catch( e ) {\r\n\t\tsupport.deleteExpando = false;\r\n\t}\r\n\r\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\r\n\t\tdiv.attachEvent( \"onclick\", function() {\r\n\t\t\t// Cloning a node shouldn't copy over any\r\n\t\t\t// bound event handlers (IE does this)\r\n\t\t\tsupport.noCloneEvent = false;\r\n\t\t});\r\n\t\tdiv.cloneNode( true ).fireEvent( \"onclick\" );\r\n\t}\r\n\r\n\t// Check if a radio maintains its value\r\n\t// after being appended to the DOM\r\n\tinput = document.createElement(\"input\");\r\n\tinput.value = \"t\";\r\n\tinput.setAttribute(\"type\", \"radio\");\r\n\tsupport.radioValue = input.value === \"t\";\r\n\r\n\tinput.setAttribute(\"checked\", \"checked\");\r\n\r\n\t// #11217 - WebKit loses check when the name is after the checked attribute\r\n\tinput.setAttribute( \"name\", \"t\" );\r\n\r\n\tdiv.appendChild( input );\r\n\tfragment = document.createDocumentFragment();\r\n\tfragment.appendChild( div.lastChild );\r\n\r\n\t// WebKit doesn't clone checked state correctly in fragments\r\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\r\n\r\n\t// Check if a disconnected checkbox will retain its checked\r\n\t// value of true after appended to the DOM (IE6/7)\r\n\tsupport.appendChecked = input.checked;\r\n\r\n\tfragment.removeChild( input );\r\n\tfragment.appendChild( div );\r\n\r\n\t// Technique from Juriy Zaytsev\r\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\r\n\t// We only care about the case where non-standard event systems\r\n\t// are used, namely in IE. Short-circuiting here helps us to\r\n\t// avoid an eval call (in setAttribute) which can cause CSP\r\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\r\n\tif ( div.attachEvent ) {\r\n\t\tfor ( i in {\r\n\t\t\tsubmit: 1,\r\n\t\t\tchange: 1,\r\n\t\t\tfocusin: 1\r\n\t\t}) {\r\n\t\t\teventName = \"on\" + i;\r\n\t\t\tisSupported = ( eventName in div );\r\n\t\t\tif ( !isSupported ) {\r\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\r\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\r\n\t\t\t}\r\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\r\n\t\t}\r\n\t}\r\n\r\n\tfragment.removeChild( div );\r\n\r\n\t// Null elements to avoid leaks in IE\r\n\tfragment = select = opt = div = input = null;\r\n\r\n\t// Run tests that need a body at doc ready\r\n\tjQuery(function() {\r\n\t\tvar container, outer, inner, table, td, offsetSupport,\r\n\t\t\tmarginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,\r\n\t\t\tpaddingMarginBorderVisibility, paddingMarginBorder,\r\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\r\n\r\n\t\tif ( !body ) {\r\n\t\t\t// Return for frameset docs that don't have a body\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconMarginTop = 1;\r\n\t\tpaddingMarginBorder = \"padding:0;margin:0;border:\";\r\n\t\tpositionTopLeftWidthHeight = \"position:absolute;top:0;left:0;width:1px;height:1px;\";\r\n\t\tpaddingMarginBorderVisibility = paddingMarginBorder + \"0;visibility:hidden;\";\r\n\t\tstyle = \"style='\" + positionTopLeftWidthHeight + paddingMarginBorder + \"5px solid #000;\";\r\n\t\thtml = \"<div \" + style + \"display:block;'><div style='\" + paddingMarginBorder + \"0;display:block;overflow:hidden;'></div></div>\" +\r\n\t\t\t\"<table \" + style + \"' cellpadding='0' cellspacing='0'>\" +\r\n\t\t\t\"<tr><td></td></tr></table>\";\r\n\r\n\t\tcontainer = document.createElement(\"div\");\r\n\t\tcontainer.style.cssText = paddingMarginBorderVisibility + \"width:0;height:0;position:static;top:0;margin-top:\" + conMarginTop + \"px\";\r\n\t\tbody.insertBefore( container, body.firstChild );\r\n\r\n\t\t// Construct the test element\r\n\t\tdiv = document.createElement(\"div\");\r\n\t\tcontainer.appendChild( div );\r\n\r\n\t\t// Check if table cells still have offsetWidth/Height when they are set\r\n\t\t// to display:none and there are still other visible table cells in a\r\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\r\n\t\t// determining if an element has been hidden directly using\r\n\t\t// display:none (it is still safe to use offsets if a parent element is\r\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\r\n\t\t// (only IE 8 fails this test)\r\n\t\tdiv.innerHTML = \"<table><tr><td style='\" + paddingMarginBorder + \"0;display:none'></td><td>t</td></tr></table>\";\r\n\t\ttds = div.getElementsByTagName( \"td\" );\r\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\r\n\r\n\t\ttds[ 0 ].style.display = \"\";\r\n\t\ttds[ 1 ].style.display = \"none\";\r\n\r\n\t\t// Check if empty table cells still have offsetWidth/Height\r\n\t\t// (IE <= 8 fail this test)\r\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\r\n\r\n\t\t// Check if div with explicit width and no margin-right incorrectly\r\n\t\t// gets computed margin-right based on width of container. For more\r\n\t\t// info see bug #3333\r\n\t\t// Fails in WebKit before Feb 2011 nightlies\r\n\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\r\n\t\tif ( window.getComputedStyle ) {\r\n\t\t\tdiv.innerHTML = \"\";\r\n\t\t\tmarginDiv = document.createElement( \"div\" );\r\n\t\t\tmarginDiv.style.width = \"0\";\r\n\t\t\tmarginDiv.style.marginRight = \"0\";\r\n\t\t\tdiv.style.width = \"2px\";\r\n\t\t\tdiv.appendChild( marginDiv );\r\n\t\t\tsupport.reliableMarginRight =\r\n\t\t\t\t( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\r\n\t\t}\r\n\r\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\r\n\t\t\t// Check if natively block-level elements act like inline-block\r\n\t\t\t// elements when setting their display to 'inline' and giving\r\n\t\t\t// them layout\r\n\t\t\t// (IE < 8 does this)\r\n\t\t\tdiv.innerHTML = \"\";\r\n\t\t\tdiv.style.width = div.style.padding = \"1px\";\r\n\t\t\tdiv.style.border = 0;\r\n\t\t\tdiv.style.overflow = \"hidden\";\r\n\t\t\tdiv.style.display = \"inline\";\r\n\t\t\tdiv.style.zoom = 1;\r\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\r\n\r\n\t\t\t// Check if elements with layout shrink-wrap their children\r\n\t\t\t// (IE 6 does this)\r\n\t\t\tdiv.style.display = \"block\";\r\n\t\t\tdiv.style.overflow = \"visible\";\r\n\t\t\tdiv.innerHTML = \"<div style='width:5px;'></div>\";\r\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\r\n\t\t}\r\n\r\n\t\tdiv.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;\r\n\t\tdiv.innerHTML = html;\r\n\r\n\t\touter = div.firstChild;\r\n\t\tinner = outer.firstChild;\r\n\t\ttd = outer.nextSibling.firstChild.firstChild;\r\n\r\n\t\toffsetSupport = {\r\n\t\t\tdoesNotAddBorder: ( inner.offsetTop !== 5 ),\r\n\t\t\tdoesAddBorderForTableAndCells: ( td.offsetTop === 5 )\r\n\t\t};\r\n\r\n\t\tinner.style.position = \"fixed\";\r\n\t\tinner.style.top = \"20px\";\r\n\r\n\t\t// safari subtracts parent border width here which is 5px\r\n\t\toffsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );\r\n\t\tinner.style.position = inner.style.top = \"\";\r\n\r\n\t\touter.style.overflow = \"hidden\";\r\n\t\touter.style.position = \"relative\";\r\n\r\n\t\toffsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );\r\n\t\toffsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );\r\n\r\n\t\tif ( window.getComputedStyle ) {\r\n\t\t\tdiv.style.marginTop = \"1%\";\r\n\t\t\tsupport.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== \"1%\";\r\n\t\t}\r\n\r\n\t\tif ( typeof container.style.zoom !== \"undefined\" ) {\r\n\t\t\tcontainer.style.zoom = 1;\r\n\t\t}\r\n\r\n\t\tbody.removeChild( container );\r\n\t\tmarginDiv = div = container = null;\r\n\r\n\t\tjQuery.extend( support, offsetSupport );\r\n\t});\r\n\r\n\treturn support;\r\n})();\r\n\r\n\r\n\r\n\r\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\r\n\trmultiDash = /([A-Z])/g;\r\n\r\njQuery.extend({\r\n\tcache: {},\r\n\r\n\t// Please use with caution\r\n\tuuid: 0,\r\n\r\n\t// Unique for each copy of jQuery on the page\r\n\t// Non-digits removed to match rinlinejQuery\r\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\r\n\r\n\t// The following elements throw uncatchable exceptions if you\r\n\t// attempt to add expando properties to them.\r\n\tnoData: {\r\n\t\t\"embed\": true,\r\n\t\t// Ban all objects except for Flash (which handle expandos)\r\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\r\n\t\t\"applet\": true\r\n\t},\r\n\r\n\thasData: function( elem ) {\r\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\r\n\t\treturn !!elem && !isEmptyDataObject( elem );\r\n\t},\r\n\r\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\r\n\t\tif ( !jQuery.acceptData( elem ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar privateCache, thisCache, ret,\r\n\t\t\tinternalKey = jQuery.expando,\r\n\t\t\tgetByName = typeof name === \"string\",\r\n\r\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\r\n\t\t\t// can't GC object references properly across the DOM-JS boundary\r\n\t\t\tisNode = elem.nodeType,\r\n\r\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\r\n\t\t\t// attached directly to the object so GC can occur automatically\r\n\t\t\tcache = isNode ? jQuery.cache : elem,\r\n\r\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\r\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\r\n\t\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,\r\n\t\t\tisEvents = name === \"events\";\r\n\r\n\t\t// Avoid doing any more work than we need to when trying to get data on an\r\n\t\t// object that has no data at all\r\n\t\tif ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( !id ) {\r\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\r\n\t\t\t// ends up in the global cache\r\n\t\t\tif ( isNode ) {\r\n\t\t\t\telem[ internalKey ] = id = ++jQuery.uuid;\r\n\t\t\t} else {\r\n\t\t\t\tid = internalKey;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( !cache[ id ] ) {\r\n\t\t\tcache[ id ] = {};\r\n\r\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\r\n\t\t\t// is serialized using JSON.stringify\r\n\t\t\tif ( !isNode ) {\r\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\r\n\t\t// shallow copied over onto the existing cache\r\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\r\n\t\t\tif ( pvt ) {\r\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\r\n\t\t\t} else {\r\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivateCache = thisCache = cache[ id ];\r\n\r\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\r\n\t\t// cache in order to avoid key collisions between internal data and user-defined\r\n\t\t// data.\r\n\t\tif ( !pvt ) {\r\n\t\t\tif ( !thisCache.data ) {\r\n\t\t\t\tthisCache.data = {};\r\n\t\t\t}\r\n\r\n\t\t\tthisCache = thisCache.data;\r\n\t\t}\r\n\r\n\t\tif ( data !== undefined ) {\r\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\r\n\t\t}\r\n\r\n\t\t// Users should not attempt to inspect the internal events object using jQuery.data,\r\n\t\t// it is undocumented and subject to change. But does anyone listen? No.\r\n\t\tif ( isEvents && !thisCache[ name ] ) {\r\n\t\t\treturn privateCache.events;\r\n\t\t}\r\n\r\n\t\t// Check for both converted-to-camel and non-converted data property names\r\n\t\t// If a data property was specified\r\n\t\tif ( getByName ) {\r\n\r\n\t\t\t// First Try to find as-is property data\r\n\t\t\tret = thisCache[ name ];\r\n\r\n\t\t\t// Test for null|undefined property data\r\n\t\t\tif ( ret == null ) {\r\n\r\n\t\t\t\t// Try to find the camelCased property\r\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tret = thisCache;\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\r\n\t\tif ( !jQuery.acceptData( elem ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar thisCache, i, l,\r\n\r\n\t\t\t// Reference to internal data cache key\r\n\t\t\tinternalKey = jQuery.expando,\r\n\r\n\t\t\tisNode = elem.nodeType,\r\n\r\n\t\t\t// See jQuery.data for more information\r\n\t\t\tcache = isNode ? jQuery.cache : elem,\r\n\r\n\t\t\t// See jQuery.data for more information\r\n\t\t\tid = isNode ? elem[ internalKey ] : internalKey;\r\n\r\n\t\t// If there is already no cache entry for this object, there is no\r\n\t\t// purpose in continuing\r\n\t\tif ( !cache[ id ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( name ) {\r\n\r\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\r\n\r\n\t\t\tif ( thisCache ) {\r\n\r\n\t\t\t\t// Support array or space separated string names for data keys\r\n\t\t\t\tif ( !jQuery.isArray( name ) ) {\r\n\r\n\t\t\t\t\t// try the string as a key before any manipulation\r\n\t\t\t\t\tif ( name in thisCache ) {\r\n\t\t\t\t\t\tname = [ name ];\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\r\n\t\t\t\t\t\tname = jQuery.camelCase( name );\r\n\t\t\t\t\t\tif ( name in thisCache ) {\r\n\t\t\t\t\t\t\tname = [ name ];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tname = name.split( \" \" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\r\n\t\t\t\t\tdelete thisCache[ name[i] ];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If there is no data left in the cache, we want to continue\r\n\t\t\t\t// and let the cache object itself get destroyed\r\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// See jQuery.data for more information\r\n\t\tif ( !pvt ) {\r\n\t\t\tdelete cache[ id ].data;\r\n\r\n\t\t\t// Don't destroy the parent cache unless the internal data object\r\n\t\t\t// had been the only thing left in it\r\n\t\t\tif ( !isEmptyDataObject(cache[ id ]) ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Browsers that fail expando deletion also refuse to delete expandos on\r\n\t\t// the window, but it will allow it on all other JS objects; other browsers\r\n\t\t// don't care\r\n\t\t// Ensure that `cache` is not a window object #10080\r\n\t\tif ( jQuery.support.deleteExpando || !cache.setInterval ) {\r\n\t\t\tdelete cache[ id ];\r\n\t\t} else {\r\n\t\t\tcache[ id ] = null;\r\n\t\t}\r\n\r\n\t\t// We destroyed the cache and need to eliminate the expando on the node to avoid\r\n\t\t// false lookups in the cache for entries that no longer exist\r\n\t\tif ( isNode ) {\r\n\t\t\t// IE does not allow us to delete expando properties from nodes,\r\n\t\t\t// nor does it have a removeAttribute function on Document nodes;\r\n\t\t\t// we must handle all of these cases\r\n\t\t\tif ( jQuery.support.deleteExpando ) {\r\n\t\t\t\tdelete elem[ internalKey ];\r\n\t\t\t} else if ( elem.removeAttribute ) {\r\n\t\t\t\telem.removeAttribute( internalKey );\r\n\t\t\t} else {\r\n\t\t\t\telem[ internalKey ] = null;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// For internal use only.\r\n\t_data: function( elem, name, data ) {\r\n\t\treturn jQuery.data( elem, name, data, true );\r\n\t},\r\n\r\n\t// A method for determining if a DOM node can handle the data expando\r\n\tacceptData: function( elem ) {\r\n\t\tif ( elem.nodeName ) {\r\n\t\t\tvar match = jQuery.noData[ elem.nodeName.toLowerCase() ];\r\n\r\n\t\t\tif ( match ) {\r\n\t\t\t\treturn !(match === true || elem.getAttribute(\"classid\") !== match);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\tdata: function( key, value ) {\r\n\t\tvar parts, part, attr, name, l,\r\n\t\t\telem = this[0],\r\n\t\t\ti = 0,\r\n\t\t\tdata = null;\r\n\r\n\t\t// Gets all values\r\n\t\tif ( key === undefined ) {\r\n\t\t\tif ( this.length ) {\r\n\t\t\t\tdata = jQuery.data( elem );\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\r\n\t\t\t\t\tattr = elem.attributes;\r\n\t\t\t\t\tfor ( l = attr.length; i < l; i++ ) {\r\n\t\t\t\t\t\tname = attr[i].name;\r\n\r\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\r\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\r\n\r\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn data;\r\n\t\t}\r\n\r\n\t\t// Sets multiple values\r\n\t\tif ( typeof key === \"object\" ) {\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tjQuery.data( this, key );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tparts = key.split( \".\", 2 );\r\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\r\n\t\tpart = parts[1] + \"!\";\r\n\r\n\t\treturn jQuery.access( this, function( value ) {\r\n\r\n\t\t\tif ( value === undefined ) {\r\n\t\t\t\tdata = this.triggerHandler( \"getData\" + part, [ parts[0] ] );\r\n\r\n\t\t\t\t// Try to fetch any internally stored data first\r\n\t\t\t\tif ( data === undefined && elem ) {\r\n\t\t\t\t\tdata = jQuery.data( elem, key );\r\n\t\t\t\t\tdata = dataAttr( elem, key, data );\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn data === undefined && parts[1] ?\r\n\t\t\t\t\tthis.data( parts[0] ) :\r\n\t\t\t\t\tdata;\r\n\t\t\t}\r\n\r\n\t\t\tparts[1] = value;\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar self = jQuery( this );\r\n\r\n\t\t\t\tself.triggerHandler( \"setData\" + part, parts );\r\n\t\t\t\tjQuery.data( this, key, value );\r\n\t\t\t\tself.triggerHandler( \"changeData\" + part, parts );\r\n\t\t\t});\r\n\t\t}, null, value, arguments.length > 1, null, false );\r\n\t},\r\n\r\n\tremoveData: function( key ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.removeData( this, key );\r\n\t\t});\r\n\t}\r\n});\r\n\r\nfunction dataAttr( elem, key, data ) {\r\n\t// If nothing was found internally, try to fetch any\r\n\t// data from the HTML5 data-* attribute\r\n\tif ( data === undefined && elem.nodeType === 1 ) {\r\n\r\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\r\n\r\n\t\tdata = elem.getAttribute( name );\r\n\r\n\t\tif ( typeof data === \"string\" ) {\r\n\t\t\ttry {\r\n\t\t\t\tdata = data === \"true\" ? true :\r\n\t\t\t\tdata === \"false\" ? false :\r\n\t\t\t\tdata === \"null\" ? null :\r\n\t\t\t\tjQuery.isNumeric( data ) ? +data :\r\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\r\n\t\t\t\t\tdata;\r\n\t\t\t} catch( e ) {}\r\n\r\n\t\t\t// Make sure we set the data so it isn't changed later\r\n\t\t\tjQuery.data( elem, key, data );\r\n\r\n\t\t} else {\r\n\t\t\tdata = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\treturn data;\r\n}\r\n\r\n// checks a cache object for emptiness\r\nfunction isEmptyDataObject( obj ) {\r\n\tfor ( var name in obj ) {\r\n\r\n\t\t// if the public data object is empty, the private is still empty\r\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif ( name !== \"toJSON\" ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n\r\n\r\nfunction handleQueueMarkDefer( elem, type, src ) {\r\n\tvar deferDataKey = type + \"defer\",\r\n\t\tqueueDataKey = type + \"queue\",\r\n\t\tmarkDataKey = type + \"mark\",\r\n\t\tdefer = jQuery._data( elem, deferDataKey );\r\n\tif ( defer &&\r\n\t\t( src === \"queue\" || !jQuery._data(elem, queueDataKey) ) &&\r\n\t\t( src === \"mark\" || !jQuery._data(elem, markDataKey) ) ) {\r\n\t\t// Give room for hard-coded callbacks to fire first\r\n\t\t// and eventually mark/queue something else on the element\r\n\t\tsetTimeout( function() {\r\n\t\t\tif ( !jQuery._data( elem, queueDataKey ) &&\r\n\t\t\t\t!jQuery._data( elem, markDataKey ) ) {\r\n\t\t\t\tjQuery.removeData( elem, deferDataKey, true );\r\n\t\t\t\tdefer.fire();\r\n\t\t\t}\r\n\t\t}, 0 );\r\n\t}\r\n}\r\n\r\njQuery.extend({\r\n\r\n\t_mark: function( elem, type ) {\r\n\t\tif ( elem ) {\r\n\t\t\ttype = ( type || \"fx\" ) + \"mark\";\r\n\t\t\tjQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );\r\n\t\t}\r\n\t},\r\n\r\n\t_unmark: function( force, elem, type ) {\r\n\t\tif ( force !== true ) {\r\n\t\t\ttype = elem;\r\n\t\t\telem = force;\r\n\t\t\tforce = false;\r\n\t\t}\r\n\t\tif ( elem ) {\r\n\t\t\ttype = type || \"fx\";\r\n\t\t\tvar key = type + \"mark\",\r\n\t\t\t\tcount = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );\r\n\t\t\tif ( count ) {\r\n\t\t\t\tjQuery._data( elem, key, count );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery.removeData( elem, key, true );\r\n\t\t\t\thandleQueueMarkDefer( elem, type, \"mark\" );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tqueue: function( elem, type, data ) {\r\n\t\tvar q;\r\n\t\tif ( elem ) {\r\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\r\n\t\t\tq = jQuery._data( elem, type );\r\n\r\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\r\n\t\t\tif ( data ) {\r\n\t\t\t\tif ( !q || jQuery.isArray(data) ) {\r\n\t\t\t\t\tq = jQuery._data( elem, type, jQuery.makeArray(data) );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tq.push( data );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn q || [];\r\n\t\t}\r\n\t},\r\n\r\n\tdequeue: function( elem, type ) {\r\n\t\ttype = type || \"fx\";\r\n\r\n\t\tvar queue = jQuery.queue( elem, type ),\r\n\t\t\tfn = queue.shift(),\r\n\t\t\thooks = {};\r\n\r\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\r\n\t\tif ( fn === \"inprogress\" ) {\r\n\t\t\tfn = queue.shift();\r\n\t\t}\r\n\r\n\t\tif ( fn ) {\r\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\r\n\t\t\t// automatically dequeued\r\n\t\t\tif ( type === \"fx\" ) {\r\n\t\t\t\tqueue.unshift( \"inprogress\" );\r\n\t\t\t}\r\n\r\n\t\t\tjQuery._data( elem, type + \".run\", hooks );\r\n\t\t\tfn.call( elem, function() {\r\n\t\t\t\tjQuery.dequeue( elem, type );\r\n\t\t\t}, hooks );\r\n\t\t}\r\n\r\n\t\tif ( !queue.length ) {\r\n\t\t\tjQuery.removeData( elem, type + \"queue \" + type + \".run\", true );\r\n\t\t\thandleQueueMarkDefer( elem, type, \"queue\" );\r\n\t\t}\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\tqueue: function( type, data ) {\r\n\t\tvar setter = 2;\r\n\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tdata = type;\r\n\t\t\ttype = \"fx\";\r\n\t\t\tsetter--;\r\n\t\t}\r\n\r\n\t\tif ( arguments.length < setter ) {\r\n\t\t\treturn jQuery.queue( this[0], type );\r\n\t\t}\r\n\r\n\t\treturn data === undefined ?\r\n\t\t\tthis :\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\r\n\r\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\r\n\t\t\t\t\tjQuery.dequeue( this, type );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\tdequeue: function( type ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.dequeue( this, type );\r\n\t\t});\r\n\t},\r\n\t// Based off of the plugin by Clint Helfers, with permission.\r\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\r\n\tdelay: function( time, type ) {\r\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\r\n\t\ttype = type || \"fx\";\r\n\r\n\t\treturn this.queue( type, function( next, hooks ) {\r\n\t\t\tvar timeout = setTimeout( next, time );\r\n\t\t\thooks.stop = function() {\r\n\t\t\t\tclearTimeout( timeout );\r\n\t\t\t};\r\n\t\t});\r\n\t},\r\n\tclearQueue: function( type ) {\r\n\t\treturn this.queue( type || \"fx\", [] );\r\n\t},\r\n\t// Get a promise resolved when queues of a certain type\r\n\t// are emptied (fx is the type by default)\r\n\tpromise: function( type, object ) {\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tobject = type;\r\n\t\t\ttype = undefined;\r\n\t\t}\r\n\t\ttype = type || \"fx\";\r\n\t\tvar defer = jQuery.Deferred(),\r\n\t\t\telements = this,\r\n\t\t\ti = elements.length,\r\n\t\t\tcount = 1,\r\n\t\t\tdeferDataKey = type + \"defer\",\r\n\t\t\tqueueDataKey = type + \"queue\",\r\n\t\t\tmarkDataKey = type + \"mark\",\r\n\t\t\ttmp;\r\n\t\tfunction resolve() {\r\n\t\t\tif ( !( --count ) ) {\r\n\t\t\t\tdefer.resolveWith( elements, [ elements ] );\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile( i-- ) {\r\n\t\t\tif (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\r\n\t\t\t\t\t( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\r\n\t\t\t\t\t\tjQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\r\n\t\t\t\t\tjQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( \"once memory\" ), true ) )) {\r\n\t\t\t\tcount++;\r\n\t\t\t\ttmp.add( resolve );\r\n\t\t\t}\r\n\t\t}\r\n\t\tresolve();\r\n\t\treturn defer.promise( object );\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar rclass = /[\\n\\t\\r]/g,\r\n\trspace = /\\s+/,\r\n\trreturn = /\\r/g,\r\n\trtype = /^(?:button|input)$/i,\r\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\r\n\trclickable = /^a(?:rea)?$/i,\r\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\r\n\tgetSetAttribute = jQuery.support.getSetAttribute,\r\n\tnodeHook, boolHook, fixSpecified;\r\n\r\njQuery.fn.extend({\r\n\tattr: function( name, value ) {\r\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\r\n\t},\r\n\r\n\tremoveAttr: function( name ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.removeAttr( this, name );\r\n\t\t});\r\n\t},\r\n\r\n\tprop: function( name, value ) {\r\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\r\n\t},\r\n\r\n\tremoveProp: function( name ) {\r\n\t\tname = jQuery.propFix[ name ] || name;\r\n\t\treturn this.each(function() {\r\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\r\n\t\t\ttry {\r\n\t\t\t\tthis[ name ] = undefined;\r\n\t\t\t\tdelete this[ name ];\r\n\t\t\t} catch( e ) {}\r\n\t\t});\r\n\t},\r\n\r\n\taddClass: function( value ) {\r\n\t\tvar classNames, i, l, elem,\r\n\t\t\tsetClass, c, cl;\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( j ) {\r\n\t\t\t\tjQuery( this ).addClass( value.call(this, j, this.className) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( value && typeof value === \"string\" ) {\r\n\t\t\tclassNames = value.split( rspace );\r\n\r\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\r\n\t\t\t\t\t\telem.className = value;\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\r\n\r\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\r\n\t\t\t\t\t\t\tif ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\r\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveClass: function( value ) {\r\n\t\tvar classNames, i, l, elem, className, c, cl;\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( j ) {\r\n\t\t\t\tjQuery( this ).removeClass( value.call(this, j, this.className) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\r\n\t\t\tclassNames = ( value || \"\" ).split( rspace );\r\n\r\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\r\n\t\t\t\t\tif ( value ) {\r\n\t\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\r\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\r\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[ c ] + \" \", \" \");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telem.className = jQuery.trim( className );\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telem.className = \"\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\ttoggleClass: function( value, stateVal ) {\r\n\t\tvar type = typeof value,\r\n\t\t\tisBool = typeof stateVal === \"boolean\";\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( i ) {\r\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tif ( type === \"string\" ) {\r\n\t\t\t\t// toggle individual class names\r\n\t\t\t\tvar className,\r\n\t\t\t\t\ti = 0,\r\n\t\t\t\t\tself = jQuery( this ),\r\n\t\t\t\t\tstate = stateVal,\r\n\t\t\t\t\tclassNames = value.split( rspace );\r\n\r\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\r\n\t\t\t\t\t// check each className given, space seperated list\r\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\r\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\r\n\t\t\t\tif ( this.className ) {\r\n\t\t\t\t\t// store className if set\r\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// toggle whole className\r\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\thasClass: function( selector ) {\r\n\t\tvar className = \" \" + selector + \" \",\r\n\t\t\ti = 0,\r\n\t\t\tl = this.length;\r\n\t\tfor ( ; i < l; i++ ) {\r\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\tval: function( value ) {\r\n\t\tvar hooks, ret, isFunction,\r\n\t\t\telem = this[0];\r\n\r\n\t\tif ( !arguments.length ) {\r\n\t\t\tif ( elem ) {\r\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\r\n\r\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\r\n\t\t\t\t\treturn ret;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tret = elem.value;\r\n\r\n\t\t\t\treturn typeof ret === \"string\" ?\r\n\t\t\t\t\t// handle most common string cases\r\n\t\t\t\t\tret.replace(rreturn, \"\") :\r\n\t\t\t\t\t// handle cases where value is null/undef or number\r\n\t\t\t\t\tret == null ? \"\" : ret;\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tisFunction = jQuery.isFunction( value );\r\n\r\n\t\treturn this.each(function( i ) {\r\n\t\t\tvar self = jQuery(this), val;\r\n\r\n\t\t\tif ( this.nodeType !== 1 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif ( isFunction ) {\r\n\t\t\t\tval = value.call( this, i, self.val() );\r\n\t\t\t} else {\r\n\t\t\t\tval = value;\r\n\t\t\t}\r\n\r\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\r\n\t\t\tif ( val == null ) {\r\n\t\t\t\tval = \"\";\r\n\t\t\t} else if ( typeof val === \"number\" ) {\r\n\t\t\t\tval += \"\";\r\n\t\t\t} else if ( jQuery.isArray( val ) ) {\r\n\t\t\t\tval = jQuery.map(val, function ( value ) {\r\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\r\n\r\n\t\t\t// If set returns undefined, fall back to normal setting\r\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\r\n\t\t\t\tthis.value = val;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.extend({\r\n\tvalHooks: {\r\n\t\toption: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\r\n\t\t\t\t// uses .value. See #6932\r\n\t\t\t\tvar val = elem.attributes.value;\r\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\r\n\t\t\t}\r\n\t\t},\r\n\t\tselect: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\tvar value, i, max, option,\r\n\t\t\t\t\tindex = elem.selectedIndex,\r\n\t\t\t\t\tvalues = [],\r\n\t\t\t\t\toptions = elem.options,\r\n\t\t\t\t\tone = elem.type === \"select-one\";\r\n\r\n\t\t\t\t// Nothing was selected\r\n\t\t\t\tif ( index < 0 ) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Loop through all the selected options\r\n\t\t\t\ti = one ? index : 0;\r\n\t\t\t\tmax = one ? index + 1 : options.length;\r\n\t\t\t\tfor ( ; i < max; i++ ) {\r\n\t\t\t\t\toption = options[ i ];\r\n\r\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\r\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\r\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\r\n\r\n\t\t\t\t\t\t// Get the specific value for the option\r\n\t\t\t\t\t\tvalue = jQuery( option ).val();\r\n\r\n\t\t\t\t\t\t// We don't need an array for one selects\r\n\t\t\t\t\t\tif ( one ) {\r\n\t\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Multi-Selects return an array\r\n\t\t\t\t\t\tvalues.push( value );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\r\n\t\t\t\tif ( one && !values.length && options.length ) {\r\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn values;\r\n\t\t\t},\r\n\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tvar values = jQuery.makeArray( value );\r\n\r\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\r\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif ( !values.length ) {\r\n\t\t\t\t\telem.selectedIndex = -1;\r\n\t\t\t\t}\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tattrFn: {\r\n\t\tval: true,\r\n\t\tcss: true,\r\n\t\thtml: true,\r\n\t\ttext: true,\r\n\t\tdata: true,\r\n\t\twidth: true,\r\n\t\theight: true,\r\n\t\toffset: true\r\n\t},\r\n\r\n\tattr: function( elem, name, value, pass ) {\r\n\t\tvar ret, hooks, notxml,\r\n\t\t\tnType = elem.nodeType;\r\n\r\n\t\t// don't get/set attributes on text, comment and attribute nodes\r\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( pass && name in jQuery.attrFn ) {\r\n\t\t\treturn jQuery( elem )[ name ]( value );\r\n\t\t}\r\n\r\n\t\t// Fallback to prop when attributes are not supported\r\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\r\n\t\t\treturn jQuery.prop( elem, name, value );\r\n\t\t}\r\n\r\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\r\n\r\n\t\t// All attributes are lowercase\r\n\t\t// Grab necessary hook if one is defined\r\n\t\tif ( notxml ) {\r\n\t\t\tname = name.toLowerCase();\r\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\r\n\t\t}\r\n\r\n\t\tif ( value !== undefined ) {\r\n\r\n\t\t\tif ( value === null ) {\r\n\t\t\t\tjQuery.removeAttr( elem, name );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\r\n\t\t\t} else {\r\n\t\t\t\telem.setAttribute( name, \"\" + value );\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\r\n\t\t} else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\r\n\t\t\treturn ret;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tret = elem.getAttribute( name );\r\n\r\n\t\t\t// Non-existent attributes return null, we normalize to undefined\r\n\t\t\treturn ret === null ?\r\n\t\t\t\tundefined :\r\n\t\t\t\tret;\r\n\t\t}\r\n\t},\r\n\r\n\tremoveAttr: function( elem, value ) {\r\n\t\tvar propName, attrNames, name, l, isBool,\r\n\t\t\ti = 0;\r\n\r\n\t\tif ( value && elem.nodeType === 1 ) {\r\n\t\t\tattrNames = value.toLowerCase().split( rspace );\r\n\t\t\tl = attrNames.length;\r\n\r\n\t\t\tfor ( ; i < l; i++ ) {\r\n\t\t\t\tname = attrNames[ i ];\r\n\r\n\t\t\t\tif ( name ) {\r\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\r\n\t\t\t\t\tisBool = rboolean.test( name );\r\n\r\n\t\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\r\n\t\t\t\t\t// Do not do this for boolean attributes (see #10870)\r\n\t\t\t\t\tif ( !isBool ) {\r\n\t\t\t\t\t\tjQuery.attr( elem, name, \"\" );\r\n\t\t\t\t\t}\r\n\t\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\r\n\r\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\r\n\t\t\t\t\tif ( isBool && propName in elem ) {\r\n\t\t\t\t\t\telem[ propName ] = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tattrHooks: {\r\n\t\ttype: {\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\r\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\r\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\r\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\r\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\r\n\t\t\t\t\t// Reset value to it's default in case type is set after value\r\n\t\t\t\t\t// This is for element creation\r\n\t\t\t\t\tvar val = elem.value;\r\n\t\t\t\t\telem.setAttribute( \"type\", value );\r\n\t\t\t\t\tif ( val ) {\r\n\t\t\t\t\t\telem.value = val;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// Use the value property for back compat\r\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\r\n\t\tvalue: {\r\n\t\t\tget: function( elem, name ) {\r\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\r\n\t\t\t\t\treturn nodeHook.get( elem, name );\r\n\t\t\t\t}\r\n\t\t\t\treturn name in elem ?\r\n\t\t\t\t\telem.value :\r\n\t\t\t\t\tnull;\r\n\t\t\t},\r\n\t\t\tset: function( elem, value, name ) {\r\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\r\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\r\n\t\t\t\t}\r\n\t\t\t\t// Does not return so that setAttribute is also used\r\n\t\t\t\telem.value = value;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tpropFix: {\r\n\t\ttabindex: \"tabIndex\",\r\n\t\treadonly: \"readOnly\",\r\n\t\t\"for\": \"htmlFor\",\r\n\t\t\"class\": \"className\",\r\n\t\tmaxlength: \"maxLength\",\r\n\t\tcellspacing: \"cellSpacing\",\r\n\t\tcellpadding: \"cellPadding\",\r\n\t\trowspan: \"rowSpan\",\r\n\t\tcolspan: \"colSpan\",\r\n\t\tusemap: \"useMap\",\r\n\t\tframeborder: \"frameBorder\",\r\n\t\tcontenteditable: \"contentEditable\"\r\n\t},\r\n\r\n\tprop: function( elem, name, value ) {\r\n\t\tvar ret, hooks, notxml,\r\n\t\t\tnType = elem.nodeType;\r\n\r\n\t\t// don't get/set properties on text, comment and attribute nodes\r\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\r\n\r\n\t\tif ( notxml ) {\r\n\t\t\t// Fix name and attach hooks\r\n\t\t\tname = jQuery.propFix[ name ] || name;\r\n\t\t\thooks = jQuery.propHooks[ name ];\r\n\t\t}\r\n\r\n\t\tif ( value !== undefined ) {\r\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn ( elem[ name ] = value );\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\r\n\t\t\t\treturn ret;\r\n\r\n\t\t\t} else {\r\n\t\t\t\treturn elem[ name ];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tpropHooks: {\r\n\t\ttabIndex: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\r\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\r\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\r\n\r\n\t\t\t\treturn attributeNode && attributeNode.specified ?\r\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\r\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\r\n\t\t\t\t\t\t0 :\r\n\t\t\t\t\t\tundefined;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)\r\njQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;\r\n\r\n// Hook for boolean attributes\r\nboolHook = {\r\n\tget: function( elem, name ) {\r\n\t\t// Align boolean attributes with corresponding properties\r\n\t\t// Fall back to attribute presence where some booleans are not supported\r\n\t\tvar attrNode,\r\n\t\t\tproperty = jQuery.prop( elem, name );\r\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\r\n\t\t\tname.toLowerCase() :\r\n\t\t\tundefined;\r\n\t},\r\n\tset: function( elem, value, name ) {\r\n\t\tvar propName;\r\n\t\tif ( value === false ) {\r\n\t\t\t// Remove boolean attributes when set to false\r\n\t\t\tjQuery.removeAttr( elem, name );\r\n\t\t} else {\r\n\t\t\t// value is true since we know at this point it's type boolean and not false\r\n\t\t\t// Set boolean attributes to the same name and set the DOM property\r\n\t\t\tpropName = jQuery.propFix[ name ] || name;\r\n\t\t\tif ( propName in elem ) {\r\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\r\n\t\t\t\telem[ propName ] = true;\r\n\t\t\t}\r\n\r\n\t\t\telem.setAttribute( name, name.toLowerCase() );\r\n\t\t}\r\n\t\treturn name;\r\n\t}\r\n};\r\n\r\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\r\nif ( !getSetAttribute ) {\r\n\r\n\tfixSpecified = {\r\n\t\tname: true,\r\n\t\tid: true,\r\n\t\tcoords: true\r\n\t};\r\n\r\n\t// Use this for any attribute in IE6/7\r\n\t// This fixes almost every IE6/7 issue\r\n\tnodeHook = jQuery.valHooks.button = {\r\n\t\tget: function( elem, name ) {\r\n\t\t\tvar ret;\r\n\t\t\tret = elem.getAttributeNode( name );\r\n\t\t\treturn ret && ( fixSpecified[ name ] ? ret.nodeValue !== \"\" : ret.specified ) ?\r\n\t\t\t\tret.nodeValue :\r\n\t\t\t\tundefined;\r\n\t\t},\r\n\t\tset: function( elem, value, name ) {\r\n\t\t\t// Set the existing or create a new attribute node\r\n\t\t\tvar ret = elem.getAttributeNode( name );\r\n\t\t\tif ( !ret ) {\r\n\t\t\t\tret = document.createAttribute( name );\r\n\t\t\t\telem.setAttributeNode( ret );\r\n\t\t\t}\r\n\t\t\treturn ( ret.nodeValue = value + \"\" );\r\n\t\t}\r\n\t};\r\n\r\n\t// Apply the nodeHook to tabindex\r\n\tjQuery.attrHooks.tabindex.set = nodeHook.set;\r\n\r\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\r\n\t// This is for removals\r\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\r\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tif ( value === \"\" ) {\r\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\r\n\t// Set contenteditable to false on removals(#10429)\r\n\t// Setting to empty string throws an error as an invalid value\r\n\tjQuery.attrHooks.contenteditable = {\r\n\t\tget: nodeHook.get,\r\n\t\tset: function( elem, value, name ) {\r\n\t\t\tif ( value === \"\" ) {\r\n\t\t\t\tvalue = \"false\";\r\n\t\t\t}\r\n\t\t\tnodeHook.set( elem, value, name );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n\r\n// Some attributes require a special call on IE\r\nif ( !jQuery.support.hrefNormalized ) {\r\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\r\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\r\n\t\t\t\treturn ret === null ? undefined : ret;\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n}\r\n\r\nif ( !jQuery.support.style ) {\r\n\tjQuery.attrHooks.style = {\r\n\t\tget: function( elem ) {\r\n\t\t\t// Return undefined in the case of empty string\r\n\t\t\t// Normalize to lowercase since IE uppercases css property names\r\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\r\n\t\t},\r\n\t\tset: function( elem, value ) {\r\n\t\t\treturn ( elem.style.cssText = \"\" + value );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Safari mis-reports the default selected property of an option\r\n// Accessing the parent's selectedIndex property fixes it\r\nif ( !jQuery.support.optSelected ) {\r\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\r\n\t\tget: function( elem ) {\r\n\t\t\tvar parent = elem.parentNode;\r\n\r\n\t\t\tif ( parent ) {\r\n\t\t\t\tparent.selectedIndex;\r\n\r\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\r\n\t\t\t\tif ( parent.parentNode ) {\r\n\t\t\t\t\tparent.parentNode.selectedIndex;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t});\r\n}\r\n\r\n// IE6/7 call enctype encoding\r\nif ( !jQuery.support.enctype ) {\r\n\tjQuery.propFix.enctype = \"encoding\";\r\n}\r\n\r\n// Radios and checkboxes getter/setter\r\nif ( !jQuery.support.checkOn ) {\r\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\r\n\t\tjQuery.valHooks[ this ] = {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\r\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n}\r\njQuery.each([ \"radio\", \"checkbox\" ], function() {\r\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\r\n\t\tset: function( elem, value ) {\r\n\t\t\tif ( jQuery.isArray( value ) ) {\r\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n});\r\n\r\n\r\n\r\n\r\nvar rformElems = /^(?:textarea|input|select)$/i,\r\n\trtypenamespace = /^([^\\.]*)?(?:\\.(.+))?$/,\r\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+)?\\b/,\r\n\trkeyEvent = /^key/,\r\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\r\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\r\n\trquickIs = /^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,\r\n\tquickParse = function( selector ) {\r\n\t\tvar quick = rquickIs.exec( selector );\r\n\t\tif ( quick ) {\r\n\t\t\t//   0  1    2   3\r\n\t\t\t// [ _, tag, id, class ]\r\n\t\t\tquick[1] = ( quick[1] || \"\" ).toLowerCase();\r\n\t\t\tquick[3] = quick[3] && new RegExp( \"(?:^|\\\\s)\" + quick[3] + \"(?:\\\\s|$)\" );\r\n\t\t}\r\n\t\treturn quick;\r\n\t},\r\n\tquickIs = function( elem, m ) {\r\n\t\tvar attrs = elem.attributes || {};\r\n\t\treturn (\r\n\t\t\t(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&\r\n\t\t\t(!m[2] || (attrs.id || {}).value === m[2]) &&\r\n\t\t\t(!m[3] || m[3].test( (attrs[ \"class\" ] || {}).value ))\r\n\t\t);\r\n\t},\r\n\thoverHack = function( events ) {\r\n\t\treturn jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\r\n\t};\r\n\r\n/*\r\n * Helper functions for managing events -- not part of the public interface.\r\n * Props to Dean Edwards' addEvent library for many of the ideas.\r\n */\r\njQuery.event = {\r\n\r\n\tadd: function( elem, types, handler, data, selector ) {\r\n\r\n\t\tvar elemData, eventHandle, events,\r\n\t\t\tt, tns, type, namespaces, handleObj,\r\n\t\t\thandleObjIn, quick, handlers, special;\r\n\r\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\r\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Caller can pass in an object of custom data in lieu of the handler\r\n\t\tif ( handler.handler ) {\r\n\t\t\thandleObjIn = handler;\r\n\t\t\thandler = handleObjIn.handler;\r\n\t\t\tselector = handleObjIn.selector;\r\n\t\t}\r\n\r\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\r\n\t\tif ( !handler.guid ) {\r\n\t\t\thandler.guid = jQuery.guid++;\r\n\t\t}\r\n\r\n\t\t// Init the element's event structure and main handler, if this is the first\r\n\t\tevents = elemData.events;\r\n\t\tif ( !events ) {\r\n\t\t\telemData.events = events = {};\r\n\t\t}\r\n\t\teventHandle = elemData.handle;\r\n\t\tif ( !eventHandle ) {\r\n\t\t\telemData.handle = eventHandle = function( e ) {\r\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\r\n\t\t\t\t// when an event is called after a page has unloaded\r\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\r\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\r\n\t\t\t\t\tundefined;\r\n\t\t\t};\r\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\r\n\t\t\teventHandle.elem = elem;\r\n\t\t}\r\n\r\n\t\t// Handle multiple events separated by a space\r\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\r\n\t\ttypes = jQuery.trim( hoverHack(types) ).split( \" \" );\r\n\t\tfor ( t = 0; t < types.length; t++ ) {\r\n\r\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\r\n\t\t\ttype = tns[1];\r\n\t\t\tnamespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\r\n\r\n\t\t\t// If event changes its type, use the special event handlers for the changed type\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\r\n\t\t\t// If selector defined, determine special event api type, otherwise given type\r\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\r\n\r\n\t\t\t// Update special based on newly reset type\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\r\n\t\t\t// handleObj is passed to all event handlers\r\n\t\t\thandleObj = jQuery.extend({\r\n\t\t\t\ttype: type,\r\n\t\t\t\torigType: tns[1],\r\n\t\t\t\tdata: data,\r\n\t\t\t\thandler: handler,\r\n\t\t\t\tguid: handler.guid,\r\n\t\t\t\tselector: selector,\r\n\t\t\t\tquick: selector && quickParse( selector ),\r\n\t\t\t\tnamespace: namespaces.join(\".\")\r\n\t\t\t}, handleObjIn );\r\n\r\n\t\t\t// Init the event handler queue if we're the first\r\n\t\t\thandlers = events[ type ];\r\n\t\t\tif ( !handlers ) {\r\n\t\t\t\thandlers = events[ type ] = [];\r\n\t\t\t\thandlers.delegateCount = 0;\r\n\r\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\r\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\r\n\t\t\t\t\t// Bind the global event handler to the element\r\n\t\t\t\t\tif ( elem.addEventListener ) {\r\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\r\n\r\n\t\t\t\t\t} else if ( elem.attachEvent ) {\r\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( special.add ) {\r\n\t\t\t\tspecial.add.call( elem, handleObj );\r\n\r\n\t\t\t\tif ( !handleObj.handler.guid ) {\r\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Add to the element's handler list, delegates in front\r\n\t\t\tif ( selector ) {\r\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\r\n\t\t\t} else {\r\n\t\t\t\thandlers.push( handleObj );\r\n\t\t\t}\r\n\r\n\t\t\t// Keep track of which events have ever been used, for event optimization\r\n\t\t\tjQuery.event.global[ type ] = true;\r\n\t\t}\r\n\r\n\t\t// Nullify elem to prevent memory leaks in IE\r\n\t\telem = null;\r\n\t},\r\n\r\n\tglobal: {},\r\n\r\n\t// Detach an event or set of events from an element\r\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\r\n\r\n\t\tvar elemData = jQuery.hasData( elem ) && jQuery._data( elem ),\r\n\t\t\tt, tns, type, origType, namespaces, origCount,\r\n\t\t\tj, events, special, handle, eventType, handleObj;\r\n\r\n\t\tif ( !elemData || !(events = elemData.events) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Once for each type.namespace in types; type may be omitted\r\n\t\ttypes = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\r\n\t\tfor ( t = 0; t < types.length; t++ ) {\r\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\r\n\t\t\ttype = origType = tns[1];\r\n\t\t\tnamespaces = tns[2];\r\n\r\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\r\n\t\t\tif ( !type ) {\r\n\t\t\t\tfor ( type in events ) {\r\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\t\t\ttype = ( selector? special.delegateType : special.bindType ) || type;\r\n\t\t\teventType = events[ type ] || [];\r\n\t\t\torigCount = eventType.length;\r\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\r\n\r\n\t\t\t// Remove matching events\r\n\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\r\n\t\t\t\thandleObj = eventType[ j ];\r\n\r\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\r\n\t\t\t\t\t ( !handler || handler.guid === handleObj.guid ) &&\r\n\t\t\t\t\t ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\r\n\t\t\t\t\t ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\r\n\t\t\t\t\teventType.splice( j--, 1 );\r\n\r\n\t\t\t\t\tif ( handleObj.selector ) {\r\n\t\t\t\t\t\teventType.delegateCount--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( special.remove ) {\r\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\r\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\r\n\t\t\tif ( eventType.length === 0 && origCount !== eventType.length ) {\r\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\r\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete events[ type ];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Remove the expando if it's no longer used\r\n\t\tif ( jQuery.isEmptyObject( events ) ) {\r\n\t\t\thandle = elemData.handle;\r\n\t\t\tif ( handle ) {\r\n\t\t\t\thandle.elem = null;\r\n\t\t\t}\r\n\r\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\r\n\t\t\t// so use it instead of delete\r\n\t\t\tjQuery.removeData( elem, [ \"events\", \"handle\" ], true );\r\n\t\t}\r\n\t},\r\n\r\n\t// Events that are safe to short-circuit if no handlers are attached.\r\n\t// Native DOM events should not be added, they may have inline handlers.\r\n\tcustomEvent: {\r\n\t\t\"getData\": true,\r\n\t\t\"setData\": true,\r\n\t\t\"changeData\": true\r\n\t},\r\n\r\n\ttrigger: function( event, data, elem, onlyHandlers ) {\r\n\t\t// Don't do events on text and comment nodes\r\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Event object or event type\r\n\t\tvar type = event.type || event,\r\n\t\t\tnamespaces = [],\r\n\t\t\tcache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;\r\n\r\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\r\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( type.indexOf( \"!\" ) >= 0 ) {\r\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\r\n\t\t\ttype = type.slice(0, -1);\r\n\t\t\texclusive = true;\r\n\t\t}\r\n\r\n\t\tif ( type.indexOf( \".\" ) >= 0 ) {\r\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\r\n\t\t\tnamespaces = type.split(\".\");\r\n\t\t\ttype = namespaces.shift();\r\n\t\t\tnamespaces.sort();\r\n\t\t}\r\n\r\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\r\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Caller can pass in an Event, Object, or just an event type string\r\n\t\tevent = typeof event === \"object\" ?\r\n\t\t\t// jQuery.Event object\r\n\t\t\tevent[ jQuery.expando ] ? event :\r\n\t\t\t// Object literal\r\n\t\t\tnew jQuery.Event( type, event ) :\r\n\t\t\t// Just the event type (string)\r\n\t\t\tnew jQuery.Event( type );\r\n\r\n\t\tevent.type = type;\r\n\t\tevent.isTrigger = true;\r\n\t\tevent.exclusive = exclusive;\r\n\t\tevent.namespace = namespaces.join( \".\" );\r\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\r\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\r\n\r\n\t\t// Handle a global trigger\r\n\t\tif ( !elem ) {\r\n\r\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\r\n\t\t\tcache = jQuery.cache;\r\n\t\t\tfor ( i in cache ) {\r\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\r\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Clean up the event in case it is being reused\r\n\t\tevent.result = undefined;\r\n\t\tif ( !event.target ) {\r\n\t\t\tevent.target = elem;\r\n\t\t}\r\n\r\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\r\n\t\tdata = data != null ? jQuery.makeArray( data ) : [];\r\n\t\tdata.unshift( event );\r\n\r\n\t\t// Allow special events to draw outside the lines\r\n\t\tspecial = jQuery.event.special[ type ] || {};\r\n\t\tif ( special.trigger && special.trigger.apply( elem, data ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\r\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\r\n\t\teventPath = [[ elem, special.bindType || type ]];\r\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\r\n\r\n\t\t\tbubbleType = special.delegateType || type;\r\n\t\t\tcur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\r\n\t\t\told = null;\r\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\r\n\t\t\t\teventPath.push([ cur, bubbleType ]);\r\n\t\t\t\told = cur;\r\n\t\t\t}\r\n\r\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\r\n\t\t\tif ( old && old === elem.ownerDocument ) {\r\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fire handlers on the event path\r\n\t\tfor ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\r\n\r\n\t\t\tcur = eventPath[i][0];\r\n\t\t\tevent.type = eventPath[i][1];\r\n\r\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\r\n\t\t\tif ( handle ) {\r\n\t\t\t\thandle.apply( cur, data );\r\n\t\t\t}\r\n\t\t\t// Note that this is a bare JS function and not a jQuery handler\r\n\t\t\thandle = ontype && cur[ ontype ];\r\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\t\t}\r\n\t\tevent.type = type;\r\n\r\n\t\t// If nobody prevented the default action, do it now\r\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\r\n\r\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\r\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\r\n\r\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\r\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\r\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\r\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\r\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\r\n\r\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\r\n\t\t\t\t\told = elem[ ontype ];\r\n\r\n\t\t\t\t\tif ( old ) {\r\n\t\t\t\t\t\telem[ ontype ] = null;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\r\n\t\t\t\t\tjQuery.event.triggered = type;\r\n\t\t\t\t\telem[ type ]();\r\n\t\t\t\t\tjQuery.event.triggered = undefined;\r\n\r\n\t\t\t\t\tif ( old ) {\r\n\t\t\t\t\t\telem[ ontype ] = old;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn event.result;\r\n\t},\r\n\r\n\tdispatch: function( event ) {\r\n\r\n\t\t// Make a writable jQuery.Event from the native event object\r\n\t\tevent = jQuery.event.fix( event || window.event );\r\n\r\n\t\tvar handlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\r\n\t\t\tdelegateCount = handlers.delegateCount,\r\n\t\t\targs = [].slice.call( arguments, 0 ),\r\n\t\t\trun_all = !event.exclusive && !event.namespace,\r\n\t\t\tspecial = jQuery.event.special[ event.type ] || {},\r\n\t\t\thandlerQueue = [],\r\n\t\t\ti, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;\r\n\r\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\r\n\t\targs[0] = event;\r\n\t\tevent.delegateTarget = this;\r\n\r\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\r\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine handlers that should run if there are delegated events\r\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\r\n\t\tif ( delegateCount && !(event.button && event.type === \"click\") ) {\r\n\r\n\t\t\t// Pregenerate a single jQuery object for reuse with .is()\r\n\t\t\tjqcur = jQuery(this);\r\n\t\t\tjqcur.context = this.ownerDocument || this;\r\n\r\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\r\n\r\n\t\t\t\t// Don't process events on disabled elements (#6911, #8165)\r\n\t\t\t\tif ( cur.disabled !== true ) {\r\n\t\t\t\t\tselMatch = {};\r\n\t\t\t\t\tmatches = [];\r\n\t\t\t\t\tjqcur[0] = cur;\r\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\r\n\t\t\t\t\t\thandleObj = handlers[ i ];\r\n\t\t\t\t\t\tsel = handleObj.selector;\r\n\r\n\t\t\t\t\t\tif ( selMatch[ sel ] === undefined ) {\r\n\t\t\t\t\t\t\tselMatch[ sel ] = (\r\n\t\t\t\t\t\t\t\thandleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( selMatch[ sel ] ) {\r\n\t\t\t\t\t\t\tmatches.push( handleObj );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( matches.length ) {\r\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, matches: matches });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Add the remaining (directly-bound) handlers\r\n\t\tif ( handlers.length > delegateCount ) {\r\n\t\t\thandlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\r\n\t\t}\r\n\r\n\t\t// Run delegates first; they may want to stop propagation beneath us\r\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\r\n\t\t\tmatched = handlerQueue[ i ];\r\n\t\t\tevent.currentTarget = matched.elem;\r\n\r\n\t\t\tfor ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\r\n\t\t\t\thandleObj = matched.matches[ j ];\r\n\r\n\t\t\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\r\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\r\n\t\t\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\r\n\r\n\t\t\t\t\tevent.data = handleObj.data;\r\n\t\t\t\t\tevent.handleObj = handleObj;\r\n\r\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\r\n\t\t\t\t\t\t\t.apply( matched.elem, args );\r\n\r\n\t\t\t\t\tif ( ret !== undefined ) {\r\n\t\t\t\t\t\tevent.result = ret;\r\n\t\t\t\t\t\tif ( ret === false ) {\r\n\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Call the postDispatch hook for the mapped type\r\n\t\tif ( special.postDispatch ) {\r\n\t\t\tspecial.postDispatch.call( this, event );\r\n\t\t}\r\n\r\n\t\treturn event.result;\r\n\t},\r\n\r\n\t// Includes some event props shared by KeyEvent and MouseEvent\r\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\r\n\tprops: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\r\n\r\n\tfixHooks: {},\r\n\r\n\tkeyHooks: {\r\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\r\n\t\tfilter: function( event, original ) {\r\n\r\n\t\t\t// Add which for key events\r\n\t\t\tif ( event.which == null ) {\r\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\r\n\t\t\t}\r\n\r\n\t\t\treturn event;\r\n\t\t}\r\n\t},\r\n\r\n\tmouseHooks: {\r\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\r\n\t\tfilter: function( event, original ) {\r\n\t\t\tvar eventDoc, doc, body,\r\n\t\t\t\tbutton = original.button,\r\n\t\t\t\tfromElement = original.fromElement;\r\n\r\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\r\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\r\n\t\t\t\teventDoc = event.target.ownerDocument || document;\r\n\t\t\t\tdoc = eventDoc.documentElement;\r\n\t\t\t\tbody = eventDoc.body;\r\n\r\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\r\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\r\n\t\t\t}\r\n\r\n\t\t\t// Add relatedTarget, if necessary\r\n\t\t\tif ( !event.relatedTarget && fromElement ) {\r\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\r\n\t\t\t}\r\n\r\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\r\n\t\t\t// Note: button is not normalized, so don't use it\r\n\t\t\tif ( !event.which && button !== undefined ) {\r\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\r\n\t\t\t}\r\n\r\n\t\t\treturn event;\r\n\t\t}\r\n\t},\r\n\r\n\tfix: function( event ) {\r\n\t\tif ( event[ jQuery.expando ] ) {\r\n\t\t\treturn event;\r\n\t\t}\r\n\r\n\t\t// Create a writable copy of the event object and normalize some properties\r\n\t\tvar i, prop,\r\n\t\t\toriginalEvent = event,\r\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\r\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\r\n\r\n\t\tevent = jQuery.Event( originalEvent );\r\n\r\n\t\tfor ( i = copy.length; i; ) {\r\n\t\t\tprop = copy[ --i ];\r\n\t\t\tevent[ prop ] = originalEvent[ prop ];\r\n\t\t}\r\n\r\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\r\n\t\tif ( !event.target ) {\r\n\t\t\tevent.target = originalEvent.srcElement || document;\r\n\t\t}\r\n\r\n\t\t// Target should not be a text node (#504, Safari)\r\n\t\tif ( event.target.nodeType === 3 ) {\r\n\t\t\tevent.target = event.target.parentNode;\r\n\t\t}\r\n\r\n\t\t// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)\r\n\t\tif ( event.metaKey === undefined ) {\r\n\t\t\tevent.metaKey = event.ctrlKey;\r\n\t\t}\r\n\r\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\r\n\t},\r\n\r\n\tspecial: {\r\n\t\tready: {\r\n\t\t\t// Make sure the ready event is setup\r\n\t\t\tsetup: jQuery.bindReady\r\n\t\t},\r\n\r\n\t\tload: {\r\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\r\n\t\t\tnoBubble: true\r\n\t\t},\r\n\r\n\t\tfocus: {\r\n\t\t\tdelegateType: \"focusin\"\r\n\t\t},\r\n\t\tblur: {\r\n\t\t\tdelegateType: \"focusout\"\r\n\t\t},\r\n\r\n\t\tbeforeunload: {\r\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\r\n\t\t\t\t// We only want to do this special case on windows\r\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\r\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tteardown: function( namespaces, eventHandle ) {\r\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\r\n\t\t\t\t\tthis.onbeforeunload = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsimulate: function( type, elem, event, bubble ) {\r\n\t\t// Piggyback on a donor event to simulate a different one.\r\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\r\n\t\t// simulated event prevents default then we do the same on the donor.\r\n\t\tvar e = jQuery.extend(\r\n\t\t\tnew jQuery.Event(),\r\n\t\t\tevent,\r\n\t\t\t{ type: type,\r\n\t\t\t\tisSimulated: true,\r\n\t\t\t\toriginalEvent: {}\r\n\t\t\t}\r\n\t\t);\r\n\t\tif ( bubble ) {\r\n\t\t\tjQuery.event.trigger( e, null, elem );\r\n\t\t} else {\r\n\t\t\tjQuery.event.dispatch.call( elem, e );\r\n\t\t}\r\n\t\tif ( e.isDefaultPrevented() ) {\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// Some plugins are using, but it's undocumented/deprecated and will be removed.\r\n// The 1.7 special event interface should provide all the hooks needed now.\r\njQuery.event.handle = jQuery.event.dispatch;\r\n\r\njQuery.removeEvent = document.removeEventListener ?\r\n\tfunction( elem, type, handle ) {\r\n\t\tif ( elem.removeEventListener ) {\r\n\t\t\telem.removeEventListener( type, handle, false );\r\n\t\t}\r\n\t} :\r\n\tfunction( elem, type, handle ) {\r\n\t\tif ( elem.detachEvent ) {\r\n\t\t\telem.detachEvent( \"on\" + type, handle );\r\n\t\t}\r\n\t};\r\n\r\njQuery.Event = function( src, props ) {\r\n\t// Allow instantiation without the 'new' keyword\r\n\tif ( !(this instanceof jQuery.Event) ) {\r\n\t\treturn new jQuery.Event( src, props );\r\n\t}\r\n\r\n\t// Event object\r\n\tif ( src && src.type ) {\r\n\t\tthis.originalEvent = src;\r\n\t\tthis.type = src.type;\r\n\r\n\t\t// Events bubbling up the document may have been marked as prevented\r\n\t\t// by a handler lower down the tree; reflect the correct value.\r\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\r\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\r\n\r\n\t// Event type\r\n\t} else {\r\n\t\tthis.type = src;\r\n\t}\r\n\r\n\t// Put explicitly provided properties onto the event object\r\n\tif ( props ) {\r\n\t\tjQuery.extend( this, props );\r\n\t}\r\n\r\n\t// Create a timestamp if incoming event doesn't have one\r\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\r\n\r\n\t// Mark it as fixed\r\n\tthis[ jQuery.expando ] = true;\r\n};\r\n\r\nfunction returnFalse() {\r\n\treturn false;\r\n}\r\nfunction returnTrue() {\r\n\treturn true;\r\n}\r\n\r\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\r\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\r\njQuery.Event.prototype = {\r\n\tpreventDefault: function() {\r\n\t\tthis.isDefaultPrevented = returnTrue;\r\n\r\n\t\tvar e = this.originalEvent;\r\n\t\tif ( !e ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// if preventDefault exists run it on the original event\r\n\t\tif ( e.preventDefault ) {\r\n\t\t\te.preventDefault();\r\n\r\n\t\t// otherwise set the returnValue property of the original event to false (IE)\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t},\r\n\tstopPropagation: function() {\r\n\t\tthis.isPropagationStopped = returnTrue;\r\n\r\n\t\tvar e = this.originalEvent;\r\n\t\tif ( !e ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// if stopPropagation exists run it on the original event\r\n\t\tif ( e.stopPropagation ) {\r\n\t\t\te.stopPropagation();\r\n\t\t}\r\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\r\n\t\te.cancelBubble = true;\r\n\t},\r\n\tstopImmediatePropagation: function() {\r\n\t\tthis.isImmediatePropagationStopped = returnTrue;\r\n\t\tthis.stopPropagation();\r\n\t},\r\n\tisDefaultPrevented: returnFalse,\r\n\tisPropagationStopped: returnFalse,\r\n\tisImmediatePropagationStopped: returnFalse\r\n};\r\n\r\n// Create mouseenter/leave events using mouseover/out and event-time checks\r\njQuery.each({\r\n\tmouseenter: \"mouseover\",\r\n\tmouseleave: \"mouseout\"\r\n}, function( orig, fix ) {\r\n\tjQuery.event.special[ orig ] = {\r\n\t\tdelegateType: fix,\r\n\t\tbindType: fix,\r\n\r\n\t\thandle: function( event ) {\r\n\t\t\tvar target = this,\r\n\t\t\t\trelated = event.relatedTarget,\r\n\t\t\t\thandleObj = event.handleObj,\r\n\t\t\t\tselector = handleObj.selector,\r\n\t\t\t\tret;\r\n\r\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\r\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\r\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\r\n\t\t\t\tevent.type = handleObj.origType;\r\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\r\n\t\t\t\tevent.type = fix;\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t};\r\n});\r\n\r\n// IE submit delegation\r\nif ( !jQuery.support.submitBubbles ) {\r\n\r\n\tjQuery.event.special.submit = {\r\n\t\tsetup: function() {\r\n\t\t\t// Only need this for delegated form submit events\r\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\r\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\r\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\r\n\t\t\t\tvar elem = e.target,\r\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\r\n\t\t\t\tif ( form && !form._submit_attached ) {\r\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\r\n\t\t\t\t\t\tevent._submit_bubble = true;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tform._submit_attached = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t// return undefined since we don't need an event listener\r\n\t\t},\r\n\t\t\r\n\t\tpostDispatch: function( event ) {\r\n\t\t\t// If form was submitted by the user, bubble the event up the tree\r\n\t\t\tif ( event._submit_bubble ) {\r\n\t\t\t\tdelete event._submit_bubble;\r\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\r\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tteardown: function() {\r\n\t\t\t// Only need this for delegated form submit events\r\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\r\n\t\t\tjQuery.event.remove( this, \"._submit\" );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// IE change delegation and checkbox/radio fix\r\nif ( !jQuery.support.changeBubbles ) {\r\n\r\n\tjQuery.event.special.change = {\r\n\r\n\t\tsetup: function() {\r\n\r\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\r\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\r\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\r\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\r\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\r\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\r\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\r\n\t\t\t\t\t\t\tthis._just_changed = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\r\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\r\n\t\t\t\t\t\t\tthis._just_changed = false;\r\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\r\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\r\n\t\t\t\tvar elem = e.target;\r\n\r\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {\r\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\r\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\r\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\telem._change_attached = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\thandle: function( event ) {\r\n\t\t\tvar elem = event.target;\r\n\r\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\r\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\r\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tteardown: function() {\r\n\t\t\tjQuery.event.remove( this, \"._change\" );\r\n\r\n\t\t\treturn rformElems.test( this.nodeName );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Create \"bubbling\" focus and blur events\r\nif ( !jQuery.support.focusinBubbles ) {\r\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\r\n\r\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\r\n\t\tvar attaches = 0,\r\n\t\t\thandler = function( event ) {\r\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\r\n\t\t\t};\r\n\r\n\t\tjQuery.event.special[ fix ] = {\r\n\t\t\tsetup: function() {\r\n\t\t\t\tif ( attaches++ === 0 ) {\r\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tteardown: function() {\r\n\t\t\t\tif ( --attaches === 0 ) {\r\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n}\r\n\r\njQuery.fn.extend({\r\n\r\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\r\n\t\tvar origFn, type;\r\n\r\n\t\t// Types can be a map of types/handlers\r\n\t\tif ( typeof types === \"object\" ) {\r\n\t\t\t// ( types-Object, selector, data )\r\n\t\t\tif ( typeof selector !== \"string\" ) { // && selector != null\r\n\t\t\t\t// ( types-Object, data )\r\n\t\t\t\tdata = data || selector;\r\n\t\t\t\tselector = undefined;\r\n\t\t\t}\r\n\t\t\tfor ( type in types ) {\r\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ( data == null && fn == null ) {\r\n\t\t\t// ( types, fn )\r\n\t\t\tfn = selector;\r\n\t\t\tdata = selector = undefined;\r\n\t\t} else if ( fn == null ) {\r\n\t\t\tif ( typeof selector === \"string\" ) {\r\n\t\t\t\t// ( types, selector, fn )\r\n\t\t\t\tfn = data;\r\n\t\t\t\tdata = undefined;\r\n\t\t\t} else {\r\n\t\t\t\t// ( types, data, fn )\r\n\t\t\t\tfn = data;\r\n\t\t\t\tdata = selector;\r\n\t\t\t\tselector = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif ( fn === false ) {\r\n\t\t\tfn = returnFalse;\r\n\t\t} else if ( !fn ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ( one === 1 ) {\r\n\t\t\torigFn = fn;\r\n\t\t\tfn = function( event ) {\r\n\t\t\t\t// Can use an empty set, since event contains the info\r\n\t\t\t\tjQuery().off( event );\r\n\t\t\t\treturn origFn.apply( this, arguments );\r\n\t\t\t};\r\n\t\t\t// Use same guid so caller can remove using origFn\r\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\r\n\t\t}\r\n\t\treturn this.each( function() {\r\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\r\n\t\t});\r\n\t},\r\n\tone: function( types, selector, data, fn ) {\r\n\t\treturn this.on( types, selector, data, fn, 1 );\r\n\t},\r\n\toff: function( types, selector, fn ) {\r\n\t\tif ( types && types.preventDefault && types.handleObj ) {\r\n\t\t\t// ( event )  dispatched jQuery.Event\r\n\t\t\tvar handleObj = types.handleObj;\r\n\t\t\tjQuery( types.delegateTarget ).off(\r\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\r\n\t\t\t\thandleObj.selector,\r\n\t\t\t\thandleObj.handler\r\n\t\t\t);\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif ( typeof types === \"object\" ) {\r\n\t\t\t// ( types-object [, selector] )\r\n\t\t\tfor ( var type in types ) {\r\n\t\t\t\tthis.off( type, selector, types[ type ] );\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif ( selector === false || typeof selector === \"function\" ) {\r\n\t\t\t// ( types [, fn] )\r\n\t\t\tfn = selector;\r\n\t\t\tselector = undefined;\r\n\t\t}\r\n\t\tif ( fn === false ) {\r\n\t\t\tfn = returnFalse;\r\n\t\t}\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.event.remove( this, types, fn, selector );\r\n\t\t});\r\n\t},\r\n\r\n\tbind: function( types, data, fn ) {\r\n\t\treturn this.on( types, null, data, fn );\r\n\t},\r\n\tunbind: function( types, fn ) {\r\n\t\treturn this.off( types, null, fn );\r\n\t},\r\n\r\n\tlive: function( types, data, fn ) {\r\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\r\n\t\treturn this;\r\n\t},\r\n\tdie: function( types, fn ) {\r\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdelegate: function( selector, types, data, fn ) {\r\n\t\treturn this.on( types, selector, data, fn );\r\n\t},\r\n\tundelegate: function( selector, types, fn ) {\r\n\t\t// ( namespace ) or ( selector, types [, fn] )\r\n\t\treturn arguments.length == 1? this.off( selector, \"**\" ) : this.off( types, selector, fn );\r\n\t},\r\n\r\n\ttrigger: function( type, data ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.event.trigger( type, data, this );\r\n\t\t});\r\n\t},\r\n\ttriggerHandler: function( type, data ) {\r\n\t\tif ( this[0] ) {\r\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\r\n\t\t}\r\n\t},\r\n\r\n\ttoggle: function( fn ) {\r\n\t\t// Save reference to arguments for access in closure\r\n\t\tvar args = arguments,\r\n\t\t\tguid = fn.guid || jQuery.guid++,\r\n\t\t\ti = 0,\r\n\t\t\ttoggler = function( event ) {\r\n\t\t\t\t// Figure out which function to execute\r\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\r\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\r\n\r\n\t\t\t\t// Make sure that clicks stop\r\n\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t// and execute the function\r\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\r\n\t\t\t};\r\n\r\n\t\t// link all the functions, so any of them can unbind this click handler\r\n\t\ttoggler.guid = guid;\r\n\t\twhile ( i < args.length ) {\r\n\t\t\targs[ i++ ].guid = guid;\r\n\t\t}\r\n\r\n\t\treturn this.click( toggler );\r\n\t},\r\n\r\n\thover: function( fnOver, fnOut ) {\r\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\r\n\t}\r\n});\r\n\r\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\r\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\r\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\r\n\r\n\t// Handle event binding\r\n\tjQuery.fn[ name ] = function( data, fn ) {\r\n\t\tif ( fn == null ) {\r\n\t\t\tfn = data;\r\n\t\t\tdata = null;\r\n\t\t}\r\n\r\n\t\treturn arguments.length > 0 ?\r\n\t\t\tthis.on( name, null, data, fn ) :\r\n\t\t\tthis.trigger( name );\r\n\t};\r\n\r\n\tif ( jQuery.attrFn ) {\r\n\t\tjQuery.attrFn[ name ] = true;\r\n\t}\r\n\r\n\tif ( rkeyEvent.test( name ) ) {\r\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\r\n\t}\r\n\r\n\tif ( rmouseEvent.test( name ) ) {\r\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\r\n\t}\r\n});\r\n\r\n\r\n\r\n/*!\r\n * Sizzle CSS Selector Engine\r\n *  Copyright 2011, The Dojo Foundation\r\n *  Released under the MIT, BSD, and GPL Licenses.\r\n *  More information: http://sizzlejs.com/\r\n */\r\n(function(){\r\n\r\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\r\n\texpando = \"sizcache\" + (Math.random() + '').replace('.', ''),\r\n\tdone = 0,\r\n\ttoString = Object.prototype.toString,\r\n\thasDuplicate = false,\r\n\tbaseHasDuplicate = true,\r\n\trBackslash = /\\\\/g,\r\n\trReturn = /\\r\\n/g,\r\n\trNonWord = /\\W/;\r\n\r\n// Here we check if the JavaScript engine is using some sort of\r\n// optimization where it does not always call our comparision\r\n// function. If that is the case, discard the hasDuplicate value.\r\n//   Thus far that includes Google Chrome.\r\n[0, 0].sort(function() {\r\n\tbaseHasDuplicate = false;\r\n\treturn 0;\r\n});\r\n\r\nvar Sizzle = function( selector, context, results, seed ) {\r\n\tresults = results || [];\r\n\tcontext = context || document;\r\n\r\n\tvar origContext = context;\r\n\r\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tif ( !selector || typeof selector !== \"string\" ) {\r\n\t\treturn results;\r\n\t}\r\n\r\n\tvar m, set, checkSet, extra, ret, cur, pop, i,\r\n\t\tprune = true,\r\n\t\tcontextXML = Sizzle.isXML( context ),\r\n\t\tparts = [],\r\n\t\tsoFar = selector;\r\n\r\n\t// Reset the position of the chunker regexp (start from head)\r\n\tdo {\r\n\t\tchunker.exec( \"\" );\r\n\t\tm = chunker.exec( soFar );\r\n\r\n\t\tif ( m ) {\r\n\t\t\tsoFar = m[3];\r\n\r\n\t\t\tparts.push( m[1] );\r\n\r\n\t\t\tif ( m[2] ) {\r\n\t\t\t\textra = m[3];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t} while ( m );\r\n\r\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\r\n\r\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\r\n\t\t\tset = posProcess( parts[0] + parts[1], context, seed );\r\n\r\n\t\t} else {\r\n\t\t\tset = Expr.relative[ parts[0] ] ?\r\n\t\t\t\t[ context ] :\r\n\t\t\t\tSizzle( parts.shift(), context );\r\n\r\n\t\t\twhile ( parts.length ) {\r\n\t\t\t\tselector = parts.shift();\r\n\r\n\t\t\t\tif ( Expr.relative[ selector ] ) {\r\n\t\t\t\t\tselector += parts.shift();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tset = posProcess( selector, set, seed );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t} else {\r\n\t\t// Take a shortcut and set the context if the root selector is an ID\r\n\t\t// (but not if it'll be faster if the inner selector is an ID)\r\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\r\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\r\n\r\n\t\t\tret = Sizzle.find( parts.shift(), context, contextXML );\r\n\t\t\tcontext = ret.expr ?\r\n\t\t\t\tSizzle.filter( ret.expr, ret.set )[0] :\r\n\t\t\t\tret.set[0];\r\n\t\t}\r\n\r\n\t\tif ( context ) {\r\n\t\t\tret = seed ?\r\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\r\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\r\n\r\n\t\t\tset = ret.expr ?\r\n\t\t\t\tSizzle.filter( ret.expr, ret.set ) :\r\n\t\t\t\tret.set;\r\n\r\n\t\t\tif ( parts.length > 0 ) {\r\n\t\t\t\tcheckSet = makeArray( set );\r\n\r\n\t\t\t} else {\r\n\t\t\t\tprune = false;\r\n\t\t\t}\r\n\r\n\t\t\twhile ( parts.length ) {\r\n\t\t\t\tcur = parts.pop();\r\n\t\t\t\tpop = cur;\r\n\r\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\r\n\t\t\t\t\tcur = \"\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpop = parts.pop();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( pop == null ) {\r\n\t\t\t\t\tpop = context;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tcheckSet = parts = [];\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !checkSet ) {\r\n\t\tcheckSet = set;\r\n\t}\r\n\r\n\tif ( !checkSet ) {\r\n\t\tSizzle.error( cur || selector );\r\n\t}\r\n\r\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\r\n\t\tif ( !prune ) {\r\n\t\t\tresults.push.apply( results, checkSet );\r\n\r\n\t\t} else if ( context && context.nodeType === 1 ) {\r\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\r\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\r\n\t\t\t\t\tresults.push( set[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\r\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\r\n\t\t\t\t\tresults.push( set[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t} else {\r\n\t\tmakeArray( checkSet, results );\r\n\t}\r\n\r\n\tif ( extra ) {\r\n\t\tSizzle( extra, origContext, results, seed );\r\n\t\tSizzle.uniqueSort( results );\r\n\t}\r\n\r\n\treturn results;\r\n};\r\n\r\nSizzle.uniqueSort = function( results ) {\r\n\tif ( sortOrder ) {\r\n\t\thasDuplicate = baseHasDuplicate;\r\n\t\tresults.sort( sortOrder );\r\n\r\n\t\tif ( hasDuplicate ) {\r\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\r\n\t\t\t\tif ( results[i] === results[ i - 1 ] ) {\r\n\t\t\t\t\tresults.splice( i--, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn results;\r\n};\r\n\r\nSizzle.matches = function( expr, set ) {\r\n\treturn Sizzle( expr, null, null, set );\r\n};\r\n\r\nSizzle.matchesSelector = function( node, expr ) {\r\n\treturn Sizzle( expr, null, null, [node] ).length > 0;\r\n};\r\n\r\nSizzle.find = function( expr, context, isXML ) {\r\n\tvar set, i, len, match, type, left;\r\n\r\n\tif ( !expr ) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tfor ( i = 0, len = Expr.order.length; i < len; i++ ) {\r\n\t\ttype = Expr.order[i];\r\n\r\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\r\n\t\t\tleft = match[1];\r\n\t\t\tmatch.splice( 1, 1 );\r\n\r\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\r\n\t\t\t\tmatch[1] = (match[1] || \"\").replace( rBackslash, \"\" );\r\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\r\n\r\n\t\t\t\tif ( set != null ) {\r\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !set ) {\r\n\t\tset = typeof context.getElementsByTagName !== \"undefined\" ?\r\n\t\t\tcontext.getElementsByTagName( \"*\" ) :\r\n\t\t\t[];\r\n\t}\r\n\r\n\treturn { set: set, expr: expr };\r\n};\r\n\r\nSizzle.filter = function( expr, set, inplace, not ) {\r\n\tvar match, anyFound,\r\n\t\ttype, found, item, filter, left,\r\n\t\ti, pass,\r\n\t\told = expr,\r\n\t\tresult = [],\r\n\t\tcurLoop = set,\r\n\t\tisXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\r\n\r\n\twhile ( expr && set.length ) {\r\n\t\tfor ( type in Expr.filter ) {\r\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\r\n\t\t\t\tfilter = Expr.filter[ type ];\r\n\t\t\t\tleft = match[1];\r\n\r\n\t\t\t\tanyFound = false;\r\n\r\n\t\t\t\tmatch.splice(1,1);\r\n\r\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( curLoop === result ) {\r\n\t\t\t\t\tresult = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\r\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\r\n\r\n\t\t\t\t\tif ( !match ) {\r\n\t\t\t\t\t\tanyFound = found = true;\r\n\r\n\t\t\t\t\t} else if ( match === true ) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( match ) {\r\n\t\t\t\t\tfor ( i = 0; (item = curLoop[i]) != null; i++ ) {\r\n\t\t\t\t\t\tif ( item ) {\r\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\r\n\t\t\t\t\t\t\tpass = not ^ found;\r\n\r\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\r\n\t\t\t\t\t\t\t\tif ( pass ) {\r\n\t\t\t\t\t\t\t\t\tanyFound = true;\r\n\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t} else if ( pass ) {\r\n\t\t\t\t\t\t\t\tresult.push( item );\r\n\t\t\t\t\t\t\t\tanyFound = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( found !== undefined ) {\r\n\t\t\t\t\tif ( !inplace ) {\r\n\t\t\t\t\t\tcurLoop = result;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\r\n\r\n\t\t\t\t\tif ( !anyFound ) {\r\n\t\t\t\t\t\treturn [];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Improper expression\r\n\t\tif ( expr === old ) {\r\n\t\t\tif ( anyFound == null ) {\r\n\t\t\t\tSizzle.error( expr );\r\n\r\n\t\t\t} else {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\told = expr;\r\n\t}\r\n\r\n\treturn curLoop;\r\n};\r\n\r\nSizzle.error = function( msg ) {\r\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\r\n};\r\n\r\n/**\r\n * Utility function for retreiving the text value of an array of DOM nodes\r\n * @param {Array|Element} elem\r\n */\r\nvar getText = Sizzle.getText = function( elem ) {\r\n    var i, node,\r\n\t\tnodeType = elem.nodeType,\r\n\t\tret = \"\";\r\n\r\n\tif ( nodeType ) {\r\n\t\tif ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r\n\t\t\t// Use textContent || innerText for elements\r\n\t\t\tif ( typeof elem.textContent === 'string' ) {\r\n\t\t\t\treturn elem.textContent;\r\n\t\t\t} else if ( typeof elem.innerText === 'string' ) {\r\n\t\t\t\t// Replace IE's carriage returns\r\n\t\t\t\treturn elem.innerText.replace( rReturn, '' );\r\n\t\t\t} else {\r\n\t\t\t\t// Traverse it's children\r\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling) {\r\n\t\t\t\t\tret += getText( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\r\n\t\t\treturn elem.nodeValue;\r\n\t\t}\r\n\t} else {\r\n\r\n\t\t// If no nodeType, this is expected to be an array\r\n\t\tfor ( i = 0; (node = elem[i]); i++ ) {\r\n\t\t\t// Do not traverse comment nodes\r\n\t\t\tif ( node.nodeType !== 8 ) {\r\n\t\t\t\tret += getText( node );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn ret;\r\n};\r\n\r\nvar Expr = Sizzle.selectors = {\r\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\r\n\r\n\tmatch: {\r\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\r\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\r\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\r\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\r\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\r\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\r\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\r\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\r\n\t},\r\n\r\n\tleftMatch: {},\r\n\r\n\tattrMap: {\r\n\t\t\"class\": \"className\",\r\n\t\t\"for\": \"htmlFor\"\r\n\t},\r\n\r\n\tattrHandle: {\r\n\t\thref: function( elem ) {\r\n\t\t\treturn elem.getAttribute( \"href\" );\r\n\t\t},\r\n\t\ttype: function( elem ) {\r\n\t\t\treturn elem.getAttribute( \"type\" );\r\n\t\t}\r\n\t},\r\n\r\n\trelative: {\r\n\t\t\"+\": function(checkSet, part){\r\n\t\t\tvar isPartStr = typeof part === \"string\",\r\n\t\t\t\tisTag = isPartStr && !rNonWord.test( part ),\r\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\r\n\r\n\t\t\tif ( isTag ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\r\n\t\t\t\tif ( (elem = checkSet[i]) ) {\r\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\r\n\r\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\r\n\t\t\t\t\t\telem || false :\r\n\t\t\t\t\t\telem === part;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( isPartStrNotTag ) {\r\n\t\t\t\tSizzle.filter( part, checkSet, true );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t\">\": function( checkSet, part ) {\r\n\t\t\tvar elem,\r\n\t\t\t\tisPartStr = typeof part === \"string\",\r\n\t\t\t\ti = 0,\r\n\t\t\t\tl = checkSet.length;\r\n\r\n\t\t\tif ( isPartStr && !rNonWord.test( part ) ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\r\n\t\t\t\tfor ( ; i < l; i++ ) {\r\n\t\t\t\t\telem = checkSet[i];\r\n\r\n\t\t\t\t\tif ( elem ) {\r\n\t\t\t\t\t\tvar parent = elem.parentNode;\r\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; i < l; i++ ) {\r\n\t\t\t\t\telem = checkSet[i];\r\n\r\n\t\t\t\t\tif ( elem ) {\r\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\r\n\t\t\t\t\t\t\telem.parentNode :\r\n\t\t\t\t\t\t\telem.parentNode === part;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( isPartStr ) {\r\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t\"\": function(checkSet, part, isXML){\r\n\t\t\tvar nodeCheck,\r\n\t\t\t\tdoneName = done++,\r\n\t\t\t\tcheckFn = dirCheck;\r\n\r\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\t\t\t\tnodeCheck = part;\r\n\t\t\t\tcheckFn = dirNodeCheck;\r\n\t\t\t}\r\n\r\n\t\t\tcheckFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\r\n\t\t},\r\n\r\n\t\t\"~\": function( checkSet, part, isXML ) {\r\n\t\t\tvar nodeCheck,\r\n\t\t\t\tdoneName = done++,\r\n\t\t\t\tcheckFn = dirCheck;\r\n\r\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\r\n\t\t\t\tpart = part.toLowerCase();\r\n\t\t\t\tnodeCheck = part;\r\n\t\t\t\tcheckFn = dirNodeCheck;\r\n\t\t\t}\r\n\r\n\t\t\tcheckFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\r\n\t\t}\r\n\t},\r\n\r\n\tfind: {\r\n\t\tID: function( match, context, isXML ) {\r\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\r\n\t\t\t\tvar m = context.getElementById(match[1]);\r\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\treturn m && m.parentNode ? [m] : [];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tNAME: function( match, context ) {\r\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\r\n\t\t\t\tvar ret = [],\r\n\t\t\t\t\tresults = context.getElementsByName( match[1] );\r\n\r\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\r\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\r\n\t\t\t\t\t\tret.push( results[i] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn ret.length === 0 ? null : ret;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tTAG: function( match, context ) {\r\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\r\n\t\t\t\treturn context.getElementsByTagName( match[1] );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tpreFilter: {\r\n\t\tCLASS: function( match, curLoop, inplace, result, not, isXML ) {\r\n\t\t\tmatch = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\r\n\r\n\t\t\tif ( isXML ) {\r\n\t\t\t\treturn match;\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\r\n\t\t\t\tif ( elem ) {\r\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\r\n\t\t\t\t\t\tif ( !inplace ) {\r\n\t\t\t\t\t\t\tresult.push( elem );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( inplace ) {\r\n\t\t\t\t\t\tcurLoop[i] = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t},\r\n\r\n\t\tID: function( match ) {\r\n\t\t\treturn match[1].replace( rBackslash, \"\" );\r\n\t\t},\r\n\r\n\t\tTAG: function( match, curLoop ) {\r\n\t\t\treturn match[1].replace( rBackslash, \"\" ).toLowerCase();\r\n\t\t},\r\n\r\n\t\tCHILD: function( match ) {\r\n\t\t\tif ( match[1] === \"nth\" ) {\r\n\t\t\t\tif ( !match[2] ) {\r\n\t\t\t\t\tSizzle.error( match[0] );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmatch[2] = match[2].replace(/^\\+|\\s*/g, '');\r\n\r\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\r\n\t\t\t\tvar test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\r\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\r\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\r\n\r\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\r\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\r\n\t\t\t\tmatch[3] = test[3] - 0;\r\n\t\t\t}\r\n\t\t\telse if ( match[2] ) {\r\n\t\t\t\tSizzle.error( match[0] );\r\n\t\t\t}\r\n\r\n\t\t\t// TODO: Move to normal caching system\r\n\t\t\tmatch[0] = done++;\r\n\r\n\t\t\treturn match;\r\n\t\t},\r\n\r\n\t\tATTR: function( match, curLoop, inplace, result, not, isXML ) {\r\n\t\t\tvar name = match[1] = match[1].replace( rBackslash, \"\" );\r\n\r\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\r\n\t\t\t\tmatch[1] = Expr.attrMap[name];\r\n\t\t\t}\r\n\r\n\t\t\t// Handle if an un-quoted value was used\r\n\t\t\tmatch[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\r\n\r\n\t\t\tif ( match[2] === \"~=\" ) {\r\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\r\n\t\t\t}\r\n\r\n\t\t\treturn match;\r\n\t\t},\r\n\r\n\t\tPSEUDO: function( match, curLoop, inplace, result, not ) {\r\n\t\t\tif ( match[1] === \"not\" ) {\r\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\r\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\r\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\r\n\r\n\t\t\t\t\tif ( !inplace ) {\r\n\t\t\t\t\t\tresult.push.apply( result, ret );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\treturn match;\r\n\t\t},\r\n\r\n\t\tPOS: function( match ) {\r\n\t\t\tmatch.unshift( true );\r\n\r\n\t\t\treturn match;\r\n\t\t}\r\n\t},\r\n\r\n\tfilters: {\r\n\t\tenabled: function( elem ) {\r\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\r\n\t\t},\r\n\r\n\t\tdisabled: function( elem ) {\r\n\t\t\treturn elem.disabled === true;\r\n\t\t},\r\n\r\n\t\tchecked: function( elem ) {\r\n\t\t\treturn elem.checked === true;\r\n\t\t},\r\n\r\n\t\tselected: function( elem ) {\r\n\t\t\t// Accessing this property makes selected-by-default\r\n\t\t\t// options in Safari work properly\r\n\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\telem.parentNode.selectedIndex;\r\n\t\t\t}\r\n\r\n\t\t\treturn elem.selected === true;\r\n\t\t},\r\n\r\n\t\tparent: function( elem ) {\r\n\t\t\treturn !!elem.firstChild;\r\n\t\t},\r\n\r\n\t\tempty: function( elem ) {\r\n\t\t\treturn !elem.firstChild;\r\n\t\t},\r\n\r\n\t\thas: function( elem, i, match ) {\r\n\t\t\treturn !!Sizzle( match[3], elem ).length;\r\n\t\t},\r\n\r\n\t\theader: function( elem ) {\r\n\t\t\treturn (/h\\d/i).test( elem.nodeName );\r\n\t\t},\r\n\r\n\t\ttext: function( elem ) {\r\n\t\t\tvar attr = elem.getAttribute( \"type\" ), type = elem.type;\r\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r\n\t\t\t// use getAttribute instead to test this case\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\r\n\t\t},\r\n\r\n\t\tradio: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\r\n\t\t},\r\n\r\n\t\tcheckbox: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\r\n\t\t},\r\n\r\n\t\tfile: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\r\n\t\t},\r\n\r\n\t\tpassword: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\r\n\t\t},\r\n\r\n\t\tsubmit: function( elem ) {\r\n\t\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\t\treturn (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\r\n\t\t},\r\n\r\n\t\timage: function( elem ) {\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\r\n\t\t},\r\n\r\n\t\treset: function( elem ) {\r\n\t\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\t\treturn (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\r\n\t\t},\r\n\r\n\t\tbutton: function( elem ) {\r\n\t\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\t\treturn name === \"input\" && \"button\" === elem.type || name === \"button\";\r\n\t\t},\r\n\r\n\t\tinput: function( elem ) {\r\n\t\t\treturn (/input|select|textarea|button/i).test( elem.nodeName );\r\n\t\t},\r\n\r\n\t\tfocus: function( elem ) {\r\n\t\t\treturn elem === elem.ownerDocument.activeElement;\r\n\t\t}\r\n\t},\r\n\tsetFilters: {\r\n\t\tfirst: function( elem, i ) {\r\n\t\t\treturn i === 0;\r\n\t\t},\r\n\r\n\t\tlast: function( elem, i, match, array ) {\r\n\t\t\treturn i === array.length - 1;\r\n\t\t},\r\n\r\n\t\teven: function( elem, i ) {\r\n\t\t\treturn i % 2 === 0;\r\n\t\t},\r\n\r\n\t\todd: function( elem, i ) {\r\n\t\t\treturn i % 2 === 1;\r\n\t\t},\r\n\r\n\t\tlt: function( elem, i, match ) {\r\n\t\t\treturn i < match[3] - 0;\r\n\t\t},\r\n\r\n\t\tgt: function( elem, i, match ) {\r\n\t\t\treturn i > match[3] - 0;\r\n\t\t},\r\n\r\n\t\tnth: function( elem, i, match ) {\r\n\t\t\treturn match[3] - 0 === i;\r\n\t\t},\r\n\r\n\t\teq: function( elem, i, match ) {\r\n\t\t\treturn match[3] - 0 === i;\r\n\t\t}\r\n\t},\r\n\tfilter: {\r\n\t\tPSEUDO: function( elem, match, i, array ) {\r\n\t\t\tvar name = match[1],\r\n\t\t\t\tfilter = Expr.filters[ name ];\r\n\r\n\t\t\tif ( filter ) {\r\n\t\t\t\treturn filter( elem, i, match, array );\r\n\r\n\t\t\t} else if ( name === \"contains\" ) {\r\n\t\t\t\treturn (elem.textContent || elem.innerText || getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\r\n\r\n\t\t\t} else if ( name === \"not\" ) {\r\n\t\t\t\tvar not = match[3];\r\n\r\n\t\t\t\tfor ( var j = 0, l = not.length; j < l; j++ ) {\r\n\t\t\t\t\tif ( not[j] === elem ) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else {\r\n\t\t\t\tSizzle.error( name );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tCHILD: function( elem, match ) {\r\n\t\t\tvar first, last,\r\n\t\t\t\tdoneName, parent, cache,\r\n\t\t\t\tcount, diff,\r\n\t\t\t\ttype = match[1],\r\n\t\t\t\tnode = elem;\r\n\r\n\t\t\tswitch ( type ) {\r\n\t\t\t\tcase \"only\":\r\n\t\t\t\tcase \"first\":\r\n\t\t\t\t\twhile ( (node = node.previousSibling) ) {\r\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( type === \"first\" ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tnode = elem;\r\n\r\n\t\t\t\t\t/* falls through */\r\n\t\t\t\tcase \"last\":\r\n\t\t\t\t\twhile ( (node = node.nextSibling) ) {\r\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\tcase \"nth\":\r\n\t\t\t\t\tfirst = match[2];\r\n\t\t\t\t\tlast = match[3];\r\n\r\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdoneName = match[0];\r\n\t\t\t\t\tparent = elem.parentNode;\r\n\r\n\t\t\t\t\tif ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {\r\n\t\t\t\t\t\tcount = 0;\r\n\r\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\r\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\r\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tparent[ expando ] = doneName;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdiff = elem.nodeIndex - last;\r\n\r\n\t\t\t\t\tif ( first === 0 ) {\r\n\t\t\t\t\t\treturn diff === 0;\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\r\n\t\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tID: function( elem, match ) {\r\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\r\n\t\t},\r\n\r\n\t\tTAG: function( elem, match ) {\r\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;\r\n\t\t},\r\n\r\n\t\tCLASS: function( elem, match ) {\r\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\r\n\t\t\t\t.indexOf( match ) > -1;\r\n\t\t},\r\n\r\n\t\tATTR: function( elem, match ) {\r\n\t\t\tvar name = match[1],\r\n\t\t\t\tresult = Sizzle.attr ?\r\n\t\t\t\t\tSizzle.attr( elem, name ) :\r\n\t\t\t\t\tExpr.attrHandle[ name ] ?\r\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\r\n\t\t\t\t\telem[ name ] != null ?\r\n\t\t\t\t\t\telem[ name ] :\r\n\t\t\t\t\t\telem.getAttribute( name ),\r\n\t\t\t\tvalue = result + \"\",\r\n\t\t\t\ttype = match[2],\r\n\t\t\t\tcheck = match[4];\r\n\r\n\t\t\treturn result == null ?\r\n\t\t\t\ttype === \"!=\" :\r\n\t\t\t\t!type && Sizzle.attr ?\r\n\t\t\t\tresult != null :\r\n\t\t\t\ttype === \"=\" ?\r\n\t\t\t\tvalue === check :\r\n\t\t\t\ttype === \"*=\" ?\r\n\t\t\t\tvalue.indexOf(check) >= 0 :\r\n\t\t\t\ttype === \"~=\" ?\r\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\r\n\t\t\t\t!check ?\r\n\t\t\t\tvalue && result !== false :\r\n\t\t\t\ttype === \"!=\" ?\r\n\t\t\t\tvalue !== check :\r\n\t\t\t\ttype === \"^=\" ?\r\n\t\t\t\tvalue.indexOf(check) === 0 :\r\n\t\t\t\ttype === \"$=\" ?\r\n\t\t\t\tvalue.substr(value.length - check.length) === check :\r\n\t\t\t\ttype === \"|=\" ?\r\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\r\n\t\t\t\tfalse;\r\n\t\t},\r\n\r\n\t\tPOS: function( elem, match, i, array ) {\r\n\t\t\tvar name = match[2],\r\n\t\t\t\tfilter = Expr.setFilters[ name ];\r\n\r\n\t\t\tif ( filter ) {\r\n\t\t\t\treturn filter( elem, i, match, array );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nvar origPOS = Expr.match.POS,\r\n\tfescape = function(all, num){\r\n\t\treturn \"\\\\\" + (num - 0 + 1);\r\n\t};\r\n\r\nfor ( var type in Expr.match ) {\r\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\r\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\r\n}\r\n// Expose origPOS\r\n// \"global\" as in regardless of relation to brackets/parens\r\nExpr.match.globalPOS = origPOS;\r\n\r\nvar makeArray = function( array, results ) {\r\n\tarray = Array.prototype.slice.call( array, 0 );\r\n\r\n\tif ( results ) {\r\n\t\tresults.push.apply( results, array );\r\n\t\treturn results;\r\n\t}\r\n\r\n\treturn array;\r\n};\r\n\r\n// Perform a simple check to determine if the browser is capable of\r\n// converting a NodeList to an array using builtin methods.\r\n// Also verifies that the returned array holds DOM nodes\r\n// (which is not the case in the Blackberry browser)\r\ntry {\r\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\r\n\r\n// Provide a fallback method if it does not work\r\n} catch( e ) {\r\n\tmakeArray = function( array, results ) {\r\n\t\tvar i = 0,\r\n\t\t\tret = results || [];\r\n\r\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\r\n\t\t\tArray.prototype.push.apply( ret, array );\r\n\r\n\t\t} else {\r\n\t\t\tif ( typeof array.length === \"number\" ) {\r\n\t\t\t\tfor ( var l = array.length; i < l; i++ ) {\r\n\t\t\t\t\tret.push( array[i] );\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\tfor ( ; array[i]; i++ ) {\r\n\t\t\t\t\tret.push( array[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t};\r\n}\r\n\r\nvar sortOrder, siblingCheck;\r\n\r\nif ( document.documentElement.compareDocumentPosition ) {\r\n\tsortOrder = function( a, b ) {\r\n\t\tif ( a === b ) {\r\n\t\t\thasDuplicate = true;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\r\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\r\n\t\t}\r\n\r\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : 1;\r\n\t};\r\n\r\n} else {\r\n\tsortOrder = function( a, b ) {\r\n\t\t// The nodes are identical, we can exit early\r\n\t\tif ( a === b ) {\r\n\t\t\thasDuplicate = true;\r\n\t\t\treturn 0;\r\n\r\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\r\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\r\n\t\t\treturn a.sourceIndex - b.sourceIndex;\r\n\t\t}\r\n\r\n\t\tvar al, bl,\r\n\t\t\tap = [],\r\n\t\t\tbp = [],\r\n\t\t\taup = a.parentNode,\r\n\t\t\tbup = b.parentNode,\r\n\t\t\tcur = aup;\r\n\r\n\t\t// If the nodes are siblings (or identical) we can do a quick check\r\n\t\tif ( aup === bup ) {\r\n\t\t\treturn siblingCheck( a, b );\r\n\r\n\t\t// If no parents were found then the nodes are disconnected\r\n\t\t} else if ( !aup ) {\r\n\t\t\treturn -1;\r\n\r\n\t\t} else if ( !bup ) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\t// Otherwise they're somewhere else in the tree so we need\r\n\t\t// to build up a full list of the parentNodes for comparison\r\n\t\twhile ( cur ) {\r\n\t\t\tap.unshift( cur );\r\n\t\t\tcur = cur.parentNode;\r\n\t\t}\r\n\r\n\t\tcur = bup;\r\n\r\n\t\twhile ( cur ) {\r\n\t\t\tbp.unshift( cur );\r\n\t\t\tcur = cur.parentNode;\r\n\t\t}\r\n\r\n\t\tal = ap.length;\r\n\t\tbl = bp.length;\r\n\r\n\t\t// Start walking down the tree looking for a discrepancy\r\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\r\n\t\t\tif ( ap[i] !== bp[i] ) {\r\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// We ended someplace up the tree so do a sibling check\r\n\t\treturn i === al ?\r\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\r\n\t\t\tsiblingCheck( ap[i], b, 1 );\r\n\t};\r\n\r\n\tsiblingCheck = function( a, b, ret ) {\r\n\t\tif ( a === b ) {\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\tvar cur = a.nextSibling;\r\n\r\n\t\twhile ( cur ) {\r\n\t\t\tif ( cur === b ) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\r\n\t\t\tcur = cur.nextSibling;\r\n\t\t}\r\n\r\n\t\treturn 1;\r\n\t};\r\n}\r\n\r\n// Check to see if the browser returns elements by name when\r\n// querying by getElementById (and provide a workaround)\r\n(function(){\r\n\t// We're going to inject a fake input element with a specified name\r\n\tvar form = document.createElement(\"div\"),\r\n\t\tid = \"script\" + (new Date()).getTime(),\r\n\t\troot = document.documentElement;\r\n\r\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\r\n\r\n\t// Inject it into the root element, check its status, and remove it quickly\r\n\troot.insertBefore( form, root.firstChild );\r\n\r\n\t// The workaround has to do additional checks after a getElementById\r\n\t// Which slows things down for other browsers (hence the branching)\r\n\tif ( document.getElementById( id ) ) {\r\n\t\tExpr.find.ID = function( match, context, isXML ) {\r\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\r\n\t\t\t\tvar m = context.getElementById(match[1]);\r\n\r\n\t\t\t\treturn m ?\r\n\t\t\t\t\tm.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\r\n\t\t\t\t\t\t[m] :\r\n\t\t\t\t\t\tundefined :\r\n\t\t\t\t\t[];\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tExpr.filter.ID = function( elem, match ) {\r\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\r\n\r\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\r\n\t\t};\r\n\t}\r\n\r\n\troot.removeChild( form );\r\n\r\n\t// release memory in IE\r\n\troot = form = null;\r\n})();\r\n\r\n(function(){\r\n\t// Check to see if the browser returns only elements\r\n\t// when doing getElementsByTagName(\"*\")\r\n\r\n\t// Create a fake element\r\n\tvar div = document.createElement(\"div\");\r\n\tdiv.appendChild( document.createComment(\"\") );\r\n\r\n\t// Make sure no comments are found\r\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\r\n\t\tExpr.find.TAG = function( match, context ) {\r\n\t\t\tvar results = context.getElementsByTagName( match[1] );\r\n\r\n\t\t\t// Filter out possible comments\r\n\t\t\tif ( match[1] === \"*\" ) {\r\n\t\t\t\tvar tmp = [];\r\n\r\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\r\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\r\n\t\t\t\t\t\ttmp.push( results[i] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresults = tmp;\r\n\t\t\t}\r\n\r\n\t\t\treturn results;\r\n\t\t};\r\n\t}\r\n\r\n\t// Check to see if an attribute returns normalized href attributes\r\n\tdiv.innerHTML = \"<a href='#'></a>\";\r\n\r\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\r\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\r\n\r\n\t\tExpr.attrHandle.href = function( elem ) {\r\n\t\t\treturn elem.getAttribute( \"href\", 2 );\r\n\t\t};\r\n\t}\r\n\r\n\t// release memory in IE\r\n\tdiv = null;\r\n})();\r\n\r\nif ( document.querySelectorAll ) {\r\n\t(function(){\r\n\t\tvar oldSizzle = Sizzle,\r\n\t\t\tdiv = document.createElement(\"div\"),\r\n\t\t\tid = \"__sizzle__\";\r\n\r\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\r\n\r\n\t\t// Safari can't handle uppercase or unicode characters when\r\n\t\t// in quirks mode.\r\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tSizzle = function( query, context, extra, seed ) {\r\n\t\t\tcontext = context || document;\r\n\r\n\t\t\t// Only use querySelectorAll on non-XML documents\r\n\t\t\t// (ID selectors don't work in non-HTML documents)\r\n\t\t\tif ( !seed && !Sizzle.isXML(context) ) {\r\n\t\t\t\t// See if we find a selector to speed up\r\n\t\t\t\tvar match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\r\n\r\n\t\t\t\tif ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\r\n\t\t\t\t\t// Speed-up: Sizzle(\"TAG\")\r\n\t\t\t\t\tif ( match[1] ) {\r\n\t\t\t\t\t\treturn makeArray( context.getElementsByTagName( query ), extra );\r\n\r\n\t\t\t\t\t// Speed-up: Sizzle(\".CLASS\")\r\n\t\t\t\t\t} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\r\n\t\t\t\t\t\treturn makeArray( context.getElementsByClassName( match[2] ), extra );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( context.nodeType === 9 ) {\r\n\t\t\t\t\t// Speed-up: Sizzle(\"body\")\r\n\t\t\t\t\t// The body element only exists once, optimize finding it\r\n\t\t\t\t\tif ( query === \"body\" && context.body ) {\r\n\t\t\t\t\t\treturn makeArray( [ context.body ], extra );\r\n\r\n\t\t\t\t\t// Speed-up: Sizzle(\"#ID\")\r\n\t\t\t\t\t} else if ( match && match[3] ) {\r\n\t\t\t\t\t\tvar elem = context.getElementById( match[3] );\r\n\r\n\t\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\t\t\tif ( elem && elem.parentNode ) {\r\n\t\t\t\t\t\t\t// Handle the case where IE and Opera return items\r\n\t\t\t\t\t\t\t// by name instead of ID\r\n\t\t\t\t\t\t\tif ( elem.id === match[3] ) {\r\n\t\t\t\t\t\t\t\treturn makeArray( [ elem ], extra );\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\treturn makeArray( [], extra );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\r\n\t\t\t\t\t} catch(qsaError) {}\r\n\r\n\t\t\t\t// qSA works strangely on Element-rooted queries\r\n\t\t\t\t// We can work around this by specifying an extra ID on the root\r\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\r\n\t\t\t\t// IE 8 doesn't work on object elements\r\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\r\n\t\t\t\t\tvar oldContext = context,\r\n\t\t\t\t\t\told = context.getAttribute( \"id\" ),\r\n\t\t\t\t\t\tnid = old || id,\r\n\t\t\t\t\t\thasParent = context.parentNode,\r\n\t\t\t\t\t\trelativeHierarchySelector = /^\\s*[+~]/.test( query );\r\n\r\n\t\t\t\t\tif ( !old ) {\r\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tnid = nid.replace( /'/g, \"\\\\$&\" );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( relativeHierarchySelector && hasParent ) {\r\n\t\t\t\t\t\tcontext = context.parentNode;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tif ( !relativeHierarchySelector || hasParent ) {\r\n\t\t\t\t\t\t\treturn makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} catch(pseudoError) {\r\n\t\t\t\t\t} finally {\r\n\t\t\t\t\t\tif ( !old ) {\r\n\t\t\t\t\t\t\toldContext.removeAttribute( \"id\" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn oldSizzle(query, context, extra, seed);\r\n\t\t};\r\n\r\n\t\tfor ( var prop in oldSizzle ) {\r\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\r\n\t\t}\r\n\r\n\t\t// release memory in IE\r\n\t\tdiv = null;\r\n\t})();\r\n}\r\n\r\n(function(){\r\n\tvar html = document.documentElement,\r\n\t\tmatches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\r\n\r\n\tif ( matches ) {\r\n\t\t// Check to see if it's possible to do matchesSelector\r\n\t\t// on a disconnected node (IE 9 fails this)\r\n\t\tvar disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\r\n\t\t\tpseudoWorks = false;\r\n\r\n\t\ttry {\r\n\t\t\t// This should fail with an exception\r\n\t\t\t// Gecko does not error, returns false instead\r\n\t\t\tmatches.call( document.documentElement, \"[test!='']:sizzle\" );\r\n\r\n\t\t} catch( pseudoError ) {\r\n\t\t\tpseudoWorks = true;\r\n\t\t}\r\n\r\n\t\tSizzle.matchesSelector = function( node, expr ) {\r\n\t\t\t// Make sure that attribute selectors are quoted\r\n\t\t\texpr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\r\n\r\n\t\t\tif ( !Sizzle.isXML( node ) ) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\r\n\t\t\t\t\t\tvar ret = matches.call( node, expr );\r\n\r\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\r\n\t\t\t\t\t\tif ( ret || !disconnectedMatch ||\r\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\r\n\t\t\t\t\t\t\t\t// fragment in IE 9, so check for that\r\n\t\t\t\t\t\t\t\tnode.document && node.document.nodeType !== 11 ) {\r\n\t\t\t\t\t\t\treturn ret;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t\treturn Sizzle(expr, null, null, [node]).length > 0;\r\n\t\t};\r\n\t}\r\n})();\r\n\r\n(function(){\r\n\tvar div = document.createElement(\"div\");\r\n\r\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\r\n\r\n\t// Opera can't find a second classname (in 9.6)\r\n\t// Also, make sure that getElementsByClassName actually exists\r\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\r\n\tdiv.lastChild.className = \"e\";\r\n\r\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tExpr.order.splice(1, 0, \"CLASS\");\r\n\tExpr.find.CLASS = function( match, context, isXML ) {\r\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\r\n\t\t\treturn context.getElementsByClassName(match[1]);\r\n\t\t}\r\n\t};\r\n\r\n\t// release memory in IE\r\n\tdiv = null;\r\n})();\r\n\r\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\r\n\t\tvar elem = checkSet[i];\r\n\r\n\t\tif ( elem ) {\r\n\t\t\tvar match = false;\r\n\r\n\t\t\telem = elem[dir];\r\n\r\n\t\t\twhile ( elem ) {\r\n\t\t\t\tif ( elem[ expando ] === doneName ) {\r\n\t\t\t\t\tmatch = checkSet[elem.sizset];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\r\n\t\t\t\t\telem[ expando ] = doneName;\r\n\t\t\t\t\telem.sizset = i;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\r\n\t\t\t\t\tmatch = elem;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telem = elem[dir];\r\n\t\t\t}\r\n\r\n\t\t\tcheckSet[i] = match;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\r\n\t\tvar elem = checkSet[i];\r\n\r\n\t\tif ( elem ) {\r\n\t\t\tvar match = false;\r\n\r\n\t\t\telem = elem[dir];\r\n\r\n\t\t\twhile ( elem ) {\r\n\t\t\t\tif ( elem[ expando ] === doneName ) {\r\n\t\t\t\t\tmatch = checkSet[elem.sizset];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\tif ( !isXML ) {\r\n\t\t\t\t\t\telem[ expando ] = doneName;\r\n\t\t\t\t\t\telem.sizset = i;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\r\n\t\t\t\t\t\tif ( elem === cur ) {\r\n\t\t\t\t\t\t\tmatch = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\r\n\t\t\t\t\t\tmatch = elem;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\telem = elem[dir];\r\n\t\t\t}\r\n\r\n\t\t\tcheckSet[i] = match;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nif ( document.documentElement.contains ) {\r\n\tSizzle.contains = function( a, b ) {\r\n\t\treturn a !== b && (a.contains ? a.contains(b) : true);\r\n\t};\r\n\r\n} else if ( document.documentElement.compareDocumentPosition ) {\r\n\tSizzle.contains = function( a, b ) {\r\n\t\treturn !!(a.compareDocumentPosition(b) & 16);\r\n\t};\r\n\r\n} else {\r\n\tSizzle.contains = function() {\r\n\t\treturn false;\r\n\t};\r\n}\r\n\r\nSizzle.isXML = function( elem ) {\r\n\t// documentElement is verified for cases where it doesn't yet exist\r\n\t// (such as loading iframes in IE - #4833)\r\n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\r\n\r\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\r\n};\r\n\r\nvar posProcess = function( selector, context, seed ) {\r\n\tvar match,\r\n\t\ttmpSet = [],\r\n\t\tlater = \"\",\r\n\t\troot = context.nodeType ? [context] : context;\r\n\r\n\t// Position selectors must be done after the filter\r\n\t// And so must :not(positional) so we move all PSEUDOs to the end\r\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\r\n\t\tlater += match[0];\r\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\r\n\t}\r\n\r\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\r\n\r\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\r\n\t\tSizzle( selector, root[i], tmpSet, seed );\r\n\t}\r\n\r\n\treturn Sizzle.filter( later, tmpSet );\r\n};\r\n\r\n// EXPOSE\r\n// Override sizzle attribute retrieval\r\nSizzle.attr = jQuery.attr;\r\nSizzle.selectors.attrMap = {};\r\njQuery.find = Sizzle;\r\njQuery.expr = Sizzle.selectors;\r\njQuery.expr[\":\"] = jQuery.expr.filters;\r\njQuery.unique = Sizzle.uniqueSort;\r\njQuery.text = Sizzle.getText;\r\njQuery.isXMLDoc = Sizzle.isXML;\r\njQuery.contains = Sizzle.contains;\r\n\r\n\r\n})();\r\n\r\n\r\nvar runtil = /Until$/,\r\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\r\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\r\n\trmultiselector = /,/,\r\n\tisSimple = /^.[^:#\\[\\.,]*$/,\r\n\tslice = Array.prototype.slice,\r\n\tPOS = jQuery.expr.match.globalPOS,\r\n\t// methods guaranteed to produce a unique set when starting from a unique set\r\n\tguaranteedUnique = {\r\n\t\tchildren: true,\r\n\t\tcontents: true,\r\n\t\tnext: true,\r\n\t\tprev: true\r\n\t};\r\n\r\njQuery.fn.extend({\r\n\tfind: function( selector ) {\r\n\t\tvar self = this,\r\n\t\t\ti, l;\r\n\r\n\t\tif ( typeof selector !== \"string\" ) {\r\n\t\t\treturn jQuery( selector ).filter(function() {\r\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\r\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar ret = this.pushStack( \"\", \"find\", selector ),\r\n\t\t\tlength, n, r;\r\n\r\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\tlength = ret.length;\r\n\t\t\tjQuery.find( selector, this[i], ret );\r\n\r\n\t\t\tif ( i > 0 ) {\r\n\t\t\t\t// Make sure that the results are unique\r\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\r\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\r\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\r\n\t\t\t\t\t\t\tret.splice(n--, 1);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\thas: function( target ) {\r\n\t\tvar targets = jQuery( target );\r\n\t\treturn this.filter(function() {\r\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\r\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tnot: function( selector ) {\r\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\r\n\t},\r\n\r\n\tfilter: function( selector ) {\r\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\r\n\t},\r\n\r\n\tis: function( selector ) {\r\n\t\treturn !!selector && (\r\n\t\t\ttypeof selector === \"string\" ?\r\n\t\t\t\t// If this is a positional selector, check membership in the returned set\r\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\r\n\t\t\t\tPOS.test( selector ) ?\r\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\r\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\r\n\t\t\t\tthis.filter( selector ).length > 0 );\r\n\t},\r\n\r\n\tclosest: function( selectors, context ) {\r\n\t\tvar ret = [], i, l, cur = this[0];\r\n\r\n\t\t// Array (deprecated as of jQuery 1.7)\r\n\t\tif ( jQuery.isArray( selectors ) ) {\r\n\t\t\tvar level = 1;\r\n\r\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\r\n\t\t\t\tfor ( i = 0; i < selectors.length; i++ ) {\r\n\r\n\t\t\t\t\tif ( jQuery( cur ).is( selectors[ i ] ) ) {\r\n\t\t\t\t\t\tret.push({ selector: selectors[ i ], elem: cur, level: level });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcur = cur.parentNode;\r\n\t\t\t\tlevel++;\r\n\t\t\t}\r\n\r\n\t\t\treturn ret;\r\n\t\t}\r\n\r\n\t\t// String\r\n\t\tvar pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\r\n\t\t\t\tjQuery( selectors, context || this.context ) :\r\n\t\t\t\t0;\r\n\r\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\r\n\t\t\tcur = this[i];\r\n\r\n\t\t\twhile ( cur ) {\r\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\r\n\t\t\t\t\tret.push( cur );\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcur = cur.parentNode;\r\n\t\t\t\t\tif ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\r\n\r\n\t\treturn this.pushStack( ret, \"closest\", selectors );\r\n\t},\r\n\r\n\t// Determine the position of an element within\r\n\t// the matched set of elements\r\n\tindex: function( elem ) {\r\n\r\n\t\t// No argument, return index in parent\r\n\t\tif ( !elem ) {\r\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\r\n\t\t}\r\n\r\n\t\t// index in selector\r\n\t\tif ( typeof elem === \"string\" ) {\r\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\r\n\t\t}\r\n\r\n\t\t// Locate the position of the desired element\r\n\t\treturn jQuery.inArray(\r\n\t\t\t// If it receives a jQuery object, the first element is used\r\n\t\t\telem.jquery ? elem[0] : elem, this );\r\n\t},\r\n\r\n\tadd: function( selector, context ) {\r\n\t\tvar set = typeof selector === \"string\" ?\r\n\t\t\t\tjQuery( selector, context ) :\r\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\r\n\t\t\tall = jQuery.merge( this.get(), set );\r\n\r\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\r\n\t\t\tall :\r\n\t\t\tjQuery.unique( all ) );\r\n\t},\r\n\r\n\tandSelf: function() {\r\n\t\treturn this.add( this.prevObject );\r\n\t}\r\n});\r\n\r\n// A painfully simple check to see if an element is disconnected\r\n// from a document (should be improved, where feasible).\r\nfunction isDisconnected( node ) {\r\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\r\n}\r\n\r\njQuery.each({\r\n\tparent: function( elem ) {\r\n\t\tvar parent = elem.parentNode;\r\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\r\n\t},\r\n\tparents: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"parentNode\" );\r\n\t},\r\n\tparentsUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\r\n\t},\r\n\tnext: function( elem ) {\r\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\r\n\t},\r\n\tprev: function( elem ) {\r\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\r\n\t},\r\n\tnextAll: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\r\n\t},\r\n\tprevAll: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\r\n\t},\r\n\tnextUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\r\n\t},\r\n\tprevUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\r\n\t},\r\n\tsiblings: function( elem ) {\r\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\r\n\t},\r\n\tchildren: function( elem ) {\r\n\t\treturn jQuery.sibling( elem.firstChild );\r\n\t},\r\n\tcontents: function( elem ) {\r\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\r\n\t\t\telem.contentDocument || elem.contentWindow.document :\r\n\t\t\tjQuery.makeArray( elem.childNodes );\r\n\t}\r\n}, function( name, fn ) {\r\n\tjQuery.fn[ name ] = function( until, selector ) {\r\n\t\tvar ret = jQuery.map( this, fn, until );\r\n\r\n\t\tif ( !runtil.test( name ) ) {\r\n\t\t\tselector = until;\r\n\t\t}\r\n\r\n\t\tif ( selector && typeof selector === \"string\" ) {\r\n\t\t\tret = jQuery.filter( selector, ret );\r\n\t\t}\r\n\r\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\r\n\r\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\r\n\t\t\tret = ret.reverse();\r\n\t\t}\r\n\r\n\t\treturn this.pushStack( ret, name, slice.call( arguments ).join(\",\") );\r\n\t};\r\n});\r\n\r\njQuery.extend({\r\n\tfilter: function( expr, elems, not ) {\r\n\t\tif ( not ) {\r\n\t\t\texpr = \":not(\" + expr + \")\";\r\n\t\t}\r\n\r\n\t\treturn elems.length === 1 ?\r\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\r\n\t\t\tjQuery.find.matches(expr, elems);\r\n\t},\r\n\r\n\tdir: function( elem, dir, until ) {\r\n\t\tvar matched = [],\r\n\t\t\tcur = elem[ dir ];\r\n\r\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\r\n\t\t\tif ( cur.nodeType === 1 ) {\r\n\t\t\t\tmatched.push( cur );\r\n\t\t\t}\r\n\t\t\tcur = cur[dir];\r\n\t\t}\r\n\t\treturn matched;\r\n\t},\r\n\r\n\tnth: function( cur, result, dir, elem ) {\r\n\t\tresult = result || 1;\r\n\t\tvar num = 0;\r\n\r\n\t\tfor ( ; cur; cur = cur[dir] ) {\r\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn cur;\r\n\t},\r\n\r\n\tsibling: function( n, elem ) {\r\n\t\tvar r = [];\r\n\r\n\t\tfor ( ; n; n = n.nextSibling ) {\r\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\r\n\t\t\t\tr.push( n );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn r;\r\n\t}\r\n});\r\n\r\n// Implement the identical functionality for filter and not\r\nfunction winnow( elements, qualifier, keep ) {\r\n\r\n\t// Can't pass null or undefined to indexOf in Firefox 4\r\n\t// Set to 0 to skip string check\r\n\tqualifier = qualifier || 0;\r\n\r\n\tif ( jQuery.isFunction( qualifier ) ) {\r\n\t\treturn jQuery.grep(elements, function( elem, i ) {\r\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\r\n\t\t\treturn retVal === keep;\r\n\t\t});\r\n\r\n\t} else if ( qualifier.nodeType ) {\r\n\t\treturn jQuery.grep(elements, function( elem, i ) {\r\n\t\t\treturn ( elem === qualifier ) === keep;\r\n\t\t});\r\n\r\n\t} else if ( typeof qualifier === \"string\" ) {\r\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\r\n\t\t\treturn elem.nodeType === 1;\r\n\t\t});\r\n\r\n\t\tif ( isSimple.test( qualifier ) ) {\r\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\r\n\t\t} else {\r\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\r\n\t\t}\r\n\t}\r\n\r\n\treturn jQuery.grep(elements, function( elem, i ) {\r\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\r\n\t});\r\n}\r\n\r\n\r\n\r\n\r\nfunction createSafeFragment( document ) {\r\n\tvar list = nodeNames.split( \"|\" ),\r\n\tsafeFrag = document.createDocumentFragment();\r\n\r\n\tif ( safeFrag.createElement ) {\r\n\t\twhile ( list.length ) {\r\n\t\t\tsafeFrag.createElement(\r\n\t\t\t\tlist.pop()\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\treturn safeFrag;\r\n}\r\n\r\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\r\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\r\n\trinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\r\n\trleadingWhitespace = /^\\s+/,\r\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\r\n\trtagName = /<([\\w:]+)/,\r\n\trtbody = /<tbody/i,\r\n\trhtml = /<|&#?\\w+;/,\r\n\trnoInnerhtml = /<(?:script|style)/i,\r\n\trnocache = /<(?:script|object|embed|option|style)/i,\r\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\r\n\t// checked=\"checked\" or checked\r\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\r\n\trscriptType = /\\/(java|ecma)script/i,\r\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\r\n\twrapMap = {\r\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\r\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\r\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\r\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\r\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\r\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\r\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\r\n\t\t_default: [ 0, \"\", \"\" ]\r\n\t},\r\n\tsafeFragment = createSafeFragment( document );\r\n\r\nwrapMap.optgroup = wrapMap.option;\r\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\r\nwrapMap.th = wrapMap.td;\r\n\r\n// IE can't serialize <link> and <script> tags normally\r\nif ( !jQuery.support.htmlSerialize ) {\r\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\r\n}\r\n\r\njQuery.fn.extend({\r\n\ttext: function( value ) {\r\n\t\treturn jQuery.access( this, function( value ) {\r\n\t\t\treturn value === undefined ?\r\n\t\t\t\tjQuery.text( this ) :\r\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\r\n\t\t}, null, value, arguments.length );\r\n\t},\r\n\r\n\twrapAll: function( html ) {\r\n\t\tif ( jQuery.isFunction( html ) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( this[0] ) {\r\n\t\t\t// The elements to wrap the target around\r\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\r\n\r\n\t\t\tif ( this[0].parentNode ) {\r\n\t\t\t\twrap.insertBefore( this[0] );\r\n\t\t\t}\r\n\r\n\t\t\twrap.map(function() {\r\n\t\t\t\tvar elem = this;\r\n\r\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\r\n\t\t\t\t\telem = elem.firstChild;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn elem;\r\n\t\t\t}).append( this );\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\twrapInner: function( html ) {\r\n\t\tif ( jQuery.isFunction( html ) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tvar self = jQuery( this ),\r\n\t\t\t\tcontents = self.contents();\r\n\r\n\t\t\tif ( contents.length ) {\r\n\t\t\t\tcontents.wrapAll( html );\r\n\r\n\t\t\t} else {\r\n\t\t\t\tself.append( html );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\twrap: function( html ) {\r\n\t\tvar isFunction = jQuery.isFunction( html );\r\n\r\n\t\treturn this.each(function(i) {\r\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\r\n\t\t});\r\n\t},\r\n\r\n\tunwrap: function() {\r\n\t\treturn this.parent().each(function() {\r\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\r\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\r\n\t\t\t}\r\n\t\t}).end();\r\n\t},\r\n\r\n\tappend: function() {\r\n\t\treturn this.domManip(arguments, true, function( elem ) {\r\n\t\t\tif ( this.nodeType === 1 ) {\r\n\t\t\t\tthis.appendChild( elem );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tprepend: function() {\r\n\t\treturn this.domManip(arguments, true, function( elem ) {\r\n\t\t\tif ( this.nodeType === 1 ) {\r\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tbefore: function() {\r\n\t\tif ( this[0] && this[0].parentNode ) {\r\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\r\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\r\n\t\t\t});\r\n\t\t} else if ( arguments.length ) {\r\n\t\t\tvar set = jQuery.clean( arguments );\r\n\t\t\tset.push.apply( set, this.toArray() );\r\n\t\t\treturn this.pushStack( set, \"before\", arguments );\r\n\t\t}\r\n\t},\r\n\r\n\tafter: function() {\r\n\t\tif ( this[0] && this[0].parentNode ) {\r\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\r\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\r\n\t\t\t});\r\n\t\t} else if ( arguments.length ) {\r\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\r\n\t\t\tset.push.apply( set, jQuery.clean(arguments) );\r\n\t\t\treturn set;\r\n\t\t}\r\n\t},\r\n\r\n\t// keepData is for internal use only--do not document\r\n\tremove: function( selector, keepData ) {\r\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\r\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\r\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\r\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\r\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\t\telem.parentNode.removeChild( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tempty: function() {\r\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\r\n\t\t\t// Remove element nodes and prevent memory leaks\r\n\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\r\n\t\t\t}\r\n\r\n\t\t\t// Remove any remaining nodes\r\n\t\t\twhile ( elem.firstChild ) {\r\n\t\t\t\telem.removeChild( elem.firstChild );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\r\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\r\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\r\n\r\n\t\treturn this.map( function () {\r\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\r\n\t\t});\r\n\t},\r\n\r\n\thtml: function( value ) {\r\n\t\treturn jQuery.access( this, function( value ) {\r\n\t\t\tvar elem = this[0] || {},\r\n\t\t\t\ti = 0,\r\n\t\t\t\tl = this.length;\r\n\r\n\t\t\tif ( value === undefined ) {\r\n\t\t\t\treturn elem.nodeType === 1 ?\r\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\r\n\t\t\t\t\tnull;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\r\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\r\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\r\n\r\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tfor (; i < l; i++ ) {\r\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\r\n\t\t\t\t\t\telem = this[i] || {};\r\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName( \"*\" ) );\r\n\t\t\t\t\t\t\telem.innerHTML = value;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telem = 0;\r\n\r\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t\tif ( elem ) {\r\n\t\t\t\tthis.empty().append( value );\r\n\t\t\t}\r\n\t\t}, null, value, arguments.length );\r\n\t},\r\n\r\n\treplaceWith: function( value ) {\r\n\t\tif ( this[0] && this[0].parentNode ) {\r\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\r\n\t\t\t// this can help fix replacing a parent with child elements\r\n\t\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\t\treturn this.each(function(i) {\r\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\r\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif ( typeof value !== \"string\" ) {\r\n\t\t\t\tvalue = jQuery( value ).detach();\r\n\t\t\t}\r\n\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tvar next = this.nextSibling,\r\n\t\t\t\t\tparent = this.parentNode;\r\n\r\n\t\t\t\tjQuery( this ).remove();\r\n\r\n\t\t\t\tif ( next ) {\r\n\t\t\t\t\tjQuery(next).before( value );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tjQuery(parent).append( value );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\treturn this.length ?\r\n\t\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\r\n\t\t\t\tthis;\r\n\t\t}\r\n\t},\r\n\r\n\tdetach: function( selector ) {\r\n\t\treturn this.remove( selector, true );\r\n\t},\r\n\r\n\tdomManip: function( args, table, callback ) {\r\n\t\tvar results, first, fragment, parent,\r\n\t\t\tvalue = args[0],\r\n\t\t\tscripts = [];\r\n\r\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\r\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction(value) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tvar self = jQuery(this);\r\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\r\n\t\t\t\tself.domManip( args, table, callback );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( this[0] ) {\r\n\t\t\tparent = value && value.parentNode;\r\n\r\n\t\t\t// If we're in a fragment, just use that instead of building a new one\r\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\r\n\t\t\t\tresults = { fragment: parent };\r\n\r\n\t\t\t} else {\r\n\t\t\t\tresults = jQuery.buildFragment( args, this, scripts );\r\n\t\t\t}\r\n\r\n\t\t\tfragment = results.fragment;\r\n\r\n\t\t\tif ( fragment.childNodes.length === 1 ) {\r\n\t\t\t\tfirst = fragment = fragment.firstChild;\r\n\t\t\t} else {\r\n\t\t\t\tfirst = fragment.firstChild;\r\n\t\t\t}\r\n\r\n\t\t\tif ( first ) {\r\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\r\n\r\n\t\t\t\tfor ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\r\n\t\t\t\t\tcallback.call(\r\n\t\t\t\t\t\ttable ?\r\n\t\t\t\t\t\t\troot(this[i], first) :\r\n\t\t\t\t\t\t\tthis[i],\r\n\t\t\t\t\t\t// Make sure that we do not leak memory by inadvertently discarding\r\n\t\t\t\t\t\t// the original fragment (which might have attached data) instead of\r\n\t\t\t\t\t\t// using it; in addition, use the original fragment object for the last\r\n\t\t\t\t\t\t// item instead of first because it can end up being emptied incorrectly\r\n\t\t\t\t\t\t// in certain situations (Bug #8070).\r\n\t\t\t\t\t\t// Fragments from the fragment cache must always be cloned and never used\r\n\t\t\t\t\t\t// in place.\r\n\t\t\t\t\t\tresults.cacheable || ( l > 1 && i < lastIndex ) ?\r\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true ) :\r\n\t\t\t\t\t\t\tfragment\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( scripts.length ) {\r\n\t\t\t\tjQuery.each( scripts, function( i, elem ) {\r\n\t\t\t\t\tif ( elem.src ) {\r\n\t\t\t\t\t\tjQuery.ajax({\r\n\t\t\t\t\t\t\ttype: \"GET\",\r\n\t\t\t\t\t\t\tglobal: false,\r\n\t\t\t\t\t\t\turl: elem.src,\r\n\t\t\t\t\t\t\tasync: false,\r\n\t\t\t\t\t\t\tdataType: \"script\"\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\t\t\telem.parentNode.removeChild( elem );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nfunction root( elem, cur ) {\r\n\treturn jQuery.nodeName(elem, \"table\") ?\r\n\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\r\n\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\r\n\t\telem;\r\n}\r\n\r\nfunction cloneCopyEvent( src, dest ) {\r\n\r\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar type, i, l,\r\n\t\toldData = jQuery._data( src ),\r\n\t\tcurData = jQuery._data( dest, oldData ),\r\n\t\tevents = oldData.events;\r\n\r\n\tif ( events ) {\r\n\t\tdelete curData.handle;\r\n\t\tcurData.events = {};\r\n\r\n\t\tfor ( type in events ) {\r\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\r\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// make the cloned public data object a copy from the original\r\n\tif ( curData.data ) {\r\n\t\tcurData.data = jQuery.extend( {}, curData.data );\r\n\t}\r\n}\r\n\r\nfunction cloneFixAttributes( src, dest ) {\r\n\tvar nodeName;\r\n\r\n\t// We do not need to do anything for non-Elements\r\n\tif ( dest.nodeType !== 1 ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// clearAttributes removes the attributes, which we don't want,\r\n\t// but also removes the attachEvent events, which we *do* want\r\n\tif ( dest.clearAttributes ) {\r\n\t\tdest.clearAttributes();\r\n\t}\r\n\r\n\t// mergeAttributes, in contrast, only merges back on the\r\n\t// original attributes, not the events\r\n\tif ( dest.mergeAttributes ) {\r\n\t\tdest.mergeAttributes( src );\r\n\t}\r\n\r\n\tnodeName = dest.nodeName.toLowerCase();\r\n\r\n\t// IE6-8 fail to clone children inside object elements that use\r\n\t// the proprietary classid attribute value (rather than the type\r\n\t// attribute) to identify the type of content to display\r\n\tif ( nodeName === \"object\" ) {\r\n\t\tdest.outerHTML = src.outerHTML;\r\n\r\n\t} else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\r\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\r\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\r\n\t\t// a checked appearance if the defaultChecked value isn't also set\r\n\t\tif ( src.checked ) {\r\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\r\n\t\t}\r\n\r\n\t\t// IE6-7 get confused and end up setting the value of a cloned\r\n\t\t// checkbox/radio button to an empty string instead of \"on\"\r\n\t\tif ( dest.value !== src.value ) {\r\n\t\t\tdest.value = src.value;\r\n\t\t}\r\n\r\n\t// IE6-8 fails to return the selected option to the default selected\r\n\t// state when cloning options\r\n\t} else if ( nodeName === \"option\" ) {\r\n\t\tdest.selected = src.defaultSelected;\r\n\r\n\t// IE6-8 fails to set the defaultValue to the correct value when\r\n\t// cloning other types of input fields\r\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\r\n\t\tdest.defaultValue = src.defaultValue;\r\n\r\n\t// IE blanks contents when cloning scripts\r\n\t} else if ( nodeName === \"script\" && dest.text !== src.text ) {\r\n\t\tdest.text = src.text;\r\n\t}\r\n\r\n\t// Event data gets referenced instead of copied if the expando\r\n\t// gets copied too\r\n\tdest.removeAttribute( jQuery.expando );\r\n\r\n\t// Clear flags for bubbling special change/submit events, they must\r\n\t// be reattached when the newly cloned events are first activated\r\n\tdest.removeAttribute( \"_submit_attached\" );\r\n\tdest.removeAttribute( \"_change_attached\" );\r\n}\r\n\r\njQuery.buildFragment = function( args, nodes, scripts ) {\r\n\tvar fragment, cacheable, cacheresults, doc,\r\n\tfirst = args[ 0 ];\r\n\r\n\t// nodes may contain either an explicit document object,\r\n\t// a jQuery collection or context object.\r\n\t// If nodes[0] contains a valid object to assign to doc\r\n\tif ( nodes && nodes[0] ) {\r\n\t\tdoc = nodes[0].ownerDocument || nodes[0];\r\n\t}\r\n\r\n\t// Ensure that an attr object doesn't incorrectly stand in as a document object\r\n\t// Chrome and Firefox seem to allow this to occur and will throw exception\r\n\t// Fixes #8950\r\n\tif ( !doc.createDocumentFragment ) {\r\n\t\tdoc = document;\r\n\t}\r\n\r\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\r\n\t// Cloning options loses the selected state, so don't cache them\r\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\r\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\r\n\t// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\r\n\tif ( args.length === 1 && typeof first === \"string\" && first.length < 512 && doc === document &&\r\n\t\tfirst.charAt(0) === \"<\" && !rnocache.test( first ) &&\r\n\t\t(jQuery.support.checkClone || !rchecked.test( first )) &&\r\n\t\t(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\r\n\r\n\t\tcacheable = true;\r\n\r\n\t\tcacheresults = jQuery.fragments[ first ];\r\n\t\tif ( cacheresults && cacheresults !== 1 ) {\r\n\t\t\tfragment = cacheresults;\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !fragment ) {\r\n\t\tfragment = doc.createDocumentFragment();\r\n\t\tjQuery.clean( args, doc, fragment, scripts );\r\n\t}\r\n\r\n\tif ( cacheable ) {\r\n\t\tjQuery.fragments[ first ] = cacheresults ? fragment : 1;\r\n\t}\r\n\r\n\treturn { fragment: fragment, cacheable: cacheable };\r\n};\r\n\r\njQuery.fragments = {};\r\n\r\njQuery.each({\r\n\tappendTo: \"append\",\r\n\tprependTo: \"prepend\",\r\n\tinsertBefore: \"before\",\r\n\tinsertAfter: \"after\",\r\n\treplaceAll: \"replaceWith\"\r\n}, function( name, original ) {\r\n\tjQuery.fn[ name ] = function( selector ) {\r\n\t\tvar ret = [],\r\n\t\t\tinsert = jQuery( selector ),\r\n\t\t\tparent = this.length === 1 && this[0].parentNode;\r\n\r\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\r\n\t\t\tinsert[ original ]( this[0] );\r\n\t\t\treturn this;\r\n\r\n\t\t} else {\r\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\r\n\t\t\t\tvar elems = ( i > 0 ? this.clone(true) : this ).get();\r\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\r\n\t\t\t\tret = ret.concat( elems );\r\n\t\t\t}\r\n\r\n\t\t\treturn this.pushStack( ret, name, insert.selector );\r\n\t\t}\r\n\t};\r\n});\r\n\r\nfunction getAll( elem ) {\r\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\r\n\t\treturn elem.getElementsByTagName( \"*\" );\r\n\r\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\r\n\t\treturn elem.querySelectorAll( \"*\" );\r\n\r\n\t} else {\r\n\t\treturn [];\r\n\t}\r\n}\r\n\r\n// Used in clean, fixes the defaultChecked property\r\nfunction fixDefaultChecked( elem ) {\r\n\tif ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\r\n\t\telem.defaultChecked = elem.checked;\r\n\t}\r\n}\r\n// Finds all inputs and passes them to fixDefaultChecked\r\nfunction findInputs( elem ) {\r\n\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\r\n\tif ( nodeName === \"input\" ) {\r\n\t\tfixDefaultChecked( elem );\r\n\t// Skip scripts, get other children\r\n\t} else if ( nodeName !== \"script\" && typeof elem.getElementsByTagName !== \"undefined\" ) {\r\n\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\r\n\t}\r\n}\r\n\r\n// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js\r\nfunction shimCloneNode( elem ) {\r\n\tvar div = document.createElement( \"div\" );\r\n\tsafeFragment.appendChild( div );\r\n\r\n\tdiv.innerHTML = elem.outerHTML;\r\n\treturn div.firstChild;\r\n}\r\n\r\njQuery.extend({\r\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\r\n\t\tvar srcElements,\r\n\t\t\tdestElements,\r\n\t\t\ti,\r\n\t\t\t// IE<=8 does not properly clone detached, unknown element nodes\r\n\t\t\tclone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ?\r\n\t\t\t\telem.cloneNode( true ) :\r\n\t\t\t\tshimCloneNode( elem );\r\n\r\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\r\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\r\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\r\n\t\t\t// Calling detachEvent on the clone will also remove the events\r\n\t\t\t// from the original. In order to get around this, we use some\r\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\r\n\t\t\t// guys for this hotness.\r\n\r\n\t\t\tcloneFixAttributes( elem, clone );\r\n\r\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName instead\r\n\t\t\tsrcElements = getAll( elem );\r\n\t\t\tdestElements = getAll( clone );\r\n\r\n\t\t\t// Weird iteration because IE will replace the length property\r\n\t\t\t// with an element if you are cloning the body and one of the\r\n\t\t\t// elements on the page has a name or id of \"length\"\r\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\r\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\r\n\t\t\t\tif ( destElements[i] ) {\r\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Copy the events from the original to the clone\r\n\t\tif ( dataAndEvents ) {\r\n\t\t\tcloneCopyEvent( elem, clone );\r\n\r\n\t\t\tif ( deepDataAndEvents ) {\r\n\t\t\t\tsrcElements = getAll( elem );\r\n\t\t\t\tdestElements = getAll( clone );\r\n\r\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\r\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsrcElements = destElements = null;\r\n\r\n\t\t// Return the cloned set\r\n\t\treturn clone;\r\n\t},\r\n\r\n\tclean: function( elems, context, fragment, scripts ) {\r\n\t\tvar checkScriptType, script, j,\r\n\t\t\t\tret = [];\r\n\r\n\t\tcontext = context || document;\r\n\r\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\r\n\t\tif ( typeof context.createElement === \"undefined\" ) {\r\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\r\n\t\t\tif ( typeof elem === \"number\" ) {\r\n\t\t\t\telem += \"\";\r\n\t\t\t}\r\n\r\n\t\t\tif ( !elem ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Convert html string into DOM nodes\r\n\t\t\tif ( typeof elem === \"string\" ) {\r\n\t\t\t\tif ( !rhtml.test( elem ) ) {\r\n\t\t\t\t\telem = context.createTextNode( elem );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\r\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\r\n\r\n\t\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\r\n\t\t\t\t\tvar tag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase(),\r\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\r\n\t\t\t\t\t\tdepth = wrap[0],\r\n\t\t\t\t\t\tdiv = context.createElement(\"div\"),\r\n\t\t\t\t\t\tsafeChildNodes = safeFragment.childNodes,\r\n\t\t\t\t\t\tremove;\r\n\r\n\t\t\t\t\t// Append wrapper element to unknown element safe doc fragment\r\n\t\t\t\t\tif ( context === document ) {\r\n\t\t\t\t\t\t// Use the fragment we've already created for this document\r\n\t\t\t\t\t\tsafeFragment.appendChild( div );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// Use a fragment created with the owner document\r\n\t\t\t\t\t\tcreateSafeFragment( context ).appendChild( div );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\r\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\r\n\r\n\t\t\t\t\t// Move to the right depth\r\n\t\t\t\t\twhile ( depth-- ) {\r\n\t\t\t\t\t\tdiv = div.lastChild;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\r\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\r\n\r\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\r\n\t\t\t\t\t\tvar hasBody = rtbody.test(elem),\r\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\r\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\r\n\r\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\r\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\r\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\r\n\t\t\t\t\t\t\t\t\t[];\r\n\r\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\r\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\r\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\r\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\r\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telem = div.childNodes;\r\n\r\n\t\t\t\t\t// Clear elements from DocumentFragment (safeFragment or otherwise)\r\n\t\t\t\t\t// to avoid hoarding elements. Fixes #11356\r\n\t\t\t\t\tif ( div ) {\r\n\t\t\t\t\t\tdiv.parentNode.removeChild( div );\r\n\r\n\t\t\t\t\t\t// Guard against -1 index exceptions in FF3.6\r\n\t\t\t\t\t\tif ( safeChildNodes.length > 0 ) {\r\n\t\t\t\t\t\t\tremove = safeChildNodes[ safeChildNodes.length - 1 ];\r\n\r\n\t\t\t\t\t\t\tif ( remove && remove.parentNode ) {\r\n\t\t\t\t\t\t\t\tremove.parentNode.removeChild( remove );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Resets defaultChecked for any radios and checkboxes\r\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\r\n\t\t\tvar len;\r\n\t\t\tif ( !jQuery.support.appendChecked ) {\r\n\t\t\t\tif ( elem[0] && typeof (len = elem.length) === \"number\" ) {\r\n\t\t\t\t\tfor ( j = 0; j < len; j++ ) {\r\n\t\t\t\t\t\tfindInputs( elem[j] );\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfindInputs( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( elem.nodeType ) {\r\n\t\t\t\tret.push( elem );\r\n\t\t\t} else {\r\n\t\t\t\tret = jQuery.merge( ret, elem );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( fragment ) {\r\n\t\t\tcheckScriptType = function( elem ) {\r\n\t\t\t\treturn !elem.type || rscriptType.test( elem.type );\r\n\t\t\t};\r\n\t\t\tfor ( i = 0; ret[i]; i++ ) {\r\n\t\t\t\tscript = ret[i];\r\n\t\t\t\tif ( scripts && jQuery.nodeName( script, \"script\" ) && (!script.type || rscriptType.test( script.type )) ) {\r\n\t\t\t\t\tscripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif ( script.nodeType === 1 ) {\r\n\t\t\t\t\t\tvar jsTags = jQuery.grep( script.getElementsByTagName( \"script\" ), checkScriptType );\r\n\r\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfragment.appendChild( script );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\tcleanData: function( elems ) {\r\n\t\tvar data, id,\r\n\t\t\tcache = jQuery.cache,\r\n\t\t\tspecial = jQuery.event.special,\r\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\r\n\r\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\r\n\t\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tid = elem[ jQuery.expando ];\r\n\r\n\t\t\tif ( id ) {\r\n\t\t\t\tdata = cache[ id ];\r\n\r\n\t\t\t\tif ( data && data.events ) {\r\n\t\t\t\t\tfor ( var type in data.events ) {\r\n\t\t\t\t\t\tif ( special[ type ] ) {\r\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\r\n\r\n\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Null the DOM reference to avoid IE6/7/8 leak (#7054)\r\n\t\t\t\t\tif ( data.handle ) {\r\n\t\t\t\t\t\tdata.handle.elem = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( deleteExpando ) {\r\n\t\t\t\t\tdelete elem[ jQuery.expando ];\r\n\r\n\t\t\t\t} else if ( elem.removeAttribute ) {\r\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete cache[ id ];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar ralpha = /alpha\\([^)]*\\)/i,\r\n\tropacity = /opacity=([^)]*)/,\r\n\t// fixed for IE9, see #8346\r\n\trupper = /([A-Z]|^ms)/g,\r\n\trnum = /^[\\-+]?(?:\\d*\\.)?\\d+$/i,\r\n\trnumnonpx = /^-?(?:\\d*\\.)?\\d+(?!px)[^\\d\\s]+$/i,\r\n\trrelNum = /^([\\-+])=([\\-+.\\de]+)/,\r\n\trmargin = /^margin/,\r\n\r\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\r\n\r\n\t// order is important!\r\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\r\n\r\n\tcurCSS,\r\n\r\n\tgetComputedStyle,\r\n\tcurrentStyle;\r\n\r\njQuery.fn.css = function( name, value ) {\r\n\treturn jQuery.access( this, function( elem, name, value ) {\r\n\t\treturn value !== undefined ?\r\n\t\t\tjQuery.style( elem, name, value ) :\r\n\t\t\tjQuery.css( elem, name );\r\n\t}, name, value, arguments.length > 1 );\r\n};\r\n\r\njQuery.extend({\r\n\t// Add in style property hooks for overriding the default\r\n\t// behavior of getting and setting a style property\r\n\tcssHooks: {\r\n\t\topacity: {\r\n\t\t\tget: function( elem, computed ) {\r\n\t\t\t\tif ( computed ) {\r\n\t\t\t\t\t// We should always get a number back from opacity\r\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\r\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn elem.style.opacity;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// Exclude the following css properties to add px\r\n\tcssNumber: {\r\n\t\t\"fillOpacity\": true,\r\n\t\t\"fontWeight\": true,\r\n\t\t\"lineHeight\": true,\r\n\t\t\"opacity\": true,\r\n\t\t\"orphans\": true,\r\n\t\t\"widows\": true,\r\n\t\t\"zIndex\": true,\r\n\t\t\"zoom\": true\r\n\t},\r\n\r\n\t// Add in properties whose names you wish to fix before\r\n\t// setting or getting the value\r\n\tcssProps: {\r\n\t\t// normalize float css property\r\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\r\n\t},\r\n\r\n\t// Get and set the style property on a DOM Node\r\n\tstyle: function( elem, name, value, extra ) {\r\n\t\t// Don't set styles on text and comment nodes\r\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Make sure that we're working with the right name\r\n\t\tvar ret, type, origName = jQuery.camelCase( name ),\r\n\t\t\tstyle = elem.style, hooks = jQuery.cssHooks[ origName ];\r\n\r\n\t\tname = jQuery.cssProps[ origName ] || origName;\r\n\r\n\t\t// Check if we're setting a value\r\n\t\tif ( value !== undefined ) {\r\n\t\t\ttype = typeof value;\r\n\r\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\r\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\r\n\t\t\t\tvalue = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );\r\n\t\t\t\t// Fixes bug #9237\r\n\t\t\t\ttype = \"number\";\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\r\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\r\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\r\n\t\t\t\tvalue += \"px\";\r\n\t\t\t}\r\n\r\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\r\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\r\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\r\n\t\t\t\t// Fixes bug #5509\r\n\t\t\t\ttry {\r\n\t\t\t\t\tstyle[ name ] = value;\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// If a hook was provided get the non-computed value from there\r\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\r\n\t\t\t// Otherwise just get the value from the style object\r\n\t\t\treturn style[ name ];\r\n\t\t}\r\n\t},\r\n\r\n\tcss: function( elem, name, extra ) {\r\n\t\tvar ret, hooks;\r\n\r\n\t\t// Make sure that we're working with the right name\r\n\t\tname = jQuery.camelCase( name );\r\n\t\thooks = jQuery.cssHooks[ name ];\r\n\t\tname = jQuery.cssProps[ name ] || name;\r\n\r\n\t\t// cssFloat needs a special treatment\r\n\t\tif ( name === \"cssFloat\" ) {\r\n\t\t\tname = \"float\";\r\n\t\t}\r\n\r\n\t\t// If a hook was provided get the computed value from there\r\n\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\r\n\t\t\treturn ret;\r\n\r\n\t\t// Otherwise, if a way to get the computed value exists, use that\r\n\t\t} else if ( curCSS ) {\r\n\t\t\treturn curCSS( elem, name );\r\n\t\t}\r\n\t},\r\n\r\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\r\n\tswap: function( elem, options, callback ) {\r\n\t\tvar old = {},\r\n\t\t\tret, name;\r\n\r\n\t\t// Remember the old values, and insert the new ones\r\n\t\tfor ( name in options ) {\r\n\t\t\told[ name ] = elem.style[ name ];\r\n\t\t\telem.style[ name ] = options[ name ];\r\n\t\t}\r\n\r\n\t\tret = callback.call( elem );\r\n\r\n\t\t// Revert the old values\r\n\t\tfor ( name in options ) {\r\n\t\t\telem.style[ name ] = old[ name ];\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t}\r\n});\r\n\r\n// DEPRECATED in 1.3, Use jQuery.css() instead\r\njQuery.curCSS = jQuery.css;\r\n\r\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\r\n\tgetComputedStyle = function( elem, name ) {\r\n\t\tvar ret, defaultView, computedStyle, width,\r\n\t\t\tstyle = elem.style;\r\n\r\n\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\r\n\r\n\t\tif ( (defaultView = elem.ownerDocument.defaultView) &&\r\n\t\t\t\t(computedStyle = defaultView.getComputedStyle( elem, null )) ) {\r\n\r\n\t\t\tret = computedStyle.getPropertyValue( name );\r\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\r\n\t\t\t\tret = jQuery.style( elem, name );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\r\n\t\t// WebKit uses \"computed value (percentage if specified)\" instead of \"used value\" for margins\r\n\t\t// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\r\n\t\tif ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {\r\n\t\t\twidth = style.width;\r\n\t\t\tstyle.width = ret;\r\n\t\t\tret = computedStyle.width;\r\n\t\t\tstyle.width = width;\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t};\r\n}\r\n\r\nif ( document.documentElement.currentStyle ) {\r\n\tcurrentStyle = function( elem, name ) {\r\n\t\tvar left, rsLeft, uncomputed,\r\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\r\n\t\t\tstyle = elem.style;\r\n\r\n\t\t// Avoid setting ret to empty string here\r\n\t\t// so we don't default to auto\r\n\t\tif ( ret == null && style && (uncomputed = style[ name ]) ) {\r\n\t\t\tret = uncomputed;\r\n\t\t}\r\n\r\n\t\t// From the awesome hack by Dean Edwards\r\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\r\n\r\n\t\t// If we're not dealing with a regular pixel number\r\n\t\t// but a number that has a weird ending, we need to convert it to pixels\r\n\t\tif ( rnumnonpx.test( ret ) ) {\r\n\r\n\t\t\t// Remember the original values\r\n\t\t\tleft = style.left;\r\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\r\n\r\n\t\t\t// Put in the new values to get a computed value out\r\n\t\t\tif ( rsLeft ) {\r\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\r\n\t\t\t}\r\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\r\n\t\t\tret = style.pixelLeft + \"px\";\r\n\r\n\t\t\t// Revert the changed values\r\n\t\t\tstyle.left = left;\r\n\t\t\tif ( rsLeft ) {\r\n\t\t\t\telem.runtimeStyle.left = rsLeft;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret === \"\" ? \"auto\" : ret;\r\n\t};\r\n}\r\n\r\ncurCSS = getComputedStyle || currentStyle;\r\n\r\nfunction getWidthOrHeight( elem, name, extra ) {\r\n\r\n\t// Start with offset property\r\n\tvar val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\r\n\t\ti = name === \"width\" ? 1 : 0,\r\n\t\tlen = 4;\r\n\r\n\tif ( val > 0 ) {\r\n\t\tif ( extra !== \"border\" ) {\r\n\t\t\tfor ( ; i < len; i += 2 ) {\r\n\t\t\t\tif ( !extra ) {\r\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\r\n\t\t\t\t}\r\n\t\t\t\tif ( extra === \"margin\" ) {\r\n\t\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn val + \"px\";\r\n\t}\r\n\r\n\t// Fall back to computed then uncomputed css if necessary\r\n\tval = curCSS( elem, name );\r\n\tif ( val < 0 || val == null ) {\r\n\t\tval = elem.style[ name ];\r\n\t}\r\n\r\n\t// Computed unit is not pixels. Stop here and return.\r\n\tif ( rnumnonpx.test(val) ) {\r\n\t\treturn val;\r\n\t}\r\n\r\n\t// Normalize \"\", auto, and prepare for extra\r\n\tval = parseFloat( val ) || 0;\r\n\r\n\t// Add padding, border, margin\r\n\tif ( extra ) {\r\n\t\tfor ( ; i < len; i += 2 ) {\r\n\t\t\tval += parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\r\n\t\t\tif ( extra !== \"padding\" ) {\r\n\t\t\t\tval += parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\r\n\t\t\t}\r\n\t\t\tif ( extra === \"margin\" ) {\r\n\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn val + \"px\";\r\n}\r\n\r\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\r\n\tjQuery.cssHooks[ name ] = {\r\n\t\tget: function( elem, computed, extra ) {\r\n\t\t\tif ( computed ) {\r\n\t\t\t\tif ( elem.offsetWidth !== 0 ) {\r\n\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn jQuery.swap( elem, cssShow, function() {\r\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tset: function( elem, value ) {\r\n\t\t\treturn rnum.test( value ) ?\r\n\t\t\t\tvalue + \"px\" :\r\n\t\t\t\tvalue;\r\n\t\t}\r\n\t};\r\n});\r\n\r\nif ( !jQuery.support.opacity ) {\r\n\tjQuery.cssHooks.opacity = {\r\n\t\tget: function( elem, computed ) {\r\n\t\t\t// IE uses filters for opacity\r\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\r\n\t\t\t\t( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\r\n\t\t\t\tcomputed ? \"1\" : \"\";\r\n\t\t},\r\n\r\n\t\tset: function( elem, value ) {\r\n\t\t\tvar style = elem.style,\r\n\t\t\t\tcurrentStyle = elem.currentStyle,\r\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\r\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\r\n\r\n\t\t\t// IE has trouble with opacity if it does not have layout\r\n\t\t\t// Force it by setting the zoom level\r\n\t\t\tstyle.zoom = 1;\r\n\r\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\r\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" ) {\r\n\r\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\r\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\r\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\r\n\t\t\t\tstyle.removeAttribute( \"filter\" );\r\n\r\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\r\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// otherwise, set new filter values\r\n\t\t\tstyle.filter = ralpha.test( filter ) ?\r\n\t\t\t\tfilter.replace( ralpha, opacity ) :\r\n\t\t\t\tfilter + \" \" + opacity;\r\n\t\t}\r\n\t};\r\n}\r\n\r\njQuery(function() {\r\n\t// This hook cannot be added until DOM ready because the support test\r\n\t// for it is not run until after DOM ready\r\n\tif ( !jQuery.support.reliableMarginRight ) {\r\n\t\tjQuery.cssHooks.marginRight = {\r\n\t\t\tget: function( elem, computed ) {\r\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\r\n\t\t\t\t// Work around by temporarily setting element display to inline-block\r\n\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\r\n\t\t\t\t\tif ( computed ) {\r\n\t\t\t\t\t\treturn curCSS( elem, \"margin-right\" );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn elem.style.marginRight;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n});\r\n\r\nif ( jQuery.expr && jQuery.expr.filters ) {\r\n\tjQuery.expr.filters.hidden = function( elem ) {\r\n\t\tvar width = elem.offsetWidth,\r\n\t\t\theight = elem.offsetHeight;\r\n\r\n\t\treturn ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\r\n\t};\r\n\r\n\tjQuery.expr.filters.visible = function( elem ) {\r\n\t\treturn !jQuery.expr.filters.hidden( elem );\r\n\t};\r\n}\r\n\r\n// These hooks are used by animate to expand properties\r\njQuery.each({\r\n\tmargin: \"\",\r\n\tpadding: \"\",\r\n\tborder: \"Width\"\r\n}, function( prefix, suffix ) {\r\n\r\n\tjQuery.cssHooks[ prefix + suffix ] = {\r\n\t\texpand: function( value ) {\r\n\t\t\tvar i,\r\n\r\n\t\t\t\t// assumes a single number if not a string\r\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ],\r\n\t\t\t\texpanded = {};\r\n\r\n\t\t\tfor ( i = 0; i < 4; i++ ) {\r\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\r\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\r\n\t\t\t}\r\n\r\n\t\t\treturn expanded;\r\n\t\t}\r\n\t};\r\n});\r\n\r\n\r\n\r\n\r\nvar r20 = /%20/g,\r\n\trbracket = /\\[\\]$/,\r\n\trCRLF = /\\r?\\n/g,\r\n\trhash = /#.*$/,\r\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\r\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\r\n\t// #7653, #8125, #8152: local protocol detection\r\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\r\n\trnoContent = /^(?:GET|HEAD)$/,\r\n\trprotocol = /^\\/\\//,\r\n\trquery = /\\?/,\r\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\r\n\trselectTextarea = /^(?:select|textarea)/i,\r\n\trspacesAjax = /\\s+/,\r\n\trts = /([?&])_=[^&]*/,\r\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\r\n\r\n\t// Keep a copy of the old load method\r\n\t_load = jQuery.fn.load,\r\n\r\n\t/* Prefilters\r\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\r\n\t * 2) These are called:\r\n\t *    - BEFORE asking for a transport\r\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\r\n\t * 3) key is the dataType\r\n\t * 4) the catchall symbol \"*\" can be used\r\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\r\n\t */\r\n\tprefilters = {},\r\n\r\n\t/* Transports bindings\r\n\t * 1) key is the dataType\r\n\t * 2) the catchall symbol \"*\" can be used\r\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\r\n\t */\r\n\ttransports = {},\r\n\r\n\t// Document location\r\n\tajaxLocation,\r\n\r\n\t// Document location segments\r\n\tajaxLocParts,\r\n\r\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\r\n\tallTypes = [\"*/\"] + [\"*\"];\r\n\r\n// #8138, IE may throw an exception when accessing\r\n// a field from window.location if document.domain has been set\r\ntry {\r\n\tajaxLocation = location.href;\r\n} catch( e ) {\r\n\t// Use the href attribute of an A element\r\n\t// since IE will modify it given document.location\r\n\tajaxLocation = document.createElement( \"a\" );\r\n\tajaxLocation.href = \"\";\r\n\tajaxLocation = ajaxLocation.href;\r\n}\r\n\r\n// Segment location into parts\r\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\r\n\r\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\r\nfunction addToPrefiltersOrTransports( structure ) {\r\n\r\n\t// dataTypeExpression is optional and defaults to \"*\"\r\n\treturn function( dataTypeExpression, func ) {\r\n\r\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\r\n\t\t\tfunc = dataTypeExpression;\r\n\t\t\tdataTypeExpression = \"*\";\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction( func ) ) {\r\n\t\t\tvar dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\r\n\t\t\t\ti = 0,\r\n\t\t\t\tlength = dataTypes.length,\r\n\t\t\t\tdataType,\r\n\t\t\t\tlist,\r\n\t\t\t\tplaceBefore;\r\n\r\n\t\t\t// For each dataType in the dataTypeExpression\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tdataType = dataTypes[ i ];\r\n\t\t\t\t// We control if we're asked to add before\r\n\t\t\t\t// any existing element\r\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\r\n\t\t\t\tif ( placeBefore ) {\r\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\r\n\t\t\t\t}\r\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\r\n\t\t\t\t// then we add to the structure accordingly\r\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Base inspection function for prefilters and transports\r\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\r\n\t\tdataType /* internal */, inspected /* internal */ ) {\r\n\r\n\tdataType = dataType || options.dataTypes[ 0 ];\r\n\tinspected = inspected || {};\r\n\r\n\tinspected[ dataType ] = true;\r\n\r\n\tvar list = structure[ dataType ],\r\n\t\ti = 0,\r\n\t\tlength = list ? list.length : 0,\r\n\t\texecuteOnly = ( structure === prefilters ),\r\n\t\tselection;\r\n\r\n\tfor ( ; i < length && ( executeOnly || !selection ); i++ ) {\r\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\r\n\t\t// If we got redirected to another dataType\r\n\t\t// we try there if executing only and not done already\r\n\t\tif ( typeof selection === \"string\" ) {\r\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\r\n\t\t\t\tselection = undefined;\r\n\t\t\t} else {\r\n\t\t\t\toptions.dataTypes.unshift( selection );\r\n\t\t\t\tselection = inspectPrefiltersOrTransports(\r\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// If we're only executing or nothing was selected\r\n\t// we try the catchall dataType if not done already\r\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\r\n\t\tselection = inspectPrefiltersOrTransports(\r\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\r\n\t}\r\n\t// unnecessary when only executing (prefilters)\r\n\t// but it'll be ignored by the caller in that case\r\n\treturn selection;\r\n}\r\n\r\n// A special extend for ajax options\r\n// that takes \"flat\" options (not to be deep extended)\r\n// Fixes #9887\r\nfunction ajaxExtend( target, src ) {\r\n\tvar key, deep,\r\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\r\n\tfor ( key in src ) {\r\n\t\tif ( src[ key ] !== undefined ) {\r\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\r\n\t\t}\r\n\t}\r\n\tif ( deep ) {\r\n\t\tjQuery.extend( true, target, deep );\r\n\t}\r\n}\r\n\r\njQuery.fn.extend({\r\n\tload: function( url, params, callback ) {\r\n\t\tif ( typeof url !== \"string\" && _load ) {\r\n\t\t\treturn _load.apply( this, arguments );\r\n\r\n\t\t// Don't do a request if no elements are being requested\r\n\t\t} else if ( !this.length ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar off = url.indexOf( \" \" );\r\n\t\tif ( off >= 0 ) {\r\n\t\t\tvar selector = url.slice( off, url.length );\r\n\t\t\turl = url.slice( 0, off );\r\n\t\t}\r\n\r\n\t\t// Default to a GET request\r\n\t\tvar type = \"GET\";\r\n\r\n\t\t// If the second parameter was provided\r\n\t\tif ( params ) {\r\n\t\t\t// If it's a function\r\n\t\t\tif ( jQuery.isFunction( params ) ) {\r\n\t\t\t\t// We assume that it's the callback\r\n\t\t\t\tcallback = params;\r\n\t\t\t\tparams = undefined;\r\n\r\n\t\t\t// Otherwise, build a param string\r\n\t\t\t} else if ( typeof params === \"object\" ) {\r\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\r\n\t\t\t\ttype = \"POST\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar self = this;\r\n\r\n\t\t// Request the remote document\r\n\t\tjQuery.ajax({\r\n\t\t\turl: url,\r\n\t\t\ttype: type,\r\n\t\t\tdataType: \"html\",\r\n\t\t\tdata: params,\r\n\t\t\t// Complete callback (responseText is used internally)\r\n\t\t\tcomplete: function( jqXHR, status, responseText ) {\r\n\t\t\t\t// Store the response as specified by the jqXHR object\r\n\t\t\t\tresponseText = jqXHR.responseText;\r\n\t\t\t\t// If successful, inject the HTML into all the matched elements\r\n\t\t\t\tif ( jqXHR.isResolved() ) {\r\n\t\t\t\t\t// #4825: Get the actual response in case\r\n\t\t\t\t\t// a dataFilter is present in ajaxSettings\r\n\t\t\t\t\tjqXHR.done(function( r ) {\r\n\t\t\t\t\t\tresponseText = r;\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// See if a selector was specified\r\n\t\t\t\t\tself.html( selector ?\r\n\t\t\t\t\t\t// Create a dummy div to hold the results\r\n\t\t\t\t\t\tjQuery(\"<div>\")\r\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\r\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\r\n\t\t\t\t\t\t\t.append(responseText.replace(rscript, \"\"))\r\n\r\n\t\t\t\t\t\t\t// Locate the specified elements\r\n\t\t\t\t\t\t\t.find(selector) :\r\n\r\n\t\t\t\t\t\t// If not, just inject the full result\r\n\t\t\t\t\t\tresponseText );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( callback ) {\r\n\t\t\t\t\tself.each( callback, [ responseText, status, jqXHR ] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tserialize: function() {\r\n\t\treturn jQuery.param( this.serializeArray() );\r\n\t},\r\n\r\n\tserializeArray: function() {\r\n\t\treturn this.map(function(){\r\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\r\n\t\t})\r\n\t\t.filter(function(){\r\n\t\t\treturn this.name && !this.disabled &&\r\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\r\n\t\t\t\t\trinput.test( this.type ) );\r\n\t\t})\r\n\t\t.map(function( i, elem ){\r\n\t\t\tvar val = jQuery( this ).val();\r\n\r\n\t\t\treturn val == null ?\r\n\t\t\t\tnull :\r\n\t\t\t\tjQuery.isArray( val ) ?\r\n\t\t\t\t\tjQuery.map( val, function( val, i ){\r\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\r\n\t\t\t\t\t}) :\r\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\r\n\t\t}).get();\r\n\t}\r\n});\r\n\r\n// Attach a bunch of functions for handling common AJAX events\r\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\r\n\tjQuery.fn[ o ] = function( f ){\r\n\t\treturn this.on( o, f );\r\n\t};\r\n});\r\n\r\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\r\n\tjQuery[ method ] = function( url, data, callback, type ) {\r\n\t\t// shift arguments if data argument was omitted\r\n\t\tif ( jQuery.isFunction( data ) ) {\r\n\t\t\ttype = type || callback;\r\n\t\t\tcallback = data;\r\n\t\t\tdata = undefined;\r\n\t\t}\r\n\r\n\t\treturn jQuery.ajax({\r\n\t\t\ttype: method,\r\n\t\t\turl: url,\r\n\t\t\tdata: data,\r\n\t\t\tsuccess: callback,\r\n\t\t\tdataType: type\r\n\t\t});\r\n\t};\r\n});\r\n\r\njQuery.extend({\r\n\r\n\tgetScript: function( url, callback ) {\r\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\r\n\t},\r\n\r\n\tgetJSON: function( url, data, callback ) {\r\n\t\treturn jQuery.get( url, data, callback, \"json\" );\r\n\t},\r\n\r\n\t// Creates a full fledged settings object into target\r\n\t// with both ajaxSettings and settings fields.\r\n\t// If target is omitted, writes into ajaxSettings.\r\n\tajaxSetup: function( target, settings ) {\r\n\t\tif ( settings ) {\r\n\t\t\t// Building a settings object\r\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\r\n\t\t} else {\r\n\t\t\t// Extending ajaxSettings\r\n\t\t\tsettings = target;\r\n\t\t\ttarget = jQuery.ajaxSettings;\r\n\t\t}\r\n\t\tajaxExtend( target, settings );\r\n\t\treturn target;\r\n\t},\r\n\r\n\tajaxSettings: {\r\n\t\turl: ajaxLocation,\r\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\r\n\t\tglobal: true,\r\n\t\ttype: \"GET\",\r\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\r\n\t\tprocessData: true,\r\n\t\tasync: true,\r\n\t\t/*\r\n\t\ttimeout: 0,\r\n\t\tdata: null,\r\n\t\tdataType: null,\r\n\t\tusername: null,\r\n\t\tpassword: null,\r\n\t\tcache: null,\r\n\t\ttraditional: false,\r\n\t\theaders: {},\r\n\t\t*/\r\n\r\n\t\taccepts: {\r\n\t\t\txml: \"application/xml, text/xml\",\r\n\t\t\thtml: \"text/html\",\r\n\t\t\ttext: \"text/plain\",\r\n\t\t\tjson: \"application/json, text/javascript\",\r\n\t\t\t\"*\": allTypes\r\n\t\t},\r\n\r\n\t\tcontents: {\r\n\t\t\txml: /xml/,\r\n\t\t\thtml: /html/,\r\n\t\t\tjson: /json/\r\n\t\t},\r\n\r\n\t\tresponseFields: {\r\n\t\t\txml: \"responseXML\",\r\n\t\t\ttext: \"responseText\"\r\n\t\t},\r\n\r\n\t\t// List of data converters\r\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\r\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\r\n\t\tconverters: {\r\n\r\n\t\t\t// Convert anything to text\r\n\t\t\t\"* text\": window.String,\r\n\r\n\t\t\t// Text to html (true = no transformation)\r\n\t\t\t\"text html\": true,\r\n\r\n\t\t\t// Evaluate text as a json expression\r\n\t\t\t\"text json\": jQuery.parseJSON,\r\n\r\n\t\t\t// Parse text as xml\r\n\t\t\t\"text xml\": jQuery.parseXML\r\n\t\t},\r\n\r\n\t\t// For options that shouldn't be deep extended:\r\n\t\t// you can add your own custom options here if\r\n\t\t// and when you create one that shouldn't be\r\n\t\t// deep extended (see ajaxExtend)\r\n\t\tflatOptions: {\r\n\t\t\tcontext: true,\r\n\t\t\turl: true\r\n\t\t}\r\n\t},\r\n\r\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\r\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\r\n\r\n\t// Main method\r\n\tajax: function( url, options ) {\r\n\r\n\t\t// If url is an object, simulate pre-1.5 signature\r\n\t\tif ( typeof url === \"object\" ) {\r\n\t\t\toptions = url;\r\n\t\t\turl = undefined;\r\n\t\t}\r\n\r\n\t\t// Force options to be an object\r\n\t\toptions = options || {};\r\n\r\n\t\tvar // Create the final options object\r\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\r\n\t\t\t// Callbacks context\r\n\t\t\tcallbackContext = s.context || s,\r\n\t\t\t// Context for global events\r\n\t\t\t// It's the callbackContext if one was provided in the options\r\n\t\t\t// and if it's a DOM node or a jQuery collection\r\n\t\t\tglobalEventContext = callbackContext !== s &&\r\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\r\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\r\n\t\t\t// Deferreds\r\n\t\t\tdeferred = jQuery.Deferred(),\r\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\r\n\t\t\t// Status-dependent callbacks\r\n\t\t\tstatusCode = s.statusCode || {},\r\n\t\t\t// ifModified key\r\n\t\t\tifModifiedKey,\r\n\t\t\t// Headers (they are sent all at once)\r\n\t\t\trequestHeaders = {},\r\n\t\t\trequestHeadersNames = {},\r\n\t\t\t// Response headers\r\n\t\t\tresponseHeadersString,\r\n\t\t\tresponseHeaders,\r\n\t\t\t// transport\r\n\t\t\ttransport,\r\n\t\t\t// timeout handle\r\n\t\t\ttimeoutTimer,\r\n\t\t\t// Cross-domain detection vars\r\n\t\t\tparts,\r\n\t\t\t// The jqXHR state\r\n\t\t\tstate = 0,\r\n\t\t\t// To know if global events are to be dispatched\r\n\t\t\tfireGlobals,\r\n\t\t\t// Loop variable\r\n\t\t\ti,\r\n\t\t\t// Fake xhr\r\n\t\t\tjqXHR = {\r\n\r\n\t\t\t\treadyState: 0,\r\n\r\n\t\t\t\t// Caches the header\r\n\t\t\t\tsetRequestHeader: function( name, value ) {\r\n\t\t\t\t\tif ( !state ) {\r\n\t\t\t\t\t\tvar lname = name.toLowerCase();\r\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\r\n\t\t\t\t\t\trequestHeaders[ name ] = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Raw string\r\n\t\t\t\tgetAllResponseHeaders: function() {\r\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Builds headers hashtable if needed\r\n\t\t\t\tgetResponseHeader: function( key ) {\r\n\t\t\t\t\tvar match;\r\n\t\t\t\t\tif ( state === 2 ) {\r\n\t\t\t\t\t\tif ( !responseHeaders ) {\r\n\t\t\t\t\t\t\tresponseHeaders = {};\r\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\r\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn match === undefined ? null : match;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Overrides response content-type header\r\n\t\t\t\toverrideMimeType: function( type ) {\r\n\t\t\t\t\tif ( !state ) {\r\n\t\t\t\t\t\ts.mimeType = type;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Cancel the request\r\n\t\t\t\tabort: function( statusText ) {\r\n\t\t\t\t\tstatusText = statusText || \"abort\";\r\n\t\t\t\t\tif ( transport ) {\r\n\t\t\t\t\t\ttransport.abort( statusText );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdone( 0, statusText );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t// Callback for when everything is done\r\n\t\t// It is defined here because jslint complains if it is declared\r\n\t\t// at the end of the function (which would be more logical and readable)\r\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\r\n\r\n\t\t\t// Called once\r\n\t\t\tif ( state === 2 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// State is \"done\" now\r\n\t\t\tstate = 2;\r\n\r\n\t\t\t// Clear timeout if it exists\r\n\t\t\tif ( timeoutTimer ) {\r\n\t\t\t\tclearTimeout( timeoutTimer );\r\n\t\t\t}\r\n\r\n\t\t\t// Dereference transport for early garbage collection\r\n\t\t\t// (no matter how long the jqXHR object will be used)\r\n\t\t\ttransport = undefined;\r\n\r\n\t\t\t// Cache response headers\r\n\t\t\tresponseHeadersString = headers || \"\";\r\n\r\n\t\t\t// Set readyState\r\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\r\n\r\n\t\t\tvar isSuccess,\r\n\t\t\t\tsuccess,\r\n\t\t\t\terror,\r\n\t\t\t\tstatusText = nativeStatusText,\r\n\t\t\t\tresponse = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\r\n\t\t\t\tlastModified,\r\n\t\t\t\tetag;\r\n\r\n\t\t\t// If successful, handle type chaining\r\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\r\n\r\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\r\n\t\t\t\tif ( s.ifModified ) {\r\n\r\n\t\t\t\t\tif ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\r\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = lastModified;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\r\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = etag;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If not modified\r\n\t\t\t\tif ( status === 304 ) {\r\n\r\n\t\t\t\t\tstatusText = \"notmodified\";\r\n\t\t\t\t\tisSuccess = true;\r\n\r\n\t\t\t\t// If we have data\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tsuccess = ajaxConvert( s, response );\r\n\t\t\t\t\t\tstatusText = \"success\";\r\n\t\t\t\t\t\tisSuccess = true;\r\n\t\t\t\t\t} catch(e) {\r\n\t\t\t\t\t\t// We have a parsererror\r\n\t\t\t\t\t\tstatusText = \"parsererror\";\r\n\t\t\t\t\t\terror = e;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// We extract error from statusText\r\n\t\t\t\t// then normalize statusText and status for non-aborts\r\n\t\t\t\terror = statusText;\r\n\t\t\t\tif ( !statusText || status ) {\r\n\t\t\t\t\tstatusText = \"error\";\r\n\t\t\t\t\tif ( status < 0 ) {\r\n\t\t\t\t\t\tstatus = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set data for the fake xhr object\r\n\t\t\tjqXHR.status = status;\r\n\t\t\tjqXHR.statusText = \"\" + ( nativeStatusText || statusText );\r\n\r\n\t\t\t// Success/Error\r\n\t\t\tif ( isSuccess ) {\r\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\r\n\t\t\t} else {\r\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\r\n\t\t\t}\r\n\r\n\t\t\t// Status-dependent callbacks\r\n\t\t\tjqXHR.statusCode( statusCode );\r\n\t\t\tstatusCode = undefined;\r\n\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\r\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\r\n\t\t\t}\r\n\r\n\t\t\t// Complete\r\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\r\n\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\r\n\t\t\t\t// Handle the global AJAX counter\r\n\t\t\t\tif ( !( --jQuery.active ) ) {\r\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Attach deferreds\r\n\t\tdeferred.promise( jqXHR );\r\n\t\tjqXHR.success = jqXHR.done;\r\n\t\tjqXHR.error = jqXHR.fail;\r\n\t\tjqXHR.complete = completeDeferred.add;\r\n\r\n\t\t// Status-dependent callbacks\r\n\t\tjqXHR.statusCode = function( map ) {\r\n\t\t\tif ( map ) {\r\n\t\t\t\tvar tmp;\r\n\t\t\t\tif ( state < 2 ) {\r\n\t\t\t\t\tfor ( tmp in map ) {\r\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttmp = map[ jqXHR.status ];\r\n\t\t\t\t\tjqXHR.then( tmp, tmp );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\t// Remove hash character (#7531: and string promotion)\r\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\r\n\t\t// We also use the url parameter if available\r\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\r\n\r\n\t\t// Extract dataTypes list\r\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\r\n\r\n\t\t// Determine if a cross-domain request is in order\r\n\t\tif ( s.crossDomain == null ) {\r\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\r\n\t\t\ts.crossDomain = !!( parts &&\r\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\r\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\r\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Convert data if not already a string\r\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\r\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\r\n\t\t}\r\n\r\n\t\t// Apply prefilters\r\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\r\n\r\n\t\t// If request was aborted inside a prefilter, stop there\r\n\t\tif ( state === 2 ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// We can fire global events as of now if asked to\r\n\t\tfireGlobals = s.global;\r\n\r\n\t\t// Uppercase the type\r\n\t\ts.type = s.type.toUpperCase();\r\n\r\n\t\t// Determine if request has content\r\n\t\ts.hasContent = !rnoContent.test( s.type );\r\n\r\n\t\t// Watch for a new set of requests\r\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\r\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\r\n\t\t}\r\n\r\n\t\t// More options handling for requests with no content\r\n\t\tif ( !s.hasContent ) {\r\n\r\n\t\t\t// If data is available, append data to url\r\n\t\t\tif ( s.data ) {\r\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\r\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\r\n\t\t\t\tdelete s.data;\r\n\t\t\t}\r\n\r\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\r\n\t\t\tifModifiedKey = s.url;\r\n\r\n\t\t\t// Add anti-cache in url if needed\r\n\t\t\tif ( s.cache === false ) {\r\n\r\n\t\t\t\tvar ts = jQuery.now(),\r\n\t\t\t\t\t// try replacing _= if it is there\r\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\r\n\r\n\t\t\t\t// if nothing was replaced, add timestamp to the end\r\n\t\t\t\ts.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set the correct header, if data is being sent\r\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\r\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\r\n\t\t}\r\n\r\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\r\n\t\tif ( s.ifModified ) {\r\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\r\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\r\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\r\n\t\t\t}\r\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\r\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set the Accepts header for the server, depending on the dataType\r\n\t\tjqXHR.setRequestHeader(\r\n\t\t\t\"Accept\",\r\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\r\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\r\n\t\t\t\ts.accepts[ \"*\" ]\r\n\t\t);\r\n\r\n\t\t// Check for headers option\r\n\t\tfor ( i in s.headers ) {\r\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\r\n\t\t}\r\n\r\n\t\t// Allow custom headers/mimetypes and early abort\r\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\r\n\t\t\t\t// Abort if not done already\r\n\t\t\t\tjqXHR.abort();\r\n\t\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\t// Install callbacks on deferreds\r\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\r\n\t\t\tjqXHR[ i ]( s[ i ] );\r\n\t\t}\r\n\r\n\t\t// Get transport\r\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\r\n\r\n\t\t// If no transport, we auto-abort\r\n\t\tif ( !transport ) {\r\n\t\t\tdone( -1, \"No Transport\" );\r\n\t\t} else {\r\n\t\t\tjqXHR.readyState = 1;\r\n\t\t\t// Send global event\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\r\n\t\t\t}\r\n\t\t\t// Timeout\r\n\t\t\tif ( s.async && s.timeout > 0 ) {\r\n\t\t\t\ttimeoutTimer = setTimeout( function(){\r\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\r\n\t\t\t\t}, s.timeout );\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tstate = 1;\r\n\t\t\t\ttransport.send( requestHeaders, done );\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// Propagate exception as error if not done\r\n\t\t\t\tif ( state < 2 ) {\r\n\t\t\t\t\tdone( -1, e );\r\n\t\t\t\t// Simply rethrow otherwise\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow e;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn jqXHR;\r\n\t},\r\n\r\n\t// Serialize an array of form elements or a set of\r\n\t// key/values into a query string\r\n\tparam: function( a, traditional ) {\r\n\t\tvar s = [],\r\n\t\t\tadd = function( key, value ) {\r\n\t\t\t\t// If value is a function, invoke it and return its value\r\n\t\t\t\tvalue = jQuery.isFunction( value ) ? value() : value;\r\n\t\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\r\n\t\t\t};\r\n\r\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\r\n\t\tif ( traditional === undefined ) {\r\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\r\n\t\t}\r\n\r\n\t\t// If an array was passed in, assume that it is an array of form elements.\r\n\t\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\r\n\t\t\t// Serialize the form elements\r\n\t\t\tjQuery.each( a, function() {\r\n\t\t\t\tadd( this.name, this.value );\r\n\t\t\t});\r\n\r\n\t\t} else {\r\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\r\n\t\t\t// did it), otherwise encode params recursively.\r\n\t\t\tfor ( var prefix in a ) {\r\n\t\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Return the resulting serialization\r\n\t\treturn s.join( \"&\" ).replace( r20, \"+\" );\r\n\t}\r\n});\r\n\r\nfunction buildParams( prefix, obj, traditional, add ) {\r\n\tif ( jQuery.isArray( obj ) ) {\r\n\t\t// Serialize array item.\r\n\t\tjQuery.each( obj, function( i, v ) {\r\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\r\n\t\t\t\t// Treat each array item as a scalar.\r\n\t\t\t\tadd( prefix, v );\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// If array item is non-scalar (array or object), encode its\r\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\r\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\r\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\r\n\t\t\t\t// a server error. Possible fixes are to modify rack's\r\n\t\t\t\t// deserialization algorithm or to provide an option or flag\r\n\t\t\t\t// to force array serialization to be shallow.\r\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\r\n\t\t// Serialize object item.\r\n\t\tfor ( var name in obj ) {\r\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\r\n\t\t}\r\n\r\n\t} else {\r\n\t\t// Serialize scalar item.\r\n\t\tadd( prefix, obj );\r\n\t}\r\n}\r\n\r\n// This is still on the jQuery object... for now\r\n// Want to move this to jQuery.ajax some day\r\njQuery.extend({\r\n\r\n\t// Counter for holding the number of active queries\r\n\tactive: 0,\r\n\r\n\t// Last-Modified header cache for next request\r\n\tlastModified: {},\r\n\tetag: {}\r\n\r\n});\r\n\r\n/* Handles responses to an ajax request:\r\n * - sets all responseXXX fields accordingly\r\n * - finds the right dataType (mediates between content-type and expected dataType)\r\n * - returns the corresponding response\r\n */\r\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\r\n\r\n\tvar contents = s.contents,\r\n\t\tdataTypes = s.dataTypes,\r\n\t\tresponseFields = s.responseFields,\r\n\t\tct,\r\n\t\ttype,\r\n\t\tfinalDataType,\r\n\t\tfirstDataType;\r\n\r\n\t// Fill responseXXX fields\r\n\tfor ( type in responseFields ) {\r\n\t\tif ( type in responses ) {\r\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\r\n\t\t}\r\n\t}\r\n\r\n\t// Remove auto dataType and get content-type in the process\r\n\twhile( dataTypes[ 0 ] === \"*\" ) {\r\n\t\tdataTypes.shift();\r\n\t\tif ( ct === undefined ) {\r\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\r\n\t\t}\r\n\t}\r\n\r\n\t// Check if we're dealing with a known content-type\r\n\tif ( ct ) {\r\n\t\tfor ( type in contents ) {\r\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\r\n\t\t\t\tdataTypes.unshift( type );\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Check to see if we have a response for the expected dataType\r\n\tif ( dataTypes[ 0 ] in responses ) {\r\n\t\tfinalDataType = dataTypes[ 0 ];\r\n\t} else {\r\n\t\t// Try convertible dataTypes\r\n\t\tfor ( type in responses ) {\r\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\r\n\t\t\t\tfinalDataType = type;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif ( !firstDataType ) {\r\n\t\t\t\tfirstDataType = type;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Or just use first one\r\n\t\tfinalDataType = finalDataType || firstDataType;\r\n\t}\r\n\r\n\t// If we found a dataType\r\n\t// We add the dataType to the list if needed\r\n\t// and return the corresponding response\r\n\tif ( finalDataType ) {\r\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\r\n\t\t\tdataTypes.unshift( finalDataType );\r\n\t\t}\r\n\t\treturn responses[ finalDataType ];\r\n\t}\r\n}\r\n\r\n// Chain conversions given the request and the original response\r\nfunction ajaxConvert( s, response ) {\r\n\r\n\t// Apply the dataFilter if provided\r\n\tif ( s.dataFilter ) {\r\n\t\tresponse = s.dataFilter( response, s.dataType );\r\n\t}\r\n\r\n\tvar dataTypes = s.dataTypes,\r\n\t\tconverters = {},\r\n\t\ti,\r\n\t\tkey,\r\n\t\tlength = dataTypes.length,\r\n\t\ttmp,\r\n\t\t// Current and previous dataTypes\r\n\t\tcurrent = dataTypes[ 0 ],\r\n\t\tprev,\r\n\t\t// Conversion expression\r\n\t\tconversion,\r\n\t\t// Conversion function\r\n\t\tconv,\r\n\t\t// Conversion functions (transitive conversion)\r\n\t\tconv1,\r\n\t\tconv2;\r\n\r\n\t// For each dataType in the chain\r\n\tfor ( i = 1; i < length; i++ ) {\r\n\r\n\t\t// Create converters map\r\n\t\t// with lowercased keys\r\n\t\tif ( i === 1 ) {\r\n\t\t\tfor ( key in s.converters ) {\r\n\t\t\t\tif ( typeof key === \"string\" ) {\r\n\t\t\t\t\tconverters[ key.toLowerCase() ] = s.converters[ key ];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Get the dataTypes\r\n\t\tprev = current;\r\n\t\tcurrent = dataTypes[ i ];\r\n\r\n\t\t// If current is auto dataType, update it to prev\r\n\t\tif ( current === \"*\" ) {\r\n\t\t\tcurrent = prev;\r\n\t\t// If no auto and dataTypes are actually different\r\n\t\t} else if ( prev !== \"*\" && prev !== current ) {\r\n\r\n\t\t\t// Get the converter\r\n\t\t\tconversion = prev + \" \" + current;\r\n\t\t\tconv = converters[ conversion ] || converters[ \"* \" + current ];\r\n\r\n\t\t\t// If there is no direct converter, search transitively\r\n\t\t\tif ( !conv ) {\r\n\t\t\t\tconv2 = undefined;\r\n\t\t\t\tfor ( conv1 in converters ) {\r\n\t\t\t\t\ttmp = conv1.split( \" \" );\r\n\t\t\t\t\tif ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\r\n\t\t\t\t\t\tconv2 = converters[ tmp[1] + \" \" + current ];\r\n\t\t\t\t\t\tif ( conv2 ) {\r\n\t\t\t\t\t\t\tconv1 = converters[ conv1 ];\r\n\t\t\t\t\t\t\tif ( conv1 === true ) {\r\n\t\t\t\t\t\t\t\tconv = conv2;\r\n\t\t\t\t\t\t\t} else if ( conv2 === true ) {\r\n\t\t\t\t\t\t\t\tconv = conv1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// If we found no converter, dispatch an error\r\n\t\t\tif ( !( conv || conv2 ) ) {\r\n\t\t\t\tjQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\r\n\t\t\t}\r\n\t\t\t// If found converter is not an equivalence\r\n\t\t\tif ( conv !== true ) {\r\n\t\t\t\t// Convert with 1 or 2 converters accordingly\r\n\t\t\t\tresponse = conv ? conv( response ) : conv2( conv1(response) );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn response;\r\n}\r\n\r\n\r\n\r\n\r\nvar jsc = jQuery.now(),\r\n\tjsre = /(\\=)\\?(&|$)|\\?\\?/i;\r\n\r\n// Default jsonp settings\r\njQuery.ajaxSetup({\r\n\tjsonp: \"callback\",\r\n\tjsonpCallback: function() {\r\n\t\treturn jQuery.expando + \"_\" + ( jsc++ );\r\n\t}\r\n});\r\n\r\n// Detect, normalize options and install callbacks for jsonp requests\r\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\r\n\r\n\tvar inspectData = ( typeof s.data === \"string\" ) && /^application\\/x\\-www\\-form\\-urlencoded/.test( s.contentType );\r\n\r\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" ||\r\n\t\ts.jsonp !== false && ( jsre.test( s.url ) ||\r\n\t\t\t\tinspectData && jsre.test( s.data ) ) ) {\r\n\r\n\t\tvar responseContainer,\r\n\t\t\tjsonpCallback = s.jsonpCallback =\r\n\t\t\t\tjQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\r\n\t\t\tprevious = window[ jsonpCallback ],\r\n\t\t\turl = s.url,\r\n\t\t\tdata = s.data,\r\n\t\t\treplace = \"$1\" + jsonpCallback + \"$2\";\r\n\r\n\t\tif ( s.jsonp !== false ) {\r\n\t\t\turl = url.replace( jsre, replace );\r\n\t\t\tif ( s.url === url ) {\r\n\t\t\t\tif ( inspectData ) {\r\n\t\t\t\t\tdata = data.replace( jsre, replace );\r\n\t\t\t\t}\r\n\t\t\t\tif ( s.data === data ) {\r\n\t\t\t\t\t// Add callback manually\r\n\t\t\t\t\turl += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\ts.url = url;\r\n\t\ts.data = data;\r\n\r\n\t\t// Install callback\r\n\t\twindow[ jsonpCallback ] = function( response ) {\r\n\t\t\tresponseContainer = [ response ];\r\n\t\t};\r\n\r\n\t\t// Clean-up function\r\n\t\tjqXHR.always(function() {\r\n\t\t\t// Set callback back to previous value\r\n\t\t\twindow[ jsonpCallback ] = previous;\r\n\t\t\t// Call if it was a function and we have a response\r\n\t\t\tif ( responseContainer && jQuery.isFunction( previous ) ) {\r\n\t\t\t\twindow[ jsonpCallback ]( responseContainer[ 0 ] );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Use data converter to retrieve json after script execution\r\n\t\ts.converters[\"script json\"] = function() {\r\n\t\t\tif ( !responseContainer ) {\r\n\t\t\t\tjQuery.error( jsonpCallback + \" was not called\" );\r\n\t\t\t}\r\n\t\t\treturn responseContainer[ 0 ];\r\n\t\t};\r\n\r\n\t\t// force json dataType\r\n\t\ts.dataTypes[ 0 ] = \"json\";\r\n\r\n\t\t// Delegate to script\r\n\t\treturn \"script\";\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\n// Install script dataType\r\njQuery.ajaxSetup({\r\n\taccepts: {\r\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\r\n\t},\r\n\tcontents: {\r\n\t\tscript: /javascript|ecmascript/\r\n\t},\r\n\tconverters: {\r\n\t\t\"text script\": function( text ) {\r\n\t\t\tjQuery.globalEval( text );\r\n\t\t\treturn text;\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Handle cache's special case and global\r\njQuery.ajaxPrefilter( \"script\", function( s ) {\r\n\tif ( s.cache === undefined ) {\r\n\t\ts.cache = false;\r\n\t}\r\n\tif ( s.crossDomain ) {\r\n\t\ts.type = \"GET\";\r\n\t\ts.global = false;\r\n\t}\r\n});\r\n\r\n// Bind script tag hack transport\r\njQuery.ajaxTransport( \"script\", function(s) {\r\n\r\n\t// This transport only deals with cross domain requests\r\n\tif ( s.crossDomain ) {\r\n\r\n\t\tvar script,\r\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\r\n\r\n\t\treturn {\r\n\r\n\t\t\tsend: function( _, callback ) {\r\n\r\n\t\t\t\tscript = document.createElement( \"script\" );\r\n\r\n\t\t\t\tscript.async = \"async\";\r\n\r\n\t\t\t\tif ( s.scriptCharset ) {\r\n\t\t\t\t\tscript.charset = s.scriptCharset;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tscript.src = s.url;\r\n\r\n\t\t\t\t// Attach handlers for all browsers\r\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\r\n\r\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\r\n\r\n\t\t\t\t\t\t// Handle memory leak in IE\r\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\r\n\r\n\t\t\t\t\t\t// Remove the script\r\n\t\t\t\t\t\tif ( head && script.parentNode ) {\r\n\t\t\t\t\t\t\thead.removeChild( script );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Dereference the script\r\n\t\t\t\t\t\tscript = undefined;\r\n\r\n\t\t\t\t\t\t// Callback if not abort\r\n\t\t\t\t\t\tif ( !isAbort ) {\r\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\r\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\r\n\t\t\t\thead.insertBefore( script, head.firstChild );\r\n\t\t\t},\r\n\r\n\t\t\tabort: function() {\r\n\t\t\t\tif ( script ) {\r\n\t\t\t\t\tscript.onload( 0, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\r\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\r\n\t\t// Abort all pending requests\r\n\t\tfor ( var key in xhrCallbacks ) {\r\n\t\t\txhrCallbacks[ key ]( 0, 1 );\r\n\t\t}\r\n\t} : false,\r\n\txhrId = 0,\r\n\txhrCallbacks;\r\n\r\n// Functions to create xhrs\r\nfunction createStandardXHR() {\r\n\ttry {\r\n\t\treturn new window.XMLHttpRequest();\r\n\t} catch( e ) {}\r\n}\r\n\r\nfunction createActiveXHR() {\r\n\ttry {\r\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\r\n\t} catch( e ) {}\r\n}\r\n\r\n// Create the request object\r\n// (This is still attached to ajaxSettings for backward compatibility)\r\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\r\n\t/* Microsoft failed to properly\r\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\r\n\t * so we use the ActiveXObject when it is available\r\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\r\n\t * we need a fallback.\r\n\t */\r\n\tfunction() {\r\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\r\n\t} :\r\n\t// For all other browsers, use the standard XMLHttpRequest object\r\n\tcreateStandardXHR;\r\n\r\n// Determine support properties\r\n(function( xhr ) {\r\n\tjQuery.extend( jQuery.support, {\r\n\t\tajax: !!xhr,\r\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\r\n\t});\r\n})( jQuery.ajaxSettings.xhr() );\r\n\r\n// Create transport if the browser can provide an xhr\r\nif ( jQuery.support.ajax ) {\r\n\r\n\tjQuery.ajaxTransport(function( s ) {\r\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\r\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\r\n\r\n\t\t\tvar callback;\r\n\r\n\t\t\treturn {\r\n\t\t\t\tsend: function( headers, complete ) {\r\n\r\n\t\t\t\t\t// Get a new xhr\r\n\t\t\t\t\tvar xhr = s.xhr(),\r\n\t\t\t\t\t\thandle,\r\n\t\t\t\t\t\ti;\r\n\r\n\t\t\t\t\t// Open the socket\r\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\r\n\t\t\t\t\tif ( s.username ) {\r\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Apply custom fields if provided\r\n\t\t\t\t\tif ( s.xhrFields ) {\r\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\r\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Override mime type if needed\r\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\r\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// X-Requested-With header\r\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\r\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\r\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\r\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\r\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\r\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tfor ( i in headers ) {\r\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} catch( _ ) {}\r\n\r\n\t\t\t\t\t// Do send the request\r\n\t\t\t\t\t// This may raise an exception which is actually\r\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\r\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\r\n\r\n\t\t\t\t\t// Listener\r\n\t\t\t\t\tcallback = function( _, isAbort ) {\r\n\r\n\t\t\t\t\t\tvar status,\r\n\t\t\t\t\t\t\tstatusText,\r\n\t\t\t\t\t\t\tresponseHeaders,\r\n\t\t\t\t\t\t\tresponses,\r\n\t\t\t\t\t\t\txml;\r\n\r\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\r\n\t\t\t\t\t\t// of an xhr when a network error occured\r\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\r\n\t\t\t\t\t\ttry {\r\n\r\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\r\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\r\n\r\n\t\t\t\t\t\t\t\t// Only called once\r\n\t\t\t\t\t\t\t\tcallback = undefined;\r\n\r\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\r\n\t\t\t\t\t\t\t\tif ( handle ) {\r\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\r\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\r\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// If it's an abort\r\n\t\t\t\t\t\t\t\tif ( isAbort ) {\r\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\r\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\r\n\t\t\t\t\t\t\t\t\t\txhr.abort();\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\r\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\r\n\t\t\t\t\t\t\t\t\tresponses = {};\r\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\r\n\r\n\t\t\t\t\t\t\t\t\t// Construct response list\r\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\r\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\r\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\r\n\t\t\t\t\t\t\t\t\t} catch( _ ) {\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\r\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\r\n\t\t\t\t\t\t\t\t\t} catch( e ) {\r\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\r\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\r\n\r\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\r\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\r\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\r\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\r\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\r\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\r\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\r\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\r\n\t\t\t\t\t\t\tif ( !isAbort ) {\r\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Call complete if needed\r\n\t\t\t\t\t\tif ( responses ) {\r\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// if we're in sync mode or it's in cache\r\n\t\t\t\t\t// and has been retrieved directly (IE6 & IE7)\r\n\t\t\t\t\t// we need to manually fire the callback\r\n\t\t\t\t\tif ( !s.async || xhr.readyState === 4 ) {\r\n\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\thandle = ++xhrId;\r\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\r\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\r\n\t\t\t\t\t\t\t// and attach the unload handler\r\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\r\n\t\t\t\t\t\t\t\txhrCallbacks = {};\r\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\r\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\txhr.onreadystatechange = callback;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\tabort: function() {\r\n\t\t\t\t\tif ( callback ) {\r\n\t\t\t\t\t\tcallback(0,1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n}\r\n\r\n\r\n\r\n\r\nvar elemdisplay = {},\r\n\tiframe, iframeDoc,\r\n\trfxtypes = /^(?:toggle|show|hide)$/,\r\n\trfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\r\n\ttimerId,\r\n\tfxAttrs = [\r\n\t\t// height animations\r\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\r\n\t\t// width animations\r\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\r\n\t\t// opacity animations\r\n\t\t[ \"opacity\" ]\r\n\t],\r\n\tfxNow;\r\n\r\njQuery.fn.extend({\r\n\tshow: function( speed, easing, callback ) {\r\n\t\tvar elem, display;\r\n\r\n\t\tif ( speed || speed === 0 ) {\r\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, easing, callback );\r\n\r\n\t\t} else {\r\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.style ) {\r\n\t\t\t\t\tdisplay = elem.style.display;\r\n\r\n\t\t\t\t\t// Reset the inline display of this element to learn if it is\r\n\t\t\t\t\t// being hidden by cascaded rules or not\r\n\t\t\t\t\tif ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\r\n\t\t\t\t\t\tdisplay = elem.style.display = \"\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Set elements which have been overridden with display: none\r\n\t\t\t\t\t// in a stylesheet to whatever the default browser style is\r\n\t\t\t\t\t// for such an element\r\n\t\t\t\t\tif ( (display === \"\" && jQuery.css(elem, \"display\") === \"none\") ||\r\n\t\t\t\t\t\t!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\r\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set the display of most of the elements in a second loop\r\n\t\t\t// to avoid the constant reflow\r\n\t\t\tfor ( i = 0; i < j; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\r\n\t\t\t\tif ( elem.style ) {\r\n\t\t\t\t\tdisplay = elem.style.display;\r\n\r\n\t\t\t\t\tif ( display === \"\" || display === \"none\" ) {\r\n\t\t\t\t\t\telem.style.display = jQuery._data( elem, \"olddisplay\" ) || \"\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\t},\r\n\r\n\thide: function( speed, easing, callback ) {\r\n\t\tif ( speed || speed === 0 ) {\r\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, easing, callback);\r\n\r\n\t\t} else {\r\n\t\t\tvar elem, display,\r\n\t\t\t\ti = 0,\r\n\t\t\t\tj = this.length;\r\n\r\n\t\t\tfor ( ; i < j; i++ ) {\r\n\t\t\t\telem = this[i];\r\n\t\t\t\tif ( elem.style ) {\r\n\t\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\r\n\r\n\t\t\t\t\tif ( display !== \"none\" && !jQuery._data( elem, \"olddisplay\" ) ) {\r\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", display );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set the display of the elements in a second loop\r\n\t\t\t// to avoid the constant reflow\r\n\t\t\tfor ( i = 0; i < j; i++ ) {\r\n\t\t\t\tif ( this[i].style ) {\r\n\t\t\t\t\tthis[i].style.display = \"none\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\t},\r\n\r\n\t// Save the old toggle function\r\n\t_toggle: jQuery.fn.toggle,\r\n\r\n\ttoggle: function( fn, fn2, callback ) {\r\n\t\tvar bool = typeof fn === \"boolean\";\r\n\r\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\r\n\t\t\tthis._toggle.apply( this, arguments );\r\n\r\n\t\t} else if ( fn == null || bool ) {\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\r\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\r\n\t\t\t});\r\n\r\n\t\t} else {\r\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2, callback);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfadeTo: function( speed, to, easing, callback ) {\r\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\r\n\t\t\t\t\t.animate({opacity: to}, speed, easing, callback);\r\n\t},\r\n\r\n\tanimate: function( prop, speed, easing, callback ) {\r\n\t\tvar optall = jQuery.speed( speed, easing, callback );\r\n\r\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\r\n\t\t\treturn this.each( optall.complete, [ false ] );\r\n\t\t}\r\n\r\n\t\t// Do not change referenced properties as per-property easing will be lost\r\n\t\tprop = jQuery.extend( {}, prop );\r\n\r\n\t\tfunction doAnimation() {\r\n\t\t\t// XXX 'this' does not always have a nodeName when running the\r\n\t\t\t// test suite\r\n\r\n\t\t\tif ( optall.queue === false ) {\r\n\t\t\t\tjQuery._mark( this );\r\n\t\t\t}\r\n\r\n\t\t\tvar opt = jQuery.extend( {}, optall ),\r\n\t\t\t\tisElement = this.nodeType === 1,\r\n\t\t\t\thidden = isElement && jQuery(this).is(\":hidden\"),\r\n\t\t\t\tname, val, p, e, hooks, replace,\r\n\t\t\t\tparts, start, end, unit,\r\n\t\t\t\tmethod;\r\n\r\n\t\t\t// will store per property easing and be used to determine when an animation is complete\r\n\t\t\topt.animatedProperties = {};\r\n\r\n\t\t\t// first pass over propertys to expand / normalize\r\n\t\t\tfor ( p in prop ) {\r\n\t\t\t\tname = jQuery.camelCase( p );\r\n\t\t\t\tif ( p !== name ) {\r\n\t\t\t\t\tprop[ name ] = prop[ p ];\r\n\t\t\t\t\tdelete prop[ p ];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( ( hooks = jQuery.cssHooks[ name ] ) && \"expand\" in hooks ) {\r\n\t\t\t\t\treplace = hooks.expand( prop[ name ] );\r\n\t\t\t\t\tdelete prop[ name ];\r\n\r\n\t\t\t\t\t// not quite $.extend, this wont overwrite keys already present.\r\n\t\t\t\t\t// also - reusing 'p' from above because we have the correct \"name\"\r\n\t\t\t\t\tfor ( p in replace ) {\r\n\t\t\t\t\t\tif ( ! ( p in prop ) ) {\r\n\t\t\t\t\t\t\tprop[ p ] = replace[ p ];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor ( name in prop ) {\r\n\t\t\t\tval = prop[ name ];\r\n\t\t\t\t// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\r\n\t\t\t\tif ( jQuery.isArray( val ) ) {\r\n\t\t\t\t\topt.animatedProperties[ name ] = val[ 1 ];\r\n\t\t\t\t\tval = prop[ name ] = val[ 0 ];\r\n\t\t\t\t} else {\r\n\t\t\t\t\topt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\r\n\t\t\t\t\treturn opt.complete.call( this );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( isElement && ( name === \"height\" || name === \"width\" ) ) {\r\n\t\t\t\t\t// Make sure that nothing sneaks out\r\n\t\t\t\t\t// Record all 3 overflow attributes because IE does not\r\n\t\t\t\t\t// change the overflow attribute when overflowX and\r\n\t\t\t\t\t// overflowY are set to the same value\r\n\t\t\t\t\topt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\r\n\r\n\t\t\t\t\t// Set display property to inline-block for height/width\r\n\t\t\t\t\t// animations on inline elements that are having width/height animated\r\n\t\t\t\t\tif ( jQuery.css( this, \"display\" ) === \"inline\" &&\r\n\t\t\t\t\t\t\tjQuery.css( this, \"float\" ) === \"none\" ) {\r\n\r\n\t\t\t\t\t\t// inline-level elements accept inline-block;\r\n\t\t\t\t\t\t// block-level elements need to be inline with layout\r\n\t\t\t\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === \"inline\" ) {\r\n\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.style.zoom = 1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( opt.overflow != null ) {\r\n\t\t\t\tthis.style.overflow = \"hidden\";\r\n\t\t\t}\r\n\r\n\t\t\tfor ( p in prop ) {\r\n\t\t\t\te = new jQuery.fx( this, opt, p );\r\n\t\t\t\tval = prop[ p ];\r\n\r\n\t\t\t\tif ( rfxtypes.test( val ) ) {\r\n\r\n\t\t\t\t\t// Tracks whether to show or hide based on private\r\n\t\t\t\t\t// data attached to the element\r\n\t\t\t\t\tmethod = jQuery._data( this, \"toggle\" + p ) || ( val === \"toggle\" ? hidden ? \"show\" : \"hide\" : 0 );\r\n\t\t\t\t\tif ( method ) {\r\n\t\t\t\t\t\tjQuery._data( this, \"toggle\" + p, method === \"show\" ? \"hide\" : \"show\" );\r\n\t\t\t\t\t\te[ method ]();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\te[ val ]();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tparts = rfxnum.exec( val );\r\n\t\t\t\t\tstart = e.cur();\r\n\r\n\t\t\t\t\tif ( parts ) {\r\n\t\t\t\t\t\tend = parseFloat( parts[2] );\r\n\t\t\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\r\n\r\n\t\t\t\t\t\t// We need to compute starting value\r\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\r\n\t\t\t\t\t\t\tjQuery.style( this, p, (end || 1) + unit);\r\n\t\t\t\t\t\t\tstart = ( (end || 1) / e.cur() ) * start;\r\n\t\t\t\t\t\t\tjQuery.style( this, p, start + unit);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\r\n\t\t\t\t\t\tif ( parts[1] ) {\r\n\t\t\t\t\t\t\tend = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\te.custom( start, end, unit );\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\te.custom( start, val, \"\" );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// For JS strict compliance\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn optall.queue === false ?\r\n\t\t\tthis.each( doAnimation ) :\r\n\t\t\tthis.queue( optall.queue, doAnimation );\r\n\t},\r\n\r\n\tstop: function( type, clearQueue, gotoEnd ) {\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tgotoEnd = clearQueue;\r\n\t\t\tclearQueue = type;\r\n\t\t\ttype = undefined;\r\n\t\t}\r\n\t\tif ( clearQueue && type !== false ) {\r\n\t\t\tthis.queue( type || \"fx\", [] );\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tvar index,\r\n\t\t\t\thadTimers = false,\r\n\t\t\t\ttimers = jQuery.timers,\r\n\t\t\t\tdata = jQuery._data( this );\r\n\r\n\t\t\t// clear marker counters if we know they won't be\r\n\t\t\tif ( !gotoEnd ) {\r\n\t\t\t\tjQuery._unmark( true, this );\r\n\t\t\t}\r\n\r\n\t\t\tfunction stopQueue( elem, data, index ) {\r\n\t\t\t\tvar hooks = data[ index ];\r\n\t\t\t\tjQuery.removeData( elem, index, true );\r\n\t\t\t\thooks.stop( gotoEnd );\r\n\t\t\t}\r\n\r\n\t\t\tif ( type == null ) {\r\n\t\t\t\tfor ( index in data ) {\r\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && index.indexOf(\".run\") === index.length - 4 ) {\r\n\t\t\t\t\t\tstopQueue( this, data, index );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if ( data[ index = type + \".run\" ] && data[ index ].stop ){\r\n\t\t\t\tstopQueue( this, data, index );\r\n\t\t\t}\r\n\r\n\t\t\tfor ( index = timers.length; index--; ) {\r\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\r\n\t\t\t\t\tif ( gotoEnd ) {\r\n\r\n\t\t\t\t\t\t// force the next step to be the last\r\n\t\t\t\t\t\ttimers[ index ]( true );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttimers[ index ].saveState();\r\n\t\t\t\t\t}\r\n\t\t\t\t\thadTimers = true;\r\n\t\t\t\t\ttimers.splice( index, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// start the next in the queue if the last step wasn't forced\r\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\r\n\t\t\t// but only if they were gotoEnd\r\n\t\t\tif ( !( gotoEnd && hadTimers ) ) {\r\n\t\t\t\tjQuery.dequeue( this, type );\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n});\r\n\r\n// Animations created synchronously will run synchronously\r\nfunction createFxNow() {\r\n\tsetTimeout( clearFxNow, 0 );\r\n\treturn ( fxNow = jQuery.now() );\r\n}\r\n\r\nfunction clearFxNow() {\r\n\tfxNow = undefined;\r\n}\r\n\r\n// Generate parameters to create a standard animation\r\nfunction genFx( type, num ) {\r\n\tvar obj = {};\r\n\r\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {\r\n\t\tobj[ this ] = type;\r\n\t});\r\n\r\n\treturn obj;\r\n}\r\n\r\n// Generate shortcuts for custom animations\r\njQuery.each({\r\n\tslideDown: genFx( \"show\", 1 ),\r\n\tslideUp: genFx( \"hide\", 1 ),\r\n\tslideToggle: genFx( \"toggle\", 1 ),\r\n\tfadeIn: { opacity: \"show\" },\r\n\tfadeOut: { opacity: \"hide\" },\r\n\tfadeToggle: { opacity: \"toggle\" }\r\n}, function( name, props ) {\r\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\r\n\t\treturn this.animate( props, speed, easing, callback );\r\n\t};\r\n});\r\n\r\njQuery.extend({\r\n\tspeed: function( speed, easing, fn ) {\r\n\t\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\r\n\t\t\tcomplete: fn || !fn && easing ||\r\n\t\t\t\tjQuery.isFunction( speed ) && speed,\r\n\t\t\tduration: speed,\r\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\r\n\t\t};\r\n\r\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\r\n\t\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\r\n\r\n\t\t// normalize opt.queue - true/undefined/null -> \"fx\"\r\n\t\tif ( opt.queue == null || opt.queue === true ) {\r\n\t\t\topt.queue = \"fx\";\r\n\t\t}\r\n\r\n\t\t// Queueing\r\n\t\topt.old = opt.complete;\r\n\r\n\t\topt.complete = function( noUnmark ) {\r\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\r\n\t\t\t\topt.old.call( this );\r\n\t\t\t}\r\n\r\n\t\t\tif ( opt.queue ) {\r\n\t\t\t\tjQuery.dequeue( this, opt.queue );\r\n\t\t\t} else if ( noUnmark !== false ) {\r\n\t\t\t\tjQuery._unmark( this );\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn opt;\r\n\t},\r\n\r\n\teasing: {\r\n\t\tlinear: function( p ) {\r\n\t\t\treturn p;\r\n\t\t},\r\n\t\tswing: function( p ) {\r\n\t\t\treturn ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;\r\n\t\t}\r\n\t},\r\n\r\n\ttimers: [],\r\n\r\n\tfx: function( elem, options, prop ) {\r\n\t\tthis.options = options;\r\n\t\tthis.elem = elem;\r\n\t\tthis.prop = prop;\r\n\r\n\t\toptions.orig = options.orig || {};\r\n\t}\r\n\r\n});\r\n\r\njQuery.fx.prototype = {\r\n\t// Simple function for setting a style value\r\n\tupdate: function() {\r\n\t\tif ( this.options.step ) {\r\n\t\t\tthis.options.step.call( this.elem, this.now, this );\r\n\t\t}\r\n\r\n\t\t( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );\r\n\t},\r\n\r\n\t// Get the current size\r\n\tcur: function() {\r\n\t\tif ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {\r\n\t\t\treturn this.elem[ this.prop ];\r\n\t\t}\r\n\r\n\t\tvar parsed,\r\n\t\t\tr = jQuery.css( this.elem, this.prop );\r\n\t\t// Empty strings, null, undefined and \"auto\" are converted to 0,\r\n\t\t// complex values such as \"rotate(1rad)\" are returned as is,\r\n\t\t// simple values such as \"10px\" are parsed to Float.\r\n\t\treturn isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\r\n\t},\r\n\r\n\t// Start an animation from one number to another\r\n\tcustom: function( from, to, unit ) {\r\n\t\tvar self = this,\r\n\t\t\tfx = jQuery.fx;\r\n\r\n\t\tthis.startTime = fxNow || createFxNow();\r\n\t\tthis.end = to;\r\n\t\tthis.now = this.start = from;\r\n\t\tthis.pos = this.state = 0;\r\n\t\tthis.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\r\n\r\n\t\tfunction t( gotoEnd ) {\r\n\t\t\treturn self.step( gotoEnd );\r\n\t\t}\r\n\r\n\t\tt.queue = this.options.queue;\r\n\t\tt.elem = this.elem;\r\n\t\tt.saveState = function() {\r\n\t\t\tif ( jQuery._data( self.elem, \"fxshow\" + self.prop ) === undefined ) {\r\n\t\t\t\tif ( self.options.hide ) {\r\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.start );\r\n\t\t\t\t} else if ( self.options.show ) {\r\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.end );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\r\n\t\t\ttimerId = setInterval( fx.tick, fx.interval );\r\n\t\t}\r\n\t},\r\n\r\n\t// Simple 'show' function\r\n\tshow: function() {\r\n\t\tvar dataShow = jQuery._data( this.elem, \"fxshow\" + this.prop );\r\n\r\n\t\t// Remember where we started, so that we can go back to it later\r\n\t\tthis.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );\r\n\t\tthis.options.show = true;\r\n\r\n\t\t// Begin the animation\r\n\t\t// Make sure that we start at a small width/height to avoid any flash of content\r\n\t\tif ( dataShow !== undefined ) {\r\n\t\t\t// This show is picking up where a previous hide or show left off\r\n\t\t\tthis.custom( this.cur(), dataShow );\r\n\t\t} else {\r\n\t\t\tthis.custom( this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur() );\r\n\t\t}\r\n\r\n\t\t// Start by showing the element\r\n\t\tjQuery( this.elem ).show();\r\n\t},\r\n\r\n\t// Simple 'hide' function\r\n\thide: function() {\r\n\t\t// Remember where we started, so that we can go back to it later\r\n\t\tthis.options.orig[ this.prop ] = jQuery._data( this.elem, \"fxshow\" + this.prop ) || jQuery.style( this.elem, this.prop );\r\n\t\tthis.options.hide = true;\r\n\r\n\t\t// Begin the animation\r\n\t\tthis.custom( this.cur(), 0 );\r\n\t},\r\n\r\n\t// Each step of an animation\r\n\tstep: function( gotoEnd ) {\r\n\t\tvar p, n, complete,\r\n\t\t\tt = fxNow || createFxNow(),\r\n\t\t\tdone = true,\r\n\t\t\telem = this.elem,\r\n\t\t\toptions = this.options;\r\n\r\n\t\tif ( gotoEnd || t >= options.duration + this.startTime ) {\r\n\t\t\tthis.now = this.end;\r\n\t\t\tthis.pos = this.state = 1;\r\n\t\t\tthis.update();\r\n\r\n\t\t\toptions.animatedProperties[ this.prop ] = true;\r\n\r\n\t\t\tfor ( p in options.animatedProperties ) {\r\n\t\t\t\tif ( options.animatedProperties[ p ] !== true ) {\r\n\t\t\t\t\tdone = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( done ) {\r\n\t\t\t\t// Reset the overflow\r\n\t\t\t\tif ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\r\n\r\n\t\t\t\t\tjQuery.each( [ \"\", \"X\", \"Y\" ], function( index, value ) {\r\n\t\t\t\t\t\telem.style[ \"overflow\" + value ] = options.overflow[ index ];\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Hide the element if the \"hide\" operation was done\r\n\t\t\t\tif ( options.hide ) {\r\n\t\t\t\t\tjQuery( elem ).hide();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\r\n\t\t\t\tif ( options.hide || options.show ) {\r\n\t\t\t\t\tfor ( p in options.animatedProperties ) {\r\n\t\t\t\t\t\tjQuery.style( elem, p, options.orig[ p ] );\r\n\t\t\t\t\t\tjQuery.removeData( elem, \"fxshow\" + p, true );\r\n\t\t\t\t\t\t// Toggle data is no longer needed\r\n\t\t\t\t\t\tjQuery.removeData( elem, \"toggle\" + p, true );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Execute the complete function\r\n\t\t\t\t// in the event that the complete function throws an exception\r\n\t\t\t\t// we must ensure it won't be called twice. #5684\r\n\r\n\t\t\t\tcomplete = options.complete;\r\n\t\t\t\tif ( complete ) {\r\n\r\n\t\t\t\t\toptions.complete = false;\r\n\t\t\t\t\tcomplete.call( elem );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t} else {\r\n\t\t\t// classical easing cannot be used with an Infinity duration\r\n\t\t\tif ( options.duration == Infinity ) {\r\n\t\t\t\tthis.now = t;\r\n\t\t\t} else {\r\n\t\t\t\tn = t - this.startTime;\r\n\t\t\t\tthis.state = n / options.duration;\r\n\r\n\t\t\t\t// Perform the easing function, defaults to swing\r\n\t\t\t\tthis.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );\r\n\t\t\t\tthis.now = this.start + ( (this.end - this.start) * this.pos );\r\n\t\t\t}\r\n\t\t\t// Perform the next step of the animation\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n};\r\n\r\njQuery.extend( jQuery.fx, {\r\n\ttick: function() {\r\n\t\tvar timer,\r\n\t\t\ttimers = jQuery.timers,\r\n\t\t\ti = 0;\r\n\r\n\t\tfor ( ; i < timers.length; i++ ) {\r\n\t\t\ttimer = timers[ i ];\r\n\t\t\t// Checks the timer has not already been removed\r\n\t\t\tif ( !timer() && timers[ i ] === timer ) {\r\n\t\t\t\ttimers.splice( i--, 1 );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( !timers.length ) {\r\n\t\t\tjQuery.fx.stop();\r\n\t\t}\r\n\t},\r\n\r\n\tinterval: 13,\r\n\r\n\tstop: function() {\r\n\t\tclearInterval( timerId );\r\n\t\ttimerId = null;\r\n\t},\r\n\r\n\tspeeds: {\r\n\t\tslow: 600,\r\n\t\tfast: 200,\r\n\t\t// Default speed\r\n\t\t_default: 400\r\n\t},\r\n\r\n\tstep: {\r\n\t\topacity: function( fx ) {\r\n\t\t\tjQuery.style( fx.elem, \"opacity\", fx.now );\r\n\t\t},\r\n\r\n\t\t_default: function( fx ) {\r\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\r\n\t\t\t\tfx.elem.style[ fx.prop ] = fx.now + fx.unit;\r\n\t\t\t} else {\r\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Ensure props that can't be negative don't go there on undershoot easing\r\njQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {\r\n\t// exclude marginTop, marginLeft, marginBottom and marginRight from this list\r\n\tif ( prop.indexOf( \"margin\" ) ) {\r\n\t\tjQuery.fx.step[ prop ] = function( fx ) {\r\n\t\t\tjQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );\r\n\t\t};\r\n\t}\r\n});\r\n\r\nif ( jQuery.expr && jQuery.expr.filters ) {\r\n\tjQuery.expr.filters.animated = function( elem ) {\r\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\r\n\t\t\treturn elem === fn.elem;\r\n\t\t}).length;\r\n\t};\r\n}\r\n\r\n// Try to restore the default display value of an element\r\nfunction defaultDisplay( nodeName ) {\r\n\r\n\tif ( !elemdisplay[ nodeName ] ) {\r\n\r\n\t\tvar body = document.body,\r\n\t\t\telem = jQuery( \"<\" + nodeName + \">\" ).appendTo( body ),\r\n\t\t\tdisplay = elem.css( \"display\" );\r\n\t\telem.remove();\r\n\r\n\t\t// If the simple way fails,\r\n\t\t// get element's real default display by attaching it to a temp iframe\r\n\t\tif ( display === \"none\" || display === \"\" ) {\r\n\t\t\t// No iframe to use yet, so create it\r\n\t\t\tif ( !iframe ) {\r\n\t\t\t\tiframe = document.createElement( \"iframe\" );\r\n\t\t\t\tiframe.frameBorder = iframe.width = iframe.height = 0;\r\n\t\t\t}\r\n\r\n\t\t\tbody.appendChild( iframe );\r\n\r\n\t\t\t// Create a cacheable copy of the iframe document on first call.\r\n\t\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\r\n\t\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\r\n\t\t\tif ( !iframeDoc || !iframe.createElement ) {\r\n\t\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\r\n\t\t\t\tiframeDoc.write( ( jQuery.support.boxModel ? \"<!doctype html>\" : \"\" ) + \"<html><body>\" );\r\n\t\t\t\tiframeDoc.close();\r\n\t\t\t}\r\n\r\n\t\t\telem = iframeDoc.createElement( nodeName );\r\n\r\n\t\t\tiframeDoc.body.appendChild( elem );\r\n\r\n\t\t\tdisplay = jQuery.css( elem, \"display\" );\r\n\t\t\tbody.removeChild( iframe );\r\n\t\t}\r\n\r\n\t\t// Store the correct default display\r\n\t\telemdisplay[ nodeName ] = display;\r\n\t}\r\n\r\n\treturn elemdisplay[ nodeName ];\r\n}\r\n\r\n\r\n\r\n\r\nvar getOffset,\r\n\trtable = /^t(?:able|d|h)$/i,\r\n\trroot = /^(?:body|html)$/i;\r\n\r\nif ( \"getBoundingClientRect\" in document.documentElement ) {\r\n\tgetOffset = function( elem, doc, docElem, box ) {\r\n\t\ttry {\r\n\t\t\tbox = elem.getBoundingClientRect();\r\n\t\t} catch(e) {}\r\n\r\n\t\t// Make sure we're not dealing with a disconnected DOM node\r\n\t\tif ( !box || !jQuery.contains( docElem, elem ) ) {\r\n\t\t\treturn box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\r\n\t\t}\r\n\r\n\t\tvar body = doc.body,\r\n\t\t\twin = getWindow( doc ),\r\n\t\t\tclientTop  = docElem.clientTop  || body.clientTop  || 0,\r\n\t\t\tclientLeft = docElem.clientLeft || body.clientLeft || 0,\r\n\t\t\tscrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\r\n\t\t\tscrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\r\n\t\t\ttop  = box.top  + scrollTop  - clientTop,\r\n\t\t\tleft = box.left + scrollLeft - clientLeft;\r\n\r\n\t\treturn { top: top, left: left };\r\n\t};\r\n\r\n} else {\r\n\tgetOffset = function( elem, doc, docElem ) {\r\n\t\tvar computedStyle,\r\n\t\t\toffsetParent = elem.offsetParent,\r\n\t\t\tprevOffsetParent = elem,\r\n\t\t\tbody = doc.body,\r\n\t\t\tdefaultView = doc.defaultView,\r\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\r\n\t\t\ttop = elem.offsetTop,\r\n\t\t\tleft = elem.offsetLeft;\r\n\r\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\r\n\t\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\r\n\t\t\ttop  -= elem.scrollTop;\r\n\t\t\tleft -= elem.scrollLeft;\r\n\r\n\t\t\tif ( elem === offsetParent ) {\r\n\t\t\t\ttop  += elem.offsetTop;\r\n\t\t\t\tleft += elem.offsetLeft;\r\n\r\n\t\t\t\tif ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\r\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\r\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tprevOffsetParent = offsetParent;\r\n\t\t\t\toffsetParent = elem.offsetParent;\r\n\t\t\t}\r\n\r\n\t\t\tif ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\r\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\r\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\r\n\t\t\t}\r\n\r\n\t\t\tprevComputedStyle = computedStyle;\r\n\t\t}\r\n\r\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\r\n\t\t\ttop  += body.offsetTop;\r\n\t\t\tleft += body.offsetLeft;\r\n\t\t}\r\n\r\n\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\r\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\r\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\r\n\t\t}\r\n\r\n\t\treturn { top: top, left: left };\r\n\t};\r\n}\r\n\r\njQuery.fn.offset = function( options ) {\r\n\tif ( arguments.length ) {\r\n\t\treturn options === undefined ?\r\n\t\t\tthis :\r\n\t\t\tthis.each(function( i ) {\r\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\r\n\t\t\t});\r\n\t}\r\n\r\n\tvar elem = this[0],\r\n\t\tdoc = elem && elem.ownerDocument;\r\n\r\n\tif ( !doc ) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif ( elem === doc.body ) {\r\n\t\treturn jQuery.offset.bodyOffset( elem );\r\n\t}\r\n\r\n\treturn getOffset( elem, doc, doc.documentElement );\r\n};\r\n\r\njQuery.offset = {\r\n\r\n\tbodyOffset: function( body ) {\r\n\t\tvar top = body.offsetTop,\r\n\t\t\tleft = body.offsetLeft;\r\n\r\n\t\tif ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\r\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\r\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\r\n\t\t}\r\n\r\n\t\treturn { top: top, left: left };\r\n\t},\r\n\r\n\tsetOffset: function( elem, options, i ) {\r\n\t\tvar position = jQuery.css( elem, \"position\" );\r\n\r\n\t\t// set position first, in-case top/left are set even on static elem\r\n\t\tif ( position === \"static\" ) {\r\n\t\t\telem.style.position = \"relative\";\r\n\t\t}\r\n\r\n\t\tvar curElem = jQuery( elem ),\r\n\t\t\tcurOffset = curElem.offset(),\r\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\r\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\r\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\r\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\r\n\r\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\r\n\t\tif ( calculatePosition ) {\r\n\t\t\tcurPosition = curElem.position();\r\n\t\t\tcurTop = curPosition.top;\r\n\t\t\tcurLeft = curPosition.left;\r\n\t\t} else {\r\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\r\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction( options ) ) {\r\n\t\t\toptions = options.call( elem, i, curOffset );\r\n\t\t}\r\n\r\n\t\tif ( options.top != null ) {\r\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\r\n\t\t}\r\n\t\tif ( options.left != null ) {\r\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\r\n\t\t}\r\n\r\n\t\tif ( \"using\" in options ) {\r\n\t\t\toptions.using.call( elem, props );\r\n\t\t} else {\r\n\t\t\tcurElem.css( props );\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\njQuery.fn.extend({\r\n\r\n\tposition: function() {\r\n\t\tif ( !this[0] ) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar elem = this[0],\r\n\r\n\t\t// Get *real* offsetParent\r\n\t\toffsetParent = this.offsetParent(),\r\n\r\n\t\t// Get correct offsets\r\n\t\toffset       = this.offset(),\r\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\r\n\r\n\t\t// Subtract element margins\r\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\r\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\r\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\r\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\r\n\r\n\t\t// Add offsetParent borders\r\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\r\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\r\n\r\n\t\t// Subtract the two offsets\r\n\t\treturn {\r\n\t\t\ttop:  offset.top  - parentOffset.top,\r\n\t\t\tleft: offset.left - parentOffset.left\r\n\t\t};\r\n\t},\r\n\r\n\toffsetParent: function() {\r\n\t\treturn this.map(function() {\r\n\t\t\tvar offsetParent = this.offsetParent || document.body;\r\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\r\n\t\t\t\toffsetParent = offsetParent.offsetParent;\r\n\t\t\t}\r\n\t\t\treturn offsetParent;\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\r\n// Create scrollLeft and scrollTop methods\r\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\r\n\tvar top = /Y/.test( prop );\r\n\r\n\tjQuery.fn[ method ] = function( val ) {\r\n\t\treturn jQuery.access( this, function( elem, method, val ) {\r\n\t\t\tvar win = getWindow( elem );\r\n\r\n\t\t\tif ( val === undefined ) {\r\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\r\n\t\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\r\n\t\t\t\t\t\twin.document.body[ method ] :\r\n\t\t\t\t\telem[ method ];\r\n\t\t\t}\r\n\r\n\t\t\tif ( win ) {\r\n\t\t\t\twin.scrollTo(\r\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\r\n\t\t\t\t\t top ? val : jQuery( win ).scrollTop()\r\n\t\t\t\t);\r\n\r\n\t\t\t} else {\r\n\t\t\t\telem[ method ] = val;\r\n\t\t\t}\r\n\t\t}, method, val, arguments.length, null );\r\n\t};\r\n});\r\n\r\nfunction getWindow( elem ) {\r\n\treturn jQuery.isWindow( elem ) ?\r\n\t\telem :\r\n\t\telem.nodeType === 9 ?\r\n\t\t\telem.defaultView || elem.parentWindow :\r\n\t\t\tfalse;\r\n}\r\n\r\n\r\n\r\n\r\n// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods\r\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\r\n\tvar clientProp = \"client\" + name,\r\n\t\tscrollProp = \"scroll\" + name,\r\n\t\toffsetProp = \"offset\" + name;\r\n\r\n\t// innerHeight and innerWidth\r\n\tjQuery.fn[ \"inner\" + name ] = function() {\r\n\t\tvar elem = this[0];\r\n\t\treturn elem ?\r\n\t\t\telem.style ?\r\n\t\t\tparseFloat( jQuery.css( elem, type, \"padding\" ) ) :\r\n\t\t\tthis[ type ]() :\r\n\t\t\tnull;\r\n\t};\r\n\r\n\t// outerHeight and outerWidth\r\n\tjQuery.fn[ \"outer\" + name ] = function( margin ) {\r\n\t\tvar elem = this[0];\r\n\t\treturn elem ?\r\n\t\t\telem.style ?\r\n\t\t\tparseFloat( jQuery.css( elem, type, margin ? \"margin\" : \"border\" ) ) :\r\n\t\t\tthis[ type ]() :\r\n\t\t\tnull;\r\n\t};\r\n\r\n\tjQuery.fn[ type ] = function( value ) {\r\n\t\treturn jQuery.access( this, function( elem, type, value ) {\r\n\t\t\tvar doc, docElemProp, orig, ret;\r\n\r\n\t\t\tif ( jQuery.isWindow( elem ) ) {\r\n\t\t\t\t// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\r\n\t\t\t\tdoc = elem.document;\r\n\t\t\t\tdocElemProp = doc.documentElement[ clientProp ];\r\n\t\t\t\treturn jQuery.support.boxModel && docElemProp ||\r\n\t\t\t\t\tdoc.body && doc.body[ clientProp ] || docElemProp;\r\n\t\t\t}\r\n\r\n\t\t\t// Get document width or height\r\n\t\t\tif ( elem.nodeType === 9 ) {\r\n\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\r\n\t\t\t\tdoc = elem.documentElement;\r\n\r\n\t\t\t\t// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]\r\n\t\t\t\t// so we can't use max, as it'll choose the incorrect offset[Width/Height]\r\n\t\t\t\t// instead we use the correct client[Width/Height]\r\n\t\t\t\t// support:IE6\r\n\t\t\t\tif ( doc[ clientProp ] >= doc[ scrollProp ] ) {\r\n\t\t\t\t\treturn doc[ clientProp ];\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn Math.max(\r\n\t\t\t\t\telem.body[ scrollProp ], doc[ scrollProp ],\r\n\t\t\t\t\telem.body[ offsetProp ], doc[ offsetProp ]\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\t// Get width or height on the element\r\n\t\t\tif ( value === undefined ) {\r\n\t\t\t\torig = jQuery.css( elem, type );\r\n\t\t\t\tret = parseFloat( orig );\r\n\t\t\t\treturn jQuery.isNumeric( ret ) ? ret : orig;\r\n\t\t\t}\r\n\r\n\t\t\t// Set the width or height on the element\r\n\t\t\tjQuery( elem ).css( type, value );\r\n\t\t}, type, value, arguments.length, null );\r\n\t};\r\n});\r\n\r\n\r\n\r\n\r\n// Expose jQuery to the global object\r\nwindow.jQuery = window.$ = jQuery;\r\n\r\n// Expose jQuery as an AMD module, but only for AMD loaders that\r\n// understand the issues with loading multiple versions of jQuery\r\n// in a page that all might call define(). The loader will indicate\r\n// they have special allowances for multiple jQuery versions by\r\n// specifying define.amd.jQuery = true. Register as a named module,\r\n// since jQuery can be concatenated with other files that may use define,\r\n// but not use a proper concatenation script that understands anonymous\r\n// AMD modules. A named AMD is safest and most robust way to register.\r\n// Lowercase jquery is used because AMD module names are derived from\r\n// file names, and jQuery is normally delivered in a lowercase file name.\r\n// Do this after creating the global so that if an AMD module wants to call\r\n// noConflict to hide this version of jQuery, it will work.\r\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\r\n\tdefine( \"jquery\", [], function () { return jQuery; } );\r\n}\r\n\r\n\r\n\r\n})( window );"
  },
  {
    "path": "servers/www/assets/js/vendor/jquery.layout.js",
    "content": "/**\r\n * @preserve jquery.layout 1.3.0 - Release Candidate 30.51\r\n * $Date: 2012-05-12 08:00:00 (Sat, 12 May 2012) $\r\n * $Rev: 303005 $\r\n *\r\n * Copyright (c) 2012 \r\n *   Fabrizio Balliano (http://www.fabrizioballiano.net)\r\n *   Kevin Dalman (http://allpro.net)\r\n *\r\n * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)\r\n * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.\r\n *\r\n * Changelog: http://layout.jquery-dev.net/changelog.cfm#1.3.0.rc30.5\r\n *\r\n * Docs: http://layout.jquery-dev.net/documentation.html\r\n * Tips: http://layout.jquery-dev.net/tips.html\r\n * Help: http://groups.google.com/group/jquery-ui-layout\r\n */\r\n\r\n/* JavaDoc Info: http://code.google.com/closure/compiler/docs/js-for-compiler.html\r\n * {!Object}  non-nullable type (never NULL)\r\n * {?string}\tnullable type (sometimes NULL) - default for {Object}\r\n * {number=}\toptional parameter\r\n * {*}\t\t\tALL types\r\n */\r\n\r\n// NOTE: For best readability, view with a fixed-width font and tabs equal to 4-chars\r\n\r\n;(function ($) {\r\n\r\n// alias Math methods - used a lot!\r\nvar\tmin\t\t= Math.min\r\n,\tmax\t\t= Math.max\r\n,\tround\t= Math.floor\r\n;\r\nfunction isStr (v) { return $.type(v) === \"string\"; }\r\n\r\nfunction runPluginCallbacks (Instance, a_fn) {\r\n\tif ($.isArray(a_fn)) \r\n\t\tfor (var i=0, c=a_fn.length; i<c; i++) {\r\n\t\t\tvar fn = a_fn[i];\r\n\t\t\ttry {\r\n\t\t\t\tif (isStr(fn)) // 'name' of a function\r\n\t\t\t\t\tfn = eval(fn);\r\n\t\t\t\tif ($.isFunction(fn))\r\n\t\t\t\t\tfn( Instance );\r\n\t\t\t} catch (ex) {}\r\n\t\t}\r\n};\r\n\r\n\r\n\r\n/*\r\n *\tGENERIC $.layout METHODS - used by all layouts\r\n */\r\n$.layout = {\r\n\r\n\tversion:\t\"1.3.rc30.51\"\r\n,\trevision:\t0.033005 // 1.3.0 final = 1.0300 - major(n+).minor(nn)+patch(nn+)\r\n\r\n\t// LANGUAGE CUSTOMIZATION\r\n,\tlanguage: {\r\n\t//\tTips and messages for resizers, togglers, custom buttons, etc.\r\n\t\tOpen:\t\t\t\"Open\"\t// eg: \"Open Pane\"\r\n\t,\tClose:\t\t\t\"Close\"\r\n\t,\tResize:\t\t\t\"Resize\"\r\n\t,\tSlide:\t\t\t\"Slide Open\"\r\n\t,\tPin:\t\t\t\"Pin\"\r\n\t,\tUnpin:\t\t\t\"Un-Pin\"\r\n\t,\tnoRoomToOpenTip: \"Not enough room to show this pane.\"\r\n\t,\tminSizeWarning:\t\"Panel has reached its minimum size\"\r\n\t,\tmaxSizeWarning:\t\"Panel has reached its maximum size\"\r\n\t//\tDeveloper error messages\r\n\t,\tpane:\t\t\t\t\t\"pane\"\t\t// description of \"layout pane element\"\r\n\t,\tselector:\t\t\t\t\"selector\"\t// description of \"jQuery-selector\"\r\n\t,\terrButton:\t\t\t\t\"Error Adding Button \\n\\nInvalid \"\r\n\t,\terrContainerMissing:\t\"UI Layout Initialization Error\\n\\nThe specified layout-container does not exist.\"\r\n\t,\terrCenterPaneMissing:\t\"UI Layout Initialization Error\\n\\nThe center-pane element does not exist.\\n\\nThe center-pane is a required element.\"\r\n\t,\terrContainerHeight:\t\t\"UI Layout Initialization Warning\\n\\nThe layout-container \\\"CONTAINER\\\" has no height.\\n\\nTherefore the layout is 0-height and hence 'invisible'!\"\r\n\t}\r\n\r\n\t// can update code here if $.browser is phased out\r\n,\tbrowser: {\r\n\t\tmozilla:\t!!$.browser.mozilla\r\n\t,\twebkit:\t\t!!$.browser.webkit || !!$.browser.safari // webkit = jQ 1.4\r\n\t,\tmsie:\t\t!!$.browser.msie\r\n\t,\tisIE6:\t\t!!$.browser.msie && $.browser.version == 6\r\n\t,\tversion:\t$.browser.version // not used in Layout core, but may be used by plugins\r\n\t}\r\n\r\n\t// *PREDEFINED* EFFECTS & DEFAULTS \r\n\t// MUST list effect here - OR MUST set an fxSettings option (can be an empty hash: {})\r\n,\teffects: {\r\n\r\n\t//\tPane Open/Close Animations\r\n\t\tslide: {\r\n\t\t\tall:\t{ duration:  \"fast\"\t} // eg: duration: 1000, easing: \"easeOutBounce\"\r\n\t\t,\tnorth:\t{ direction: \"up\"\t}\r\n\t\t,\tsouth:\t{ direction: \"down\"\t}\r\n\t\t,\teast:\t{ direction: \"right\"}\r\n\t\t,\twest:\t{ direction: \"left\"\t}\r\n\t\t}\r\n\t,\tdrop: {\r\n\t\t\tall:\t{ duration:  \"slow\"\t}\r\n\t\t,\tnorth:\t{ direction: \"up\"\t}\r\n\t\t,\tsouth:\t{ direction: \"down\"\t}\r\n\t\t,\teast:\t{ direction: \"right\"}\r\n\t\t,\twest:\t{ direction: \"left\"\t}\r\n\t\t}\r\n\t,\tscale: {\r\n\t\t\tall:\t{ duration:\t\"fast\"\t}\r\n\t\t}\r\n\t//\tthese are not recommended, but can be used\r\n\t,\tblind:\t\t{}\r\n\t,\tclip:\t\t{}\r\n\t,\texplode:\t{}\r\n\t,\tfade:\t\t{}\r\n\t,\tfold:\t\t{}\r\n\t,\tpuff:\t\t{}\r\n\r\n\t//\tPane Resize Animations\r\n\t,\tsize: {\r\n\t\t\tall:\t{ easing:\t\"swing\"\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// INTERNAL CONFIG DATA - DO NOT CHANGE THIS!\r\n,\tconfig: {\r\n\t\toptionRootKeys:\t\"effects,panes,north,south,west,east,center\".split(\",\")\r\n\t,\tallPanes:\t\t\"north,south,west,east,center\".split(\",\")\r\n\t,\tborderPanes:\t\"north,south,west,east\".split(\",\")\r\n\t,\toppositeEdge: {\r\n\t\t\tnorth:\t\"south\"\r\n\t\t,\tsouth:\t\"north\"\r\n\t\t,\teast: \t\"west\"\r\n\t\t,\twest: \t\"east\"\r\n\t\t}\r\n\t//\toffscreen data\r\n\t,\toffscreenCSS:\t{ left: \"-99999px\", right: \"auto\" } // used by hide/close if useOffscreenClose=true\r\n\t,\toffscreenReset:\t\"offscreenReset\" // key used for data\r\n\t//\tCSS used in multiple places\r\n\t,\thidden:\t\t{ visibility: \"hidden\" }\r\n\t,\tvisible:\t{ visibility: \"visible\" }\r\n\t//\tlayout element settings\r\n\t,\tresizers: {\r\n\t\t\tcssReq: {\r\n\t\t\t\tposition: \t\"absolute\"\r\n\t\t\t,\tpadding: \t0\r\n\t\t\t,\tmargin: \t0\r\n\t\t\t,\tfontSize:\t\"1px\"\r\n\t\t\t,\ttextAlign:\t\"left\"\t// to counter-act \"center\" alignment!\r\n\t\t\t,\toverflow: \t\"hidden\" // prevent toggler-button from overflowing\r\n\t\t\t//\tSEE $.layout.defaults.zIndexes.resizer_normal\r\n\t\t\t}\r\n\t\t,\tcssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true\r\n\t\t\t\tbackground: \"#DDD\"\r\n\t\t\t,\tborder:\t\t\"none\"\r\n\t\t\t}\r\n\t\t}\r\n\t,\ttogglers: {\r\n\t\t\tcssReq: {\r\n\t\t\t\tposition: \t\"absolute\"\r\n\t\t\t,\tdisplay: \t\"block\"\r\n\t\t\t,\tpadding: \t0\r\n\t\t\t,\tmargin: \t0\r\n\t\t\t,\toverflow:\t\"hidden\"\r\n\t\t\t,\ttextAlign:\t\"center\"\r\n\t\t\t,\tfontSize:\t\"1px\"\r\n\t\t\t,\tcursor: \t\"pointer\"\r\n\t\t\t,\tzIndex: \t1\r\n\t\t\t}\r\n\t\t,\tcssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true\r\n\t\t\t\tbackground: \"#AAA\"\r\n\t\t\t}\r\n\t\t}\r\n\t,\tcontent: {\r\n\t\t\tcssReq: {\r\n\t\t\t\tposition:\t\"relative\" /* contain floated or positioned elements */\r\n\t\t\t}\r\n\t\t,\tcssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true\r\n\t\t\t\toverflow:\t\"auto\"\r\n\t\t\t,\tpadding:\t\"10px\"\r\n\t\t\t}\r\n\t\t,\tcssDemoPane: { // DEMO CSS - REMOVE scrolling from 'pane' when it has a content-div\r\n\t\t\t\toverflow:\t\"hidden\"\r\n\t\t\t,\tpadding:\t0\r\n\t\t\t}\r\n\t\t}\r\n\t,\tpanes: { // defaults for ALL panes - overridden by 'per-pane settings' below\r\n\t\t\tcssReq: {\r\n\t\t\t\tposition: \t\"absolute\"\r\n\t\t\t,\tmargin:\t\t0\r\n\t\t\t//\t$.layout.defaults.zIndexes.pane_normal\r\n\t\t\t}\r\n\t\t,\tcssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true\r\n\t\t\t\tpadding:\t\"10px\"\r\n\t\t\t,\tbackground:\t\"#FFF\"\r\n\t\t\t,\tborder:\t\t\"1px solid #BBB\"\r\n\t\t\t,\toverflow:\t\"auto\"\r\n\t\t\t}\r\n\t\t}\r\n\t,\tnorth: {\r\n\t\t\tside:\t\t\t\"Top\"\r\n\t\t,\tsizeType:\t\t\"Height\"\r\n\t\t,\tdir:\t\t\t\"horz\"\r\n\t\t,\tcssReq: {\r\n\t\t\t\ttop: \t\t0\r\n\t\t\t,\tbottom: \t\"auto\"\r\n\t\t\t,\tleft: \t\t0\r\n\t\t\t,\tright: \t\t0\r\n\t\t\t,\twidth: \t\t\"auto\"\r\n\t\t\t//\theight: \tDYNAMIC\r\n\t\t\t}\r\n\t\t}\r\n\t,\tsouth: {\r\n\t\t\tside:\t\t\t\"Bottom\"\r\n\t\t,\tsizeType:\t\t\"Height\"\r\n\t\t,\tdir:\t\t\t\"horz\"\r\n\t\t,\tcssReq: {\r\n\t\t\t\ttop: \t\t\"auto\"\r\n\t\t\t,\tbottom: \t0\r\n\t\t\t,\tleft: \t\t0\r\n\t\t\t,\tright: \t\t0\r\n\t\t\t,\twidth: \t\t\"auto\"\r\n\t\t\t//\theight: \tDYNAMIC\r\n\t\t\t}\r\n\t\t}\r\n\t,\teast: {\r\n\t\t\tside:\t\t\t\"Right\"\r\n\t\t,\tsizeType:\t\t\"Width\"\r\n\t\t,\tdir:\t\t\t\"vert\"\r\n\t\t,\tcssReq: {\r\n\t\t\t\tleft: \t\t\"auto\"\r\n\t\t\t,\tright: \t\t0\r\n\t\t\t,\ttop: \t\t\"auto\" // DYNAMIC\r\n\t\t\t,\tbottom: \t\"auto\" // DYNAMIC\r\n\t\t\t,\theight: \t\"auto\"\r\n\t\t\t//\twidth: \t\tDYNAMIC\r\n\t\t\t}\r\n\t\t}\r\n\t,\twest: {\r\n\t\t\tside:\t\t\t\"Left\"\r\n\t\t,\tsizeType:\t\t\"Width\"\r\n\t\t,\tdir:\t\t\t\"vert\"\r\n\t\t,\tcssReq: {\r\n\t\t\t\tleft: \t\t0\r\n\t\t\t,\tright: \t\t\"auto\"\r\n\t\t\t,\ttop: \t\t\"auto\" // DYNAMIC\r\n\t\t\t,\tbottom: \t\"auto\" // DYNAMIC\r\n\t\t\t,\theight: \t\"auto\"\r\n\t\t\t//\twidth: \t\tDYNAMIC\r\n\t\t\t}\r\n\t\t}\r\n\t,\tcenter: {\r\n\t\t\tdir:\t\t\t\"center\"\r\n\t\t,\tcssReq: {\r\n\t\t\t\tleft: \t\t\"auto\" // DYNAMIC\r\n\t\t\t,\tright: \t\t\"auto\" // DYNAMIC\r\n\t\t\t,\ttop: \t\t\"auto\" // DYNAMIC\r\n\t\t\t,\tbottom: \t\"auto\" // DYNAMIC\r\n\t\t\t,\theight: \t\"auto\"\r\n\t\t\t,\twidth: \t\t\"auto\"\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// CALLBACK FUNCTION NAMESPACE - used to store reusable callback functions\r\n,\tcallbacks: {}\r\n\r\n,\tgetParentPaneElem: function (el) {\r\n\t\t// must pass either a container or pane element\r\n\t\tvar $el = $(el)\r\n\t\t,\tlayout = $el.data(\"layout\") || $el.data(\"parentLayout\");\r\n\t\tif (layout) {\r\n\t\t\tvar $cont = layout.container;\r\n\t\t\t// see if this container is directly-nested inside an outer-pane\r\n\t\t\tif ($cont.data(\"layoutPane\")) return $cont;\r\n\t\t\tvar $pane = $cont.closest(\".\"+ $.layout.defaults.panes.paneClass);\r\n\t\t\t// if a pane was found, return it\r\n\t\t\tif ($pane.data(\"layoutPane\")) return $pane;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n,\tgetParentPaneInstance: function (el) {\r\n\t\t// must pass either a container or pane element\r\n\t\tvar $pane = $.layout.getParentPaneElem(el);\r\n\t\treturn $pane ? $pane.data(\"layoutPane\") : null;\r\n\t}\r\n\r\n,\tgetParentLayoutInstance: function (el) {\r\n\t\t// must pass either a container or pane element\r\n\t\tvar $pane = $.layout.getParentPaneElem(el);\r\n\t\treturn $pane ? $pane.data(\"parentLayout\") : null;\r\n\t}\r\n\r\n,\tgetEventObject: function (evt) {\r\n\t\treturn typeof evt === \"object\" && evt.stopPropagation ? evt : null;\r\n\t}\r\n,\tparsePaneName: function (evt_or_pane) {\r\n\t\t// getEventObject() automatically calls .stopPropagation(), WHICH MUST BE DONE!\r\n\t\tvar evt = $.layout.getEventObject( evt_or_pane );\r\n\t\tif (evt) {\r\n\t\t\t// ALWAYS stop propagation of events triggered in Layout!\r\n\t\t\tevt.stopPropagation();\r\n\t\t\treturn $(this).data(\"layoutEdge\");\r\n\t\t}\r\n\t\telse\r\n\t\t\treturn evt_or_pane;\r\n\t}\r\n\r\n\r\n\t// LAYOUT-PLUGIN REGISTRATION\r\n\t// more plugins can added beyond this default list\r\n,\tplugins: {\r\n\t\tdraggable:\t\t!!$.fn.draggable // resizing\r\n\t,\teffects: {\r\n\t\t\tcore:\t\t!!$.effects\t\t// animimations (specific effects tested by initOptions)\r\n\t\t,\tslide:\t\t$.effects && $.effects.slide // default effect\r\n\t\t}\r\n\t}\r\n\r\n//\tarrays of plugin or other methods to be triggered for events in *each layout* - will be passed 'Instance'\r\n,\tonCreate:\t[]\t// runs when layout is just starting to be created - right after options are set\r\n,\tonLoad:\t\t[]\t// runs after layout container and global events init, but before initPanes is called\r\n,\tonReady:\t[]\t// runs after initialization *completes* - ie, after initPanes completes successfully\r\n,\tonDestroy:\t[]\t// runs after layout is destroyed\r\n,\tonUnload:\t[]\t// runs after layout is destroyed OR when page unloads\r\n,\tafterOpen:\t[]\t// runs after setAsOpen() completes\r\n,\tafterClose:\t[]\t// runs after setAsClosed() completes\r\n\r\n\t/*\r\n\t*\tGENERIC UTILITY METHODS\r\n\t*/\r\n\r\n\t// calculate and return the scrollbar width, as an integer\r\n,\tscrollbarWidth:\t\tfunction () { return window.scrollbarWidth  || $.layout.getScrollbarSize('width'); }\r\n,\tscrollbarHeight:\tfunction () { return window.scrollbarHeight || $.layout.getScrollbarSize('height'); }\r\n,\tgetScrollbarSize:\tfunction (dim) {\r\n\t\tvar $c\t= $('<div style=\"position: absolute; top: -10000px; left: -10000px; width: 100px; height: 100px; overflow: scroll;\"></div>').appendTo(\"body\");\r\n\t\tvar d\t= { width: $c.width() - $c[0].clientWidth, height: $c.height() - $c[0].clientHeight };\r\n\t\t$c.remove();\r\n\t\twindow.scrollbarWidth\t= d.width;\r\n\t\twindow.scrollbarHeight\t= d.height;\r\n\t\treturn dim.match(/^(width|height)$/) ? d[dim] : d;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Returns hash container 'display' and 'visibility'\r\n\t*\r\n\t* @see\t$.swap() - swaps CSS, runs callback, resets CSS\r\n\t*/\r\n,\tshowInvisibly: function ($E, force) {\r\n\t\tif (!$E) return {};\r\n\t\tif (!$E.jquery) $E = $($E);\r\n\t\tvar CSS = {\r\n\t\t\tdisplay:\t$E.css('display')\r\n\t\t,\tvisibility:\t$E.css('visibility')\r\n\t\t};\r\n\t\tif (force || CSS.display === \"none\") { // only if not *already hidden*\r\n\t\t\t$E.css({ display: \"block\", visibility: \"hidden\" }); // show element 'invisibly' so can be measured\r\n\t\t\treturn CSS;\r\n\t\t}\r\n\t\telse return {};\r\n\t}\r\n\r\n\t/**\r\n\t* Returns data for setting size of an element (container or a pane).\r\n\t*\r\n\t* @see  _create(), onWindowResize() for container, plus others for pane\r\n\t* @return JSON  Returns a hash of all dimensions: top, bottom, left, right, outerWidth, innerHeight, etc\r\n\t*/\r\n,\tgetElementDimensions: function ($E) {\r\n\t\tvar\r\n\t\t\td\t= {}\t\t\t// dimensions hash\r\n\t\t,\tx\t= d.css = {}\t// CSS hash\r\n\t\t,\ti\t= {}\t\t\t// TEMP insets\r\n\t\t,\tb, p\t\t\t\t// TEMP border, padding\r\n\t\t,\tN\t= $.layout.cssNum\r\n\t\t,\toff = $E.offset()\r\n\t\t;\r\n\t\td.offsetLeft = off.left;\r\n\t\td.offsetTop  = off.top;\r\n\r\n\t\t$.each(\"Left,Right,Top,Bottom\".split(\",\"), function (idx, e) { // e = edge\r\n\t\t\tb = x[\"border\" + e] = $.layout.borderWidth($E, e);\r\n\t\t\tp = x[\"padding\"+ e] = $.layout.cssNum($E, \"padding\"+e);\r\n\t\t\ti[e] = b + p; // total offset of content from outer side\r\n\t\t\td[\"inset\"+ e] = p;\r\n\t\t});\r\n\r\n\t\td.offsetWidth\t= $E.innerWidth();\t// offsetWidth is used in calc when doing manual resize\r\n\t\td.offsetHeight\t= $E.innerHeight();\t// ditto\r\n\t\td.outerWidth\t= $E.outerWidth();\r\n\t\td.outerHeight\t= $E.outerHeight();\r\n\t\td.innerWidth\t= max(0, d.outerWidth  - i.Left - i.Right);\r\n\t\td.innerHeight\t= max(0, d.outerHeight - i.Top  - i.Bottom);\r\n\r\n\t\tx.width\t\t= $E.width();\r\n\t\tx.height\t= $E.height();\r\n\t\tx.top\t\t= N($E,\"top\",true);\r\n\t\tx.bottom\t= N($E,\"bottom\",true);\r\n\t\tx.left\t\t= N($E,\"left\",true);\r\n\t\tx.right\t\t= N($E,\"right\",true);\r\n\r\n\t\t//d.visible\t= $E.is(\":visible\");// && x.width > 0 && x.height > 0;\r\n\r\n\t\treturn d;\r\n\t}\r\n\r\n,\tgetElementCSS: function ($E, list) {\r\n\t\tvar\r\n\t\t\tCSS\t= {}\r\n\t\t,\tstyle\t= $E[0].style\r\n\t\t,\tprops\t= list.split(\",\")\r\n\t\t,\tsides\t= \"Top,Bottom,Left,Right\".split(\",\")\r\n\t\t,\tattrs\t= \"Color,Style,Width\".split(\",\")\r\n\t\t,\tp, s, a, i, j, k\r\n\t\t;\r\n\t\tfor (i=0; i < props.length; i++) {\r\n\t\t\tp = props[i];\r\n\t\t\tif (p.match(/(border|padding|margin)$/))\r\n\t\t\t\tfor (j=0; j < 4; j++) {\r\n\t\t\t\t\ts = sides[j];\r\n\t\t\t\t\tif (p === \"border\")\r\n\t\t\t\t\t\tfor (k=0; k < 3; k++) {\r\n\t\t\t\t\t\t\ta = attrs[k];\r\n\t\t\t\t\t\t\tCSS[p+s+a] = style[p+s+a];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tCSS[p+s] = style[p+s];\r\n\t\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tCSS[p] = style[p];\r\n\t\t};\r\n\t\treturn CSS\r\n\t}\r\n\r\n\t/**\r\n\t* Return the innerWidth for the current browser/doctype\r\n\t*\r\n\t* @see  initPanes(), sizeMidPanes(), initHandles(), sizeHandles()\r\n\t* @param  {Array.<Object>}\t$E  Must pass a jQuery object - first element is processed\r\n\t* @param  {number=}\t\t\touterWidth (optional) Can pass a width, allowing calculations BEFORE element is resized\r\n\t* @return {number}\t\t\tReturns the innerWidth of the elem by subtracting padding and borders\r\n\t*/\r\n,\tcssWidth: function ($E, outerWidth) {\r\n\t\tvar\r\n\t\t\tb = $.layout.borderWidth\r\n\t\t,\tn = $.layout.cssNum\r\n\t\t;\r\n\t\t// a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed\r\n\t\tif (outerWidth <= 0) return 0;\r\n\r\n\t\tif (!$.support.boxModel) return outerWidth;\r\n\r\n\t\t// strip border and padding from outerWidth to get CSS Width\r\n\t\tvar W = outerWidth\r\n\t\t\t- b($E, \"Left\")\r\n\t\t\t- b($E, \"Right\")\r\n\t\t\t- n($E, \"paddingLeft\")\t\t\r\n\t\t\t- n($E, \"paddingRight\")\r\n\t\t;\r\n\r\n\t\treturn max(0,W);\r\n\t}\r\n\r\n\t/**\r\n\t* Return the innerHeight for the current browser/doctype\r\n\t*\r\n\t* @see  initPanes(), sizeMidPanes(), initHandles(), sizeHandles()\r\n\t* @param  {Array.<Object>}\t$E  Must pass a jQuery object - first element is processed\r\n\t* @param  {number=}\t\t\touterHeight  (optional) Can pass a width, allowing calculations BEFORE element is resized\r\n\t* @return {number}\t\t\tReturns the innerHeight of the elem by subtracting padding and borders\r\n\t*/\r\n,\tcssHeight: function ($E, outerHeight) {\r\n\t\tvar\r\n\t\t\tb = $.layout.borderWidth\r\n\t\t,\tn = $.layout.cssNum\r\n\t\t;\r\n\t\t// a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed\r\n\t\tif (outerHeight <= 0) return 0;\r\n\r\n\t\tif (!$.support.boxModel) return outerHeight;\r\n\r\n\t\t// strip border and padding from outerHeight to get CSS Height\r\n\t\tvar H = outerHeight\r\n\t\t\t- b($E, \"Top\")\r\n\t\t\t- b($E, \"Bottom\")\r\n\t\t\t- n($E, \"paddingTop\")\r\n\t\t\t- n($E, \"paddingBottom\")\r\n\t\t;\r\n\r\n\t\treturn max(0,H);\r\n\t}\r\n\r\n\t/**\r\n\t* Returns the 'current CSS numeric value' for a CSS property - 0 if property does not exist\r\n\t*\r\n\t* @see  Called by many methods\r\n\t* @param {Array.<Object>}\t$E\t\t\t\t\tMust pass a jQuery object - first element is processed\r\n\t* @param {string}\t\t\tprop\t\t\t\tThe name of the CSS property, eg: top, width, etc.\r\n\t* @param {boolean=}\t\t\t[allowAuto=false]\ttrue = return 'auto' if that is value; false = return 0\r\n\t* @return {(string|number)}\t\t\t\t\t\tUsually used to get an integer value for position (top, left) or size (height, width)\r\n\t*/\r\n,\tcssNum: function ($E, prop, allowAuto) {\r\n\t\tif (!$E.jquery) $E = $($E);\r\n\t\tvar CSS = $.layout.showInvisibly($E)\r\n\t\t,\tp\t= $.curCSS($E[0], prop, true)\r\n\t\t,\tv\t= allowAuto && p==\"auto\" ? p : (parseInt(p, 10) || 0);\r\n\t\t$E.css( CSS ); // RESET\r\n\t\treturn v;\r\n\t}\r\n\r\n,\tborderWidth: function (el, side) {\r\n\t\tif (el.jquery) el = el[0];\r\n\t\tvar b = \"border\"+ side.substr(0,1).toUpperCase() + side.substr(1); // left => Left\r\n\t\treturn $.curCSS(el, b+\"Style\", true) === \"none\" ? 0 : (parseInt($.curCSS(el, b+\"Width\", true), 10) || 0);\r\n\t}\r\n\r\n\t/**\r\n\t* Mouse-tracking utility - FUTURE REFERENCE\r\n\t*\r\n\t* init: if (!window.mouse) {\r\n\t*\t\t\twindow.mouse = { x: 0, y: 0 };\r\n\t*\t\t\t$(document).mousemove( $.layout.trackMouse );\r\n\t*\t\t}\r\n\t*\r\n\t* @param {Object}\t\tevt\r\n\t*\r\n,\ttrackMouse: function (evt) {\r\n\t\twindow.mouse = { x: evt.clientX, y: evt.clientY };\r\n\t}\r\n\t*/\r\n\r\n\t/**\r\n\t* SUBROUTINE for preventPrematureSlideClose option\r\n\t*\r\n\t* @param {Object}\t\tevt\r\n\t* @param {Object=}\t\tel\r\n\t*/\r\n,\tisMouseOverElem: function (evt, el) {\r\n\t\tvar\r\n\t\t\t$E\t= $(el || this)\r\n\t\t,\td\t= $E.offset()\r\n\t\t,\tT\t= d.top\r\n\t\t,\tL\t= d.left\r\n\t\t,\tR\t= L + $E.outerWidth()\r\n\t\t,\tB\t= T + $E.outerHeight()\r\n\t\t,\tx\t= evt.pageX\t// evt.clientX ?\r\n\t\t,\ty\t= evt.pageY\t// evt.clientY ?\r\n\t\t;\r\n\t\t// if X & Y are < 0, probably means is over an open SELECT\r\n\t\treturn ($.layout.browser.msie && x < 0 && y < 0) || ((x >= L && x <= R) && (y >= T && y <= B));\r\n\t}\r\n\r\n\t/**\r\n\t* Message/Logging Utility\r\n\t*\r\n\t* @example $.layout.msg(\"My message\");\t\t\t\t// log text\r\n\t* @example $.layout.msg(\"My message\", true);\t\t// alert text\r\n\t* @example $.layout.msg({ foo: \"bar\" }, \"Title\");\t// log hash-data, with custom title\r\n\t* @example $.layout.msg({ foo: \"bar\" }, true, \"Title\", { sort: false }); -OR-\r\n\t* @example $.layout.msg({ foo: \"bar\" }, \"Title\", { sort: false, display: true }); // alert hash-data\r\n\t*\r\n\t* @param {(Object|string)}\t\t\tinfo\t\t\tString message OR Hash/Array\r\n\t* @param {(Boolean|string|Object)=}\t[popup=false]\tTrue means alert-box - can be skipped\r\n\t* @param {(Object|string)=}\t\t\t[debugTitle=\"\"]\tTitle for Hash data - can be skipped\r\n\t* @param {Object=}\t\t\t\t\t[debutOpts={}]\tExtra options for debug output\r\n\t*/\r\n,\tmsg: function (info, popup, debugTitle, debugOpts) {\r\n\t\tif ($.isPlainObject(info) && window.debugData) {\r\n\t\t\tif (typeof popup === \"string\") {\r\n\t\t\t\tdebugOpts\t= debugTitle;\r\n\t\t\t\tdebugTitle\t= popup;\r\n\t\t\t}\r\n\t\t\telse if (typeof debugTitle === \"object\") {\r\n\t\t\t\tdebugOpts\t= debugTitle;\r\n\t\t\t\tdebugTitle\t= null;\r\n\t\t\t}\r\n\t\t\tvar t = debugTitle || \"log( <object> )\"\r\n\t\t\t,\to = $.extend({ sort: false, returnHTML: false, display: false }, debugOpts);\r\n\t\t\tif (popup === true || o.display)\r\n\t\t\t\tdebugData( info, t, o );\r\n\t\t\telse if (window.console)\r\n\t\t\t\tconsole.log(debugData( info, t, o ));\r\n\t\t}\r\n\t\telse if (popup)\r\n\t\t\talert(info);\r\n\t\telse if (window.console)\r\n\t\t\tconsole.log(info);\r\n\t\telse {\r\n\t\t\tvar id\t= \"#layoutLogger\"\r\n\t\t\t,\t$l = $(id);\r\n\t\t\tif (!$l.length)\r\n\t\t\t\t$l = createLog();\r\n\t\t\t$l.children(\"ul\").append('<li style=\"padding: 4px 10px; margin: 0; border-top: 1px solid #CCC;\">'+ info.replace(/\\</g,\"&lt;\").replace(/\\>/g,\"&gt;\") +'</li>');\r\n\t\t}\r\n\r\n\t\tfunction createLog () {\r\n\t\t\tvar pos = $.support.fixedPosition ? 'fixed' : 'absolute'\r\n\t\t\t,\t$e = $('<div id=\"layoutLogger\" style=\"position: '+ pos +'; top: 5px; z-index: 999999; max-width: 25%; overflow: hidden; border: 1px solid #000; border-radius: 5px; background: #FBFBFB; box-shadow: 0 2px 10px rgba(0,0,0,0.3);\">'\r\n\t\t\t\t+\t'<div style=\"font-size: 13px; font-weight: bold; padding: 5px 10px; background: #F6F6F6; border-radius: 5px 5px 0 0; cursor: move;\">'\r\n\t\t\t\t+\t'<span style=\"float: right; padding-left: 7px; cursor: pointer;\" title=\"Remove Console\" onclick=\"$(this).closest(\\'#layoutLogger\\').remove()\">X</span>Layout console.log</div>'\r\n\t\t\t\t+\t'<ul style=\"font-size: 13px; font-weight: none; list-style: none; margin: 0; padding: 0 0 2px;\"></ul>'\r\n\t\t\t\t+ '</div>'\r\n\t\t\t\t).appendTo(\"body\");\r\n\t\t\t$e.css('left', $(window).width() - $e.outerWidth() - 5)\r\n\t\t\tif ($.ui.draggable) $e.draggable({ handle: ':first-child' });\r\n\t\t\treturn $e;\r\n\t\t};\r\n\t}\r\n\r\n};\r\n\r\nvar\tlang = $.layout.language; // alias used in defaults...\r\n\r\n// DEFAULT OPTIONS - CHANGE IF DESIRED\r\n$.layout.defaults = {\r\n/*\r\n *\tLAYOUT & LAYOUT-CONTAINER OPTIONS\r\n *\t- none of these options are applicable to individual panes\r\n */\r\n\tname:\t\t\t\t\t\t\"\"\t\t\t// Not required, but useful for buttons and used for the state-cookie\r\n,\tcontainerSelector:\t\t\t\"\"\t\t\t// ONLY used when specifying a childOptions - to find container-element that is NOT directly-nested\r\n,\tcontainerClass:\t\t\t\t\"ui-layout-container\" // layout-container element\r\n,\tscrollToBookmarkOnLoad:\t\ttrue\t\t// after creating a layout, scroll to bookmark in URL (.../page.htm#myBookmark)\r\n,\tresizeWithWindow:\t\t\ttrue\t\t// bind thisLayout.resizeAll() to the window.resize event\r\n,\tresizeWithWindowDelay:\t\t200\t\t\t// delay calling resizeAll because makes window resizing very jerky\r\n,\tresizeWithWindowMaxDelay:\t0\t\t\t// 0 = none - force resize every XX ms while window is being resized\r\n,\tonresizeall_start:\t\t\tnull\t\t// CALLBACK when resizeAll() STARTS\t- NOT pane-specific\r\n,\tonresizeall_end:\t\t\tnull\t\t// CALLBACK when resizeAll() ENDS\t- NOT pane-specific\r\n,\tonload_start:\t\t\t\tnull\t\t// CALLBACK when Layout inits - after options initialized, but before elements\r\n,\tonload_end:\t\t\t\t\tnull\t\t// CALLBACK when Layout inits - after EVERYTHING has been initialized\r\n,\tonunload_start:\t\t\t\tnull\t\t// CALLBACK when Layout is destroyed OR onWindowUnload\r\n,\tonunload_end:\t\t\t\tnull\t\t// CALLBACK when Layout is destroyed OR onWindowUnload\r\n,\tautoBindCustomButtons:\t\tfalse\t\t// search for buttons with ui-layout-button class and auto-bind them\r\n,\tinitPanes:\t\t\t\t\ttrue\t\t// false = DO NOT initialize the panes onLoad - will init later\r\n,\tshowErrorMessages:\t\t\ttrue\t\t// enables fatal error messages to warn developers of common errors\r\n,\tshowDebugMessages:\t\t\tfalse\t\t// display console-and-alert debug msgs - IF this Layout version _has_ debugging code!\r\n//\tChanging this zIndex value will cause other zIndex values to automatically change\r\n,\tzIndex:\t\t\t\t\t\tnull\t\t// the PANE zIndex - resizers and masks will be +1\r\n//\tDO NOT CHANGE the zIndex values below unless you clearly understand their relationships\r\n,\tzIndexes: {\t\t\t\t\t\t\t\t// set _default_ z-index values here...\r\n\t\tpane_normal:\t\t\t0\t\t\t// normal z-index for panes\r\n\t,\tcontent_mask:\t\t\t1\t\t\t// applied to overlays used to mask content INSIDE panes during resizing\r\n\t,\tresizer_normal:\t\t\t2\t\t\t// normal z-index for resizer-bars\r\n\t,\tpane_sliding:\t\t\t100\t\t\t// applied to *BOTH* the pane and its resizer when a pane is 'slid open'\r\n\t,\tpane_animate:\t\t\t1000\t\t// applied to the pane when being animated - not applied to the resizer\r\n\t,\tresizer_drag:\t\t\t10000\t\t// applied to the CLONED resizer-bar when being 'dragged'\r\n\t}\r\n/*\r\n *\tPANE DEFAULT SETTINGS\r\n *\t- settings under the 'panes' key become the default settings for *all panes*\r\n *\t- ALL pane-options can also be set specifically for each panes, which will override these 'default values'\r\n */\r\n,\tpanes: { // default options for 'all panes' - will be overridden by 'per-pane settings'\r\n\t\tapplyDemoStyles: \t\tfalse\t\t// NOTE: renamed from applyDefaultStyles for clarity\r\n\t,\tclosable:\t\t\t\ttrue\t\t// pane can open & close\r\n\t,\tresizable:\t\t\t\ttrue\t\t// when open, pane can be resized \r\n\t,\tslidable:\t\t\t\ttrue\t\t// when closed, pane can 'slide open' over other panes - closes on mouse-out\r\n\t,\tinitClosed:\t\t\t\tfalse\t\t// true = init pane as 'closed'\r\n\t,\tinitHidden: \t\t\tfalse \t\t// true = init pane as 'hidden' - no resizer-bar/spacing\r\n\t//\tSELECTORS\r\n\t//,\tpaneSelector:\t\t\t\"\"\t\t\t// MUST be pane-specific - jQuery selector for pane\r\n\t,\tcontentSelector:\t\t\".ui-layout-content\" // INNER div/element to auto-size so only it scrolls, not the entire pane!\r\n\t,\tcontentIgnoreSelector:\t\".ui-layout-ignore\"\t// element(s) to 'ignore' when measuring 'content'\r\n\t,\tfindNestedContent:\t\tfalse\t\t// true = $P.find(contentSelector), false = $P.children(contentSelector)\r\n\t//\tGENERIC ROOT-CLASSES - for auto-generated classNames\r\n\t,\tpaneClass:\t\t\t\t\"ui-layout-pane\"\t// Layout Pane\r\n\t,\tresizerClass:\t\t\t\"ui-layout-resizer\"\t// Resizer Bar\r\n\t,\ttogglerClass:\t\t\t\"ui-layout-toggler\"\t// Toggler Button\r\n\t,\tbuttonClass:\t\t\t\"ui-layout-button\"\t// CUSTOM Buttons\t- eg: '[ui-layout-button]-toggle/-open/-close/-pin'\r\n\t//\tELEMENT SIZE & SPACING\r\n\t//,\tsize:\t\t\t\t\t100\t\t\t// MUST be pane-specific -initial size of pane\r\n\t,\tminSize:\t\t\t\t0\t\t\t// when manually resizing a pane\r\n\t,\tmaxSize:\t\t\t\t0\t\t\t// ditto, 0 = no limit\r\n\t,\tspacing_open:\t\t\t6\t\t\t// space between pane and adjacent panes - when pane is 'open'\r\n\t,\tspacing_closed:\t\t\t6\t\t\t// ditto - when pane is 'closed'\r\n\t,\ttogglerLength_open:\t\t50\t\t\t// Length = WIDTH of toggler button on north/south sides - HEIGHT on east/west sides\r\n\t,\ttogglerLength_closed: \t50\t\t\t// 100% OR -1 means 'full height/width of resizer bar' - 0 means 'hidden'\r\n\t,\ttogglerAlign_open:\t\t\"center\"\t// top/left, bottom/right, center, OR...\r\n\t,\ttogglerAlign_closed:\t\"center\"\t// 1 => nn = offset from top/left, -1 => -nn == offset from bottom/right\r\n\t,\ttogglerTip_open:\t\tlang.Close\t// Toggler tool-tip (title)\r\n\t,\ttogglerTip_closed:\t\tlang.Open\t// ditto\r\n\t,\ttogglerContent_open:\t\"\"\t\t\t// text or HTML to put INSIDE the toggler\r\n\t,\ttogglerContent_closed:\t\"\"\t\t\t// ditto\r\n\t//\tRESIZING OPTIONS\r\n\t,\tresizerDblClickToggle:\ttrue\t\t// \r\n\t,\tautoResize:\t\t\t\ttrue\t\t// IF size is 'auto' or a percentage, then recalc 'pixel size' whenever the layout resizes\r\n\t,\tautoReopen:\t\t\t\ttrue\t\t// IF a pane was auto-closed due to noRoom, reopen it when there is room? False = leave it closed\r\n\t,\tresizerDragOpacity:\t\t1\t\t\t// option for ui.draggable\r\n\t//,\tresizerCursor:\t\t\t\"\"\t\t\t// MUST be pane-specific - cursor when over resizer-bar\r\n\t,\tmaskContents:\t\t\tfalse\t\t// true = add DIV-mask over-or-inside this pane so can 'drag' over IFRAMES\r\n\t,\tmaskObjects:\t\t\tfalse\t\t// true = add IFRAME-mask over-or-inside this pane to cover objects/applets - content-mask will overlay this mask\r\n\t,\tmaskZindex:\t\t\t\tnull\t\t// will override zIndexes.content_mask if specified - not applicable to iframe-panes\r\n\t,\tresizingGrid:\t\t\tfalse\t\t// grid size that the resizers will snap-to during resizing, eg: [20,20]\r\n\t,\tlivePaneResizing:\t\tfalse\t\t// true = LIVE Resizing as resizer is dragged\r\n\t,\tliveContentResizing:\tfalse\t\t// true = re-measure header/footer heights as resizer is dragged\r\n\t,\tliveResizingTolerance:\t1\t\t\t// how many px change before pane resizes, to control performance\r\n\t//\tTIPS & MESSAGES - also see lang object\r\n\t,\tnoRoomToOpenTip:\t\tlang.noRoomToOpenTip\r\n\t,\tresizerTip:\t\t\t\tlang.Resize\t// Resizer tool-tip (title)\r\n\t,\tsliderTip:\t\t\t\tlang.Slide\t// resizer-bar triggers 'sliding' when pane is closed\r\n\t,\tsliderCursor:\t\t\t\"pointer\"\t// cursor when resizer-bar will trigger 'sliding'\r\n\t,\tslideTrigger_open:\t\t\"click\"\t\t// click, dblclick, mouseenter\r\n\t,\tslideTrigger_close:\t\t\"mouseleave\"// click, mouseleave\r\n\t,\tslideDelay_open:\t\t300\t\t\t// applies only for mouseenter event - 0 = instant open\r\n\t,\tslideDelay_close:\t\t300\t\t\t// applies only for mouseleave event (300ms is the minimum!)\r\n\t,\thideTogglerOnSlide:\t\tfalse\t\t// when pane is slid-open, should the toggler show?\r\n\t,\tpreventQuickSlideClose:\t$.layout.browser.webkit // Chrome triggers slideClosed as it is opening\r\n\t,\tpreventPrematureSlideClose: false\t// handle incorrect mouseleave trigger, like when over a SELECT-list in IE\r\n\t//\tHOT-KEYS & MISC\r\n\t,\tshowOverflowOnHover:\tfalse\t\t// will bind allowOverflow() utility to pane.onMouseOver\r\n\t,\tenableCursorHotkey:\t\ttrue\t\t// enabled 'cursor' hotkeys\r\n\t//,\tcustomHotkey:\t\t\t\"\"\t\t\t// MUST be pane-specific - EITHER a charCode OR a character\r\n\t,\tcustomHotkeyModifier:\t\"SHIFT\"\t\t// either 'SHIFT', 'CTRL' or 'CTRL+SHIFT' - NOT 'ALT'\r\n\t//\tPANE ANIMATION\r\n\t//\tNOTE: fxSss_open, fxSss_close & fxSss_size options (eg: fxName_open) are auto-generated if not passed\r\n\t,\tfxName:\t\t\t\t\t\"slide\" \t// ('none' or blank), slide, drop, scale -- only relevant to 'open' & 'close', NOT 'size'\r\n\t,\tfxSpeed:\t\t\t\tnull\t\t// slow, normal, fast, 200, nnn - if passed, will OVERRIDE fxSettings.duration\r\n\t,\tfxSettings:\t\t\t\t{}\t\t\t// can be passed, eg: { easing: \"easeOutBounce\", duration: 1500 }\r\n\t,\tfxOpacityFix:\t\t\ttrue\t\t// tries to fix opacity in IE to restore anti-aliasing after animation\r\n\t,\tanimatePaneSizing:\t\tfalse\t\t// true = animate resizing after dragging resizer-bar OR sizePane() is called\r\n    /*  NOTE: Action-specific FX options are auto-generated from the options above if not specifically set:\r\n\t\tfxName_open:\t\t\t\"slide\"\t\t// 'Open' pane animation\r\n\t\tfnName_close:\t\t\t\"slide\"\t\t// 'Close' pane animation\r\n\t\tfxName_size:\t\t\t\"slide\"\t\t// 'Size' pane animation - when animatePaneSizing = true\r\n\t\tfxSpeed_open:\t\t\tnull\r\n\t\tfxSpeed_close:\t\t\tnull\r\n\t\tfxSpeed_size:\t\t\tnull\r\n\t\tfxSettings_open:\t\t{}\r\n\t\tfxSettings_close:\t\t{}\r\n\t\tfxSettings_size:\t\t{}\r\n\t*/\r\n\t//\tCHILD/NESTED LAYOUTS\r\n\t,\tchildOptions:\t\t\tnull\t\t// Layout-options for nested/child layout - even {} is valid as options\r\n\t,\tinitChildLayout:\t\ttrue\t\t// true = child layout will be created as soon as _this_ layout completes initialization\r\n\t,\tdestroyChildLayout:\t\ttrue\t\t// true = destroy child-layout if this pane is destroyed\r\n\t,\tresizeChildLayout:\t\ttrue\t\t// true = trigger child-layout.resizeAll() when this pane is resized\r\n\t//\tPANE CALLBACKS\r\n\t,\ttriggerEventsOnLoad:\tfalse\t\t// true = trigger onopen OR onclose callbacks when layout initializes\r\n\t,\ttriggerEventsDuringLiveResize: true\t// true = trigger onresize callback REPEATEDLY if livePaneResizing==true\r\n\t,\tonshow_start:\t\t\tnull\t\t// CALLBACK when pane STARTS to Show\t- BEFORE onopen/onhide_start\r\n\t,\tonshow_end:\t\t\t\tnull\t\t// CALLBACK when pane ENDS being Shown\t- AFTER  onopen/onhide_end\r\n\t,\tonhide_start:\t\t\tnull\t\t// CALLBACK when pane STARTS to Close\t- BEFORE onclose_start\r\n\t,\tonhide_end:\t\t\t\tnull\t\t// CALLBACK when pane ENDS being Closed\t- AFTER  onclose_end\r\n\t,\tonopen_start:\t\t\tnull\t\t// CALLBACK when pane STARTS to Open\r\n\t,\tonopen_end:\t\t\t\tnull\t\t// CALLBACK when pane ENDS being Opened\r\n\t,\tonclose_start:\t\t\tnull\t\t// CALLBACK when pane STARTS to Close\r\n\t,\tonclose_end:\t\t\tnull\t\t// CALLBACK when pane ENDS being Closed\r\n\t,\tonresize_start:\t\t\tnull\t\t// CALLBACK when pane STARTS being Resized ***FOR ANY REASON***\r\n\t,\tonresize_end:\t\t\tnull\t\t// CALLBACK when pane ENDS being Resized ***FOR ANY REASON***\r\n\t,\tonsizecontent_start:\tnull\t\t// CALLBACK when sizing of content-element STARTS\r\n\t,\tonsizecontent_end:\t\tnull\t\t// CALLBACK when sizing of content-element ENDS\r\n\t,\tonswap_start:\t\t\tnull\t\t// CALLBACK when pane STARTS to Swap\r\n\t,\tonswap_end:\t\t\t\tnull\t\t// CALLBACK when pane ENDS being Swapped\r\n\t,\tondrag_start:\t\t\tnull\t\t// CALLBACK when pane STARTS being ***MANUALLY*** Resized\r\n\t,\tondrag_end:\t\t\t\tnull\t\t// CALLBACK when pane ENDS being ***MANUALLY*** Resized\r\n\t}\r\n/*\r\n *\tPANE-SPECIFIC SETTINGS\r\n *\t- options listed below MUST be specified per-pane - they CANNOT be set under 'panes'\r\n *\t- all options under the 'panes' key can also be set specifically for any pane\r\n *\t- most options under the 'panes' key apply only to 'border-panes' - NOT the the center-pane\r\n */\r\n,\tnorth: {\r\n\t\tpaneSelector:\t\t\t\".ui-layout-north\"\r\n\t,\tsize:\t\t\t\t\t\"auto\"\t\t// eg: \"auto\", \"30%\", .30, 200\r\n\t,\tresizerCursor:\t\t\t\"n-resize\"\t// custom = url(myCursor.cur)\r\n\t,\tcustomHotkey:\t\t\t\"\"\t\t\t// EITHER a charCode (43) OR a character (\"o\")\r\n\t}\r\n,\tsouth: {\r\n\t\tpaneSelector:\t\t\t\".ui-layout-south\"\r\n\t,\tsize:\t\t\t\t\t\"auto\"\r\n\t,\tresizerCursor:\t\t\t\"s-resize\"\r\n\t,\tcustomHotkey:\t\t\t\"\"\r\n\t}\r\n,\teast: {\r\n\t\tpaneSelector:\t\t\t\".ui-layout-east\"\r\n\t,\tsize:\t\t\t\t\t200\r\n\t,\tresizerCursor:\t\t\t\"e-resize\"\r\n\t,\tcustomHotkey:\t\t\t\"\"\r\n\t}\r\n,\twest: {\r\n\t\tpaneSelector:\t\t\t\".ui-layout-west\"\r\n\t,\tsize:\t\t\t\t\t200\r\n\t,\tresizerCursor:\t\t\t\"w-resize\"\r\n\t,\tcustomHotkey:\t\t\t\"\"\r\n\t}\r\n,\tcenter: {\r\n\t\tpaneSelector:\t\t\t\".ui-layout-center\"\r\n\t,\tminWidth:\t\t\t\t0\r\n\t,\tminHeight:\t\t\t\t0\r\n\t}\r\n};\r\n\r\n$.layout.optionsMap = {\r\n\t// layout/global options - NOT pane-options\r\n\tlayout: (\"stateManagement,effects,zIndexes,\"\r\n\t+\t\"name,zIndex,scrollToBookmarkOnLoad,showErrorMessages,\"\r\n\t+\t\"resizeWithWindow,resizeWithWindowDelay,resizeWithWindowMaxDelay,\"\r\n\t+\t\"onresizeall,onresizeall_start,onresizeall_end,onload,onunload,autoBindCustomButtons\").split(\",\")\r\n//\tborderPanes: [ ALL options that are NOT specified as 'layout' ]\r\n\t// default.panes options that apply to the center-pane (most options apply _only_ to border-panes)\r\n,\tcenter: (\"paneClass,contentSelector,contentIgnoreSelector,findNestedContent,applyDemoStyles,triggerEventsOnLoad,\"\r\n\t+\t\"showOverflowOnHover,maskContents,maskObjects,liveContentResizing,\"\r\n\t+\t\"childOptions,initChildLayout,resizeChildLayout,destroyChildLayout,\"\r\n\t+\t\"onresize,onresize_start,onresize_end,onsizecontent,onsizecontent_start,onsizecontent_end\").split(\",\")\r\n\t// options that MUST be specifically set 'per-pane' - CANNOT set in the panes (defaults) key\r\n,\tnoDefault: (\"paneSelector,resizerCursor,customHotkey\").split(\",\")\r\n};\r\n\r\n/**\r\n * Processes options passed in converts flat-format data into subkey (JSON) format\r\n * In flat-format, subkeys are _currently_ separated with 2 underscores, like north__optName\r\n * Plugins may also call this method so they can transform their own data\r\n *\r\n * @param  {!Object}\thash\tData/options passed by user - may be a single level or nested levels\r\n * @return {Object}\t\t\t\tReturns hash of minWidth & minHeight\r\n */\r\n$.layout.transformData = function (hash) {\r\n\tvar\tjson = { panes: {}, center: {} } // init return object\r\n\t,\tdata, branch, optKey, keys, key, val, i, c;\r\n\r\n\tif (typeof hash !== \"object\") return json; // no options passed\r\n\r\n\t// convert all 'flat-keys' to 'sub-key' format\r\n\tfor (optKey in hash) {\r\n\t\tbranch\t= json;\r\n\t\tdata\t= $.layout.optionsMap.layout;\r\n\t\tval\t\t= hash[ optKey ];\r\n\t\tkeys\t= optKey.split(\"__\"); // eg: west__size or north__fxSettings__duration\r\n\t\tc\t\t= keys.length - 1;\r\n\t\t// convert underscore-delimited to subkeys\r\n\t\tfor (i=0; i <= c; i++) {\r\n\t\t\tkey = keys[i];\r\n\t\t\tif (i === c)\r\n\t\t\t\tbranch[key] = val;\r\n\t\t\telse if (!branch[key])\r\n\t\t\t\tbranch[key] = {}; // create the subkey\r\n\t\t\t// recurse to sub-key for next loop - if not done\r\n\t\t\tbranch = branch[key];\r\n\t\t}\r\n\t}\r\n\r\n\treturn json;\r\n}\r\n\r\n// INTERNAL CONFIG DATA - DO NOT CHANGE THIS!\r\n$.layout.backwardCompatibility = {\r\n\t// data used by renameOldOptions()\r\n\tmap: {\r\n\t//\tOLD Option Name:\t\t\tNEW Option Name\r\n\t\tapplyDefaultStyles:\t\t\t\"applyDemoStyles\"\r\n\t,\tresizeNestedLayout:\t\t\t\"resizeChildLayout\"\r\n\t,\tresizeWhileDragging:\t\t\"livePaneResizing\"\r\n\t,\tresizeContentWhileDragging:\t\"liveContentResizing\"\r\n\t,\ttriggerEventsWhileDragging:\t\"triggerEventsDuringLiveResize\"\r\n\t,\tmaskIframesOnResize:\t\t\"maskContents\"\r\n\t,\tuseStateCookie:\t\t\t\t\"stateManagement.enabled\"\r\n\t,\t\"cookie.autoLoad\":\t\t\t\"stateManagement.autoLoad\"\r\n\t,\t\"cookie.autoSave\":\t\t\t\"stateManagement.autoSave\"\r\n\t,\t\"cookie.keys\":\t\t\t\t\"stateManagement.stateKeys\"\r\n\t,\t\"cookie.name\":\t\t\t\t\"stateManagement.cookie.name\"\r\n\t,\t\"cookie.domain\":\t\t\t\"stateManagement.cookie.domain\"\r\n\t,\t\"cookie.path\":\t\t\t\t\"stateManagement.cookie.path\"\r\n\t,\t\"cookie.expires\":\t\t\t\"stateManagement.cookie.expires\"\r\n\t,\t\"cookie.secure\":\t\t\t\"stateManagement.cookie.secure\"\r\n\t}\r\n\t/**\r\n\t* @param {Object}\topts\r\n\t*/\r\n,\trenameOptions: function (opts) {\r\n\t\tvar map = $.layout.backwardCompatibility.map\r\n\t\t,\toldData, newData, value\r\n\t\t;\r\n\t\tfor (var itemPath in map) {\r\n\t\t\toldData\t= getBranch( itemPath );\r\n\t\t\tvalue\t= oldData.branch[ oldData.key ]\r\n\t\t\tif (value !== undefined) {\r\n\t\t\t\tnewData = getBranch( map[itemPath], true )\r\n\t\t\t\tnewData.branch[ newData.key ] = value;\r\n\t\t\t\tdelete oldData.branch[ oldData.key ];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t* @param {string}\tpath\r\n\t\t* @param {boolean=}\t[create=false]\tCreate path if does not exist\r\n\t\t*/\r\n\t\tfunction getBranch (path, create) {\r\n\t\t\tvar a = path.split(\".\") // split keys into array\r\n\t\t\t,\tc = a.length - 1\r\n\t\t\t,\tD = { branch: opts, key: a[c] } // init branch at top & set key (last item)\r\n\t\t\t,\ti = 0, k, undef;\r\n\t\t\tfor (; i<c; i++) { // skip the last key (data)\r\n\t\t\t\tk = a[i];\r\n\t\t\t\tif (D.branch[ k ] == undefined) { // child-key does not exist\r\n\t\t\t\t\tif (create) {\r\n\t\t\t\t\t\tD.branch = D.branch[ k ] = {}; // create child-branch\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse // can't go any farther\r\n\t\t\t\t\t\tD.branch = {}; // branch is undefined\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tD.branch = D.branch[ k ]; // get child-branch\r\n\t\t\t}\r\n\t\t\treturn D;\r\n\t\t};\r\n\t}\r\n\t/**\r\n\t* @param {Object}\topts\r\n\t*/\r\n,\trenameAllOptions: function (opts) {\r\n\t\tvar ren = $.layout.backwardCompatibility.renameOptions;\r\n\t\t// rename root (layout) options\r\n\t\tren( opts );\r\n\t\t// rename 'defaults' to 'panes'\r\n\t\tif (opts.defaults) {\r\n\t\t\tif (typeof opts.panes !== \"object\")\r\n\t\t\t\topts.panes = {};\r\n\t\t\t$.extend(true, opts.panes, opts.defaults);\r\n\t\t\tdelete opts.defaults;\r\n\t\t}\r\n\t\t// rename options in the the options.panes key\r\n\t\tif (opts.panes) ren( opts.panes );\r\n\t\t// rename options inside *each pane key*, eg: options.west\r\n\t\t$.each($.layout.config.allPanes, function (i, pane) {\r\n\t\t\tif (opts[pane]) ren( opts[pane] );\r\n\t\t});\t\r\n\t\treturn opts;\r\n\t}\r\n};\r\n\r\n\r\n\r\n/*\t============================================================\r\n *\tBEGIN WIDGET: $( selector ).layout( {options} );\r\n *\t============================================================\r\n */\r\n$.fn.layout = function (opts) {\r\n\tvar\r\n\r\n\t// local aliases to global data\r\n\tbrowser\t= $.layout.browser\r\n,\tlang\t= $.layout.language // internal alias\r\n,\t_c\t\t= $.layout.config\r\n\r\n\t// local aliases to utlity methods\r\n,\tcssW\t= $.layout.cssWidth\r\n,\tcssH\t= $.layout.cssHeight\r\n,\telDims\t= $.layout.getElementDimensions\r\n,\telCSS\t= $.layout.getElementCSS\r\n,\tevtObj\t= $.layout.getEventObject\r\n,\tevtPane\t= $.layout.parsePaneName\r\n\r\n/**\r\n * options - populated by initOptions()\r\n */\r\n,\toptions = $.extend(true, {}, $.layout.defaults)\r\n,\teffects\t= options.effects = $.extend(true, {}, $.layout.effects)\r\n\r\n/**\r\n * layout-state object\r\n */\r\n,\tstate = {\r\n\t\t// generate unique ID to use for event.namespace so can unbind only events added by 'this layout'\r\n\t\tid:\t\t\t\"layout\"+ $.now()\t// code uses alias: sID\r\n\t,\tinitialized: false\r\n\t,\tcontainer:\t{} // init all keys\r\n\t,\tnorth:\t\t{}\r\n\t,\tsouth:\t\t{}\r\n\t,\teast:\t\t{}\r\n\t,\twest:\t\t{}\r\n\t,\tcenter:\t\t{}\r\n\t}\r\n\r\n/**\r\n * parent/child-layout pointers\r\n */\r\n//,\thasParentLayout\t= false\t- exists ONLY inside Instance so can be set externally\r\n,\tchildren = {\r\n\t\tnorth:\t\tnull\r\n\t,\tsouth:\t\tnull\r\n\t,\teast:\t\tnull\r\n\t,\twest:\t\tnull\r\n\t,\tcenter:\t\tnull\r\n\t}\r\n\r\n/*\r\n * ###########################\r\n *  INTERNAL HELPER FUNCTIONS\r\n * ###########################\r\n */\r\n\r\n\t/**\r\n\t* Manages all internal timers\r\n\t*/\r\n,\ttimer = {\r\n\t\tdata:\t{}\r\n\t,\tset:\tfunction (s, fn, ms) { timer.clear(s); timer.data[s] = setTimeout(fn, ms); }\r\n\t,\tclear:\tfunction (s) { var t=timer.data; if (t[s]) {clearTimeout(t[s]); delete t[s];} }\r\n\t}\r\n\r\n,\t_log = function (msg, popup) {\r\n\t\t$.layout.msg( options.name +' / '+ msg, (popup && options.showErrorMessages) );\r\n\t}\r\n\r\n\t/**\r\n\t* Executes a Callback function after a trigger event, like resize, open or close\r\n\t*\r\n\t* @param {string}\tevtName\t\t\tName of the layout callback, eg \"onresize_start\"\r\n\t* @param {?string}\tpane\t\t\tThis is passed only so we can pass the 'pane object' to the callback\r\n\t* @param {?boolean}\tskipBoundEvents\tAccepts a function name, OR a comma-delimited array: [0]=function name, [1]=argument\r\n\t*/\r\n,\t_runCallbacks = function (evtName, pane, skipBoundEvents) {\r\n\t\tvar\to\t\t= pane ? options[pane] : options\r\n\t\t\t// names like onopen and onopen_end separate are interchangeable in options...\r\n\t\t,\tlng\t= evtName + (evtName.match(/_/) ? \"\" : \"_end\")\r\n\t\t,\tshrt\t= lng.match(/_end$/) ? lng.substr(0, lng.length - 4) : \"\"\r\n\t\t,\tfn\t\t= o[lng]\r\n\t\t,\tretVal\t= \"NC\" // NC = No Callback\r\n\t\t,\targs\t= []\r\n\t\t;\r\n\t\tif (!fn && shrt)\r\n\t\t\tfn = o[shrt];\r\n\r\n\t\t// first trigger the callback set in the options\r\n\t\tif (fn) {\r\n\t\t\t//try {\r\n\t\t\t\t// convert function name (string) to function object\r\n\t\t\t\tif (isStr( fn )) {\r\n\t\t\t\t\tif (fn.match(/,/)) {\r\n\t\t\t\t\t\t// function name cannot contain a comma, \r\n\t\t\t\t\t\t// so must be a function name AND a parameter to pass\r\n\t\t\t\t\t\targs = fn.split(\",\")\r\n\t\t\t\t\t\t,\tfn = eval(args[0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse // just the name of an external function?\r\n\t\t\t\t\t\tfn = eval(fn);\r\n\t\t\t\t}\r\n\t\t\t\t// execute the callback, if exists\r\n\t\t\t\tif ($.isFunction( fn )) {\r\n\t\t\t\t\tif (args.length)\r\n\t\t\t\t\t\tretVal = fn(args[1]); // pass the argument parsed from 'list'\r\n\t\t\t\t\telse if (pane && $Ps[pane])\r\n\t\t\t\t\t\t// pass data: pane-name, pane-element, pane-state, pane-options, and layout-name\r\n\t\t\t\t\t\tretVal = fn( pane, $Ps[pane], state[pane], options[pane], options.name );\r\n\t\t\t\t\telse // must be a layout/container callback - pass suitable info\r\n\t\t\t\t\t\tretVal = fn( Instance, state, options, options.name );\r\n\t\t\t\t}\r\n\t\t\t//}\r\n\t\t\t//catch (ex) {}\r\n\t\t}\r\n\r\n\t\t// trigger additional events bound directly to the pane\r\n\t\tif (!skipBoundEvents && retVal !== false) {\r\n\t\t\tif (pane) { // PANE events can be bound to each pane-elements\r\n\t\t\t\t$Ps[pane].triggerHandler('layoutpane'+ lng, [ pane, $Ps[pane], state[pane], options[pane], options.name ]);\r\n\t\t\t\tif (shrt)\r\n\t\t\t\t\t$Ps[pane].triggerHandler('layoutpane'+ shrt, [ pane, $Ps[pane], state[pane], options[pane], options.name ]);\r\n\t\t\t}\r\n\t\t\telse // LAYOUT events can be bound to the container-element\r\n\t\t\t\t$N.triggerHandler('layout'+ lng, [ pane, $Ps[pane], state[pane], options[pane], options.name ]);\r\n\t\t}\r\n\r\n\t\t// ALWAYS resizeChildLayout after a resize event - even during initialization\r\n\t\tif (evtName === \"onresize_end\" || evtName === \"onsizecontent_end\")\r\n\t\t\tresizeChildLayout(pane); \r\n\r\n\t\treturn retVal;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* cure iframe display issues in IE & other browsers\r\n\t*/\r\n,\t_fixIframe = function (pane) {\r\n\t\tif (browser.mozilla) return; // skip FireFox - it auto-refreshes iframes onShow\r\n\t\tvar $P = $Ps[pane];\r\n\t\t// if the 'pane' is an iframe, do it\r\n\t\tif (state[pane].tagName === \"IFRAME\")\r\n\t\t\t$P.css(_c.hidden).css(_c.visible); \r\n\t\telse // ditto for any iframes INSIDE the pane\r\n\t\t\t$P.find('IFRAME').css(_c.hidden).css(_c.visible);\r\n\t}\r\n\r\n\t/**\r\n\t* @param  {string}\t\tpane\t\tCan accept ONLY a 'pane' (east, west, etc)\r\n\t* @param  {number=}\t\touterSize\t(optional) Can pass a width, allowing calculations BEFORE element is resized\r\n\t* @return {number}\t\tReturns the innerHeight/Width of el by subtracting padding and borders\r\n\t*/\r\n,\tcssSize = function (pane, outerSize) {\r\n\t\tvar fn = _c[pane].dir==\"horz\" ? cssH : cssW;\r\n\t\treturn fn($Ps[pane], outerSize);\r\n\t}\r\n\r\n\t/**\r\n\t* @param  {string}\t\tpane\t\tCan accept ONLY a 'pane' (east, west, etc)\r\n\t* @return {Object}\t\tReturns hash of minWidth & minHeight\r\n\t*/\r\n,\tcssMinDims = function (pane) {\r\n\t\t// minWidth/Height means CSS width/height = 1px\r\n\t\tvar\t$P\t= $Ps[pane]\r\n\t\t,\tdir\t= _c[pane].dir\r\n\t\t,\td\t= {\r\n\t\t\t\tminWidth:\t1001 - cssW($P, 1000)\r\n\t\t\t,\tminHeight:\t1001 - cssH($P, 1000)\r\n\t\t\t}\r\n\t\t;\r\n\t\tif (dir === \"horz\") d.minSize = d.minHeight;\r\n\t\tif (dir === \"vert\") d.minSize = d.minWidth;\r\n\t\treturn d;\r\n\t}\r\n\r\n\t// TODO: see if these methods can be made more useful...\r\n\t// TODO: *maybe* return cssW/H from these so caller can use this info\r\n\r\n\t/**\r\n\t* @param {(string|!Object)}\t\tel\r\n\t* @param {number=}\t\t\t\touterWidth\r\n\t* @param {boolean=}\t\t\t\t[autoHide=false]\r\n\t*/\r\n,\tsetOuterWidth = function (el, outerWidth, autoHide) {\r\n\t\tvar $E = el, w;\r\n\t\tif (isStr(el)) $E = $Ps[el]; // west\r\n\t\telse if (!el.jquery) $E = $(el);\r\n\t\tw = cssW($E, outerWidth);\r\n\t\t$E.css({ width: w });\r\n\t\tif (w > 0) {\r\n\t\t\tif (autoHide && $E.data('autoHidden') && $E.innerHeight() > 0) {\r\n\t\t\t\t$E.show().data('autoHidden', false);\r\n\t\t\t\tif (!browser.mozilla) // FireFox refreshes iframes - IE does not\r\n\t\t\t\t\t// make hidden, then visible to 'refresh' display after animation\r\n\t\t\t\t\t$E.css(_c.hidden).css(_c.visible);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (autoHide && !$E.data('autoHidden'))\r\n\t\t\t$E.hide().data('autoHidden', true);\r\n\t}\r\n\r\n\t/**\r\n\t* @param {(string|!Object)}\t\tel\r\n\t* @param {number=}\t\t\t\touterHeight\r\n\t* @param {boolean=}\t\t\t\t[autoHide=false]\r\n\t*/\r\n,\tsetOuterHeight = function (el, outerHeight, autoHide) {\r\n\t\tvar $E = el, h;\r\n\t\tif (isStr(el)) $E = $Ps[el]; // west\r\n\t\telse if (!el.jquery) $E = $(el);\r\n\t\th = cssH($E, outerHeight);\r\n\t\t$E.css({ height: h, visibility: \"visible\" }); // may have been 'hidden' by sizeContent\r\n\t\tif (h > 0 && $E.innerWidth() > 0) {\r\n\t\t\tif (autoHide && $E.data('autoHidden')) {\r\n\t\t\t\t$E.show().data('autoHidden', false);\r\n\t\t\t\tif (!browser.mozilla) // FireFox refreshes iframes - IE does not\r\n\t\t\t\t\t$E.css(_c.hidden).css(_c.visible);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (autoHide && !$E.data('autoHidden'))\r\n\t\t\t$E.hide().data('autoHidden', true);\r\n\t}\r\n\r\n\t/**\r\n\t* @param {(string|!Object)}\t\tel\r\n\t* @param {number=}\t\t\t\touterSize\r\n\t* @param {boolean=}\t\t\t\t[autoHide=false]\r\n\t*/\r\n,\tsetOuterSize = function (el, outerSize, autoHide) {\r\n\t\tif (_c[pane].dir==\"horz\") // pane = north or south\r\n\t\t\tsetOuterHeight(el, outerSize, autoHide);\r\n\t\telse // pane = east or west\r\n\t\t\tsetOuterWidth(el, outerSize, autoHide);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Converts any 'size' params to a pixel/integer size, if not already\r\n\t* If 'auto' or a decimal/percentage is passed as 'size', a pixel-size is calculated\r\n\t*\r\n\t/**\r\n\t* @param  {string}\t\t\t\tpane\r\n\t* @param  {(string|number)=}\tsize\r\n\t* @param  {string=}\t\t\t\t[dir]\r\n\t* @return {number}\r\n\t*/\r\n,\t_parseSize = function (pane, size, dir) {\r\n\t\tif (!dir) dir = _c[pane].dir;\r\n\r\n\t\tif (isStr(size) && size.match(/%/))\r\n\t\t\tsize = (size === '100%') ? -1 : parseInt(size, 10) / 100; // convert % to decimal\r\n\r\n\t\tif (size === 0)\r\n\t\t\treturn 0;\r\n\t\telse if (size >= 1)\r\n\t\t\treturn parseInt(size, 10);\r\n\r\n\t\tvar o = options, avail = 0;\r\n\t\tif (dir==\"horz\") // north or south or center.minHeight\r\n\t\t\tavail = sC.innerHeight - ($Ps.north ? o.north.spacing_open : 0) - ($Ps.south ? o.south.spacing_open : 0);\r\n\t\telse if (dir==\"vert\") // east or west or center.minWidth\r\n\t\t\tavail = sC.innerWidth - ($Ps.west ? o.west.spacing_open : 0) - ($Ps.east ? o.east.spacing_open : 0);\r\n\r\n\t\tif (size === -1) // -1 == 100%\r\n\t\t\treturn avail;\r\n\t\telse if (size > 0) // percentage, eg: .25\r\n\t\t\treturn round(avail * size);\r\n\t\telse if (pane==\"center\")\r\n\t\t\treturn 0;\r\n\t\telse { // size < 0 || size=='auto' || size==Missing || size==Invalid\r\n\t\t\t// auto-size the pane\r\n\t\t\tvar\tdim\t= (dir === \"horz\" ? \"height\" : \"width\")\r\n\t\t\t,\t$P\t= $Ps[pane]\r\n\t\t\t,\t$C\t= dim === 'height' ? $Cs[pane] : false\r\n\t\t\t,\tvis\t= $.layout.showInvisibly($P) // show pane invisibly if hidden\r\n\t\t\t,\tszP\t= $P.css(dim) // SAVE current pane size\r\n\t\t\t,\tszC\t= $C ? $C.css(dim) : 0 // SAVE current content size\r\n\t\t\t;\r\n\t\t\t$P.css(dim, \"auto\");\r\n\t\t\tif ($C) $C.css(dim, \"auto\");\r\n\t\t\tsize = (dim === \"height\") ? $P.outerHeight() : $P.outerWidth(); // MEASURE\r\n\t\t\t$P.css(dim, szP).css(vis); // RESET size & visibility\r\n\t\t\tif ($C) $C.css(dim, szC);\r\n\t\t\treturn size;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Calculates current 'size' (outer-width or outer-height) of a border-pane - optionally with 'pane-spacing' added\r\n\t*\r\n\t* @param  {(string|!Object)}\tpane\r\n\t* @param  {boolean=}\t\t\t[inclSpace=false]\r\n\t* @return {number}\t\t\t\tReturns EITHER Width for east/west panes OR Height for north/south panes - adjusted for boxModel & browser\r\n\t*/\r\n,\tgetPaneSize = function (pane, inclSpace) {\r\n\t\tvar \r\n\t\t\t$P\t= $Ps[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\toSp\t= (inclSpace ? o.spacing_open : 0)\r\n\t\t,\tcSp\t= (inclSpace ? o.spacing_closed : 0)\r\n\t\t;\r\n\t\tif (!$P || s.isHidden)\r\n\t\t\treturn 0;\r\n\t\telse if (s.isClosed || (s.isSliding && inclSpace))\r\n\t\t\treturn cSp;\r\n\t\telse if (_c[pane].dir === \"horz\")\r\n\t\t\treturn $P.outerHeight() + oSp;\r\n\t\telse // dir === \"vert\"\r\n\t\t\treturn $P.outerWidth() + oSp;\r\n\t}\r\n\r\n\t/**\r\n\t* Calculate min/max pane dimensions and limits for resizing\r\n\t*\r\n\t* @param  {string}\t\tpane\r\n\t* @param  {boolean=}\t[slide=false]\r\n\t*/\r\n,\tsetSizeLimits = function (pane, slide) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar \r\n\t\t\to\t\t\t\t= options[pane]\r\n\t\t,\ts\t\t\t\t= state[pane]\r\n\t\t,\tc\t\t\t\t= _c[pane]\r\n\t\t,\tdir\t\t\t\t= c.dir\r\n\t\t,\tside\t\t\t= c.side.toLowerCase()\r\n\t\t,\ttype\t\t\t= c.sizeType.toLowerCase()\r\n\t\t,\tisSliding\t\t= (slide != undefined ? slide : s.isSliding) // only open() passes 'slide' param\r\n\t\t,\t$P\t\t\t\t= $Ps[pane]\r\n\t\t,\tpaneSpacing\t\t= o.spacing_open\r\n\t\t//\tmeasure the pane on the *opposite side* from this pane\r\n\t\t,\taltPane\t\t\t= _c.oppositeEdge[pane]\r\n\t\t,\taltS\t\t\t= state[altPane]\r\n\t\t,\t$altP\t\t\t= $Ps[altPane]\r\n\t\t,\taltPaneSize\t\t= (!$altP || altS.isVisible===false || altS.isSliding ? 0 : (dir==\"horz\" ? $altP.outerHeight() : $altP.outerWidth()))\r\n\t\t,\taltPaneSpacing\t= ((!$altP || altS.isHidden ? 0 : options[altPane][ altS.isClosed !== false ? \"spacing_closed\" : \"spacing_open\" ]) || 0)\r\n\t\t//\tlimitSize prevents this pane from 'overlapping' opposite pane\r\n\t\t,\tcontainerSize\t= (dir==\"horz\" ? sC.innerHeight : sC.innerWidth)\r\n\t\t,\tminCenterDims\t= cssMinDims(\"center\")\r\n\t\t,\tminCenterSize\t= dir==\"horz\" ? max(options.center.minHeight, minCenterDims.minHeight) : max(options.center.minWidth, minCenterDims.minWidth)\r\n\t\t//\tif pane is 'sliding', then ignore center and alt-pane sizes - because 'overlays' them\r\n\t\t,\tlimitSize\t\t= (containerSize - paneSpacing - (isSliding ? 0 : (_parseSize(\"center\", minCenterSize, dir) + altPaneSize + altPaneSpacing)))\r\n\t\t,\tminSize\t\t\t= s.minSize = max( _parseSize(pane, o.minSize), cssMinDims(pane).minSize )\r\n\t\t,\tmaxSize\t\t\t= s.maxSize = min( (o.maxSize ? _parseSize(pane, o.maxSize) : 100000), limitSize )\r\n\t\t,\tr\t\t\t\t= s.resizerPosition = {} // used to set resizing limits\r\n\t\t,\ttop\t\t\t\t= sC.insetTop\r\n\t\t,\tleft\t\t\t= sC.insetLeft\r\n\t\t,\tW\t\t\t\t= sC.innerWidth\r\n\t\t,\tH\t\t\t\t= sC.innerHeight\r\n\t\t,\trW\t\t\t\t= o.spacing_open // subtract resizer-width to get top/left position for south/east\r\n\t\t;\r\n\t\tswitch (pane) {\r\n\t\t\tcase \"north\":\tr.min = top + minSize;\r\n\t\t\t\t\t\t\tr.max = top + maxSize;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\tcase \"west\":\tr.min = left + minSize;\r\n\t\t\t\t\t\t\tr.max = left + maxSize;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\tcase \"south\":\tr.min = top + H - maxSize - rW;\r\n\t\t\t\t\t\t\tr.max = top + H - minSize - rW;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\tcase \"east\":\tr.min = left + W - maxSize - rW;\r\n\t\t\t\t\t\t\tr.max = left + W - minSize - rW;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t* Returns data for setting the size/position of center pane. Also used to set Height for east/west panes\r\n\t*\r\n\t* @return JSON  Returns a hash of all dimensions: top, bottom, left, right, (outer) width and (outer) height\r\n\t*/\r\n,\tcalcNewCenterPaneDims = function () {\r\n\t\tvar d = {\r\n\t\t\ttop:\tgetPaneSize(\"north\", true) // true = include 'spacing' value for pane\r\n\t\t,\tbottom:\tgetPaneSize(\"south\", true)\r\n\t\t,\tleft:\tgetPaneSize(\"west\", true)\r\n\t\t,\tright:\tgetPaneSize(\"east\", true)\r\n\t\t,\twidth:\t0\r\n\t\t,\theight:\t0\r\n\t\t};\r\n\r\n\t\t// NOTE: sC = state.container\r\n\t\t// calc center-pane outer dimensions\r\n\t\td.width\t\t= sC.innerWidth - d.left - d.right;  // outerWidth\r\n\t\td.height\t= sC.innerHeight - d.bottom - d.top; // outerHeight\r\n\t\t// add the 'container border/padding' to get final positions relative to the container\r\n\t\td.top\t\t+= sC.insetTop;\r\n\t\td.bottom\t+= sC.insetBottom;\r\n\t\td.left\t\t+= sC.insetLeft;\r\n\t\td.right\t\t+= sC.insetRight;\r\n\r\n\t\treturn d;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* @param {!Object}\t\tel\r\n\t* @param {boolean=}\t\t[allStates=false]\r\n\t*/\r\n,\tgetHoverClasses = function (el, allStates) {\r\n\t\tvar\r\n\t\t\t$El\t\t= $(el)\r\n\t\t,\ttype\t= $El.data(\"layoutRole\")\r\n\t\t,\tpane\t= $El.data(\"layoutEdge\")\r\n\t\t,\to\t\t= options[pane]\r\n\t\t,\troot\t= o[type +\"Class\"]\r\n\t\t,\t_pane\t= \"-\"+ pane // eg: \"-west\"\r\n\t\t,\t_open\t= \"-open\"\r\n\t\t,\t_closed\t= \"-closed\"\r\n\t\t,\t_slide\t= \"-sliding\"\r\n\t\t,\t_hover\t= \"-hover \" // NOTE the trailing space\r\n\t\t,\t_state\t= $El.hasClass(root+_closed) ? _closed : _open\r\n\t\t,\t_alt\t= _state === _closed ? _open : _closed\r\n\t\t,\tclasses = (root+_hover) + (root+_pane+_hover) + (root+_state+_hover) + (root+_pane+_state+_hover)\r\n\t\t;\r\n\t\tif (allStates) // when 'removing' classes, also remove alternate-state classes\r\n\t\t\tclasses += (root+_alt+_hover) + (root+_pane+_alt+_hover);\r\n\r\n\t\tif (type==\"resizer\" && $El.hasClass(root+_slide))\r\n\t\t\tclasses += (root+_slide+_hover) + (root+_pane+_slide+_hover);\r\n\r\n\t\treturn $.trim(classes);\r\n\t}\r\n,\taddHover\t= function (evt, el) {\r\n\t\tvar $E = $(el || this);\r\n\t\tif (evt && $E.data(\"layoutRole\") === \"toggler\")\r\n\t\t\tevt.stopPropagation(); // prevent triggering 'slide' on Resizer-bar\r\n\t\t$E.addClass( getHoverClasses($E) );\r\n\t}\r\n,\tremoveHover\t= function (evt, el) {\r\n\t\tvar $E = $(el || this);\r\n\t\t$E.removeClass( getHoverClasses($E, true) );\r\n\t}\r\n\r\n,\tonResizerEnter\t= function (evt) { // ALSO called by toggler.mouseenter\r\n\t\tif ($.fn.disableSelection)\r\n\t\t\t$(\"body\").disableSelection();\r\n\t}\r\n,\tonResizerLeave\t= function (evt, el) {\r\n\t\tvar\r\n\t\t\te = el || this // el is only passed when called by the timer\r\n\t\t,\tpane = $(e).data(\"layoutEdge\")\r\n\t\t,\tname = pane +\"ResizerLeave\"\r\n\t\t;\r\n\t\ttimer.clear(pane+\"_openSlider\"); // cancel slideOpen timer, if set\r\n\t\ttimer.clear(name); // cancel enableSelection timer - may re/set below\r\n\t\t// this method calls itself on a timer because it needs to allow\r\n\t\t// enough time for dragging to kick-in and set the isResizing flag\r\n\t\t// dragging has a 100ms delay set, so this delay must be >100\r\n\t\tif (!el) // 1st call - mouseleave event\r\n\t\t\ttimer.set(name, function(){ onResizerLeave(evt, e); }, 200);\r\n\t\t// if user is resizing, then dragStop will enableSelection(), so can skip it here\r\n\t\telse if (!state[pane].isResizing && $.fn.enableSelection) // 2nd call - by timer\r\n\t\t\t$(\"body\").enableSelection();\r\n\t}\r\n\r\n/*\r\n * ###########################\r\n *   INITIALIZATION METHODS\r\n * ###########################\r\n */\r\n\r\n\t/**\r\n\t* Initialize the layout - called automatically whenever an instance of layout is created\r\n\t*\r\n\t* @see  none - triggered onInit\r\n\t* @return  mixed\ttrue = fully initialized | false = panes not initialized (yet) | 'cancel' = abort\r\n\t*/\r\n,\t_create = function () {\r\n\t\t// initialize config/options\r\n\t\tinitOptions();\r\n\t\tvar o = options;\r\n\r\n\t\t// TEMP state so isInitialized returns true during init process\r\n\t\tstate.creatingLayout = true;\r\n\r\n\t\t// init plugins for this layout, if there are any (eg: stateManagement)\r\n\t\trunPluginCallbacks( Instance, $.layout.onCreate );\r\n\r\n\t\t// options & state have been initialized, so now run beforeLoad callback\r\n\t\t// onload will CANCEL layout creation if it returns false\r\n\t\tif (false === _runCallbacks(\"onload_start\"))\r\n\t\t\treturn 'cancel';\r\n\r\n\t\t// initialize the container element\r\n\t\t_initContainer();\r\n\r\n\t\t// bind hotkey function - keyDown - if required\r\n\t\tinitHotkeys();\r\n\r\n\t\t// bind window.onunload\r\n\t\t$(window).bind(\"unload.\"+ sID, unload);\r\n\r\n\t\t// init plugins for this layout, if there are any (eg: customButtons)\r\n\t\trunPluginCallbacks( Instance, $.layout.onLoad );\r\n\r\n\t\t// if layout elements are hidden, then layout WILL NOT complete initialization!\r\n\t\t// initLayoutElements will set initialized=true and run the onload callback IF successful\r\n\t\tif (o.initPanes) _initLayoutElements();\r\n\r\n\t\tdelete state.creatingLayout;\r\n\r\n\t\treturn state.initialized;\r\n\t}\r\n\r\n\t/**\r\n\t* Initialize the layout IF not already\r\n\t*\r\n\t* @see  All methods in Instance run this test\r\n\t* @return  boolean\ttrue = layoutElements have been initialized | false = panes are not initialized (yet)\r\n\t*/\r\n,\tisInitialized = function () {\r\n\t\tif (state.initialized || state.creatingLayout) return true;\t// already initialized\r\n\t\telse return _initLayoutElements();\t// try to init panes NOW\r\n\t}\r\n\r\n\t/**\r\n\t* Initialize the layout - called automatically whenever an instance of layout is created\r\n\t*\r\n\t* @see  _create() & isInitialized\r\n\t* @return  An object pointer to the instance created\r\n\t*/\r\n,\t_initLayoutElements = function (retry) {\r\n\t\t// initialize config/options\r\n\t\tvar o = options;\r\n\r\n\t\t// CANNOT init panes inside a hidden container!\r\n\t\tif (!$N.is(\":visible\")) {\r\n\t\t\t// handle Chrome bug where popup window 'has no height'\r\n\t\t\t// if layout is BODY element, try again in 50ms\r\n\t\t\t// SEE: http://layout.jquery-dev.net/samples/test_popup_window.html\r\n\t\t\tif ( !retry && browser.webkit && $N[0].tagName === \"BODY\" )\r\n\t\t\t\tsetTimeout(function(){ _initLayoutElements(true); }, 50);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// a center pane is required, so make sure it exists\r\n\t\tif (!getPane(\"center\").length) {\r\n\t\t\tif (options.showErrorMessages)\r\n\t\t\t\t_log( lang.errCenterPaneMissing, true );\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// TEMP state so isInitialized returns true during init process\r\n\t\tstate.creatingLayout = true;\r\n\r\n\t\t// update Container dims\r\n\t\t$.extend(sC, elDims( $N ));\r\n\r\n\t\t// initialize all layout elements\r\n\t\tinitPanes();\t// size & position panes - calls initHandles() - which calls initResizable()\r\n\r\n\t\tif (o.scrollToBookmarkOnLoad) {\r\n\t\t\tvar l = self.location;\r\n\t\t\tif (l.hash) l.replace( l.hash ); // scrollTo Bookmark\r\n\t\t}\r\n\r\n\t\t// check to see if this layout 'nested' inside a pane\r\n\t\tif (Instance.hasParentLayout)\r\n\t\t\to.resizeWithWindow = false;\r\n\t\t// bind resizeAll() for 'this layout instance' to window.resize event\r\n\t\telse if (o.resizeWithWindow)\r\n\t\t\t$(window).bind(\"resize.\"+ sID, windowResize);\r\n\r\n\t\tdelete state.creatingLayout;\r\n\t\tstate.initialized = true;\r\n\r\n\t\t// init plugins for this layout, if there are any\r\n\t\trunPluginCallbacks( Instance, $.layout.onReady );\r\n\r\n\t\t// now run the onload callback, if exists\r\n\t\t_runCallbacks(\"onload_end\");\r\n\r\n\t\treturn true; // elements initialized successfully\r\n\t}\r\n\r\n\t/**\r\n\t* Initialize nested layouts - called when _initLayoutElements completes\r\n\t*\r\n\t* NOT CURRENTLY USED\r\n\t*\r\n\t* @see _initLayoutElements\r\n\t* @return  An object pointer to the instance created\r\n\t*/\r\n,\t_initChildLayouts = function () {\r\n\t\t$.each(_c.allPanes, function (idx, pane) {\r\n\t\t\tif (options[pane].initChildLayout)\r\n\t\t\t\tcreateChildLayout( pane );\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* Initialize nested layouts for a specific pane - can optionally pass layout-options\r\n\t*\r\n\t* @see _initChildLayouts\r\n\t* @param {string}\tpane\t\tThe pane being opened, ie: north, south, east, or west\r\n\t* @param {Object=}\t[opts]\t\tLayout-options - if passed, will OVERRRIDE options[pane].childOptions\r\n\t* @return  An object pointer to the layout instance created - or null\r\n\t*/\r\n,\tcreateChildLayout = function (evt_or_pane, opts) {\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$P\t= $Ps[pane]\r\n\t\t,\tC\t= children\r\n\t\t;\r\n\t\tif ($P) {\r\n\t\t\tvar\t$C\t= $Cs[pane]\r\n\t\t\t,\to\t= opts || options[pane].childOptions\r\n\t\t\t,\td\t= \"layout\"\r\n\t\t\t//\tdetermine which element is supposed to be the 'child container'\r\n\t\t\t//\tif pane has a 'containerSelector' OR a 'content-div', use those instead of the pane\r\n\t\t\t,\t$Cont = o.containerSelector ? $P.find( o.containerSelector ) : ($C || $P)\r\n\t\t\t,\tcontainerFound = $Cont.length\r\n\t\t\t//\tsee if a child-layout ALREADY exists on this element\r\n\t\t\t,\tchild = containerFound ? (C[pane] = $Cont.data(d) || null) : null\r\n\t\t\t;\r\n\t\t\t// if no layout exists, but childOptions are set, try to create the layout now\r\n\t\t\tif (!child && containerFound && o)\r\n\t\t\t\tchild = C[pane] = $Cont.eq(0).layout(o) || null;\r\n\t\t\tif (child)\r\n\t\t\t\tchild.hasParentLayout = true;\t// set parent-flag in child\r\n\t\t}\r\n\t\tInstance[pane].child = C[pane]; // ALWAYS set pane-object pointer, even if null\r\n\t}\r\n\r\n,\twindowResize = function () {\r\n\t\tvar delay = Number(options.resizeWithWindowDelay);\r\n\t\tif (delay < 10) delay = 100; // MUST have a delay!\r\n\t\t// resizing uses a delay-loop because the resize event fires repeatly - except in FF, but delay anyway\r\n\t\ttimer.clear(\"winResize\"); // if already running\r\n\t\ttimer.set(\"winResize\", function(){\r\n\t\t\ttimer.clear(\"winResize\");\r\n\t\t\ttimer.clear(\"winResizeRepeater\");\r\n\t\t\tvar dims = elDims( $N );\r\n\t\t\t// only trigger resizeAll() if container has changed size\r\n\t\t\tif (dims.innerWidth !== sC.innerWidth || dims.innerHeight !== sC.innerHeight)\r\n\t\t\t\tresizeAll();\r\n\t\t}, delay);\r\n\t\t// ALSO set fixed-delay timer, if not already running\r\n\t\tif (!timer.data[\"winResizeRepeater\"]) setWindowResizeRepeater();\r\n\t}\r\n\r\n,\tsetWindowResizeRepeater = function () {\r\n\t\tvar delay = Number(options.resizeWithWindowMaxDelay);\r\n\t\tif (delay > 0)\r\n\t\t\ttimer.set(\"winResizeRepeater\", function(){ setWindowResizeRepeater(); resizeAll(); }, delay);\r\n\t}\r\n\r\n,\tunload = function () {\r\n\t\tvar o = options;\r\n\r\n\t\t_runCallbacks(\"onunload_start\");\r\n\r\n\t\t// trigger plugin callabacks for this layout (eg: stateManagement)\r\n\t\trunPluginCallbacks( Instance, $.layout.onUnload );\r\n\r\n\t\t_runCallbacks(\"onunload_end\");\r\n\t}\r\n\r\n\t/**\r\n\t* Validate and initialize container CSS and events\r\n\t*\r\n\t* @see  _create()\r\n\t*/\r\n,\t_initContainer = function () {\r\n\t\tvar\r\n\t\t\tN\t\t= $N[0]\r\n\t\t,\ttag\t\t= sC.tagName = N.tagName\r\n\t\t,\tid\t\t= sC.id = N.id\r\n\t\t,\tcls\t\t= sC.className = N.className\r\n\t\t,\to\t\t= options\r\n\t\t,\tname\t= o.name\r\n\t\t,\tfullPage= (tag === \"BODY\")\r\n\t\t,\tprops\t= \"overflow,position,margin,padding,border\"\r\n\t\t,\tcss\t\t= \"layoutCSS\"\r\n\t\t,\tCSS\t\t= {}\r\n\t\t,\thid\t\t= \"hidden\" // used A LOT!\r\n\t\t//\tsee if this container is a 'pane' inside an outer-layout\r\n\t\t,\tparent\t= $N.data(\"parentLayout\")\t// parent-layout Instance\r\n\t\t,\tpane\t= $N.data(\"layoutEdge\")\t\t// pane-name in parent-layout\r\n\t\t,\tisChild\t= parent && pane\r\n\t\t;\r\n\t\t// sC -> state.container\r\n\t\tsC.selector = $N.selector.split(\".slice\")[0];\r\n\t\tsC.ref\t\t= (o.name ? o.name +' layout / ' : '') + tag + (id ? \"#\"+id : cls ? '.['+cls+']' : ''); // used in messages\r\n\r\n\t\t$N\t.data({\r\n\t\t\t\tlayout: Instance\r\n\t\t\t,\tlayoutContainer: sID // FLAG to indicate this is a layout-container - contains unique internal ID\r\n\t\t\t})\r\n\t\t\t.addClass(o.containerClass)\r\n\t\t;\r\n\t\tvar layoutMethods = {\r\n\t\t\t\tdestroy:\t''\r\n\t\t\t,\tinitPanes:\t''\r\n\t\t\t,\tresizeAll:\t'resizeAll'\r\n\t\t\t,\tresize:\t\t'resizeAll'\r\n\t\t\t}\r\n\t\t,\tname;\r\n\t\t// loop hash and bind all methods - include layoutID namespacing\r\n\t\tfor (name in layoutMethods) {\r\n\t\t\t$N.bind(\"layout\"+ name.toLowerCase() +\".\"+ sID, Instance[ layoutMethods[name] || name ]);\r\n\t\t}\r\n\r\n\t\t// if this container is another layout's 'pane', then set child/parent pointers\r\n\t\tif (isChild) {\r\n\t\t\t// update parent flag\r\n\t\t\tInstance.hasParentLayout = true;\r\n\t\t\t// set pointers to THIS child-layout (Instance) in parent-layout\r\n\t\t\t// NOTE: parent.PANE.child is an ALIAS to parent.children.PANE\r\n\t\t\tparent[pane].child = parent.children[pane] = $N.data(\"layout\");\r\n\t\t}\r\n\r\n\t\t// SAVE original container CSS for use in destroy()\r\n\t\tif (!$N.data(css)) {\r\n\t\t\t// handle props like overflow different for BODY & HTML - has 'system default' values\r\n\t\t\tif (fullPage) {\r\n\t\t\t\tCSS = $.extend( elCSS($N, props), {\r\n\t\t\t\t\theight:\t\t$N.css(\"height\")\r\n\t\t\t\t,\toverflow:\t$N.css(\"overflow\")\r\n\t\t\t\t,\toverflowX:\t$N.css(\"overflowX\")\r\n\t\t\t\t,\toverflowY:\t$N.css(\"overflowY\")\r\n\t\t\t\t});\r\n\t\t\t\t// ALSO SAVE <HTML> CSS\r\n\t\t\t\tvar $H = $(\"html\");\r\n\t\t\t\t$H.data(css, {\r\n\t\t\t\t\theight:\t\t\"auto\" // FF would return a fixed px-size!\r\n\t\t\t\t,\toverflow:\t$H.css(\"overflow\")\r\n\t\t\t\t,\toverflowX:\t$H.css(\"overflowX\")\r\n\t\t\t\t,\toverflowY:\t$H.css(\"overflowY\")\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse // handle props normally for non-body elements\r\n\t\t\t\tCSS = elCSS($N, props+\",top,bottom,left,right,width,height,overflow,overflowX,overflowY\");\r\n\r\n\t\t\t$N.data(css, CSS);\r\n\t\t}\r\n\r\n\t\ttry { // format html/body if this is a full page layout\r\n\t\t\tif (fullPage) {\r\n\t\t\t\t$(\"html\").css({\r\n\t\t\t\t\theight:\t\t\"100%\"\r\n\t\t\t\t,\toverflow:\thid\r\n\t\t\t\t,\toverflowX:\thid\r\n\t\t\t\t,\toverflowY:\thid\r\n\t\t\t\t});\r\n\t\t\t\t$(\"body\").css({\r\n\t\t\t\t\tposition:\t\"relative\"\r\n\t\t\t\t,\theight:\t\t\"100%\"\r\n\t\t\t\t,\toverflow:\thid\r\n\t\t\t\t,\toverflowX:\thid\r\n\t\t\t\t,\toverflowY:\thid\r\n\t\t\t\t,\tmargin:\t\t0\r\n\t\t\t\t,\tpadding:\t0\t\t// TODO: test whether body-padding could be handled?\r\n\t\t\t\t,\tborder:\t\t\"none\"\t// a body-border creates problems because it cannot be measured!\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// set current layout-container dimensions\r\n\t\t\t\t$.extend(sC, elDims( $N ));\r\n\t\t\t}\r\n\t\t\telse { // set required CSS for overflow and position\r\n\t\t\t\t// ENSURE container will not 'scroll'\r\n\t\t\t\tCSS = { overflow: hid, overflowX: hid, overflowY: hid }\r\n\t\t\t\tvar\r\n\t\t\t\t\tp = $N.css(\"position\")\r\n\t\t\t\t,\th = $N.css(\"height\")\r\n\t\t\t\t;\r\n\t\t\t\t// if this is a NESTED layout, then container/outer-pane ALREADY has position and height\r\n\t\t\t\tif (!isChild) {\r\n\t\t\t\t\tif (!p || !p.match(/fixed|absolute|relative/))\r\n\t\t\t\t\t\tCSS.position = \"relative\"; // container MUST have a 'position'\r\n\t\t\t\t\t/*\r\n\t\t\t\t\tif (!h || h==\"auto\")\r\n\t\t\t\t\t\tCSS.height = \"100%\"; // container MUST have a 'height'\r\n\t\t\t\t\t*/\r\n\t\t\t\t}\r\n\t\t\t\t$N.css( CSS );\r\n\r\n\t\t\t\t// set current layout-container dimensions\r\n\t\t\t\tif ( $N.is(\":visible\") ) {\r\n\t\t\t\t\t$.extend(sC, elDims( $N ));\r\n\t\t\t\t\tif (o.showErrorMessages && sC.innerHeight < 1)\r\n\t\t\t\t\t\t_log( lang.errContainerHeight.replace(/CONTAINER/, sC.ref), true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (ex) {}\r\n\t}\r\n\r\n\t/**\r\n\t* Bind layout hotkeys - if options enabled\r\n\t*\r\n\t* @see  _create() and addPane()\r\n\t* @param {string=}\t[panes=\"\"]\tThe edge(s) to process\r\n\t*/\r\n,\tinitHotkeys = function (panes) {\r\n\t\tpanes = panes ? panes.split(\",\") : _c.borderPanes;\r\n\t\t// bind keyDown to capture hotkeys, if option enabled for ANY pane\r\n\t\t$.each(panes, function (i, pane) {\r\n\t\t\tvar o = options[pane];\r\n\t\t\tif (o.enableCursorHotkey || o.customHotkey) {\r\n\t\t\t\t$(document).bind(\"keydown.\"+ sID, keyDown); // only need to bind this ONCE\r\n\t\t\t\treturn false; // BREAK - binding was done\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* Build final OPTIONS data\r\n\t*\r\n\t* @see  _create()\r\n\t*/\r\n,\tinitOptions = function () {\r\n\t\tvar data, d, pane, key, val, i, c, o;\r\n\r\n\t\t// reprocess user's layout-options to have correct options sub-key structure\r\n\t\topts = $.layout.transformData( opts ); // panes = default subkey\r\n\r\n\t\t// auto-rename old options for backward compatibility\r\n\t\topts = $.layout.backwardCompatibility.renameAllOptions( opts );\r\n\r\n\t\t// if user-options has 'panes' key (pane-defaults), process it...\r\n\t\tif (!$.isEmptyObject(opts.panes)) {\r\n\t\t\t// REMOVE any pane-defaults that MUST be set per-pane\r\n\t\t\tdata = $.layout.optionsMap.noDefault;\r\n\t\t\tfor (i=0, c=data.length; i<c; i++) {\r\n\t\t\t\tkey = data[i];\r\n\t\t\t\tdelete opts.panes[key]; // OK if does not exist\r\n\t\t\t}\r\n\t\t\t// REMOVE any layout-options specified under opts.panes\r\n\t\t\tdata = $.layout.optionsMap.layout;\r\n\t\t\tfor (i=0, c=data.length; i<c; i++) {\r\n\t\t\t\tkey = data[i];\r\n\t\t\t\tdelete opts.panes[key]; // OK if does not exist\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// MOVE any NON-layout-options to opts.panes\r\n\t\tdata = $.layout.optionsMap.layout;\r\n\t\tvar rootKeys = $.layout.config.optionRootKeys;\r\n\t\tfor (key in opts) {\r\n\t\t\tval = opts[key];\r\n\t\t\tif ($.inArray(key, rootKeys) < 0 && $.inArray(key, data) < 0) {\r\n\t\t\t\tif (!opts.panes[key])\r\n\t\t\t\t\topts.panes[key] = $.isPlainObject(val) ? $.extend(true, {}, val) : val;\r\n\t\t\t\tdelete opts[key]\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// START by updating ALL options from opts\r\n\t\t$.extend(true, options, opts);\r\n\r\n\t\t// CREATE final options (and config) for EACH pane\r\n\t\t$.each(_c.allPanes, function (i, pane) {\r\n\r\n\t\t\t// apply 'pane-defaults' to CONFIG.[PANE]\r\n\t\t\t_c[pane] = $.extend( true, {}, _c.panes, _c[pane] );\r\n\r\n\t\t\td = options.panes;\r\n\t\t\to = options[pane];\r\n\r\n\t\t\t// center-pane uses SOME keys in defaults.panes branch\r\n\t\t\tif (pane === 'center') {\r\n\t\t\t\t// ONLY copy keys from opts.panes listed in: $.layout.optionsMap.center\r\n\t\t\t\tdata = $.layout.optionsMap.center;\t\t// list of 'center-pane keys'\r\n\t\t\t\tfor (i=0, c=data.length; i<c; i++) {\t// loop the list...\r\n\t\t\t\t\tkey = data[i];\r\n\t\t\t\t\t// only need to use pane-default if pane-specific value not set\r\n\t\t\t\t\tif (!opts.center[key] && (opts.panes[key] || !o[key]))\r\n\t\t\t\t\t\to[key] = d[key]; // pane-default\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// border-panes use ALL keys in defaults.panes branch\r\n\t\t\t\to = options[pane] = $.extend({}, d, o); // re-apply pane-specific opts AFTER pane-defaults\r\n\t\t\t\tcreateFxOptions( pane );\r\n\t\t\t\t// ensure all border-pane-specific base-classes exist\r\n\t\t\t\tif (!o.resizerClass)\to.resizerClass\t= \"ui-layout-resizer\";\r\n\t\t\t\tif (!o.togglerClass)\to.togglerClass\t= \"ui-layout-toggler\";\r\n\t\t\t}\r\n\t\t\t// ensure we have base pane-class (ALL panes)\r\n\t\t\tif (!o.paneClass) o.paneClass = \"ui-layout-pane\";\r\n\t\t});\r\n\r\n\t\t// update options.zIndexes if a zIndex-option specified\r\n\t\tvar zo\t= opts.zIndex\r\n\t\t,\tz\t= options.zIndexes;\r\n\t\tif (zo > 0) {\r\n\t\t\tz.pane_normal\t\t= zo;\r\n\t\t\tz.content_mask\t\t= max(zo+1, z.content_mask);\t// MIN = +1\r\n\t\t\tz.resizer_normal\t= max(zo+2, z.resizer_normal);\t// MIN = +2\r\n\t\t}\r\n\r\n\t\tfunction createFxOptions ( pane ) {\r\n\t\t\tvar\to = options[pane]\r\n\t\t\t,\td = options.panes;\r\n\t\t\t// ensure fxSettings key to avoid errors\r\n\t\t\tif (!o.fxSettings) o.fxSettings = {};\r\n\t\t\tif (!d.fxSettings) d.fxSettings = {};\r\n\r\n\t\t\t$.each([\"_open\",\"_close\",\"_size\"], function (i,n) { \r\n\t\t\t\tvar\r\n\t\t\t\t\tsName\t\t= \"fxName\"+ n\r\n\t\t\t\t,\tsSpeed\t\t= \"fxSpeed\"+ n\r\n\t\t\t\t,\tsSettings\t= \"fxSettings\"+ n\r\n\t\t\t\t\t// recalculate fxName according to specificity rules\r\n\t\t\t\t,\tfxName = o[sName] =\r\n\t\t\t\t\t\to[sName]\t// options.west.fxName_open\r\n\t\t\t\t\t||\td[sName]\t// options.panes.fxName_open\r\n\t\t\t\t\t||\to.fxName\t// options.west.fxName\r\n\t\t\t\t\t||\td.fxName\t// options.panes.fxName\r\n\t\t\t\t\t||\t\"none\"\t\t// MEANS $.layout.defaults.panes.fxName == \"\" || false || null || 0\r\n\t\t\t\t;\r\n\t\t\t\t// validate fxName to ensure is valid effect - MUST have effect-config data in options.effects\r\n\t\t\t\tif (fxName === \"none\" || !$.effects || !$.effects[fxName] || !options.effects[fxName])\r\n\t\t\t\t\tfxName = o[sName] = \"none\"; // effect not loaded OR unrecognized fxName\r\n\r\n\t\t\t\t// set vars for effects subkeys to simplify logic\r\n\t\t\t\tvar\tfx\t\t= options.effects[fxName] || {}\t// effects.slide\r\n\t\t\t\t,\tfx_all\t= fx.all\t|| null\t\t\t\t// effects.slide.all\r\n\t\t\t\t,\tfx_pane\t= fx[pane]\t|| null\t\t\t\t// effects.slide.west\r\n\t\t\t\t;\r\n\t\t\t\t// create fxSpeed[_open|_close|_size]\r\n\t\t\t\to[sSpeed] =\r\n\t\t\t\t\to[sSpeed]\t\t\t\t// options.west.fxSpeed_open\r\n\t\t\t\t||\td[sSpeed]\t\t\t\t// options.west.fxSpeed_open\r\n\t\t\t\t||\to.fxSpeed\t\t\t\t// options.west.fxSpeed\r\n\t\t\t\t||\td.fxSpeed\t\t\t\t// options.panes.fxSpeed\r\n\t\t\t\t||\tnull\t\t\t\t\t// DEFAULT - let fxSetting.duration control speed\r\n\t\t\t\t;\r\n\t\t\t\t// create fxSettings[_open|_close|_size]\r\n\t\t\t\to[sSettings] = $.extend(\r\n\t\t\t\t\t{}\r\n\t\t\t\t,\tfx_all\t\t\t\t\t// effects.slide.all\r\n\t\t\t\t,\tfx_pane\t\t\t\t\t// effects.slide.west\r\n\t\t\t\t,\td.fxSettings\t\t\t// options.panes.fxSettings\r\n\t\t\t\t,\to.fxSettings\t\t\t// options.west.fxSettings\r\n\t\t\t\t,\td[sSettings]\t\t\t// options.panes.fxSettings_open\r\n\t\t\t\t,\to[sSettings]\t\t\t// options.west.fxSettings_open\r\n\t\t\t\t);\r\n\t\t\t});\r\n\r\n\t\t\t// DONE creating action-specific-settings for this pane,\r\n\t\t\t// so DELETE generic options - are no longer meaningful\r\n\t\t\tdelete o.fxName;\r\n\t\t\tdelete o.fxSpeed;\r\n\t\t\tdelete o.fxSettings;\r\n\t\t}\r\n\r\n\t\t// DELETE 'panes' key now that we are done - values were copied to EACH pane\r\n\t\tdelete options.panes;\r\n\t}\r\n\r\n\t/**\r\n\t* Initialize module objects, styling, size and position for all panes\r\n\t*\r\n\t* @see  _initElements()\r\n\t* @param {string}\tpane\t\tThe pane to process\r\n\t*/\r\n,\tgetPane = function (pane) {\r\n\t\tvar sel = options[pane].paneSelector\r\n\t\tif (sel.substr(0,1)===\"#\") // ID selector\r\n\t\t\t// NOTE: elements selected 'by ID' DO NOT have to be 'children'\r\n\t\t\treturn $N.find(sel).eq(0);\r\n\t\telse { // class or other selector\r\n\t\t\tvar $P = $N.children(sel).eq(0);\r\n\t\t\t// look for the pane nested inside a 'form' element\r\n\t\t\treturn $P.length ? $P : $N.children(\"form:first\").children(sel).eq(0);\r\n\t\t}\r\n\t}\r\n\r\n,\tinitPanes = function () {\r\n\t\t// NOTE: do north & south FIRST so we can measure their height - do center LAST\r\n\t\t$.each(_c.allPanes, function (idx, pane) {\r\n\t\t\taddPane( pane, true );\r\n\t\t});\r\n\r\n\t\t// init the pane-handles NOW in case we have to hide or close the pane below\r\n\t\tinitHandles();\r\n\r\n\t\t// now that all panes have been initialized and initially-sized,\r\n\t\t// make sure there is really enough space available for each pane\r\n\t\t$.each(_c.borderPanes, function (i, pane) {\r\n\t\t\tif ($Ps[pane] && state[pane].isVisible) { // pane is OPEN\r\n\t\t\t\tsetSizeLimits(pane);\r\n\t\t\t\tmakePaneFit(pane); // pane may be Closed, Hidden or Resized by makePaneFit()\r\n\t\t\t}\r\n\t\t});\r\n\t\t// size center-pane AGAIN in case we 'closed' a border-pane in loop above\r\n\t\tsizeMidPanes(\"center\");\r\n\r\n\t\t//\tChrome/Webkit sometimes fires callbacks BEFORE it completes resizing!\r\n\t\t//\tBefore RC30.3, there was a 10ms delay here, but that caused layout \r\n\t\t//\tto load asynchrously, which is BAD, so try skipping delay for now\r\n\r\n\t\t// process pane contents and callbacks, and init/resize child-layout if exists\r\n\t\t$.each(_c.allPanes, function (i, pane) {\r\n\t\t\tvar o = options[pane];\r\n\t\t\tif ($Ps[pane]) {\r\n\t\t\t\tif (state[pane].isVisible) { // pane is OPEN\r\n\t\t\t\t\tsizeContent(pane);\r\n\t\t\t\t\t// trigger pane.onResize if triggerEventsOnLoad = true\r\n\t\t\t\t\tif (o.triggerEventsOnLoad)\r\n\t\t\t\t\t\t_runCallbacks(\"onresize_end\", pane);\r\n\t\t\t\telse // automatic if onresize called, otherwise call it specifically\r\n\t\t\t\t\t// resize child - IF inner-layout already exists (created before this layout)\r\n\t\t\t\t\tresizeChildLayout(pane);\r\n\t\t\t\t}\r\n\t\t\t\t// init childLayout - even if pane is not visible\r\n\t\t\t\tif (o.initChildLayout && o.childOptions)\r\n\t\t\t\t\tcreateChildLayout(pane);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* Add a pane to the layout - subroutine of initPanes()\r\n\t*\r\n\t* @see  initPanes()\r\n\t* @param {string}\tpane\t\t\tThe pane to process\r\n\t* @param {boolean=}\t[force=false]\tSize content after init\r\n\t*/\r\n,\taddPane = function (pane, force) {\r\n\t\tif (!force && !isInitialized()) return;\r\n\t\tvar\r\n\t\t\to\t\t= options[pane]\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\tc\t\t= _c[pane]\r\n\t\t,\tfx\t\t= s.fx\r\n\t\t,\tdir\t\t= c.dir\r\n\t\t,\tspacing\t= o.spacing_open || 0\r\n\t\t,\tisCenter = (pane === \"center\")\r\n\t\t,\tCSS\t\t= {}\r\n\t\t,\t$P\t\t= $Ps[pane]\r\n\t\t,\tsize, minSize, maxSize\r\n\t\t;\r\n\t\t// if pane-pointer already exists, remove the old one first\r\n\t\tif ($P)\r\n\t\t\tremovePane( pane, false, true, false );\r\n\t\telse\r\n\t\t\t$Cs[pane] = false; // init\r\n\r\n\t\t$P = $Ps[pane] = getPane(pane);\r\n\t\tif (!$P.length) {\r\n\t\t\t$Ps[pane] = false; // logic\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// SAVE original Pane CSS\r\n\t\tif (!$P.data(\"layoutCSS\")) {\r\n\t\t\tvar props = \"position,top,left,bottom,right,width,height,overflow,zIndex,display,backgroundColor,padding,margin,border\";\r\n\t\t\t$P.data(\"layoutCSS\", elCSS($P, props));\r\n\t\t}\r\n\r\n\t\t// create alias for pane data in Instance - initHandles will add more\r\n\t\tInstance[pane] = { name: pane, pane: $Ps[pane], content: $Cs[pane], options: options[pane], state: state[pane], child: children[pane] };\r\n\r\n\t\t// add classes, attributes & events\r\n\t\t$P\t.data({\r\n\t\t\t\tparentLayout:\tInstance\t\t// pointer to Layout Instance\r\n\t\t\t,\tlayoutPane:\t\tInstance[pane]\t// NEW pointer to pane-alias-object\r\n\t\t\t,\tlayoutEdge:\t\tpane\r\n\t\t\t,\tlayoutRole:\t\t\"pane\"\r\n\t\t\t})\r\n\t\t\t.css(c.cssReq).css(\"zIndex\", options.zIndexes.pane_normal)\r\n\t\t\t.css(o.applyDemoStyles ? c.cssDemo : {}) // demo styles\r\n\t\t\t.addClass( o.paneClass +\" \"+ o.paneClass+\"-\"+pane ) // default = \"ui-layout-pane ui-layout-pane-west\" - may be a dupe of 'paneSelector'\r\n\t\t\t.bind(\"mouseenter.\"+ sID, addHover )\r\n\t\t\t.bind(\"mouseleave.\"+ sID, removeHover )\r\n\t\t\t;\r\n\t\tvar paneMethods = {\r\n\t\t\t\thide:\t\t\t\t''\r\n\t\t\t,\tshow:\t\t\t\t''\r\n\t\t\t,\ttoggle:\t\t\t\t''\r\n\t\t\t,\tclose:\t\t\t\t''\r\n\t\t\t,\topen:\t\t\t\t''\r\n\t\t\t,\tslideOpen:\t\t\t''\r\n\t\t\t,\tslideClose:\t\t\t''\r\n\t\t\t,\tslideToggle:\t\t''\r\n\t\t\t,\tsize:\t\t\t\t'manualSizePane'\r\n\t\t\t,\tsizePane:\t\t\t'manualSizePane'\r\n\t\t\t,\tsizeContent:\t\t''\r\n\t\t\t,\tsizeHandles:\t\t''\r\n\t\t\t,\tenableClosable:\t\t''\r\n\t\t\t,\tdisableClosable:\t''\r\n\t\t\t,\tenableSlideable:\t''\r\n\t\t\t,\tdisableSlideable:\t''\r\n\t\t\t,\tenableResizable:\t''\r\n\t\t\t,\tdisableResizable:\t''\r\n\t\t\t,\tswapPanes:\t\t\t'swapPanes'\r\n\t\t\t,\tswap:\t\t\t\t'swapPanes'\r\n\t\t\t,\tmove:\t\t\t\t'swapPanes'\r\n\t\t\t,\tremovePane:\t\t\t'removePane'\r\n\t\t\t,\tremove:\t\t\t\t'removePane'\r\n\t\t\t,\tcreateChildLayout:\t''\r\n\t\t\t,\tresizeChildLayout:\t''\r\n\t\t\t,\tresizeAll:\t\t\t'resizeAll'\r\n\t\t\t,\tresizeLayout:\t\t'resizeAll'\r\n\t\t\t}\r\n\t\t,\tname;\r\n\t\t// loop hash and bind all methods - include layoutID namespacing\r\n\t\tfor (name in paneMethods) {\r\n\t\t\t$P.bind(\"layoutpane\"+ name.toLowerCase() +\".\"+ sID, Instance[ paneMethods[name] || name ]);\r\n\t\t}\r\n\r\n\t\t// see if this pane has a 'scrolling-content element'\r\n\t\tinitContent(pane, false); // false = do NOT sizeContent() - called later\r\n\r\n\t\tif (!isCenter) {\r\n\t\t\t// call _parseSize AFTER applying pane classes & styles - but before making visible (if hidden)\r\n\t\t\t// if o.size is auto or not valid, then MEASURE the pane and use that as its 'size'\r\n\t\t\tsize\t= s.size = _parseSize(pane, o.size);\r\n\t\t\tminSize\t= _parseSize(pane,o.minSize) || 1;\r\n\t\t\tmaxSize\t= _parseSize(pane,o.maxSize) || 100000;\r\n\t\t\tif (size > 0) size = max(min(size, maxSize), minSize);\r\n\r\n\t\t\t// state for border-panes\r\n\t\t\ts.isClosed  = false; // true = pane is closed\r\n\t\t\ts.isSliding = false; // true = pane is currently open by 'sliding' over adjacent panes\r\n\t\t\ts.isResizing= false; // true = pane is in process of being resized\r\n\t\t\ts.isHidden\t= false; // true = pane is hidden - no spacing, resizer or toggler is visible!\r\n\r\n\t\t\t// array for 'pin buttons' whose classNames are auto-updated on pane-open/-close\r\n\t\t\tif (!s.pins) s.pins = [];\r\n\t\t}\r\n\t\t//\tstates common to ALL panes\r\n\t\ts.tagName\t= $P[0].tagName;\r\n\t\ts.edge\t\t= pane;\t\t// useful if pane is (or about to be) 'swapped' - easy find out where it is (or is going)\r\n\t\ts.noRoom\t= false;\t// true = pane 'automatically' hidden due to insufficient room - will unhide automatically\r\n\t\ts.isVisible\t= true;\t\t// false = pane is invisible - closed OR hidden - simplify logic\r\n\r\n\t\t// set css-position to account for container borders & padding\r\n\t\tswitch (pane) {\r\n\t\t\tcase \"north\": \tCSS.top \t= sC.insetTop;\r\n\t\t\t\t\t\t\tCSS.left \t= sC.insetLeft;\r\n\t\t\t\t\t\t\tCSS.right\t= sC.insetRight;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\tcase \"south\": \tCSS.bottom\t= sC.insetBottom;\r\n\t\t\t\t\t\t\tCSS.left \t= sC.insetLeft;\r\n\t\t\t\t\t\t\tCSS.right \t= sC.insetRight;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\tcase \"west\": \tCSS.left \t= sC.insetLeft; // top, bottom & height set by sizeMidPanes()\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\tcase \"east\": \tCSS.right \t= sC.insetRight; // ditto\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\tcase \"center\":\t// top, left, width & height set by sizeMidPanes()\r\n\t\t}\r\n\r\n\t\tif (dir === \"horz\") // north or south pane\r\n\t\t\tCSS.height = cssH($P, size);\r\n\t\telse if (dir === \"vert\") // east or west pane\r\n\t\t\tCSS.width = cssW($P, size);\r\n\t\t//else if (isCenter) {}\r\n\r\n\t\t$P.css(CSS); // apply size -- top, bottom & height will be set by sizeMidPanes\r\n\t\tif (dir != \"horz\") sizeMidPanes(pane, true); // true = skipCallback\r\n\r\n\t\t// close or hide the pane if specified in settings\r\n\t\tif (o.initClosed && o.closable && !o.initHidden)\r\n\t\t\tclose(pane, true, true); // true, true = force, noAnimation\r\n\t\telse if (o.initHidden || o.initClosed)\r\n\t\t\thide(pane); // will be completely invisible - no resizer or spacing\r\n\t\telse if (!s.noRoom)\r\n\t\t\t// make the pane visible - in case was initially hidden\r\n\t\t\t$P.css(\"display\",\"block\");\r\n\t\t// ELSE setAsOpen() - called later by initHandles()\r\n\r\n\t\t// RESET visibility now - pane will appear IF display:block\r\n\t\t$P.css(\"visibility\",\"visible\");\r\n\r\n\t\t// check option for auto-handling of pop-ups & drop-downs\r\n\t\tif (o.showOverflowOnHover)\r\n\t\t\t$P.hover( allowOverflow, resetOverflow );\r\n\r\n\t\t// if manually adding a pane AFTER layout initialization, then...\r\n\t\tif (state.initialized) {\r\n\t\t\tinitHandles( pane );\r\n\t\t\tinitHotkeys( pane );\r\n\t\t\tresizeAll(); // will sizeContent if pane is visible\r\n\t\t\tif (s.isVisible) { // pane is OPEN\r\n\t\t\t\tif (o.triggerEventsOnLoad)\r\n\t\t\t\t\t_runCallbacks(\"onresize_end\", pane);\r\n\t\t\t\telse // automatic if onresize called, otherwise call it specifically\r\n\t\t\t\t\t// resize child - IF inner-layout already exists (created before this layout)\r\n\t\t\t\t\tresizeChildLayout(pane); // a previously existing childLayout\r\n\t\t\t}\r\n\t\t\tif (o.initChildLayout && o.childOptions)\r\n\t\t\t\tcreateChildLayout(pane);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Initialize module objects, styling, size and position for all resize bars and toggler buttons\r\n\t*\r\n\t* @see  _create()\r\n\t* @param {string=}\t[panes=\"\"]\tThe edge(s) to process\r\n\t*/\r\n,\tinitHandles = function (panes) {\r\n\t\tpanes = panes ? panes.split(\",\") : _c.borderPanes;\r\n\r\n\t\t// create toggler DIVs for each pane, and set object pointers for them, eg: $R.north = north toggler DIV\r\n\t\t$.each(panes, function (i, pane) {\r\n\t\t\tvar $P\t\t= $Ps[pane];\r\n\t\t\t$Rs[pane]\t= false; // INIT\r\n\t\t\t$Ts[pane]\t= false;\r\n\t\t\tif (!$P) return; // pane does not exist - skip\r\n\r\n\t\t\tvar \r\n\t\t\t\to\t\t= options[pane]\r\n\t\t\t,\ts\t\t= state[pane]\r\n\t\t\t,\tc\t\t= _c[pane]\r\n\t\t\t,\trClass\t= o.resizerClass\r\n\t\t\t,\ttClass\t= o.togglerClass\r\n\t\t\t,\tside\t= c.side.toLowerCase()\r\n\t\t\t,\tspacing\t= (s.isVisible ? o.spacing_open : o.spacing_closed)\r\n\t\t\t,\t_pane\t= \"-\"+ pane // used for classNames\r\n\t\t\t,\t_state\t= (s.isVisible ? \"-open\" : \"-closed\") // used for classNames\r\n\t\t\t,\tI\t\t= Instance[pane]\r\n\t\t\t\t// INIT RESIZER BAR\r\n\t\t\t,\t$R\t\t= I.resizer = $Rs[pane] = $(\"<div></div>\")\r\n\t\t\t\t// INIT TOGGLER BUTTON\r\n\t\t\t,\t$T\t\t= I.toggler = (o.closable ? $Ts[pane] = $(\"<div></div>\") : false)\r\n\t\t\t;\r\n\r\n\t\t\t//if (s.isVisible && o.resizable) ... handled by initResizable\r\n\t\t\tif (!s.isVisible && o.slidable)\r\n\t\t\t\t$R.attr(\"title\", o.sliderTip).css(\"cursor\", o.sliderCursor);\r\n\r\n\t\t\t$R\t// if paneSelector is an ID, then create a matching ID for the resizer, eg: \"#paneLeft\" => \"paneLeft-resizer\"\r\n\t\t\t\t.attr(\"id\", (o.paneSelector.substr(0,1)==\"#\" ? o.paneSelector.substr(1) + \"-resizer\" : \"\"))\r\n\t\t\t\t.data({\r\n\t\t\t\t\tparentLayout:\tInstance\r\n\t\t\t\t,\tlayoutPane:\t\tInstance[pane]\t// NEW pointer to pane-alias-object\r\n\t\t\t\t,\tlayoutEdge:\t\tpane\r\n\t\t\t\t,\tlayoutRole:\t\t\"resizer\"\r\n\t\t\t\t})\r\n\t\t\t\t.css(_c.resizers.cssReq).css(\"zIndex\", options.zIndexes.resizer_normal)\r\n\t\t\t\t.css(o.applyDemoStyles ? _c.resizers.cssDemo : {}) // add demo styles\r\n\t\t\t\t.addClass(rClass +\" \"+ rClass+_pane)\r\n\t\t\t\t.hover(addHover, removeHover) // ALWAYS add hover-classes, even if resizing is not enabled - handle with CSS instead\r\n\t\t\t\t.hover(onResizerEnter, onResizerLeave) // ALWAYS NEED resizer.mouseleave to balance toggler.mouseenter\r\n\t\t\t\t.appendTo($N) // append DIV to container\r\n\t\t\t;\r\n\r\n\t\t\tif ($T) {\r\n\t\t\t\t$T\t// if paneSelector is an ID, then create a matching ID for the resizer, eg: \"#paneLeft\" => \"#paneLeft-toggler\"\r\n\t\t\t\t\t.attr(\"id\", (o.paneSelector.substr(0,1)==\"#\" ? o.paneSelector.substr(1) + \"-toggler\" : \"\"))\r\n\t\t\t\t\t.data({\r\n\t\t\t\t\t\tparentLayout:\tInstance\r\n\t\t\t\t\t,\tlayoutPane:\t\tInstance[pane]\t// NEW pointer to pane-alias-object\r\n\t\t\t\t\t,\tlayoutEdge:\t\tpane\r\n\t\t\t\t\t,\tlayoutRole:\t\t\"toggler\"\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.css(_c.togglers.cssReq) // add base/required styles\r\n\t\t\t\t\t.css(o.applyDemoStyles ? _c.togglers.cssDemo : {}) // add demo styles\r\n\t\t\t\t\t.addClass(tClass +\" \"+ tClass+_pane)\r\n\t\t\t\t\t.hover(addHover, removeHover) // ALWAYS add hover-classes, even if toggling is not enabled - handle with CSS instead\r\n\t\t\t\t\t.bind(\"mouseenter\", onResizerEnter) // NEED toggler.mouseenter because mouseenter MAY NOT fire on resizer\r\n\t\t\t\t\t.appendTo($R) // append SPAN to resizer DIV\r\n\t\t\t\t;\r\n\t\t\t\t// ADD INNER-SPANS TO TOGGLER\r\n\t\t\t\tif (o.togglerContent_open) // ui-layout-open\r\n\t\t\t\t\t$(\"<span>\"+ o.togglerContent_open +\"</span>\")\r\n\t\t\t\t\t\t.data({\r\n\t\t\t\t\t\t\tlayoutEdge:\t\tpane\r\n\t\t\t\t\t\t,\tlayoutRole:\t\t\"togglerContent\"\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.data(\"layoutRole\", \"togglerContent\")\r\n\t\t\t\t\t\t.data(\"layoutEdge\", pane)\r\n\t\t\t\t\t\t.addClass(\"content content-open\")\r\n\t\t\t\t\t\t.css(\"display\",\"none\")\r\n\t\t\t\t\t\t.appendTo( $T )\r\n\t\t\t\t\t\t//.hover( addHover, removeHover ) // use ui-layout-toggler-west-hover .content-open instead!\r\n\t\t\t\t\t;\r\n\t\t\t\tif (o.togglerContent_closed) // ui-layout-closed\r\n\t\t\t\t\t$(\"<span>\"+ o.togglerContent_closed +\"</span>\")\r\n\t\t\t\t\t\t.data({\r\n\t\t\t\t\t\t\tlayoutEdge:\t\tpane\r\n\t\t\t\t\t\t,\tlayoutRole:\t\t\"togglerContent\"\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.addClass(\"content content-closed\")\r\n\t\t\t\t\t\t.css(\"display\",\"none\")\r\n\t\t\t\t\t\t.appendTo( $T )\r\n\t\t\t\t\t\t//.hover( addHover, removeHover ) // use ui-layout-toggler-west-hover .content-closed instead!\r\n\t\t\t\t\t;\r\n\t\t\t\t// ADD TOGGLER.click/.hover\r\n\t\t\t\tenableClosable(pane);\r\n\t\t\t}\r\n\r\n\t\t\t// add Draggable events\r\n\t\t\tinitResizable(pane);\r\n\r\n\t\t\t// ADD CLASSNAMES & SLIDE-BINDINGS - eg: class=\"resizer resizer-west resizer-open\"\r\n\t\t\tif (s.isVisible)\r\n\t\t\t\tsetAsOpen(pane);\t// onOpen will be called, but NOT onResize\r\n\t\t\telse {\r\n\t\t\t\tsetAsClosed(pane);\t// onClose will be called\r\n\t\t\t\tbindStartSlidingEvent(pane, true); // will enable events IF option is set\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t\t// SET ALL HANDLE DIMENSIONS\r\n\t\tsizeHandles();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Initialize scrolling ui-layout-content div - if exists\r\n\t*\r\n\t* @see  initPane() - or externally after an Ajax injection\r\n\t* @param {string}\t[pane]\t\t\tThe pane to process\r\n\t* @param {boolean=}\t[resize=true]\tSize content after init\r\n\t*/\r\n,\tinitContent = function (pane, resize) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar \r\n\t\t\to\t= options[pane]\r\n\t\t,\tsel\t= o.contentSelector\r\n\t\t,\tI\t= Instance[pane]\r\n\t\t,\t$P\t= $Ps[pane]\r\n\t\t,\t$C\r\n\t\t;\r\n\t\tif (sel) $C = I.content = $Cs[pane] = (o.findNestedContent)\r\n\t\t\t? $P.find(sel).eq(0) // match 1-element only\r\n\t\t\t: $P.children(sel).eq(0)\r\n\t\t;\r\n\t\tif ($C && $C.length) {\r\n\t\t\t$C.data(\"layoutRole\", \"content\");\r\n\t\t\t// SAVE original Pane CSS\r\n\t\t\tif (!$C.data(\"layoutCSS\"))\r\n\t\t\t\t$C.data(\"layoutCSS\", elCSS($C, \"height\"));\r\n\t\t\t$C.css( _c.content.cssReq );\r\n\t\t\tif (o.applyDemoStyles) {\r\n\t\t\t\t$C.css( _c.content.cssDemo ); // add padding & overflow: auto to content-div\r\n\t\t\t\t$P.css( _c.content.cssDemoPane ); // REMOVE padding/scrolling from pane\r\n\t\t\t}\r\n\t\t\tstate[pane].content = {}; // init content state\r\n\t\t\tif (resize !== false) sizeContent(pane);\r\n\t\t\t// sizeContent() is called AFTER init of all elements\r\n\t\t}\r\n\t\telse\r\n\t\t\tI.content = $Cs[pane] = false;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Add resize-bars to all panes that specify it in options\r\n\t* -dependancy: $.fn.resizable - will skip if not found\r\n\t*\r\n\t* @see  _create()\r\n\t* @param {string=}\t[panes=\"\"]\tThe edge(s) to process\r\n\t*/\r\n,\tinitResizable = function (panes) {\r\n\t\tvar\tdraggingAvailable = $.layout.plugins.draggable\r\n\t\t,\tside // set in start()\r\n\t\t;\r\n\t\tpanes = panes ? panes.split(\",\") : _c.borderPanes;\r\n\r\n\t\t$.each(panes, function (idx, pane) {\r\n\t\t\tvar o = options[pane];\r\n\t\t\tif (!draggingAvailable || !$Ps[pane] || !o.resizable) {\r\n\t\t\t\to.resizable = false;\r\n\t\t\t\treturn true; // skip to next\r\n\t\t\t}\r\n\r\n\t\t\tvar s\t\t= state[pane]\r\n\t\t\t,\tz\t\t= options.zIndexes\r\n\t\t\t,\tc\t\t= _c[pane]\r\n\t\t\t,\tside\t= c.dir==\"horz\" ? \"top\" : \"left\"\r\n\t\t\t,\topEdge\t= _c.oppositeEdge[pane]\r\n\t\t\t,\tmasks\t=  pane +\",center,\"+ opEdge + (c.dir==\"horz\" ? \",west,east\" : \"\")\r\n\t\t\t,\t$P \t\t= $Ps[pane]\r\n\t\t\t,\t$R\t\t= $Rs[pane]\r\n\t\t\t,\tbase\t= o.resizerClass\r\n\t\t\t,\tlastPos\t= 0 // used when live-resizing\r\n\t\t\t,\tr, live // set in start because may change\r\n\t\t\t//\t'drag' classes are applied to the ORIGINAL resizer-bar while dragging is in process\r\n\t\t\t,\tresizerClass\t\t= base+\"-drag\"\t\t\t\t// resizer-drag\r\n\t\t\t,\tresizerPaneClass\t= base+\"-\"+pane+\"-drag\"\t\t// resizer-north-drag\r\n\t\t\t//\t'helper' class is applied to the CLONED resizer-bar while it is being dragged\r\n\t\t\t,\thelperClass\t\t\t= base+\"-dragging\"\t\t\t// resizer-dragging\r\n\t\t\t,\thelperPaneClass\t\t= base+\"-\"+pane+\"-dragging\" // resizer-north-dragging\r\n\t\t\t,\thelperLimitClass\t= base+\"-dragging-limit\"\t// resizer-drag\r\n\t\t\t,\thelperPaneLimitClass = base+\"-\"+pane+\"-dragging-limit\"\t// resizer-north-drag\r\n\t\t\t,\thelperClassesSet\t= false \t\t\t\t\t// logic var\r\n\t\t\t;\r\n\r\n\t\t\tif (!s.isClosed)\r\n\t\t\t\t$R.attr(\"title\", o.resizerTip)\r\n\t\t\t\t  .css(\"cursor\", o.resizerCursor); // n-resize, s-resize, etc\r\n\r\n\t\t\t$R.draggable({\r\n\t\t\t\tcontainment:\t$N[0] // limit resizing to layout container\r\n\t\t\t,\taxis:\t\t\t(c.dir==\"horz\" ? \"y\" : \"x\") // limit resizing to horz or vert axis\r\n\t\t\t,\tdelay:\t\t\t0\r\n\t\t\t,\tdistance:\t\t1\r\n\t\t\t,\tgrid:\t\t\to.resizingGrid\r\n\t\t\t//\tbasic format for helper - style it using class: .ui-draggable-dragging\r\n\t\t\t,\thelper:\t\t\t\"clone\"\r\n\t\t\t,\topacity:\t\to.resizerDragOpacity\r\n\t\t\t,\taddClasses:\t\tfalse // avoid ui-state-disabled class when disabled\r\n\t\t\t//,\tiframeFix:\t\to.draggableIframeFix // TODO: consider using when bug is fixed\r\n\t\t\t,\tzIndex:\t\t\tz.resizer_drag\r\n\r\n\t\t\t,\tstart: function (e, ui) {\r\n\t\t\t\t\t// REFRESH options & state pointers in case we used swapPanes\r\n\t\t\t\t\to = options[pane];\r\n\t\t\t\t\ts = state[pane];\r\n\t\t\t\t\t// re-read options\r\n\t\t\t\t\tlive = o.livePaneResizing;\r\n\r\n\t\t\t\t\t// ondrag_start callback - will CANCEL hide if returns false\r\n\t\t\t\t\t// TODO: dragging CANNOT be cancelled like this, so see if there is a way?\r\n\t\t\t\t\tif (false === _runCallbacks(\"ondrag_start\", pane)) return false;\r\n\r\n\t\t\t\t\ts.isResizing\t= true; // prevent pane from closing while resizing\r\n\t\t\t\t\ttimer.clear(pane+\"_closeSlider\"); // just in case already triggered\r\n\r\n\t\t\t\t\t// SET RESIZER LIMITS - used in drag()\r\n\t\t\t\t\tsetSizeLimits(pane); // update pane/resizer state\r\n\t\t\t\t\tr = s.resizerPosition;\r\n\t\t\t\t\tlastPos = ui.position[ side ]\r\n\r\n\t\t\t\t\t$R.addClass( resizerClass +\" \"+ resizerPaneClass ); // add drag classes\r\n\t\t\t\t\thelperClassesSet = false; // reset logic var - see drag()\r\n\r\n\t\t\t\t\t// DISABLE TEXT SELECTION (probably already done by resizer.mouseOver)\r\n\t\t\t\t\t$('body').disableSelection(); \r\n\r\n\t\t\t\t\t// MASK PANES CONTAINING IFRAMES, APPLETS OR OTHER TROUBLESOME ELEMENTS\r\n\t\t\t\t\tshowMasks( masks );\r\n\t\t\t\t}\r\n\r\n\t\t\t,\tdrag: function (e, ui) {\r\n\t\t\t\t\tif (!helperClassesSet) { // can only add classes after clone has been added to the DOM\r\n\t\t\t\t\t\t//$(\".ui-draggable-dragging\")\r\n\t\t\t\t\t\tui.helper\r\n\t\t\t\t\t\t\t.addClass( helperClass +\" \"+ helperPaneClass ) // add helper classes\r\n\t\t\t\t\t\t\t.css({ right: \"auto\", bottom: \"auto\" })\t// fix dir=\"rtl\" issue\r\n\t\t\t\t\t\t\t.children().css(\"visibility\",\"hidden\")\t// hide toggler inside dragged resizer-bar\r\n\t\t\t\t\t\t;\r\n\t\t\t\t\t\thelperClassesSet = true;\r\n\t\t\t\t\t\t// draggable bug!? RE-SET zIndex to prevent E/W resize-bar showing through N/S pane!\r\n\t\t\t\t\t\tif (s.isSliding) $Ps[pane].css(\"zIndex\", z.pane_sliding);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// CONTAIN RESIZER-BAR TO RESIZING LIMITS\r\n\t\t\t\t\tvar limit = 0;\r\n\t\t\t\t\tif (ui.position[side] < r.min) {\r\n\t\t\t\t\t\tui.position[side] = r.min;\r\n\t\t\t\t\t\tlimit = -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (ui.position[side] > r.max) {\r\n\t\t\t\t\t\tui.position[side] = r.max;\r\n\t\t\t\t\t\tlimit = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// ADD/REMOVE dragging-limit CLASS\r\n\t\t\t\t\tif (limit) {\r\n\t\t\t\t\t\tui.helper.addClass( helperLimitClass +\" \"+ helperPaneLimitClass ); // at dragging-limit\r\n\t\t\t\t\t\twindow.defaultStatus = (limit>0 && pane.match(/north|west/)) || (limit<0 && pane.match(/south|east/)) ? lang.maxSizeWarning : lang.minSizeWarning;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tui.helper.removeClass( helperLimitClass +\" \"+ helperPaneLimitClass ); // not at dragging-limit\r\n\t\t\t\t\t\twindow.defaultStatus = \"\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// DYNAMICALLY RESIZE PANES IF OPTION ENABLED\r\n\t\t\t\t\t// won't trigger unless resizer has actually moved!\r\n\t\t\t\t\tif (live && Math.abs(ui.position[side] - lastPos) >= o.liveResizingTolerance) {\r\n\t\t\t\t\t\tlastPos = ui.position[side];\r\n\t\t\t\t\t\tresizePanes(e, ui, pane)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t,\tstop: function (e, ui) {\r\n\t\t\t\t\t$('body').enableSelection(); // RE-ENABLE TEXT SELECTION\r\n\t\t\t\t\twindow.defaultStatus = \"\"; // clear 'resizing limit' message from statusbar\r\n\t\t\t\t\t$R.removeClass( resizerClass +\" \"+ resizerPaneClass ); // remove drag classes from Resizer\r\n\t\t\t\t\ts.isResizing = false;\r\n\t\t\t\t\tresizePanes(e, ui, pane, true, masks); // true = resizingDone\r\n\t\t\t\t}\r\n\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t* resizePanes\r\n\t\t*\r\n\t\t* Sub-routine called from stop() - and drag() if livePaneResizing\r\n\t\t*\r\n\t\t* @param {!Object}\t\tevt\r\n\t\t* @param {!Object}\t\tui\r\n\t\t* @param {string}\t\tpane\r\n\t\t* @param {boolean=}\t\t[resizingDone=false]\r\n\t\t*/\r\n\t\tvar resizePanes = function (evt, ui, pane, resizingDone, masks) {\r\n\t\t\tvar\tdragPos\t= ui.position\r\n\t\t\t,\tc\t\t= _c[pane]\r\n\t\t\t,\to\t\t= options[pane]\r\n\t\t\t,\ts\t\t= state[pane]\r\n\t\t\t,\tresizerPos\r\n\t\t\t;\r\n\t\t\tswitch (pane) {\r\n\t\t\t\tcase \"north\":\tresizerPos = dragPos.top; break;\r\n\t\t\t\tcase \"west\":\tresizerPos = dragPos.left; break;\r\n\t\t\t\tcase \"south\":\tresizerPos = sC.offsetHeight - dragPos.top  - o.spacing_open; break;\r\n\t\t\t\tcase \"east\":\tresizerPos = sC.offsetWidth  - dragPos.left - o.spacing_open; break;\r\n\t\t\t};\r\n\t\t\t// remove container margin from resizer position to get the pane size\r\n\t\t\tvar newSize = resizerPos - sC[\"inset\"+ c.side];\r\n\r\n\t\t\t// Disable OR Resize Mask(s) created in drag.start\r\n\t\t\tif (!resizingDone) {\r\n\t\t\t\t// ensure we meet liveResizingTolerance criteria\r\n\t\t\t\tif (Math.abs(newSize - s.size) < o.liveResizingTolerance)\r\n\t\t\t\t\treturn; // SKIP resize this time\r\n\t\t\t\t// resize the pane\r\n\t\t\t\tmanualSizePane(pane, newSize, false, true); // true = noAnimation\r\n\t\t\t\tsizeMasks(); // resize all visible masks\r\n\t\t\t}\r\n\t\t\telse { // resizingDone\r\n\t\t\t\t// ondrag_end callback\r\n\t\t\t\tif (false !== _runCallbacks(\"ondrag_end\", pane))\r\n\t\t\t\t\tmanualSizePane(pane, newSize, false, true); // true = noAnimation\r\n\t\t\t\thideMasks(); // hide all masks, which include panes with 'content/iframe-masks'\r\n\t\t\t\tif (s.isSliding && masks) // RE-SHOW only 'object-masks' so objects won't show through sliding pane\r\n\t\t\t\t\tshowMasks( masks, true ); // true = onlyForObjects\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t *\tsizeMask\r\n\t *\r\n\t *\tNeeded to overlay a DIV over an IFRAME-pane because mask CANNOT be *inside* the pane\r\n\t *\tCalled when mask created, and during livePaneResizing\r\n\t */\r\n,\tsizeMask = function () {\r\n\t\tvar $M\t\t= $(this)\r\n\t\t,\tpane\t= $M.data(\"layoutMask\") // eg: \"west\"\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t;\r\n\t\t// only masks over an IFRAME-pane need manual resizing\r\n\t\tif (s.tagName == \"IFRAME\" && s.isVisible) // no need to mask closed/hidden panes\r\n\t\t\t$M.css({\r\n\t\t\t\ttop:\ts.offsetTop\r\n\t\t\t,\tleft:\ts.offsetLeft\r\n\t\t\t,\twidth:\ts.outerWidth\r\n\t\t\t,\theight:\ts.outerHeight\r\n\t\t\t});\r\n\t\t/* ALT Method...\r\n\t\tvar $P = $Ps[pane];\r\n\t\t$M.css( $P.position() ).css({ width: $P[0].offsetWidth, height: $P[0].offsetHeight });\r\n\t\t*/\r\n\t}\r\n,\tsizeMasks = function () {\r\n\t\t$Ms.each( sizeMask ); // resize all 'visible' masks\r\n\t}\r\n\r\n,\tshowMasks = function (panes, onlyForObjects) {\r\n\t\tvar a\t= panes ? panes.split(\",\") : $.layout.config.allPanes\r\n\t\t,\tz\t= options.zIndexes\r\n\t\t,\to, s;\r\n\t\t$.each(a, function(i,p){\r\n\t\t\ts = state[p];\r\n\t\t\to = options[p];\r\n\t\t\tif (s.isVisible && ( (!onlyForObjects && o.maskContents) || o.maskObjects )) {\r\n\t\t\t\tgetMasks(p).each(function(){\r\n\t\t\t\t\tsizeMask.call(this);\r\n\t\t\t\t\tthis.style.zIndex = s.isSliding ? z.pane_sliding+1 : z.pane_normal+1\r\n\t\t\t\t\tthis.style.display = \"block\";\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n,\thideMasks = function () {\r\n\t\t// ensure no pane is resizing - could be a timing issue\r\n\t\tvar skip;\r\n\t\t$.each( $.layout.config.borderPanes, function(i,p){\r\n\t\t\tif (state[p].isResizing) {\r\n\t\t\t\tskip = true;\r\n\t\t\t\treturn false; // BREAK\r\n\t\t\t}\r\n\t\t});\r\n\t\tif (!skip)\r\n\t\t\t$Ms.hide(); // hide ALL masks\r\n\t}\r\n\r\n,\tgetMasks = function (pane) {\r\n\t\tvar $Masks\t= $([])\r\n\t\t,\t$M, i = 0, c = $Ms.length\r\n\t\t;\r\n\t\tfor (; i<c; i++) {\r\n\t\t\t$M = $Ms.eq(i);\r\n\t\t\tif ($M.data(\"layoutMask\") === pane)\r\n\t\t\t\t$Masks = $Masks.add( $M );\r\n\t\t}\r\n\t\tif ($Masks.length)\r\n\t\t\treturn $Masks;\r\n\t\telse\r\n\t\t\treturn createMasks(pane);\r\n\t}\r\n\r\n\t/**\r\n\t *\tcreateMasks\r\n\t *\r\n\t *\tGenerates both DIV (ALWAYS used) and IFRAME (optional) elements as masks\r\n\t *\tAn IFRAME mask is created *under* the DIV when maskObjects=true, because a DIV cannot mask an applet\r\n\t */\r\n,\tcreateMasks = function (pane) {\r\n\t\tvar\r\n\t\t\t$P\t\t= $Ps[pane]\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\to\t\t= options[pane]\r\n\t\t,\tz\t\t= options.zIndexes\r\n\t\t//,\tobjMask\t= o.maskObjects && s.tagName != \"IFRAME\" // check for option\r\n\t\t,\t$Masks\t= $([])\r\n\t\t,\tisIframe, el, $M, css, i\r\n\t\t;\r\n\t\tif (!o.maskContents && !o.maskObjects) return $Masks;\r\n\t\t// if o.maskObjects=true, then loop TWICE to create BOTH kinds of mask, else only create a DIV\r\n\t\tfor (i=0; i < (o.maskObjects ? 2 : 1); i++) {\r\n\t\t\tisIframe = o.maskObjects && i==0;\r\n\t\t\tel = document.createElement( isIframe ? \"iframe\" : \"div\" );\r\n\t\t\t$M = $(el).data(\"layoutMask\", pane); // add data to relate mask to pane\r\n\t\t\tel.className = \"ui-layout-mask ui-layout-mask-\"+ pane; // for user styling\r\n\t\t\tcss = el.style;\r\n\t\t\t// styles common to both DIVs and IFRAMES\r\n\t\t\tcss.display\t\t= \"block\";\r\n\t\t\tcss.position\t= \"absolute\";\r\n\t\t\tif (isIframe) { // IFRAME-only props\r\n\t\t\t\tel.frameborder = 0;\r\n\t\t\t\tel.src\t\t= \"about:blank\";\r\n\t\t\t\tcss.opacity\t= 0;\r\n\t\t\t\tcss.filter\t= \"Alpha(Opacity='0')\";\r\n\t\t\t\tcss.border\t= 0;\r\n\t\t\t}\r\n\t\t\t// if pane is an IFRAME, then must mask the pane itself\r\n\t\t\tif (s.tagName == \"IFRAME\") {\r\n\t\t\t\t// NOTE sizing done by a subroutine so can be called during live-resizing\r\n\t\t\t\tcss.zIndex\t= z.pane_normal+1; // 1-higher than pane\r\n\t\t\t\t$N.append( el ); // append to LAYOUT CONTAINER\r\n\t\t\t}\r\n\t\t\t// otherwise put masks *inside the pane* to mask its contents\r\n\t\t\telse {\r\n\t\t\t\t$M.addClass(\"ui-layout-mask-inside-pane\");\r\n\t\t\t\tcss.zIndex\t= o.maskZindex || z.content_mask; // usually 1, but customizable\r\n\t\t\t\tcss.top\t\t= 0;\r\n\t\t\t\tcss.left\t= 0;\r\n\t\t\t\tcss.width\t= \"100%\";\r\n\t\t\t\tcss.height\t= \"100%\";\r\n\t\t\t\t$P.append( el ); // append INSIDE pane element\r\n\t\t\t}\r\n\t\t\t// add to return object\r\n\t\t\t$Masks = $Masks.add( el );\r\n\t\t\t// add Mask to cached array so can be resized & reused\r\n\t\t\t$Ms = $Ms.add( el );\r\n\t\t}\r\n\t\treturn $Masks;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Destroy this layout and reset all elements\r\n\t*\r\n\t* @param {boolean=}\t[destroyChildren=false]\t\tDestory Child-Layouts first?\r\n\t*/\r\n,\tdestroy = function (destroyChildren) {\r\n\t\t// UNBIND layout events and remove global object\r\n\t\t$(window).unbind(\".\"+ sID);\t\t// resize & unload\r\n\t\t$(document).unbind(\".\"+ sID);\t// keyDown (hotkeys)\r\n\r\n\t\t// need to look for parent layout BEFORE we remove the container data, else skips a level\r\n\t\t//var parentPane = Instance.hasParentLayout ? $.layout.getParentPaneInstance( $N ) : null;\r\n\r\n\t\t// reset layout-container\r\n\t\t$N\t.clearQueue()\r\n\t\t\t.removeData(\"layout\")\r\n\t\t\t.removeData(\"layoutContainer\")\r\n\t\t\t.removeClass(options.containerClass)\r\n\t\t\t.unbind(\".\"+ sID) // remove ALL Layout events\r\n\t\t;\r\n\r\n\t\t// remove all mask elements that have been created\r\n\t\t$Ms.remove();\r\n\r\n\t\t// loop all panes to remove layout classes, attributes and bindings\r\n\t\t$.each(_c.allPanes, function (i, pane) {\r\n\t\t\tremovePane( pane, false, true, destroyChildren ); // true = skipResize\r\n\t\t});\r\n\r\n\t\t// do NOT reset container CSS if is a 'pane' (or 'content') in an outer-layout - ie, THIS layout is 'nested'\r\n\t\tvar css = \"layoutCSS\";\r\n\t\tif ($N.data(css) && !$N.data(\"layoutRole\")) // RESET CSS\r\n\t\t\t$N.css( $N.data(css) ).removeData(css);\r\n\r\n\t\t// for full-page layouts, also reset the <HTML> CSS\r\n\t\tif (sC.tagName === \"BODY\" && ($N = $(\"html\")).data(css)) // RESET <HTML> CSS\r\n\t\t\t$N.css( $N.data(css) ).removeData(css);\r\n\r\n\t\t// trigger plugins for this layout, if there are any\r\n\t\trunPluginCallbacks( Instance, $.layout.onDestroy );\r\n\r\n\t\t// trigger state-management and onunload callback\r\n\t\tunload();\r\n\r\n\t\t// clear the Instance of everything except for container & options (so could recreate)\r\n\t\t// RE-CREATE: myLayout = myLayout.container.layout( myLayout.options );\r\n\t\tfor (n in Instance)\r\n\t\t\tif (!n.match(/^(container|options)$/)) delete Instance[ n ];\r\n\t\t// add a 'destroyed' flag to make it easy to check\r\n\t\tInstance.destroyed = true;\r\n\r\n\t\t// if this is a child layout, CLEAR the child-pointer in the parent\r\n\t\t/* for now the pointer REMAINS, but with only container, options and destroyed keys\r\n\t\tif (parentPane) {\r\n\t\t\tvar layout = parentPane.pane.data(\"parentLayout\");\r\n\t\t\tparentPane.child = layout.children[ parentPane.name ] = null;\r\n\t\t}\r\n\t\t*/\r\n\r\n\t\treturn Instance; // for coding convenience\r\n\t}\r\n\r\n\t/**\r\n\t* Remove a pane from the layout - subroutine of destroy()\r\n\t*\r\n\t* @see  destroy()\r\n\t* @param {string}\tpane\t\t\t\tThe pane to process\r\n\t* @param {boolean=}\t[remove=false]\t\tRemove the DOM element?\r\n\t* @param {boolean=}\t[skipResize=false]\tSkip calling resizeAll()?\r\n\t*/\r\n,\tremovePane = function (evt_or_pane, remove, skipResize, destroyChild) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$P\t= $Ps[pane]\r\n\t\t,\t$C\t= $Cs[pane]\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t,\t$T\t= $Ts[pane]\r\n\t\t;\r\n\t\t//alert( '$P.length = '+ $P.length );\r\n\t\t// NOTE: elements can still exist even after remove()\r\n\t\t//\t\tso check for missing data(), which is cleared by removed()\r\n\t\tif ($P && $.isEmptyObject( $P.data() )) $P = false;\r\n\t\tif ($C && $.isEmptyObject( $C.data() )) $C = false;\r\n\t\tif ($R && $.isEmptyObject( $R.data() )) $R = false;\r\n\t\tif ($T && $.isEmptyObject( $T.data() )) $T = false;\r\n\r\n\t\tif ($P) $P.stop(true, true);\r\n\r\n\t\t//\tcheck for a child layout\r\n\t\tvar\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\td\t= \"layout\"\r\n\t\t,\tcss\t= \"layoutCSS\"\r\n\t\t,\tchild\t= children[pane] || ($P ? $P.data(d) : 0) || ($C ? $C.data(d) : 0) || null\r\n\t\t,\tdestroy\t= destroyChild !== undefined ? destroyChild : o.destroyChildLayout\r\n\t\t;\r\n\r\n\t\t// FIRST destroy the child-layout(s)\r\n\t\tif (destroy && child && !child.destroyed) {\r\n\t\t\tchild.destroy(true);\t// tell child-layout to destroy ALL its child-layouts too\r\n\t\t\tif (child.destroyed)\t// destroy was successful\r\n\t\t\t\tchild = null;\t\t// clear pointer for logic below \r\n\t\t}\r\n\r\n\t\tif ($P && remove && !child)\r\n\t\t\t$P.remove();\r\n\t\telse if ($P && $P[0]) {\r\n\t\t\t//\tcreate list of ALL pane-classes that need to be removed\r\n\t\t\tvar\troot\t= o.paneClass // default=\"ui-layout-pane\"\r\n\t\t\t,\tpRoot\t= root +\"-\"+ pane // eg: \"ui-layout-pane-west\"\r\n\t\t\t,\t_open\t= \"-open\"\r\n\t\t\t,\t_sliding= \"-sliding\"\r\n\t\t\t,\t_closed\t= \"-closed\"\r\n\t\t\t,\tclasses\t= [\troot, root+_open, root+_closed, root+_sliding,\t\t// generic classes\r\n\t\t\t\t\t\t\tpRoot, pRoot+_open, pRoot+_closed, pRoot+_sliding ]\t// pane-specific classes\r\n\t\t\t;\r\n\t\t\t$.merge(classes, getHoverClasses($P, true)); // ADD hover-classes\r\n\t\t\t// remove all Layout classes from pane-element\r\n\t\t\t$P\t.removeClass( classes.join(\" \") ) // remove ALL pane-classes\r\n\t\t\t\t.removeData(\"parentLayout\")\r\n\t\t\t\t.removeData(\"layoutPane\")\r\n\t\t\t\t.removeData(\"layoutRole\")\r\n\t\t\t\t.removeData(\"layoutEdge\")\r\n\t\t\t\t.removeData(\"autoHidden\")\t// in case set\r\n\t\t\t\t.unbind(\".\"+ sID) // remove ALL Layout events\r\n\t\t\t\t// TODO: remove these extra unbind commands when jQuery is fixed\r\n\t\t\t\t//.unbind(\"mouseenter\"+ sID)\r\n\t\t\t\t//.unbind(\"mouseleave\"+ sID)\r\n\t\t\t;\r\n\t\t\t// do NOT reset CSS if this pane/content is STILL the container of a nested layout!\r\n\t\t\t// the nested layout will reset its 'container' CSS when/if it is destroyed\r\n\t\t\tif ($C && $C.data(d)) {\r\n\t\t\t\t// a content-div may not have a specific width, so give it one to contain the Layout\r\n\t\t\t\t$C.width( $C.width() );\r\n\t\t\t\tchild.resizeAll(); // now resize the Layout\r\n\t\t\t}\r\n\t\t\telse if ($C)\r\n\t\t\t\t$C.css( $C.data(css) ).removeData(css).removeData(\"layoutRole\");\r\n\t\t\t// remove pane AFTER content in case there was a nested layout\r\n\t\t\tif (!$P.data(d))\r\n\t\t\t\t$P.css( $P.data(css) ).removeData(css);\r\n\t\t}\r\n\r\n\t\t// REMOVE pane resizer and toggler elements\r\n\t\tif ($T) $T.remove();\r\n\t\tif ($R) $R.remove();\r\n\r\n\t\t// CLEAR all pointers and state data\r\n\t\tInstance[pane] = $Ps[pane] = $Cs[pane] = $Rs[pane] = $Ts[pane] = children[pane] = false;\r\n\t\ts = { removed: true };\r\n\r\n\t\tif (!skipResize)\r\n\t\t\tresizeAll();\r\n\t}\r\n\r\n\r\n/*\r\n * ###########################\r\n *\t   ACTION METHODS\r\n * ###########################\r\n */\r\n\r\n,\t_hidePane = function (pane) {\r\n\t\tvar $P\t= $Ps[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t,\ts\t= $P[0].style\r\n\t\t;\r\n\t\tif (o.useOffscreenClose) {\r\n\t\t\tif (!$P.data(_c.offscreenReset))\r\n\t\t\t\t$P.data(_c.offscreenReset, { left: s.left, right: s.right });\r\n\t\t\t$P.css( _c.offscreenCSS );\r\n\t\t}\r\n\t\telse\r\n\t\t\t$P.hide().removeData(_c.offscreenReset);\r\n\t}\r\n\r\n,\t_showPane = function (pane) {\r\n\t\tvar $P\t= $Ps[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t,\toff\t= _c.offscreenCSS\r\n\t\t,\told\t= $P.data(_c.offscreenReset)\r\n\t\t,\ts\t= $P[0].style\r\n\t\t;\r\n\t\t$P\t.show() // ALWAYS show, just in case\r\n\t\t\t.removeData(_c.offscreenReset);\r\n\t\tif (o.useOffscreenClose && old) {\r\n\t\t\tif (s.left == off.left)\r\n\t\t\t\ts.left = old.left;\r\n\t\t\tif (s.right == off.right)\r\n\t\t\t\ts.right = old.right;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Completely 'hides' a pane, including its spacing - as if it does not exist\r\n\t* The pane is not actually 'removed' from the source, so can use 'show' to un-hide it\r\n\t*\r\n\t* @param {string}\tpane\t\tThe pane being hidden, ie: north, south, east, or west\r\n\t* @param {boolean=}\t[noAnimation=false]\t\r\n\t*/\r\n,\thide = function (evt_or_pane, noAnimation) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\t$P\t= $Ps[pane]\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t;\r\n\t\tif (!$P || s.isHidden) return; // pane does not exist OR is already hidden\r\n\r\n\t\t// onhide_start callback - will CANCEL hide if returns false\r\n\t\tif (state.initialized && false === _runCallbacks(\"onhide_start\", pane)) return;\r\n\r\n\t\ts.isSliding = false; // just in case\r\n\r\n\t\t// now hide the elements\r\n\t\tif ($R) $R.hide(); // hide resizer-bar\r\n\t\tif (!state.initialized || s.isClosed) {\r\n\t\t\ts.isClosed = true; // to trigger open-animation on show()\r\n\t\t\ts.isHidden  = true;\r\n\t\t\ts.isVisible = false;\r\n\t\t\tif (!state.initialized)\r\n\t\t\t\t_hidePane(pane); // no animation when loading page\r\n\t\t\tsizeMidPanes(_c[pane].dir === \"horz\" ? \"\" : \"center\");\r\n\t\t\tif (state.initialized || o.triggerEventsOnLoad)\r\n\t\t\t\t_runCallbacks(\"onhide_end\", pane);\r\n\t\t}\r\n\t\telse {\r\n\t\t\ts.isHiding = true; // used by onclose\r\n\t\t\tclose(pane, false, noAnimation); // adjust all panes to fit\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Show a hidden pane - show as 'closed' by default unless openPane = true\r\n\t*\r\n\t* @param {string}\tpane\t\tThe pane being opened, ie: north, south, east, or west\r\n\t* @param {boolean=}\t[openPane=false]\r\n\t* @param {boolean=}\t[noAnimation=false]\r\n\t* @param {boolean=}\t[noAlert=false]\r\n\t*/\r\n,\tshow = function (evt_or_pane, openPane, noAnimation, noAlert) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\t$P\t= $Ps[pane]\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t;\r\n\t\tif (!$P || !s.isHidden) return; // pane does not exist OR is not hidden\r\n\r\n\t\t// onshow_start callback - will CANCEL show if returns false\r\n\t\tif (false === _runCallbacks(\"onshow_start\", pane)) return;\r\n\r\n\t\ts.isSliding = false; // just in case\r\n\t\ts.isShowing = true; // used by onopen/onclose\r\n\t\t//s.isHidden  = false; - will be set by open/close - if not cancelled\r\n\r\n\t\t// now show the elements\r\n\t\t//if ($R) $R.show(); - will be shown by open/close\r\n\t\tif (openPane === false)\r\n\t\t\tclose(pane, true); // true = force\r\n\t\telse\r\n\t\t\topen(pane, false, noAnimation, noAlert); // adjust all panes to fit\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Toggles a pane open/closed by calling either open or close\r\n\t*\r\n\t* @param {string}\tpane   The pane being toggled, ie: north, south, east, or west\r\n\t* @param {boolean=}\t[slide=false]\r\n\t*/\r\n,\ttoggle = function (evt_or_pane, slide) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tevt\t\t= evtObj(evt_or_pane)\r\n\t\t,\tpane\t= evtPane.call(this, evt_or_pane)\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t;\r\n\t\tif (evt) // called from to $R.dblclick OR triggerPaneEvent\r\n\t\t\tevt.stopImmediatePropagation();\r\n\t\tif (s.isHidden)\r\n\t\t\tshow(pane); // will call 'open' after unhiding it\r\n\t\telse if (s.isClosed)\r\n\t\t\topen(pane, !!slide);\r\n\t\telse\r\n\t\t\tclose(pane);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Utility method used during init or other auto-processes\r\n\t*\r\n\t* @param {string}\tpane   The pane being closed\r\n\t* @param {boolean=}\t[setHandles=false]\r\n\t*/\r\n,\t_closePane = function (pane, setHandles) {\r\n\t\tvar\r\n\t\t\t$P\t= $Ps[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t;\r\n\t\t_hidePane(pane);\r\n\t\ts.isClosed = true;\r\n\t\ts.isVisible = false;\r\n\t\t// UNUSED: if (setHandles) setAsClosed(pane, true); // true = force\r\n\t}\r\n\r\n\t/**\r\n\t* Close the specified pane (animation optional), and resize all other panes as needed\r\n\t*\r\n\t* @param {string}\tpane\t\tThe pane being closed, ie: north, south, east, or west\r\n\t* @param {boolean=}\t[force=false]\r\n\t* @param {boolean=}\t[noAnimation=false]\r\n\t* @param {boolean=}\t[skipCallback=false]\r\n\t*/\r\n,\tclose = function (evt_or_pane, force, noAnimation, skipCallback) {\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane);\r\n\t\t// if pane has been initialized, but NOT the complete layout, close pane instantly\r\n\t\tif (!state.initialized && $Ps[pane]) {\r\n\t\t\t_closePane(pane); // INIT pane as closed\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!isInitialized()) return;\r\n\r\n\t\tvar\r\n\t\t\t$P\t= $Ps[pane]\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t,\t$T\t= $Ts[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\tc\t= _c[pane]\r\n\t\t,\tdoFX, isShowing, isHiding, wasSliding;\r\n\r\n\t\t// QUEUE in case another action/animation is in progress\r\n\t\t$N.queue(function( queueNext ){\r\n\t\r\n\t\t\tif ( !$P\r\n\t\t\t||\t(!o.closable && !s.isShowing && !s.isHiding)\t// invalid request // (!o.resizable && !o.closable) ???\r\n\t\t\t||\t(!force && s.isClosed && !s.isShowing)\t\t\t// already closed\r\n\t\t\t) return queueNext();\r\n\r\n\t\t\t// onclose_start callback - will CANCEL hide if returns false\r\n\t\t\t// SKIP if just 'showing' a hidden pane as 'closed'\r\n\t\t\tvar abort = !s.isShowing && false === _runCallbacks(\"onclose_start\", pane);\r\n\r\n\t\t\t// transfer logic vars to temp vars\r\n\t\t\tisShowing\t= s.isShowing;\r\n\t\t\tisHiding\t= s.isHiding;\r\n\t\t\twasSliding\t= s.isSliding;\r\n\t\t\t// now clear the logic vars (REQUIRED before aborting)\r\n\t\t\tdelete s.isShowing;\r\n\t\t\tdelete s.isHiding;\r\n\r\n\t\t\tif (abort) return queueNext();\r\n\r\n\t\t\tdoFX\t\t= !noAnimation && !s.isClosed && (o.fxName_close != \"none\");\r\n\t\t\ts.isMoving\t= true;\r\n\t\t\ts.isClosed\t= true;\r\n\t\t\ts.isVisible\t= false;\r\n\t\t\t// update isHidden BEFORE sizing panes\r\n\t\t\tif (isHiding) s.isHidden = true;\r\n\t\t\telse if (isShowing) s.isHidden = false;\r\n\r\n\t\t\tif (s.isSliding) // pane is being closed, so UNBIND trigger events\r\n\t\t\t\tbindStopSlidingEvents(pane, false); // will set isSliding=false\r\n\t\t\telse // resize panes adjacent to this one\r\n\t\t\t\tsizeMidPanes(_c[pane].dir === \"horz\" ? \"\" : \"center\", false); // false = NOT skipCallback\r\n\r\n\t\t\t// if this pane has a resizer bar, move it NOW - before animation\r\n\t\t\tsetAsClosed(pane);\r\n\r\n\t\t\t// CLOSE THE PANE\r\n\t\t\tif (doFX) { // animate the close\r\n\t\t\t\t// mask panes with objects\r\n\t\t\t\tvar masks = \"center\"+ (c.dir==\"horz\" ? \",west,east\" : \"\");\r\n\t\t\t\tshowMasks( masks, true );\t// true = ONLY mask panes with maskObjects=true\r\n\t\t\t\tlockPaneForFX(pane, true);\t// need to set left/top so animation will work\r\n\t\t\t\t$P.hide( o.fxName_close, o.fxSettings_close, o.fxSpeed_close, function () {\r\n\t\t\t\t\tlockPaneForFX(pane, false); // undo\r\n\t\t\t\t\tif (s.isClosed) close_2();\r\n\t\t\t\t\tqueueNext();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse { // hide the pane without animation\r\n\t\t\t\t_hidePane(pane);\r\n\t\t\t\tclose_2();\r\n\t\t\t\tqueueNext();\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\t// SUBROUTINE\r\n\t\tfunction close_2 () {\r\n\t\t\ts.isMoving\t= false;\r\n\t\t\tbindStartSlidingEvent(pane, true); // will enable if o.slidable = true\r\n\r\n\t\t\t// if opposite-pane was autoClosed, see if it can be autoOpened now\r\n\t\t\tvar altPane = _c.oppositeEdge[pane];\r\n\t\t\tif (state[ altPane ].noRoom) {\r\n\t\t\t\tsetSizeLimits( altPane );\r\n\t\t\t\tmakePaneFit( altPane );\r\n\t\t\t}\r\n\r\n\t\t\t// hide any masks shown while closing\r\n\t\t\thideMasks();\r\n\r\n\t\t\tif (!skipCallback && (state.initialized || o.triggerEventsOnLoad)) {\r\n\t\t\t\t// onclose callback - UNLESS just 'showing' a hidden pane as 'closed'\r\n\t\t\t\tif (!isShowing)\t_runCallbacks(\"onclose_end\", pane);\r\n\t\t\t\t// onhide OR onshow callback\r\n\t\t\t\tif (isShowing)\t_runCallbacks(\"onshow_end\", pane);\r\n\t\t\t\tif (isHiding)\t_runCallbacks(\"onhide_end\", pane);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* @param {string}\tpane\tThe pane just closed, ie: north, south, east, or west\r\n\t*/\r\n,\tsetAsClosed = function (pane) {\r\n\t\tvar\r\n\t\t\t$P\t\t= $Ps[pane]\r\n\t\t,\t$R\t\t= $Rs[pane]\r\n\t\t,\t$T\t\t= $Ts[pane]\r\n\t\t,\to\t\t= options[pane]\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\tside\t= _c[pane].side.toLowerCase()\r\n\t\t,\tinset\t= \"inset\"+ _c[pane].side\r\n\t\t,\trClass\t= o.resizerClass\r\n\t\t,\ttClass\t= o.togglerClass\r\n\t\t,\t_pane\t= \"-\"+ pane // used for classNames\r\n\t\t,\t_open\t= \"-open\"\r\n\t\t,\t_sliding= \"-sliding\"\r\n\t\t,\t_closed\t= \"-closed\"\r\n\t\t;\r\n\t\t$R\r\n\t\t\t.css(side, sC[inset]) // move the resizer\r\n\t\t\t.removeClass( rClass+_open +\" \"+ rClass+_pane+_open )\r\n\t\t\t.removeClass( rClass+_sliding +\" \"+ rClass+_pane+_sliding )\r\n\t\t\t.addClass( rClass+_closed +\" \"+ rClass+_pane+_closed )\r\n\t\t\t.unbind(\"dblclick.\"+ sID)\r\n\t\t;\r\n\t\t// DISABLE 'resizing' when closed - do this BEFORE bindStartSlidingEvent?\r\n\t\tif (o.resizable && $.layout.plugins.draggable)\r\n\t\t\t$R\r\n\t\t\t\t.draggable(\"disable\")\r\n\t\t\t\t.removeClass(\"ui-state-disabled\") // do NOT apply disabled styling - not suitable here\r\n\t\t\t\t.css(\"cursor\", \"default\")\r\n\t\t\t\t.attr(\"title\",\"\")\r\n\t\t\t;\r\n\r\n\t\t// if pane has a toggler button, adjust that too\r\n\t\tif ($T) {\r\n\t\t\t$T\r\n\t\t\t\t.removeClass( tClass+_open +\" \"+ tClass+_pane+_open )\r\n\t\t\t\t.addClass( tClass+_closed +\" \"+ tClass+_pane+_closed )\r\n\t\t\t\t.attr(\"title\", o.togglerTip_closed) // may be blank\r\n\t\t\t;\r\n\t\t\t// toggler-content - if exists\r\n\t\t\t$T.children(\".content-open\").hide();\r\n\t\t\t$T.children(\".content-closed\").css(\"display\",\"block\");\r\n\t\t}\r\n\r\n\t\t// sync any 'pin buttons'\r\n\t\tsyncPinBtns(pane, false);\r\n\r\n\t\tif (state.initialized) {\r\n\t\t\t// resize 'length' and position togglers for adjacent panes\r\n\t\t\tsizeHandles();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* Open the specified pane (animation optional), and resize all other panes as needed\r\n\t*\r\n\t* @param {string}\tpane\t\tThe pane being opened, ie: north, south, east, or west\r\n\t* @param {boolean=}\t[slide=false]\r\n\t* @param {boolean=}\t[noAnimation=false]\r\n\t* @param {boolean=}\t[noAlert=false]\r\n\t*/\r\n,\topen = function (evt_or_pane, slide, noAnimation, noAlert) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$P\t= $Ps[pane]\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t,\t$T\t= $Ts[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\tc\t= _c[pane]\r\n\t\t,\tdoFX, isShowing\r\n\t\t;\r\n\t\t// QUEUE in case another action/animation is in progress\r\n\t\t$N.queue(function( queueNext ){\r\n\r\n\t\t\tif ( !$P\r\n\t\t\t||\t(!o.resizable && !o.closable && !s.isShowing)\t// invalid request\r\n\t\t\t||\t(s.isVisible && !s.isSliding)\t\t\t\t\t// already open\r\n\t\t\t) return queueNext();\r\n\r\n\t\t\t// pane can ALSO be unhidden by just calling show(), so handle this scenario\r\n\t\t\tif (s.isHidden && !s.isShowing) {\r\n\t\t\t\tqueueNext(); // call before show() because it needs the queue free\r\n\t\t\t\tshow(pane, true);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (o.autoResize && s.size != o.size) // resize pane to original size set in options\r\n\t\t\t\tsizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize/noAnimation\r\n\t\t\telse\r\n\t\t\t\t// make sure there is enough space available to open the pane\r\n\t\t\t\tsetSizeLimits(pane, slide);\r\n\r\n\t\t\t// onopen_start callback - will CANCEL open if returns false\r\n\t\t\tvar cbReturn = _runCallbacks(\"onopen_start\", pane);\r\n\r\n\t\t\tif (cbReturn === \"abort\")\r\n\t\t\t\treturn queueNext();\r\n\r\n\t\t\t// update pane-state again in case options were changed in onopen_start\r\n\t\t\tif (cbReturn !== \"NC\") // NC = \"No Callback\"\r\n\t\t\t\tsetSizeLimits(pane, slide);\r\n\r\n\t\t\tif (s.minSize > s.maxSize) { // INSUFFICIENT ROOM FOR PANE TO OPEN!\r\n\t\t\t\tsyncPinBtns(pane, false); // make sure pin-buttons are reset\r\n\t\t\t\tif (!noAlert && o.noRoomToOpenTip)\r\n\t\t\t\t\talert(o.noRoomToOpenTip);\r\n\t\t\t\treturn queueNext(); // ABORT\r\n\t\t\t}\r\n\r\n\t\t\tif (slide) // START Sliding - will set isSliding=true\r\n\t\t\t\tbindStopSlidingEvents(pane, true); // BIND trigger events to close sliding-pane\r\n\t\t\telse if (s.isSliding) // PIN PANE (stop sliding) - open pane 'normally' instead\r\n\t\t\t\tbindStopSlidingEvents(pane, false); // UNBIND trigger events - will set isSliding=false\r\n\t\t\telse if (o.slidable)\r\n\t\t\t\tbindStartSlidingEvent(pane, false); // UNBIND trigger events\r\n\r\n\t\t\ts.noRoom = false; // will be reset by makePaneFit if 'noRoom'\r\n\t\t\tmakePaneFit(pane);\r\n\r\n\t\t\t// transfer logic var to temp var\r\n\t\t\tisShowing = s.isShowing;\r\n\t\t\t// now clear the logic var\r\n\t\t\tdelete s.isShowing;\r\n\r\n\t\t\tdoFX\t\t= !noAnimation && s.isClosed && (o.fxName_open != \"none\");\r\n\t\t\ts.isMoving\t= true;\r\n\t\t\ts.isVisible\t= true;\r\n\t\t\ts.isClosed\t= false;\r\n\t\t\t// update isHidden BEFORE sizing panes - WHY??? Old?\r\n\t\t\tif (isShowing) s.isHidden = false;\r\n\r\n\t\t\tif (doFX) { // ANIMATE\r\n\t\t\t\t// mask panes with objects\r\n\t\t\t\tvar masks = \"center\"+ (c.dir==\"horz\" ? \",west,east\" : \"\");\r\n\t\t\t\tif (s.isSliding) masks += \",\"+ _c.oppositeEdge[pane];\r\n\t\t\t\tshowMasks( masks, true );\t// true = ONLY mask panes with maskObjects=true\r\n\t\t\t\tlockPaneForFX(pane, true);\t// need to set left/top so animation will work\r\n\t\t\t\t$P.show( o.fxName_open, o.fxSettings_open, o.fxSpeed_open, function() {\r\n\t\t\t\t\tlockPaneForFX(pane, false); // undo\r\n\t\t\t\t\tif (s.isVisible) open_2(); // continue\r\n\t\t\t\t\tqueueNext();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse { // no animation\r\n\t\t\t\t_showPane(pane);// just show pane and...\r\n\t\t\t\topen_2();\t\t// continue\r\n\t\t\t\tqueueNext();\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\t// SUBROUTINE\r\n\t\tfunction open_2 () {\r\n\t\t\ts.isMoving\t= false;\r\n\r\n\t\t\t// cure iframe display issues\r\n\t\t\t_fixIframe(pane);\r\n\r\n\t\t\t// NOTE: if isSliding, then other panes are NOT 'resized'\r\n\t\t\tif (!s.isSliding) { // resize all panes adjacent to this one\r\n\t\t\t\thideMasks(); // remove any masks shown while opening\r\n\t\t\t\tsizeMidPanes(_c[pane].dir==\"vert\" ? \"center\" : \"\", false); // false = NOT skipCallback\r\n\t\t\t}\r\n\r\n\t\t\t// set classes, position handles and execute callbacks...\r\n\t\t\tsetAsOpen(pane);\r\n\t\t};\r\n\t\r\n\t}\r\n\r\n\t/**\r\n\t* @param {string}\tpane\t\tThe pane just opened, ie: north, south, east, or west\r\n\t* @param {boolean=}\t[skipCallback=false]\r\n\t*/\r\n,\tsetAsOpen = function (pane, skipCallback) {\r\n\t\tvar \r\n\t\t\t$P\t\t= $Ps[pane]\r\n\t\t,\t$R\t\t= $Rs[pane]\r\n\t\t,\t$T\t\t= $Ts[pane]\r\n\t\t,\to\t\t= options[pane]\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\tside\t= _c[pane].side.toLowerCase()\r\n\t\t,\tinset\t= \"inset\"+ _c[pane].side\r\n\t\t,\trClass\t= o.resizerClass\r\n\t\t,\ttClass\t= o.togglerClass\r\n\t\t,\t_pane\t= \"-\"+ pane // used for classNames\r\n\t\t,\t_open\t= \"-open\"\r\n\t\t,\t_closed\t= \"-closed\"\r\n\t\t,\t_sliding= \"-sliding\"\r\n\t\t;\r\n\t\t$R\r\n\t\t\t.css(side, sC[inset] + getPaneSize(pane)) // move the resizer\r\n\t\t\t.removeClass( rClass+_closed +\" \"+ rClass+_pane+_closed )\r\n\t\t\t.addClass( rClass+_open +\" \"+ rClass+_pane+_open )\r\n\t\t;\r\n\t\tif (s.isSliding)\r\n\t\t\t$R.addClass( rClass+_sliding +\" \"+ rClass+_pane+_sliding )\r\n\t\telse // in case 'was sliding'\r\n\t\t\t$R.removeClass( rClass+_sliding +\" \"+ rClass+_pane+_sliding )\r\n\r\n\t\tif (o.resizerDblClickToggle)\r\n\t\t\t$R.bind(\"dblclick\", toggle );\r\n\t\tremoveHover( 0, $R ); // remove hover classes\r\n\t\tif (o.resizable && $.layout.plugins.draggable)\r\n\t\t\t$R\t.draggable(\"enable\")\r\n\t\t\t\t.css(\"cursor\", o.resizerCursor)\r\n\t\t\t\t.attr(\"title\", o.resizerTip);\r\n\t\telse if (!s.isSliding)\r\n\t\t\t$R.css(\"cursor\", \"default\"); // n-resize, s-resize, etc\r\n\r\n\t\t// if pane also has a toggler button, adjust that too\r\n\t\tif ($T) {\r\n\t\t\t$T\t.removeClass( tClass+_closed +\" \"+ tClass+_pane+_closed )\r\n\t\t\t\t.addClass( tClass+_open +\" \"+ tClass+_pane+_open )\r\n\t\t\t\t.attr(\"title\", o.togglerTip_open); // may be blank\r\n\t\t\tremoveHover( 0, $T ); // remove hover classes\r\n\t\t\t// toggler-content - if exists\r\n\t\t\t$T.children(\".content-closed\").hide();\r\n\t\t\t$T.children(\".content-open\").css(\"display\",\"block\");\r\n\t\t}\r\n\r\n\t\t// sync any 'pin buttons'\r\n\t\tsyncPinBtns(pane, !s.isSliding);\r\n\r\n\t\t// update pane-state dimensions - BEFORE resizing content\r\n\t\t$.extend(s, elDims($P));\r\n\r\n\t\tif (state.initialized) {\r\n\t\t\t// resize resizer & toggler sizes for all panes\r\n\t\t\tsizeHandles();\r\n\t\t\t// resize content every time pane opens - to be sure\r\n\t\t\tsizeContent(pane, true); // true = remeasure headers/footers, even if 'pane.isMoving'\r\n\t\t}\r\n\r\n\t\tif (!skipCallback && (state.initialized || o.triggerEventsOnLoad) && $P.is(\":visible\")) {\r\n\t\t\t// onopen callback\r\n\t\t\t_runCallbacks(\"onopen_end\", pane);\r\n\t\t\t// onshow callback - TODO: should this be here?\r\n\t\t\tif (s.isShowing) _runCallbacks(\"onshow_end\", pane);\r\n\r\n\t\t\t// ALSO call onresize because layout-size *may* have changed while pane was closed\r\n\t\t\tif (state.initialized)\r\n\t\t\t\t_runCallbacks(\"onresize_end\", pane);\r\n\t\t}\r\n\r\n\t\t// TODO: Somehow sizePane(\"north\") is being called after this point???\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* slideOpen / slideClose / slideToggle\r\n\t*\r\n\t* Pass-though methods for sliding\r\n\t*/\r\n,\tslideOpen = function (evt_or_pane) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tevt\t\t= evtObj(evt_or_pane)\r\n\t\t,\tpane\t= evtPane.call(this, evt_or_pane)\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\tdelay\t= options[pane].slideDelay_open\r\n\t\t;\r\n\t\t// prevent event from triggering on NEW resizer binding created below\r\n\t\tif (evt) evt.stopImmediatePropagation();\r\n\r\n\t\tif (s.isClosed && evt && evt.type === \"mouseenter\" && delay > 0)\r\n\t\t\t// trigger = mouseenter - use a delay\r\n\t\t\ttimer.set(pane+\"_openSlider\", open_NOW, delay);\r\n\t\telse\r\n\t\t\topen_NOW(); // will unbind events if is already open\r\n\r\n\t\t/**\r\n\t\t* SUBROUTINE for timed open\r\n\t\t*/\r\n\t\tfunction open_NOW () {\r\n\t\t\tif (!s.isClosed) // skip if no longer closed!\r\n\t\t\t\tbindStopSlidingEvents(pane, true); // BIND trigger events to close sliding-pane\r\n\t\t\telse if (!s.isMoving)\r\n\t\t\t\topen(pane, true); // true = slide - open() will handle binding\r\n\t\t};\r\n\t}\r\n\r\n,\tslideClose = function (evt_or_pane) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tevt\t\t= evtObj(evt_or_pane)\r\n\t\t,\tpane\t= evtPane.call(this, evt_or_pane)\r\n\t\t,\to\t\t= options[pane]\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\tdelay\t= s.isMoving ? 1000 : 300 // MINIMUM delay - option may override\r\n\t\t;\r\n\t\tif (s.isClosed || s.isResizing)\r\n\t\t\treturn; // skip if already closed OR in process of resizing\r\n\t\telse if (o.slideTrigger_close === \"click\")\r\n\t\t\tclose_NOW(); // close immediately onClick\r\n\t\telse if (o.preventQuickSlideClose && s.isMoving)\r\n\t\t\treturn; // handle Chrome quick-close on slide-open\r\n\t\telse if (o.preventPrematureSlideClose && evt && $.layout.isMouseOverElem(evt, $Ps[pane]))\r\n\t\t\treturn; // handle incorrect mouseleave trigger, like when over a SELECT-list in IE\r\n\t\telse if (evt) // trigger = mouseleave - use a delay\r\n\t\t\t// 1 sec delay if 'opening', else .3 sec\r\n\t\t\ttimer.set(pane+\"_closeSlider\", close_NOW, max(o.slideDelay_close, delay));\r\n\t\telse // called programically\r\n\t\t\tclose_NOW();\r\n\r\n\t\t/**\r\n\t\t* SUBROUTINE for timed close\r\n\t\t*/\r\n\t\tfunction close_NOW () {\r\n\t\t\tif (s.isClosed) // skip 'close' if already closed!\r\n\t\t\t\tbindStopSlidingEvents(pane, false); // UNBIND trigger events - TODO: is this needed here?\r\n\t\t\telse if (!s.isMoving)\r\n\t\t\t\tclose(pane); // close will handle unbinding\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t* @param {string}\tpane\t\tThe pane being opened, ie: north, south, east, or west\r\n\t*/\r\n,\tslideToggle = function (evt_or_pane) {\r\n\t\tvar pane = evtPane.call(this, evt_or_pane);\r\n\t\ttoggle(pane, true);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Must set left/top on East/South panes so animation will work properly\r\n\t*\r\n\t* @param {string}\tpane\tThe pane to lock, 'east' or 'south' - any other is ignored!\r\n\t* @param {boolean}\tdoLock  true = set left/top, false = remove\r\n\t*/\r\n,\tlockPaneForFX = function (pane, doLock) {\r\n\t\tvar $P\t= $Ps[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t,\tz\t= options.zIndexes\r\n\t\t;\r\n\t\tif (doLock) {\r\n\t\t\t$P.css({ zIndex: z.pane_animate }); // overlay all elements during animation\r\n\t\t\tif (pane==\"south\")\r\n\t\t\t\t$P.css({ top: sC.insetTop + sC.innerHeight - $P.outerHeight() });\r\n\t\t\telse if (pane==\"east\")\r\n\t\t\t\t$P.css({ left: sC.insetLeft + sC.innerWidth - $P.outerWidth() });\r\n\t\t}\r\n\t\telse { // animation DONE - RESET CSS\r\n\t\t\t// TODO: see if this can be deleted. It causes a quick-close when sliding in Chrome\r\n\t\t\t$P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) });\r\n\t\t\tif (pane==\"south\")\r\n\t\t\t\t$P.css({ top: \"auto\" });\r\n\t\t\t// if pane is positioned 'off-screen', then DO NOT screw with it!\r\n\t\t\telse if (pane==\"east\" && !$P.css(\"left\").match(/\\-99999/))\r\n\t\t\t\t$P.css({ left: \"auto\" });\r\n\t\t\t// fix anti-aliasing in IE - only needed for animations that change opacity\r\n\t\t\tif (browser.msie && o.fxOpacityFix && o.fxName_open != \"slide\" && $P.css(\"filter\") && $P.css(\"opacity\") == 1)\r\n\t\t\t\t$P[0].style.removeAttribute('filter');\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Toggle sliding functionality of a specific pane on/off by adding removing 'slide open' trigger\r\n\t*\r\n\t* @see  open(), close()\r\n\t* @param {string}\tpane\tThe pane to enable/disable, 'north', 'south', etc.\r\n\t* @param {boolean}\tenable\tEnable or Disable sliding?\r\n\t*/\r\n,\tbindStartSlidingEvent = function (pane, enable) {\r\n\t\tvar o\t\t= options[pane]\r\n\t\t,\t$P\t\t= $Ps[pane]\r\n\t\t,\t$R\t\t= $Rs[pane]\r\n\t\t,\tevtName\t= o.slideTrigger_open.toLowerCase()\r\n\t\t;\r\n\t\tif (!$R || (enable && !o.slidable)) return;\r\n\r\n\t\t// make sure we have a valid event\r\n\t\tif (evtName.match(/mouseover/))\r\n\t\t\tevtName = o.slideTrigger_open = \"mouseenter\";\r\n\t\telse if (!evtName.match(/click|dblclick|mouseenter/)) \r\n\t\t\tevtName = o.slideTrigger_open = \"click\";\r\n\r\n\t\t$R\r\n\t\t\t// add or remove event\r\n\t\t\t[enable ? \"bind\" : \"unbind\"](evtName +'.'+ sID, slideOpen)\r\n\t\t\t// set the appropriate cursor & title/tip\r\n\t\t\t.css(\"cursor\", enable ? o.sliderCursor : \"default\")\r\n\t\t\t.attr(\"title\", enable ? o.sliderTip : \"\")\r\n\t\t;\r\n\t}\r\n\r\n\t/**\r\n\t* Add or remove 'mouseleave' events to 'slide close' when pane is 'sliding' open or closed\r\n\t* Also increases zIndex when pane is sliding open\r\n\t* See bindStartSlidingEvent for code to control 'slide open'\r\n\t*\r\n\t* @see  slideOpen(), slideClose()\r\n\t* @param {string}\tpane\tThe pane to process, 'north', 'south', etc.\r\n\t* @param {boolean}\tenable\tEnable or Disable events?\r\n\t*/\r\n,\tbindStopSlidingEvents = function (pane, enable) {\r\n\t\tvar\to\t\t= options[pane]\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\tc\t\t= _c[pane]\r\n\t\t,\tz\t\t= options.zIndexes\r\n\t\t,\tevtName\t= o.slideTrigger_close.toLowerCase()\r\n\t\t,\taction\t= (enable ? \"bind\" : \"unbind\")\r\n\t\t,\t$P\t\t= $Ps[pane]\r\n\t\t,\t$R\t\t= $Rs[pane]\r\n\t\t;\r\n\t\ts.isSliding = enable; // logic\r\n\t\ttimer.clear(pane+\"_closeSlider\"); // just in case\r\n\r\n\t\t// remove 'slideOpen' event from resizer\r\n\t\t// ALSO will raise the zIndex of the pane & resizer\r\n\t\tif (enable) bindStartSlidingEvent(pane, false);\r\n\r\n\t\t// RE/SET zIndex - increases when pane is sliding-open, resets to normal when not\r\n\t\t$P.css(\"zIndex\", enable ? z.pane_sliding : z.pane_normal);\r\n\t\t$R.css(\"zIndex\", enable ? z.pane_sliding+2 : z.resizer_normal); // NOTE: mask = pane_sliding+1\r\n\r\n\t\t// make sure we have a valid event\r\n\t\tif (!evtName.match(/click|mouseleave/))\r\n\t\t\tevtName = o.slideTrigger_close = \"mouseleave\"; // also catches 'mouseout'\r\n\r\n\t\t// add/remove slide triggers\r\n\t\t$R[action](evtName, slideClose); // base event on resize\r\n\t\t// need extra events for mouseleave\r\n\t\tif (evtName === \"mouseleave\") {\r\n\t\t\t// also close on pane.mouseleave\r\n\t\t\t$P[action](\"mouseleave.\"+ sID, slideClose);\r\n\t\t\t// cancel timer when mouse moves between 'pane' and 'resizer'\r\n\t\t\t$R[action](\"mouseenter.\"+ sID, cancelMouseOut);\r\n\t\t\t$P[action](\"mouseenter.\"+ sID, cancelMouseOut);\r\n\t\t}\r\n\r\n\t\tif (!enable)\r\n\t\t\ttimer.clear(pane+\"_closeSlider\");\r\n\t\telse if (evtName === \"click\" && !o.resizable) {\r\n\t\t\t// IF pane is not resizable (which already has a cursor and tip) \r\n\t\t\t// then set the a cursor & title/tip on resizer when sliding\r\n\t\t\t$R.css(\"cursor\", enable ? o.sliderCursor : \"default\");\r\n\t\t\t$R.attr(\"title\", enable ? o.togglerTip_open : \"\"); // use Toggler-tip, eg: \"Close Pane\"\r\n\t\t}\r\n\r\n\t\t// SUBROUTINE for mouseleave timer clearing\r\n\t\tfunction cancelMouseOut (evt) {\r\n\t\t\ttimer.clear(pane+\"_closeSlider\");\r\n\t\t\tevt.stopPropagation();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Hides/closes a pane if there is insufficient room - reverses this when there is room again\r\n\t* MUST have already called setSizeLimits() before calling this method\r\n\t*\r\n\t* @param {string}\tpane\t\t\t\t\tThe pane being resized\r\n\t* @param {boolean=}\t[isOpening=false]\t\tCalled from onOpen?\r\n\t* @param {boolean=}\t[skipCallback=false]\tShould the onresize callback be run?\r\n\t* @param {boolean=}\t[force=false]\r\n\t*/\r\n,\tmakePaneFit = function (pane, isOpening, skipCallback, force) {\r\n\t\tvar\r\n\t\t\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t,\tc\t= _c[pane]\r\n\t\t,\t$P\t= $Ps[pane]\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t,\tisSidePane \t= c.dir===\"vert\"\r\n\t\t,\thasRoom\t\t= false\r\n\t\t;\r\n\t\t// special handling for center & east/west panes\r\n\t\tif (pane === \"center\" || (isSidePane && s.noVerticalRoom)) {\r\n\t\t\t// see if there is enough room to display the pane\r\n\t\t\t// ERROR: hasRoom = s.minHeight <= s.maxHeight && (isSidePane || s.minWidth <= s.maxWidth);\r\n\t\t\thasRoom = (s.maxHeight >= 0);\r\n\t\t\tif (hasRoom && s.noRoom) { // previously hidden due to noRoom, so show now\r\n\t\t\t\t_showPane(pane);\r\n\t\t\t\tif ($R) $R.show();\r\n\t\t\t\ts.isVisible = true;\r\n\t\t\t\ts.noRoom = false;\r\n\t\t\t\tif (isSidePane) s.noVerticalRoom = false;\r\n\t\t\t\t_fixIframe(pane);\r\n\t\t\t}\r\n\t\t\telse if (!hasRoom && !s.noRoom) { // not currently hidden, so hide now\r\n\t\t\t\t_hidePane(pane);\r\n\t\t\t\tif ($R) $R.hide();\r\n\t\t\t\ts.isVisible = false;\r\n\t\t\t\ts.noRoom = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// see if there is enough room to fit the border-pane\r\n\t\tif (pane === \"center\") {\r\n\t\t\t// ignore center in this block\r\n\t\t}\r\n\t\telse if (s.minSize <= s.maxSize) { // pane CAN fit\r\n\t\t\thasRoom = true;\r\n\t\t\tif (s.size > s.maxSize) // pane is too big - shrink it\r\n\t\t\t\tsizePane(pane, s.maxSize, skipCallback, force, true); // true = noAnimation\r\n\t\t\telse if (s.size < s.minSize) // pane is too small - enlarge it\r\n\t\t\t\tsizePane(pane, s.minSize, skipCallback, force, true);\r\n\t\t\t// need s.isVisible because new pseudoClose method keeps pane visible, but off-screen\r\n\t\t\telse if ($R && s.isVisible && $P.is(\":visible\")) {\r\n\t\t\t\t// make sure resizer-bar is positioned correctly\r\n\t\t\t\t// handles situation where nested layout was 'hidden' when initialized\r\n\t\t\t\tvar\tside = c.side.toLowerCase()\r\n\t\t\t\t,\tpos  = s.size + sC[\"inset\"+ c.side]\r\n\t\t\t\t;\r\n\t\t\t\tif ($.layout.cssNum($R, side) != pos) $R.css( side, pos );\r\n\t\t\t}\r\n\r\n\t\t\t// if was previously hidden due to noRoom, then RESET because NOW there is room\r\n\t\t\tif (s.noRoom) {\r\n\t\t\t\t// s.noRoom state will be set by open or show\r\n\t\t\t\tif (s.wasOpen && o.closable) {\r\n\t\t\t\t\tif (o.autoReopen)\r\n\t\t\t\t\t\topen(pane, false, true, true); // true = noAnimation, true = noAlert\r\n\t\t\t\t\telse // leave the pane closed, so just update state\r\n\t\t\t\t\t\ts.noRoom = false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tshow(pane, s.wasOpen, true, true); // true = noAnimation, true = noAlert\r\n\t\t\t}\r\n\t\t}\r\n\t\telse { // !hasRoom - pane CANNOT fit\r\n\t\t\tif (!s.noRoom) { // pane not set as noRoom yet, so hide or close it now...\r\n\t\t\t\ts.noRoom = true; // update state\r\n\t\t\t\ts.wasOpen = !s.isClosed && !s.isSliding;\r\n\t\t\t\tif (s.isClosed){} // SKIP\r\n\t\t\t\telse if (o.closable) // 'close' if possible\r\n\t\t\t\t\tclose(pane, true, true); // true = force, true = noAnimation\r\n\t\t\t\telse // 'hide' pane if cannot just be closed\r\n\t\t\t\t\thide(pane, true); // true = noAnimation\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* sizePane / manualSizePane\r\n\t* sizePane is called only by internal methods whenever a pane needs to be resized\r\n\t* manualSizePane is an exposed flow-through method allowing extra code when pane is 'manually resized'\r\n\t*\r\n\t* @param {string}\tpane\t\t\t\t\tThe pane being resized\r\n\t* @param {number}\tsize\t\t\t\t\tThe *desired* new size for this pane - will be validated\r\n\t* @param {boolean=}\t[skipCallback=false]\tShould the onresize callback be run?\r\n\t* @param {boolean=}\t[noAnimation=false]\r\n\t*/\r\n,\tmanualSizePane = function (evt_or_pane, size, skipCallback, noAnimation) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\to\t= options[pane]\r\n\t\t,\ts\t= state[pane]\r\n\t\t//\tif resizing callbacks have been delayed and resizing is now DONE, force resizing to complete...\r\n\t\t,\tforceResize = o.livePaneResizing && !s.isResizing\r\n\t\t;\r\n\t\t// ANY call to manualSizePane disables autoResize - ie, percentage sizing\r\n\t\to.autoResize = false;\r\n\t\t// flow-through...\r\n\t\tsizePane(pane, size, skipCallback, forceResize, noAnimation); // will animate resize if option enabled\r\n\t}\r\n\r\n\t/**\r\n\t* @param {string}\tpane\t\t\t\t\tThe pane being resized\r\n\t* @param {number}\tsize\t\t\t\t\tThe *desired* new size for this pane - will be validated\r\n\t* @param {boolean=}\t[skipCallback=false]\tShould the onresize callback be run?\r\n\t* @param {boolean=}\t[force=false]\t\t\tForce resizing even if does not seem necessary\r\n\t* @param {boolean=}\t[noAnimation=false]\r\n\t*/\r\n,\tsizePane = function (evt_or_pane, size, skipCallback, force, noAnimation) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane\t= evtPane.call(this, evt_or_pane) // probably NEVER called from event?\r\n\t\t,\to\t\t= options[pane]\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\t$P\t\t= $Ps[pane]\r\n\t\t,\t$R\t\t= $Rs[pane]\r\n\t\t,\tside\t= _c[pane].side.toLowerCase()\r\n\t\t,\tdimName\t= _c[pane].sizeType.toLowerCase()\r\n\t\t,\tinset\t= \"inset\"+ _c[pane].side\r\n\t\t,\tskipResizeWhileDragging = s.isResizing && !o.triggerEventsDuringLiveResize\r\n\t\t,\tdoFX\t= noAnimation !== true && o.animatePaneSizing\r\n\t\t,\toldSize, newSize\r\n\t\t;\r\n\t\t// QUEUE in case another action/animation is in progress\r\n\t\t$N.queue(function( queueNext ){\r\n\t\t\t// calculate 'current' min/max sizes\r\n\t\t\tsetSizeLimits(pane); // update pane-state\r\n\t\t\toldSize = s.size;\r\n\t\t\tsize = _parseSize(pane, size); // handle percentages & auto\r\n\t\t\tsize = max(size, _parseSize(pane, o.minSize));\r\n\t\t\tsize = min(size, s.maxSize);\r\n\t\t\tif (size < s.minSize) { // not enough room for pane!\r\n\t\t\t\tqueueNext(); // call before makePaneFit() because it needs the queue free\r\n\t\t\t\tmakePaneFit(pane, false, skipCallback);\t// will hide or close pane\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// IF newSize is same as oldSize, then nothing to do - abort\r\n\t\t\tif (!force && size === oldSize)\r\n\t\t\t\treturn queueNext();\r\n\r\n\t\t\t// onresize_start callback CANNOT cancel resizing because this would break the layout!\r\n\t\t\tif (!skipCallback && state.initialized && s.isVisible)\r\n\t\t\t\t_runCallbacks(\"onresize_start\", pane);\r\n\r\n\t\t\t// resize the pane, and make sure its visible\r\n\t\t\tnewSize = cssSize(pane, size);\r\n\r\n\t\t\tif (doFX && $P.is(\":visible\")) { // ANIMATE\r\n\t\t\t\tvar fx\t\t= $.layout.effects.size[pane] || $.layout.effects.size.all\r\n\t\t\t\t,\teasing\t= o.fxSettings_size.easing || fx.easing\r\n\t\t\t\t,\tz\t\t= options.zIndexes\r\n\t\t\t\t,\tprops\t= {};\r\n\t\t\t\tprops[ dimName ] = newSize +'px';\r\n\t\t\t\ts.isMoving = true;\r\n\t\t\t\t// overlay all elements during animation\r\n\t\t\t\t$P.css({ zIndex: z.pane_animate })\r\n\t\t\t\t  .show().animate( props, o.fxSpeed_size, easing, function(){\r\n\t\t\t\t\t// reset zIndex after animation\r\n\t\t\t\t\t$P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) });\r\n\t\t\t\t\ts.isMoving = false;\r\n\t\t\t\t\tsizePane_2(); // continue\r\n\t\t\t\t\tqueueNext();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse { // no animation\r\n\t\t\t\t$P.css( dimName, newSize );\t// resize pane\r\n\t\t\t\t// if pane is visible, then \r\n\t\t\t\tif ($P.is(\":visible\"))\r\n\t\t\t\t\tsizePane_2(); // continue\r\n\t\t\t\telse {\r\n\t\t\t\t\t// pane is NOT VISIBLE, so just update state data...\r\n\t\t\t\t\t// when pane is *next opened*, it will have the new size\r\n\t\t\t\t\ts.size = size;\t\t\t\t// update state.size\r\n\t\t\t\t\t$.extend(s, elDims($P));\t// update state dimensions\r\n\t\t\t\t}\r\n\t\t\t\tqueueNext();\r\n\t\t\t};\r\n\r\n\t\t});\r\n\r\n\t\t// SUBROUTINE\r\n\t\tfunction sizePane_2 () {\r\n\t\t\t/*\tPanes are sometimes not sized precisely in some browsers!?\r\n\t\t\t *\tThis code will resize the pane up to 3 times to nudge the pane to the correct size\r\n\t\t\t */\r\n\t\t\tvar\tactual\t= dimName==='width' ? $P.outerWidth() : $P.outerHeight()\r\n\t\t\t,\ttries\t= [{\r\n\t\t\t\t\t\t   \tpane:\t\tpane\r\n\t\t\t\t\t\t,\tcount:\t\t1\r\n\t\t\t\t\t\t,\ttarget:\t\tsize\r\n\t\t\t\t\t\t,\tactual:\t\tactual\r\n\t\t\t\t\t\t,\tcorrect:\t(size === actual)\r\n\t\t\t\t\t\t,\tattempt:\tsize\r\n\t\t\t\t\t\t,\tcssSize:\tnewSize\r\n\t\t\t\t\t\t}]\r\n\t\t\t,\tlastTry = tries[0]\r\n\t\t\t,\tmsg\t\t= 'Inaccurate size after resizing the '+ pane +'-pane.'\r\n\t\t\t;\r\n\t\t\twhile ( !lastTry.correct ) {\r\n\t\t\t\tthisTry = { pane: pane, count: lastTry.count+1, target: size };\r\n\r\n\t\t\t\tif (lastTry.actual > size)\r\n\t\t\t\t\tthisTry.attempt = max(0, lastTry.attempt - (lastTry.actual - size));\r\n\t\t\t\telse // lastTry.actual < size\r\n\t\t\t\t\tthisTry.attempt = max(0, lastTry.attempt + (size - lastTry.actual));\r\n\r\n\t\t\t\tthisTry.cssSize = cssSize(pane, thisTry.attempt);\r\n\t\t\t\t$P.css( dimName, thisTry.cssSize );\r\n\r\n\t\t\t\tthisTry.actual\t= dimName=='width' ? $P.outerWidth() : $P.outerHeight();\r\n\t\t\t\tthisTry.correct\t= (size === thisTry.actual);\r\n\r\n\t\t\t\t// if showDebugMessages, log attempts and alert the user of this *non-fatal error*\r\n\t\t\t\tif (options.showDebugMessages) {\r\n\t\t\t\t\tif ( tries.length === 1) {\r\n\t\t\t\t\t\t_log(msg, false);\r\n\t\t\t\t\t\t_log(lastTry, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_log(thisTry, false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// after 4 tries, is as close as its gonna get!\r\n\t\t\t\tif (tries.length > 3) break;\r\n\r\n\t\t\t\ttries.push( thisTry );\r\n\t\t\t\tlastTry = tries[ tries.length - 1 ];\r\n\t\t\t}\r\n\t\t\t// END TESTING CODE\r\n\r\n\t\t\t// update pane-state dimensions\r\n\t\t\ts.size\t= size;\r\n\t\t\t$.extend(s, elDims($P));\r\n\r\n\t\t\tif (s.isVisible && $P.is(\":visible\")) {\r\n\t\t\t\t// reposition the resizer-bar\r\n\t\t\t\tif ($R) $R.css( side, size + sC[inset] );\r\n\t\t\t\t// resize the content-div\r\n\t\t\t\tsizeContent(pane);\r\n\t\t\t}\r\n\r\n\t\t\tif (!skipCallback && !skipResizeWhileDragging && state.initialized && s.isVisible)\r\n\t\t\t\t_runCallbacks(\"onresize_end\", pane);\r\n\r\n\t\t\t// resize all the adjacent panes, and adjust their toggler buttons\r\n\t\t\t// when skipCallback passed, it means the controlling method will handle 'other panes'\r\n\t\t\tif (!skipCallback) {\r\n\t\t\t\t// also no callback if live-resize is in progress and NOT triggerEventsDuringLiveResize\r\n\t\t\t\tif (!s.isSliding) sizeMidPanes(_c[pane].dir==\"horz\" ? \"\" : \"center\", skipResizeWhileDragging, force);\r\n\t\t\t\tsizeHandles();\r\n\t\t\t}\r\n\r\n\t\t\t// if opposite-pane was autoClosed, see if it can be autoOpened now\r\n\t\t\tvar altPane = _c.oppositeEdge[pane];\r\n\t\t\tif (size < oldSize && state[ altPane ].noRoom) {\r\n\t\t\t\tsetSizeLimits( altPane );\r\n\t\t\t\tmakePaneFit( altPane, false, skipCallback );\r\n\t\t\t}\r\n\r\n\t\t\t// DEBUG - ALERT user/developer so they know there was a sizing problem\r\n\t\t\tif (options.showDebugMessages && tries.length > 1)\r\n\t\t\t\t_log(msg +'\\nSee the Error Console for details.', true);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* @see  initPanes(), sizePane(), resizeAll(), open(), close(), hide()\r\n\t* @param {string}\tpanes\t\t\t\t\tThe pane(s) being resized, comma-delmited string\r\n\t* @param {boolean=}\t[skipCallback=false]\tShould the onresize callback be run?\r\n\t* @param {boolean=}\t[force=false]\r\n\t*/\r\n,\tsizeMidPanes = function (panes, skipCallback, force) {\r\n\t\tpanes = (panes ? panes : \"east,west,center\").split(\",\");\r\n\r\n\t\t$.each(panes, function (i, pane) {\r\n\t\t\tif (!$Ps[pane]) return; // NO PANE - skip\r\n\t\t\tvar \r\n\t\t\t\to\t\t= options[pane]\r\n\t\t\t,\ts\t\t= state[pane]\r\n\t\t\t,\t$P\t\t= $Ps[pane]\r\n\t\t\t,\t$R\t\t= $Rs[pane]\r\n\t\t\t,\tisCenter= (pane==\"center\")\r\n\t\t\t,\thasRoom\t= true\r\n\t\t\t,\tCSS\t\t= {}\r\n\t\t\t,\tnewCenter\t= calcNewCenterPaneDims()\r\n\t\t\t;\r\n\t\t\t// update pane-state dimensions\r\n\t\t\t$.extend(s, elDims($P));\r\n\r\n\t\t\tif (pane === \"center\") {\r\n\t\t\t\tif (!force && s.isVisible && newCenter.width === s.outerWidth && newCenter.height === s.outerHeight)\r\n\t\t\t\t\treturn true; // SKIP - pane already the correct size\r\n\t\t\t\t// set state for makePaneFit() logic\r\n\t\t\t\t$.extend(s, cssMinDims(pane), {\r\n\t\t\t\t\tmaxWidth:\tnewCenter.width\r\n\t\t\t\t,\tmaxHeight:\tnewCenter.height\r\n\t\t\t\t});\r\n\t\t\t\tCSS = newCenter;\r\n\t\t\t\t// convert OUTER width/height to CSS width/height \r\n\t\t\t\tCSS.width\t= cssW($P, CSS.width);\r\n\t\t\t\t// NEW - allow pane to extend 'below' visible area rather than hide it\r\n\t\t\t\tCSS.height\t= cssH($P, CSS.height);\r\n\t\t\t\thasRoom\t\t= CSS.width >= 0 && CSS.height >= 0; // height >= 0 = ALWAYS TRUE NOW\r\n\t\t\t\t// during layout init, try to shrink east/west panes to make room for center\r\n\t\t\t\tif (!state.initialized && o.minWidth > s.outerWidth) {\r\n\t\t\t\t\tvar\r\n\t\t\t\t\t\treqPx\t= o.minWidth - s.outerWidth\r\n\t\t\t\t\t,\tminE\t= options.east.minSize || 0\r\n\t\t\t\t\t,\tminW\t= options.west.minSize || 0\r\n\t\t\t\t\t,\tsizeE\t= state.east.size\r\n\t\t\t\t\t,\tsizeW\t= state.west.size\r\n\t\t\t\t\t,\tnewE\t= sizeE\r\n\t\t\t\t\t,\tnewW\t= sizeW\r\n\t\t\t\t\t;\r\n\t\t\t\t\tif (reqPx > 0 && state.east.isVisible && sizeE > minE) {\r\n\t\t\t\t\t\tnewE = max( sizeE-minE, sizeE-reqPx );\r\n\t\t\t\t\t\treqPx -= sizeE-newE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (reqPx > 0 && state.west.isVisible && sizeW > minW) {\r\n\t\t\t\t\t\tnewW = max( sizeW-minW, sizeW-reqPx );\r\n\t\t\t\t\t\treqPx -= sizeW-newW;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// IF we found enough extra space, then resize the border panes as calculated\r\n\t\t\t\t\tif (reqPx === 0) {\r\n\t\t\t\t\t\tif (sizeE != minE)\r\n\t\t\t\t\t\t\tsizePane('east', newE, true, force, true); // true = skipCallback/noAnimation - initPanes will handle when done\r\n\t\t\t\t\t\tif (sizeW != minW)\r\n\t\t\t\t\t\t\tsizePane('west', newW, true, force, true);\r\n\t\t\t\t\t\t// now start over!\r\n\t\t\t\t\t\tsizeMidPanes('center', skipCallback, force);\r\n\t\t\t\t\t\treturn; // abort this loop\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse { // for east and west, set only the height, which is same as center height\r\n\t\t\t\t// set state.min/maxWidth/Height for makePaneFit() logic\r\n\t\t\t\tif (s.isVisible && !s.noVerticalRoom)\r\n\t\t\t\t\t$.extend(s, elDims($P), cssMinDims(pane))\r\n\t\t\t\tif (!force && !s.noVerticalRoom && newCenter.height === s.outerHeight)\r\n\t\t\t\t\treturn true; // SKIP - pane already the correct size\r\n\t\t\t\t// east/west have same top, bottom & height as center\r\n\t\t\t\tCSS.top\t\t= newCenter.top;\r\n\t\t\t\tCSS.bottom\t= newCenter.bottom;\r\n\t\t\t\t// NEW - allow pane to extend 'below' visible area rather than hide it\r\n\t\t\t\tCSS.height\t= cssH($P, newCenter.height);\r\n\t\t\t\ts.maxHeight\t= CSS.height;\r\n\t\t\t\thasRoom\t\t= (s.maxHeight >= 0); // ALWAYS TRUE NOW\r\n\t\t\t\tif (!hasRoom) s.noVerticalRoom = true; // makePaneFit() logic\r\n\t\t\t}\r\n\r\n\t\t\tif (hasRoom) {\r\n\t\t\t\t// resizeAll passes skipCallback because it triggers callbacks after ALL panes are resized\r\n\t\t\t\tif (!skipCallback && state.initialized)\r\n\t\t\t\t\t_runCallbacks(\"onresize_start\", pane);\r\n\r\n\t\t\t\t$P.css(CSS); // apply the CSS to pane\r\n\t\t\t\tsizeHandles(pane); // also update resizer length\r\n\t\t\t\tif (s.noRoom && !s.isClosed && !s.isHidden)\r\n\t\t\t\t\tmakePaneFit(pane); // will re-open/show auto-closed/hidden pane\r\n\t\t\t\tif (s.isVisible) {\r\n\t\t\t\t\t$.extend(s, elDims($P)); // update pane dimensions\r\n\t\t\t\t\tif (state.initialized) sizeContent(pane); // also resize the contents, if exists\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (!s.noRoom && s.isVisible) // no room for pane\r\n\t\t\t\tmakePaneFit(pane); // will hide or close pane\r\n\r\n\t\t\tif (!s.isVisible)\r\n\t\t\t\treturn true; // DONE - next pane\r\n\r\n\t\t\t/*\r\n\t\t\t* Extra CSS for IE6 or IE7 in Quirks-mode - add 'width' to NORTH/SOUTH panes\r\n\t\t\t* Normally these panes have only 'left' & 'right' positions so pane auto-sizes\r\n\t\t\t* ALSO required when pane is an IFRAME because will NOT default to 'full width'\r\n\t\t\t*/\r\n\t\t\tif (pane === \"center\") { // finished processing midPanes\r\n\t\t\t\tvar b = $.layout.browser;\r\n\t\t\t\tvar fix = b.isIE6 || (b.msie && !$.support.boxModel);\r\n\t\t\t\tif ($Ps.north && (fix || state.north.tagName==\"IFRAME\")) \r\n\t\t\t\t\t$Ps.north.css(\"width\", cssW($Ps.north, sC.innerWidth));\r\n\t\t\t\tif ($Ps.south && (fix || state.south.tagName==\"IFRAME\"))\r\n\t\t\t\t\t$Ps.south.css(\"width\", cssW($Ps.south, sC.innerWidth));\r\n\t\t\t}\r\n\r\n\t\t\t// resizeAll passes skipCallback because it triggers callbacks after ALL panes are resized\r\n\t\t\tif (!skipCallback && state.initialized)\r\n\t\t\t\t_runCallbacks(\"onresize_end\", pane);\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* @see  window.onresize(), callbacks or custom code\r\n\t*/\r\n,\tresizeAll = function () {\r\n\t\tif (!state.initialized) {\r\n\t\t\t_initLayoutElements();\r\n\t\t\treturn; // no need to resize since we just initialized!\r\n\t\t}\r\n\t\tvar\toldW\t= sC.innerWidth\r\n\t\t,\toldH\t= sC.innerHeight\r\n\t\t;\r\n\t\t// cannot size layout when 'container' is hidden or collapsed\r\n\t\tif (!$N.is(\":visible:\") ) return;\r\n\t\t$.extend( state.container, elDims( $N ) ); // UPDATE container dimensions\r\n\t\tif (!sC.outerHeight) return;\r\n\r\n\t\t// onresizeall_start will CANCEL resizing if returns false\r\n\t\t// state.container has already been set, so user can access this info for calcuations\r\n\t\tif (false === _runCallbacks(\"onresizeall_start\")) return false;\r\n\r\n\t\tvar\t// see if container is now 'smaller' than before\r\n\t\t\tshrunkH\t= (sC.innerHeight < oldH)\r\n\t\t,\tshrunkW\t= (sC.innerWidth < oldW)\r\n\t\t,\t$P, o, s, dir\r\n\t\t;\r\n\t\t// NOTE special order for sizing: S-N-E-W\r\n\t\t$.each([\"south\",\"north\",\"east\",\"west\"], function (i, pane) {\r\n\t\t\tif (!$Ps[pane]) return; // no pane - SKIP\r\n\t\t\ts\t= state[pane];\r\n\t\t\to\t= options[pane];\r\n\t\t\tdir\t= _c[pane].dir;\r\n\r\n\t\t\tif (o.autoResize && s.size != o.size) // resize pane to original size set in options\r\n\t\t\t\tsizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize/noAnimation\r\n\t\t\telse {\r\n\t\t\t\tsetSizeLimits(pane);\r\n\t\t\t\tmakePaneFit(pane, false, true, true); // true=skipCallback/forceResize\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tsizeMidPanes(\"\", true, true); // true=skipCallback, true=forceResize\r\n\t\tsizeHandles(); // reposition the toggler elements\r\n\r\n\t\t// trigger all individual pane callbacks AFTER layout has finished resizing\r\n\t\to = options; // reuse alias\r\n\t\t$.each(_c.allPanes, function (i, pane) {\r\n\t\t\t$P = $Ps[pane];\r\n\t\t\tif (!$P) return; // SKIP\r\n\t\t\tif (state[pane].isVisible) // undefined for non-existent panes\r\n\t\t\t\t_runCallbacks(\"onresize_end\", pane); // callback - if exists\r\n\t\t});\r\n\r\n\t\t_runCallbacks(\"onresizeall_end\");\r\n\t\t//_triggerLayoutEvent(pane, 'resizeall');\r\n\t}\r\n\r\n\t/**\r\n\t* Whenever a pane resizes or opens that has a nested layout, trigger resizeAll\r\n\t*\r\n\t* @param {string}\tpane\t\tThe pane just resized or opened\r\n\t*/\r\n,\tresizeChildLayout = function (evt_or_pane) {\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane);\r\n\t\tif (!options[pane].resizeChildLayout) return;\r\n\t\tvar\t$P\t= $Ps[pane]\r\n\t\t,\t$C\t= $Cs[pane]\r\n\t\t,\td\t= \"layout\"\r\n\t\t,\tP\t= Instance[pane]\r\n\t\t,\tL\t= children[pane]\r\n\t\t;\r\n\t\t// user may have manually set EITHER instance pointer, so handle that\r\n\t\tif (P.child && !L) {\r\n\t\t\t// have to reverse the pointers!\r\n\t\t\tvar el = P.child.container;\r\n\t\t\tL = children[pane] = (el ? el.data(d) : 0) || null; // set pointer _directly_ to layout instance\r\n\t\t}\r\n\r\n\t\t// if a layout-pointer exists, see if child has been destroyed\r\n\t\tif (L && L.destroyed)\r\n\t\t\tL = children[pane] = null; // clear child pointers\r\n\t\t// no child layout pointer is set - see if there is a child layout NOW\r\n\t\tif (!L)\tL = children[pane] = $P.data(d) || ($C ? $C.data(d) : 0) || null; // set/update child pointers\r\n\r\n\t\t// ALWAYS refresh the pane.child alias\r\n\t\tP.child = children[pane];\r\n\r\n\t\tif (L) L.resizeAll();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* IF pane has a content-div, then resize all elements inside pane to fit pane-height\r\n\t*\r\n\t* @param {string=}\t[panes=\"\"]\t\tThe pane(s) being resized\r\n\t* @param {boolean=}\t[remeasure=false]\tShould the content (header/footer) be remeasured?\r\n\t*/\r\n,\tsizeContent = function (evt_or_panes, remeasure) {\r\n\t\tif (!isInitialized()) return;\r\n\r\n\t\tvar panes = evtPane.call(this, evt_or_panes);\r\n\t\tpanes = panes ? panes.split(\",\") : _c.allPanes;\r\n\r\n\t\t$.each(panes, function (idx, pane) {\r\n\t\t\tvar\r\n\t\t\t\t$P\t= $Ps[pane]\r\n\t\t\t,\t$C\t= $Cs[pane]\r\n\t\t\t,\to\t= options[pane]\r\n\t\t\t,\ts\t= state[pane]\r\n\t\t\t,\tm\t= s.content // m = measurements\r\n\t\t\t;\r\n\t\t\tif (!$P || !$C || !$P.is(\":visible\")) return true; // NOT VISIBLE - skip\r\n\r\n\t\t\t// if content-element was REMOVED, update OR remove the pointer\r\n\t\t\tif (!$C.length) {\r\n\t\t\t\tinitContent(pane, false);\t// false = do NOT sizeContent() - already there!\r\n\t\t\t\tif (!$C) return;\t\t\t// no replacement element found - pointer have been removed\r\n\t\t\t}\r\n\r\n\t\t\t// onsizecontent_start will CANCEL resizing if returns false\r\n\t\t\tif (false === _runCallbacks(\"onsizecontent_start\", pane)) return;\r\n\r\n\t\t\t// skip re-measuring offsets if live-resizing\r\n\t\t\tif ((!s.isMoving && !s.isResizing) || o.liveContentResizing || remeasure || m.top == undefined) {\r\n\t\t\t\t_measure();\r\n\t\t\t\t// if any footers are below pane-bottom, they may not measure correctly,\r\n\t\t\t\t// so allow pane overflow and re-measure\r\n\t\t\t\tif (m.hiddenFooters > 0 && $P.css(\"overflow\") === \"hidden\") {\r\n\t\t\t\t\t$P.css(\"overflow\", \"visible\");\r\n\t\t\t\t\t_measure(); // remeasure while overflowing\r\n\t\t\t\t\t$P.css(\"overflow\", \"hidden\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// NOTE: spaceAbove/Below *includes* the pane paddingTop/Bottom, but not pane.borders\r\n\t\t\tvar newH = s.innerHeight - (m.spaceAbove - s.css.paddingTop) - (m.spaceBelow - s.css.paddingBottom);\r\n\r\n\t\t\tif (!$C.is(\":visible\") || m.height != newH) {\r\n\t\t\t\t// size the Content element to fit new pane-size - will autoHide if not enough room\r\n\t\t\t\tsetOuterHeight($C, newH, true); // true=autoHide\r\n\t\t\t\tm.height = newH; // save new height\r\n\t\t\t};\r\n\r\n\t\t\tif (state.initialized)\r\n\t\t\t\t_runCallbacks(\"onsizecontent_end\", pane);\r\n\r\n\t\t\tfunction _below ($E) {\r\n\t\t\t\treturn max(s.css.paddingBottom, (parseInt($E.css(\"marginBottom\"), 10) || 0));\r\n\t\t\t};\r\n\r\n\t\t\tfunction _measure () {\r\n\t\t\t\tvar\r\n\t\t\t\t\tignore\t= options[pane].contentIgnoreSelector\r\n\t\t\t\t,\t$Fs\t\t= $C.nextAll().not(ignore || ':lt(0)') // not :lt(0) = ALL\r\n\t\t\t\t,\t$Fs_vis\t= $Fs.filter(':visible')\r\n\t\t\t\t,\t$F\t\t= $Fs_vis.filter(':last')\r\n\t\t\t\t;\r\n\t\t\t\tm = {\r\n\t\t\t\t\ttop:\t\t\t$C[0].offsetTop\r\n\t\t\t\t,\theight:\t\t\t$C.outerHeight()\r\n\t\t\t\t,\tnumFooters:\t\t$Fs.length\r\n\t\t\t\t,\thiddenFooters:\t$Fs.length - $Fs_vis.length\r\n\t\t\t\t,\tspaceBelow:\t\t0 // correct if no content footer ($E)\r\n\t\t\t\t}\r\n\t\t\t\t\tm.spaceAbove\t= m.top; // just for state - not used in calc\r\n\t\t\t\t\tm.bottom\t\t= m.top + m.height;\r\n\t\t\t\tif ($F.length)\r\n\t\t\t\t\t//spaceBelow = (LastFooter.top + LastFooter.height) [footerBottom] - Content.bottom + max(LastFooter.marginBottom, pane.paddingBotom)\r\n\t\t\t\t\tm.spaceBelow = ($F[0].offsetTop + $F.outerHeight()) - m.bottom + _below($F);\r\n\t\t\t\telse // no footer - check marginBottom on Content element itself\r\n\t\t\t\t\tm.spaceBelow = _below($C);\r\n\t\t\t};\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Called every time a pane is opened, closed, or resized to slide the togglers to 'center' and adjust their length if necessary\r\n\t*\r\n\t* @see  initHandles(), open(), close(), resizeAll()\r\n\t* @param {string=}\t[panes=\"\"]\t\tThe pane(s) being resized\r\n\t*/\r\n,\tsizeHandles = function (evt_or_panes) {\r\n\t\tvar panes = evtPane.call(this, evt_or_panes)\r\n\t\tpanes = panes ? panes.split(\",\") : _c.borderPanes;\r\n\r\n\t\t$.each(panes, function (i, pane) {\r\n\t\t\tvar \r\n\t\t\t\to\t= options[pane]\r\n\t\t\t,\ts\t= state[pane]\r\n\t\t\t,\t$P\t= $Ps[pane]\r\n\t\t\t,\t$R\t= $Rs[pane]\r\n\t\t\t,\t$T\t= $Ts[pane]\r\n\t\t\t,\t$TC\r\n\t\t\t;\r\n\t\t\tif (!$P || !$R) return;\r\n\r\n\t\t\tvar\r\n\t\t\t\tdir\t\t\t= _c[pane].dir\r\n\t\t\t,\t_state\t\t= (s.isClosed ? \"_closed\" : \"_open\")\r\n\t\t\t,\tspacing\t\t= o[\"spacing\"+ _state]\r\n\t\t\t,\ttogAlign\t= o[\"togglerAlign\"+ _state]\r\n\t\t\t,\ttogLen\t\t= o[\"togglerLength\"+ _state]\r\n\t\t\t,\tpaneLen\r\n\t\t\t,\tleft\r\n\t\t\t,\toffset\r\n\t\t\t,\tCSS = {}\r\n\t\t\t;\r\n\r\n\t\t\tif (spacing === 0) {\r\n\t\t\t\t$R.hide();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\telse if (!s.noRoom && !s.isHidden) // skip if resizer was hidden for any reason\r\n\t\t\t\t$R.show(); // in case was previously hidden\r\n\r\n\t\t\t// Resizer Bar is ALWAYS same width/height of pane it is attached to\r\n\t\t\tif (dir === \"horz\") { // north/south\r\n\t\t\t\t//paneLen = $P.outerWidth(); // s.outerWidth || \r\n\t\t\t\tpaneLen = sC.innerWidth; // handle offscreen-panes\r\n\t\t\t\ts.resizerLength = paneLen;\r\n\t\t\t\tleft = $.layout.cssNum($P, \"left\")\r\n\t\t\t\t$R.css({\r\n\t\t\t\t\twidth:\tcssW($R, paneLen) // account for borders & padding\r\n\t\t\t\t,\theight:\tcssH($R, spacing) // ditto\r\n\t\t\t\t,\tleft:\tleft > -9999 ? left : sC.insetLeft // handle offscreen-panes\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse { // east/west\r\n\t\t\t\tpaneLen = $P.outerHeight(); // s.outerHeight || \r\n\t\t\t\ts.resizerLength = paneLen;\r\n\t\t\t\t$R.css({\r\n\t\t\t\t\theight:\tcssH($R, paneLen) // account for borders & padding\r\n\t\t\t\t,\twidth:\tcssW($R, spacing) // ditto\r\n\t\t\t\t,\ttop:\tsC.insetTop + getPaneSize(\"north\", true) // TODO: what if no North pane?\r\n\t\t\t\t//,\ttop:\t$.layout.cssNum($Ps[\"center\"], \"top\")\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// remove hover classes\r\n\t\t\tremoveHover( o, $R );\r\n\r\n\t\t\tif ($T) {\r\n\t\t\t\tif (togLen === 0 || (s.isSliding && o.hideTogglerOnSlide)) {\r\n\t\t\t\t\t$T.hide(); // always HIDE the toggler when 'sliding'\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\t$T.show(); // in case was previously hidden\r\n\r\n\t\t\t\tif (!(togLen > 0) || togLen === \"100%\" || togLen > paneLen) {\r\n\t\t\t\t\ttogLen = paneLen;\r\n\t\t\t\t\toffset = 0;\r\n\t\t\t\t}\r\n\t\t\t\telse { // calculate 'offset' based on options.PANE.togglerAlign_open/closed\r\n\t\t\t\t\tif (isStr(togAlign)) {\r\n\t\t\t\t\t\tswitch (togAlign) {\r\n\t\t\t\t\t\t\tcase \"top\":\r\n\t\t\t\t\t\t\tcase \"left\":\toffset = 0;\r\n\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase \"bottom\":\r\n\t\t\t\t\t\t\tcase \"right\":\toffset = paneLen - togLen;\r\n\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase \"middle\":\r\n\t\t\t\t\t\t\tcase \"center\":\r\n\t\t\t\t\t\t\tdefault:\t\toffset = round((paneLen - togLen) / 2); // 'default' catches typos\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse { // togAlign = number\r\n\t\t\t\t\t\tvar x = parseInt(togAlign, 10); //\r\n\t\t\t\t\t\tif (togAlign >= 0) offset = x;\r\n\t\t\t\t\t\telse offset = paneLen - togLen + x; // NOTE: x is negative!\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dir === \"horz\") { // north/south\r\n\t\t\t\t\tvar width = cssW($T, togLen);\r\n\t\t\t\t\t$T.css({\r\n\t\t\t\t\t\twidth:\twidth  // account for borders & padding\r\n\t\t\t\t\t,\theight:\tcssH($T, spacing) // ditto\r\n\t\t\t\t\t,\tleft:\toffset // TODO: VERIFY that toggler  positions correctly for ALL values\r\n\t\t\t\t\t,\ttop:\t0\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// CENTER the toggler content SPAN\r\n\t\t\t\t\t$T.children(\".content\").each(function(){\r\n\t\t\t\t\t\t$TC = $(this);\r\n\t\t\t\t\t\t$TC.css(\"marginLeft\", round((width-$TC.outerWidth())/2)); // could be negative\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\telse { // east/west\r\n\t\t\t\t\tvar height = cssH($T, togLen);\r\n\t\t\t\t\t$T.css({\r\n\t\t\t\t\t\theight:\theight // account for borders & padding\r\n\t\t\t\t\t,\twidth:\tcssW($T, spacing) // ditto\r\n\t\t\t\t\t,\ttop:\toffset // POSITION the toggler\r\n\t\t\t\t\t,\tleft:\t0\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// CENTER the toggler content SPAN\r\n\t\t\t\t\t$T.children(\".content\").each(function(){\r\n\t\t\t\t\t\t$TC = $(this);\r\n\t\t\t\t\t\t$TC.css(\"marginTop\", round((height-$TC.outerHeight())/2)); // could be negative\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// remove ALL hover classes\r\n\t\t\t\tremoveHover( 0, $T );\r\n\t\t\t}\r\n\r\n\t\t\t// DONE measuring and sizing this resizer/toggler, so can be 'hidden' now\r\n\t\t\tif (!state.initialized && (o.initHidden || s.noRoom)) {\r\n\t\t\t\t$R.hide();\r\n\t\t\t\tif ($T) $T.hide();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* @param {string}\tpane\r\n\t*/\r\n,\tenableClosable = function (evt_or_pane) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$T\t= $Ts[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t;\r\n\t\tif (!$T) return;\r\n\t\to.closable = true;\r\n\t\t$T\t.bind(\"click.\"+ sID, function(evt){ evt.stopPropagation(); toggle(pane); })\r\n\t\t\t.css(\"visibility\", \"visible\")\r\n\t\t\t.css(\"cursor\", \"pointer\")\r\n\t\t\t.attr(\"title\", state[pane].isClosed ? o.togglerTip_closed : o.togglerTip_open) // may be blank\r\n\t\t\t.show();\r\n\t}\r\n\t/**\r\n\t* @param {string}\tpane\r\n\t* @param {boolean=}\t[hide=false]\r\n\t*/\r\n,\tdisableClosable = function (evt_or_pane, hide) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$T\t= $Ts[pane]\r\n\t\t;\r\n\t\tif (!$T) return;\r\n\t\toptions[pane].closable = false;\r\n\t\t// is closable is disable, then pane MUST be open!\r\n\t\tif (state[pane].isClosed) open(pane, false, true);\r\n\t\t$T\t.unbind(\".\"+ sID)\r\n\t\t\t.css(\"visibility\", hide ? \"hidden\" : \"visible\") // instead of hide(), which creates logic issues\r\n\t\t\t.css(\"cursor\", \"default\")\r\n\t\t\t.attr(\"title\", \"\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* @param {string}\tpane\r\n\t*/\r\n,\tenableSlidable = function (evt_or_pane) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t;\r\n\t\tif (!$R || !$R.data('draggable')) return;\r\n\t\toptions[pane].slidable = true; \r\n\t\tif (s.isClosed)\r\n\t\t\tbindStartSlidingEvent(pane, true);\r\n\t}\r\n\t/**\r\n\t* @param {string}\tpane\r\n\t*/\r\n,\tdisableSlidable = function (evt_or_pane) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t;\r\n\t\tif (!$R) return;\r\n\t\toptions[pane].slidable = false; \r\n\t\tif (state[pane].isSliding)\r\n\t\t\tclose(pane, false, true);\r\n\t\telse {\r\n\t\t\tbindStartSlidingEvent(pane, false);\r\n\t\t\t$R\t.css(\"cursor\", \"default\")\r\n\t\t\t\t.attr(\"title\", \"\");\r\n\t\t\tremoveHover(null, $R[0]); // in case currently hovered\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* @param {string}\tpane\r\n\t*/\r\n,\tenableResizable = function (evt_or_pane) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t,\to\t= options[pane]\r\n\t\t;\r\n\t\tif (!$R || !$R.data('draggable')) return;\r\n\t\to.resizable = true; \r\n\t\t$R.draggable(\"enable\");\r\n\t\tif (!state[pane].isClosed)\r\n\t\t\t$R\t.css(\"cursor\", o.resizerCursor)\r\n\t\t\t \t.attr(\"title\", o.resizerTip);\r\n\t}\r\n\t/**\r\n\t* @param {string}\tpane\r\n\t*/\r\n,\tdisableResizable = function (evt_or_pane) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar\tpane = evtPane.call(this, evt_or_pane)\r\n\t\t,\t$R\t= $Rs[pane]\r\n\t\t;\r\n\t\tif (!$R || !$R.data('draggable')) return;\r\n\t\toptions[pane].resizable = false; \r\n\t\t$R\t.draggable(\"disable\")\r\n\t\t\t.css(\"cursor\", \"default\")\r\n\t\t\t.attr(\"title\", \"\");\r\n\t\tremoveHover(null, $R[0]); // in case currently hovered\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* Move a pane from source-side (eg, west) to target-side (eg, east)\r\n\t* If pane exists on target-side, move that to source-side, ie, 'swap' the panes\r\n\t*\r\n\t* @param {string}\tpane1\t\tThe pane/edge being swapped\r\n\t* @param {string}\tpane2\t\tditto\r\n\t*/\r\n,\tswapPanes = function (evt_or_pane1, pane2) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tvar pane1 = evtPane.call(this, evt_or_pane1);\r\n\t\t// change state.edge NOW so callbacks can know where pane is headed...\r\n\t\tstate[pane1].edge = pane2;\r\n\t\tstate[pane2].edge = pane1;\r\n\t\t// run these even if NOT state.initialized\r\n\t\tif (false === _runCallbacks(\"onswap_start\", pane1)\r\n\t\t ||\tfalse === _runCallbacks(\"onswap_start\", pane2)\r\n\t\t) {\r\n\t\t\tstate[pane1].edge = pane1; // reset\r\n\t\t\tstate[pane2].edge = pane2;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar\r\n\t\t\toPane1\t= copy( pane1 )\r\n\t\t,\toPane2\t= copy( pane2 )\r\n\t\t,\tsizes\t= {}\r\n\t\t;\r\n\t\tsizes[pane1] = oPane1 ? oPane1.state.size : 0;\r\n\t\tsizes[pane2] = oPane2 ? oPane2.state.size : 0;\r\n\r\n\t\t// clear pointers & state\r\n\t\t$Ps[pane1] = false; \r\n\t\t$Ps[pane2] = false;\r\n\t\tstate[pane1] = {};\r\n\t\tstate[pane2] = {};\r\n\t\t\r\n\t\t// ALWAYS remove the resizer & toggler elements\r\n\t\tif ($Ts[pane1]) $Ts[pane1].remove();\r\n\t\tif ($Ts[pane2]) $Ts[pane2].remove();\r\n\t\tif ($Rs[pane1]) $Rs[pane1].remove();\r\n\t\tif ($Rs[pane2]) $Rs[pane2].remove();\r\n\t\t$Rs[pane1] = $Rs[pane2] = $Ts[pane1] = $Ts[pane2] = false;\r\n\r\n\t\t// transfer element pointers and data to NEW Layout keys\r\n\t\tmove( oPane1, pane2 );\r\n\t\tmove( oPane2, pane1 );\r\n\r\n\t\t// cleanup objects\r\n\t\toPane1 = oPane2 = sizes = null;\r\n\r\n\t\t// make panes 'visible' again\r\n\t\tif ($Ps[pane1]) $Ps[pane1].css(_c.visible);\r\n\t\tif ($Ps[pane2]) $Ps[pane2].css(_c.visible);\r\n\r\n\t\t// fix any size discrepancies caused by swap\r\n\t\tresizeAll();\r\n\r\n\t\t// run these even if NOT state.initialized\r\n\t\t_runCallbacks(\"onswap_end\", pane1);\r\n\t\t_runCallbacks(\"onswap_end\", pane2);\r\n\r\n\t\treturn;\r\n\r\n\t\tfunction copy (n) { // n = pane\r\n\t\t\tvar\r\n\t\t\t\t$P\t= $Ps[n]\r\n\t\t\t,\t$C\t= $Cs[n]\r\n\t\t\t;\r\n\t\t\treturn !$P ? false : {\r\n\t\t\t\tpane:\t\tn\r\n\t\t\t,\tP:\t\t\t$P ? $P[0] : false\r\n\t\t\t,\tC:\t\t\t$C ? $C[0] : false\r\n\t\t\t,\tstate:\t\t$.extend(true, {}, state[n])\r\n\t\t\t,\toptions:\t$.extend(true, {}, options[n])\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tfunction move (oPane, pane) {\r\n\t\t\tif (!oPane) return;\r\n\t\t\tvar\r\n\t\t\t\tP\t\t= oPane.P\r\n\t\t\t,\tC\t\t= oPane.C\r\n\t\t\t,\toldPane = oPane.pane\r\n\t\t\t,\tc\t\t= _c[pane]\r\n\t\t\t,\tside\t= c.side.toLowerCase()\r\n\t\t\t,\tinset\t= \"inset\"+ c.side\r\n\t\t\t//\tsave pane-options that should be retained\r\n\t\t\t,\ts\t\t= $.extend({}, state[pane])\r\n\t\t\t,\to\t\t= options[pane]\r\n\t\t\t//\tRETAIN side-specific FX Settings - more below\r\n\t\t\t,\tfx\t\t= { resizerCursor: o.resizerCursor }\r\n\t\t\t,\tre, size, pos\r\n\t\t\t;\r\n\t\t\t$.each(\"fxName,fxSpeed,fxSettings\".split(\",\"), function (i, k) {\r\n\t\t\t\tfx[k +\"_open\"]  = o[k +\"_open\"];\r\n\t\t\t\tfx[k +\"_close\"] = o[k +\"_close\"];\r\n\t\t\t\tfx[k +\"_size\"]  = o[k +\"_size\"];\r\n\t\t\t});\r\n\r\n\t\t\t// update object pointers and attributes\r\n\t\t\t$Ps[pane] = $(P)\r\n\t\t\t\t.data({\r\n\t\t\t\t\tlayoutPane:\t\tInstance[pane]\t// NEW pointer to pane-alias-object\r\n\t\t\t\t,\tlayoutEdge:\t\tpane\r\n\t\t\t\t})\r\n\t\t\t\t.css(_c.hidden)\r\n\t\t\t\t.css(c.cssReq)\r\n\t\t\t;\r\n\t\t\t$Cs[pane] = C ? $(C) : false;\r\n\r\n\t\t\t// set options and state\r\n\t\t\toptions[pane]\t= $.extend({}, oPane.options, fx);\r\n\t\t\tstate[pane]\t\t= $.extend({}, oPane.state);\r\n\r\n\t\t\t// change classNames on the pane, eg: ui-layout-pane-east ==> ui-layout-pane-west\r\n\t\t\tre = new RegExp(o.paneClass +\"-\"+ oldPane, \"g\");\r\n\t\t\tP.className = P.className.replace(re, o.paneClass +\"-\"+ pane);\r\n\r\n\t\t\t// ALWAYS regenerate the resizer & toggler elements\r\n\t\t\tinitHandles(pane); // create the required resizer & toggler\r\n\r\n\t\t\t// if moving to different orientation, then keep 'target' pane size\r\n\t\t\tif (c.dir != _c[oldPane].dir) {\r\n\t\t\t\tsize = sizes[pane] || 0;\r\n\t\t\t\tsetSizeLimits(pane); // update pane-state\r\n\t\t\t\tsize = max(size, state[pane].minSize);\r\n\t\t\t\t// use manualSizePane to disable autoResize - not useful after panes are swapped\r\n\t\t\t\tmanualSizePane(pane, size, true, true); // true/true = skipCallback/noAnimation\r\n\t\t\t}\r\n\t\t\telse // move the resizer here\r\n\t\t\t\t$Rs[pane].css(side, sC[inset] + (state[pane].isVisible ? getPaneSize(pane) : 0));\r\n\r\n\r\n\t\t\t// ADD CLASSNAMES & SLIDE-BINDINGS\r\n\t\t\tif (oPane.state.isVisible && !s.isVisible)\r\n\t\t\t\tsetAsOpen(pane, true); // true = skipCallback\r\n\t\t\telse {\r\n\t\t\t\tsetAsClosed(pane);\r\n\t\t\t\tbindStartSlidingEvent(pane, true); // will enable events IF option is set\r\n\t\t\t}\r\n\r\n\t\t\t// DESTROY the object\r\n\t\t\toPane = null;\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* INTERNAL method to sync pin-buttons when pane is opened or closed\r\n\t* Unpinned means the pane is 'sliding' - ie, over-top of the adjacent panes\r\n\t*\r\n\t* @see  open(), setAsOpen(), setAsClosed()\r\n\t* @param {string}\tpane   These are the params returned to callbacks by layout()\r\n\t* @param {boolean}\tdoPin  True means set the pin 'down', False means 'up'\r\n\t*/\r\n,\tsyncPinBtns = function (pane, doPin) {\r\n\t\tif ($.layout.plugins.buttons)\r\n\t\t\t$.each(state[pane].pins, function (i, selector) {\r\n\t\t\t\t$.layout.buttons.setPinState(Instance, $(selector), pane, doPin);\r\n\t\t\t});\r\n\t}\r\n\r\n;\t// END var DECLARATIONS\r\n\r\n\t/**\r\n\t* Capture keys when enableCursorHotkey - toggle pane if hotkey pressed\r\n\t*\r\n\t* @see  document.keydown()\r\n\t*/\r\n\tfunction keyDown (evt) {\r\n\t\tif (!evt) return true;\r\n\t\tvar code = evt.keyCode;\r\n\t\tif (code < 33) return true; // ignore special keys: ENTER, TAB, etc\r\n\r\n\t\tvar\r\n\t\t\tPANE = {\r\n\t\t\t\t38: \"north\" // Up Cursor\t- $.ui.keyCode.UP\r\n\t\t\t,\t40: \"south\" // Down Cursor\t- $.ui.keyCode.DOWN\r\n\t\t\t,\t37: \"west\"  // Left Cursor\t- $.ui.keyCode.LEFT\r\n\t\t\t,\t39: \"east\"  // Right Cursor\t- $.ui.keyCode.RIGHT\r\n\t\t\t}\r\n\t\t,\tALT\t\t= evt.altKey // no worky!\r\n\t\t,\tSHIFT\t= evt.shiftKey\r\n\t\t,\tCTRL\t= evt.ctrlKey\r\n\t\t,\tCURSOR\t= (CTRL && code >= 37 && code <= 40)\r\n\t\t,\to, k, m, pane\r\n\t\t;\r\n\r\n\t\tif (CURSOR && options[PANE[code]].enableCursorHotkey) // valid cursor-hotkey\r\n\t\t\tpane = PANE[code];\r\n\t\telse if (CTRL || SHIFT) // check to see if this matches a custom-hotkey\r\n\t\t\t$.each(_c.borderPanes, function (i, p) { // loop each pane to check its hotkey\r\n\t\t\t\to = options[p];\r\n\t\t\t\tk = o.customHotkey;\r\n\t\t\t\tm = o.customHotkeyModifier; // if missing or invalid, treated as \"CTRL+SHIFT\"\r\n\t\t\t\tif ((SHIFT && m==\"SHIFT\") || (CTRL && m==\"CTRL\") || (CTRL && SHIFT)) { // Modifier matches\r\n\t\t\t\t\tif (k && code === (isNaN(k) || k <= 9 ? k.toUpperCase().charCodeAt(0) : k)) { // Key matches\r\n\t\t\t\t\t\tpane = p;\r\n\t\t\t\t\t\treturn false; // BREAK\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t// validate pane\r\n\t\tif (!pane || !$Ps[pane] || !options[pane].closable || state[pane].isHidden)\r\n\t\t\treturn true;\r\n\r\n\t\ttoggle(pane);\r\n\r\n\t\tevt.stopPropagation();\r\n\t\tevt.returnValue = false; // CANCEL key\r\n\t\treturn false;\r\n\t};\r\n\r\n\r\n/*\r\n * ######################################\r\n *\tUTILITY METHODS\r\n *\tcalled externally or by initButtons\r\n * ######################################\r\n */\r\n\r\n\t/**\r\n\t* Change/reset a pane overflow setting & zIndex to allow popups/drop-downs to work\r\n\t*\r\n\t* @param {Object=}   [el]\t(optional) Can also be 'bound' to a click, mouseOver, or other event\r\n\t*/\r\n\tfunction allowOverflow (el) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tif (this && this.tagName) el = this; // BOUND to element\r\n\t\tvar $P;\r\n\t\tif (isStr(el))\r\n\t\t\t$P = $Ps[el];\r\n\t\telse if ($(el).data(\"layoutRole\"))\r\n\t\t\t$P = $(el);\r\n\t\telse\r\n\t\t\t$(el).parents().each(function(){\r\n\t\t\t\tif ($(this).data(\"layoutRole\")) {\r\n\t\t\t\t\t$P = $(this);\r\n\t\t\t\t\treturn false; // BREAK\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tif (!$P || !$P.length) return; // INVALID\r\n\r\n\t\tvar\r\n\t\t\tpane\t= $P.data(\"layoutEdge\")\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t;\r\n\r\n\t\t// if pane is already raised, then reset it before doing it again!\r\n\t\t// this would happen if allowOverflow is attached to BOTH the pane and an element \r\n\t\tif (s.cssSaved)\r\n\t\t\tresetOverflow(pane); // reset previous CSS before continuing\r\n\r\n\t\t// if pane is raised by sliding or resizing, or its closed, then abort\r\n\t\tif (s.isSliding || s.isResizing || s.isClosed) {\r\n\t\t\ts.cssSaved = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar\r\n\t\t\tnewCSS\t= { zIndex: (options.zIndexes.resizer_normal + 1) }\r\n\t\t,\tcurCSS\t= {}\r\n\t\t,\tof\t\t= $P.css(\"overflow\")\r\n\t\t,\tofX\t\t= $P.css(\"overflowX\")\r\n\t\t,\tofY\t\t= $P.css(\"overflowY\")\r\n\t\t;\r\n\t\t// determine which, if any, overflow settings need to be changed\r\n\t\tif (of != \"visible\") {\r\n\t\t\tcurCSS.overflow = of;\r\n\t\t\tnewCSS.overflow = \"visible\";\r\n\t\t}\r\n\t\tif (ofX && !ofX.match(/visible|auto/)) {\r\n\t\t\tcurCSS.overflowX = ofX;\r\n\t\t\tnewCSS.overflowX = \"visible\";\r\n\t\t}\r\n\t\tif (ofY && !ofY.match(/visible|auto/)) {\r\n\t\t\tcurCSS.overflowY = ofX;\r\n\t\t\tnewCSS.overflowY = \"visible\";\r\n\t\t}\r\n\r\n\t\t// save the current overflow settings - even if blank!\r\n\t\ts.cssSaved = curCSS;\r\n\r\n\t\t// apply new CSS to raise zIndex and, if necessary, make overflow 'visible'\r\n\t\t$P.css( newCSS );\r\n\r\n\t\t// make sure the zIndex of all other panes is normal\r\n\t\t$.each(_c.allPanes, function(i, p) {\r\n\t\t\tif (p != pane) resetOverflow(p);\r\n\t\t});\r\n\r\n\t};\r\n\t/**\r\n\t* @param {Object=}   [el]\t(optional) Can also be 'bound' to a click, mouseOver, or other event\r\n\t*/\r\n\tfunction resetOverflow (el) {\r\n\t\tif (!isInitialized()) return;\r\n\t\tif (this && this.tagName) el = this; // BOUND to element\r\n\t\tvar $P;\r\n\t\tif (isStr(el))\r\n\t\t\t$P = $Ps[el];\r\n\t\telse if ($(el).data(\"layoutRole\"))\r\n\t\t\t$P = $(el);\r\n\t\telse\r\n\t\t\t$(el).parents().each(function(){\r\n\t\t\t\tif ($(this).data(\"layoutRole\")) {\r\n\t\t\t\t\t$P = $(this);\r\n\t\t\t\t\treturn false; // BREAK\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tif (!$P || !$P.length) return; // INVALID\r\n\r\n\t\tvar\r\n\t\t\tpane\t= $P.data(\"layoutEdge\")\r\n\t\t,\ts\t\t= state[pane]\r\n\t\t,\tCSS\t\t= s.cssSaved || {}\r\n\t\t;\r\n\t\t// reset the zIndex\r\n\t\tif (!s.isSliding && !s.isResizing)\r\n\t\t\t$P.css(\"zIndex\", options.zIndexes.pane_normal);\r\n\r\n\t\t// reset Overflow - if necessary\r\n\t\t$P.css( CSS );\r\n\r\n\t\t// clear var\r\n\t\ts.cssSaved = false;\r\n\t};\r\n\r\n/*\r\n * #####################\r\n * CREATE/RETURN LAYOUT\r\n * #####################\r\n */\r\n\r\n\t// validate that container exists\r\n\tvar $N = $(this).eq(0); // FIRST matching Container element\r\n\tif (!$N.length) {\r\n\t\tif (options.showErrorMessages)\r\n\t\t\t_log( lang.errContainerMissing, true );\r\n\t\treturn null;\r\n\t};\r\n\r\n\t// Users retrieve Instance of a layout with: $N.layout() OR $N.data(\"layout\")\r\n\t// return the Instance-pointer if layout has already been initialized\r\n\tif ($N.data(\"layoutContainer\") && $N.data(\"layout\"))\r\n\t\treturn $N.data(\"layout\"); // cached pointer\r\n\r\n\t// init global vars\r\n\tvar \r\n\t\t$Ps\t= {}\t// Panes x5\t\t- set in initPanes()\r\n\t,\t$Cs\t= {}\t// Content x5\t- set in initPanes()\r\n\t,\t$Rs\t= {}\t// Resizers x4\t- set in initHandles()\r\n\t,\t$Ts\t= {}\t// Togglers x4\t- set in initHandles()\r\n\t,\t$Ms\t= $([])\t// Masks - up to 2 masks per pane (IFRAME + DIV)\r\n\t//\taliases for code brevity\r\n\t,\tsC\t= state.container // alias for easy access to 'container dimensions'\r\n\t,\tsID\t= state.id // alias for unique layout ID/namespace - eg: \"layout435\"\r\n\t;\r\n\r\n\t// create Instance object to expose data & option Properties, and primary action Methods\r\n\tvar Instance = {\r\n\t//\tlayout data\r\n\t\toptions:\t\t\toptions\t\t\t// property - options hash\r\n\t,\tstate:\t\t\t\tstate\t\t\t// property - dimensions hash\r\n\t//\tobject pointers\r\n\t,\tcontainer:\t\t\t$N\t\t\t\t// property - object pointers for layout container\r\n\t,\tpanes:\t\t\t\t$Ps\t\t\t\t// property - object pointers for ALL Panes: panes.north, panes.center\r\n\t,\tcontents:\t\t\t$Cs\t\t\t\t// property - object pointers for ALL Content: contents.north, contents.center\r\n\t,\tresizers:\t\t\t$Rs\t\t\t\t// property - object pointers for ALL Resizers, eg: resizers.north\r\n\t,\ttogglers:\t\t\t$Ts\t\t\t\t// property - object pointers for ALL Togglers, eg: togglers.north\r\n\t//\tborder-pane open/close\r\n\t,\thide:\t\t\t\thide\t\t\t// method - ditto\r\n\t,\tshow:\t\t\t\tshow\t\t\t// method - ditto\r\n\t,\ttoggle:\t\t\t\ttoggle\t\t\t// method - pass a 'pane' (\"north\", \"west\", etc)\r\n\t,\topen:\t\t\t\topen\t\t\t// method - ditto\r\n\t,\tclose:\t\t\t\tclose\t\t\t// method - ditto\r\n\t,\tslideOpen:\t\t\tslideOpen\t\t// method - ditto\r\n\t,\tslideClose:\t\t\tslideClose\t\t// method - ditto\r\n\t,\tslideToggle:\t\tslideToggle\t\t// method - ditto\r\n\t//\tpane actions\r\n\t,\tsetSizeLimits:\t\tsetSizeLimits\t// method - pass a 'pane' - update state min/max data\r\n\t,\t_sizePane:\t\t\tsizePane\t\t// method -intended for user by plugins only!\r\n\t,\tsizePane:\t\t\tmanualSizePane\t// method - pass a 'pane' AND an 'outer-size' in pixels or percent, or 'auto'\r\n\t,\tsizeContent:\t\tsizeContent\t\t// method - pass a 'pane'\r\n\t,\tswapPanes:\t\t\tswapPanes\t\t// method - pass TWO 'panes' - will swap them\r\n\t//\tpane element methods\r\n\t,\tinitContent:\t\tinitContent\t\t// method - ditto\r\n\t,\taddPane:\t\t\taddPane\t\t\t// method - pass a 'pane'\r\n\t,\tremovePane:\t\t\tremovePane\t\t// method - pass a 'pane' to remove from layout, add 'true' to delete the pane-elem\r\n\t,\tcreateChildLayout:\tcreateChildLayout// method - pass a 'pane' and (optional) layout-options (OVERRIDES options[pane].childOptions\r\n\t//\tspecial pane option setting\r\n\t,\tenableClosable:\t\tenableClosable\t// method - pass a 'pane'\r\n\t,\tdisableClosable:\tdisableClosable\t// method - ditto\r\n\t,\tenableSlidable:\t\tenableSlidable\t// method - ditto\r\n\t,\tdisableSlidable:\tdisableSlidable\t// method - ditto\r\n\t,\tenableResizable:\tenableResizable\t// method - ditto\r\n\t,\tdisableResizable:\tdisableResizable// method - ditto\r\n\t//\tutility methods for panes\r\n\t,\tallowOverflow:\t\tallowOverflow\t// utility - pass calling element (this)\r\n\t,\tresetOverflow:\t\tresetOverflow\t// utility - ditto\r\n\t//\tlayout control\r\n\t,\tdestroy:\t\t\tdestroy\t\t\t// method - no parameters\r\n\t,\tinitPanes:\t\t\tisInitialized\t// method - no parameters\r\n\t,\tresizeAll:\t\t\tresizeAll\t\t// method - no parameters\r\n\t//\tcallback triggering\r\n\t,\trunCallbacks:\t\t_runCallbacks\t// method - pass evtName & pane (if a pane-event), eg: trigger(\"onopen\", \"west\")\r\n\t//\talias collections of options, state and children - created in addPane and extended elsewhere\r\n\t,\thasParentLayout:\tfalse\t\t\t// set by initContainer()\r\n\t,\tchildren:\t\t\tchildren\t\t// pointers to child-layouts, eg: Instance.children[\"west\"]\r\n\t,\tnorth:\t\t\t\tfalse\t\t\t// alias group: { name: pane, pane: $Ps[pane], options: options[pane], state: state[pane], child: children[pane] }\r\n\t,\tsouth:\t\t\t\tfalse\t\t\t// ditto\r\n\t,\twest:\t\t\t\tfalse\t\t\t// ditto\r\n\t,\teast:\t\t\t\tfalse\t\t\t// ditto\r\n\t,\tcenter:\t\t\t\tfalse\t\t\t// ditto\r\n  , showMasks: showMasks\r\n  , hideMasks: hideMasks\r\n\t};\r\n\r\n\t// create the border layout NOW\r\n\tif (_create() === 'cancel') // onload_start callback returned false to CANCEL layout creation\r\n\t\treturn null;\r\n\telse // true OR false -- if layout-elements did NOT init (hidden or do not exist), can auto-init later\r\n\t\treturn Instance; // return the Instance object\r\n\r\n}\r\n\r\n\r\n\r\n\r\n/**\r\n * jquery.layout.state 1.0\r\n * $Date: 2011-07-16 08:00:00 (Sat, 16 July 2011) $\r\n *\r\n * Copyright (c) 2010 \r\n *   Kevin Dalman (http://allpro.net)\r\n *\r\n * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)\r\n * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.\r\n *\r\n * @dependancies: UI Layout 1.3.0.rc30.1 or higher\r\n * @dependancies: $.ui.cookie (above)\r\n *\r\n * @support: http://groups.google.com/group/jquery-ui-layout\r\n */\r\n/*\r\n *\tState-management options stored in options.stateManagement, which includes a .cookie hash\r\n *\tDefault options saves ALL KEYS for ALL PANES, ie: pane.size, pane.isClosed, pane.isHidden\r\n *\r\n *\t// STATE/COOKIE OPTIONS\r\n *\t@example $(el).layout({\r\n\t\t\t\tstateManagement: {\r\n\t\t\t\t\tenabled:\ttrue\r\n\t\t\t\t,\tstateKeys:\t\"east.size,west.size,east.isClosed,west.isClosed\"\r\n\t\t\t\t,\tcookie:\t\t{ name: \"appLayout\", path: \"/\" }\r\n\t\t\t\t}\r\n\t\t\t})\r\n *\t@example $(el).layout({ stateManagement__enabled: true }) // enable auto-state-management using cookies\r\n *\t@example $(el).layout({ stateManagement__cookie: { name: \"appLayout\", path: \"/\" } })\r\n *\t@example $(el).layout({ stateManagement__cookie__name: \"appLayout\", stateManagement__cookie__path: \"/\" })\r\n *\r\n *\t// STATE/COOKIE METHODS\r\n *\t@example myLayout.saveCookie( \"west.isClosed,north.size,south.isHidden\", {expires: 7} );\r\n *\t@example myLayout.loadCookie();\r\n *\t@example myLayout.deleteCookie();\r\n *\t@example var JSON = myLayout.readState();\t// CURRENT Layout State\r\n *\t@example var JSON = myLayout.readCookie();\t// SAVED Layout State (from cookie)\r\n *\t@example var JSON = myLayout.state.stateData;\t// LAST LOADED Layout State (cookie saved in layout.state hash)\r\n *\r\n *\tCUSTOM STATE-MANAGEMENT (eg, saved in a database)\r\n *\t@example var JSON = myLayout.readState( \"west.isClosed,north.size,south.isHidden\" );\r\n *\t@example myLayout.loadState( JSON );\r\n */\r\n\r\n/**\r\n *\tUI COOKIE UTILITY\r\n *\r\n *\tA $.cookie OR $.ui.cookie namespace *should be standard*, but until then...\r\n *\tThis creates $.ui.cookie so Layout does not need the cookie.jquery.js plugin\r\n *\tNOTE: This utility is REQUIRED by the layout.state plugin\r\n *\r\n *\tCookie methods in Layout are created as part of State Management \r\n */\r\nif (!$.ui) $.ui = {};\r\n$.ui.cookie = {\r\n\r\n\t// cookieEnabled is not in DOM specs, but DOES works in all browsers,including IE6\r\n\tacceptsCookies: !!navigator.cookieEnabled\r\n\r\n,\tread: function (name) {\r\n\t\tvar\r\n\t\t\tc\t\t= document.cookie\r\n\t\t,\tcs\t\t= c ? c.split(';') : []\r\n\t\t,\tpair\t// loop var\r\n\t\t;\r\n\t\tfor (var i=0, n=cs.length; i < n; i++) {\r\n\t\t\tpair = $.trim(cs[i]).split('='); // name=value pair\r\n\t\t\tif (pair[0] == name) // found the layout cookie\r\n\t\t\t\treturn decodeURIComponent(pair[1]);\r\n\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n,\twrite: function (name, val, cookieOpts) {\r\n\t\tvar\r\n\t\t\tparams\t= ''\r\n\t\t,\tdate\t= ''\r\n\t\t,\tclear\t= false\r\n\t\t,\to\t\t= cookieOpts || {}\r\n\t\t,\tx\t\t= o.expires\r\n\t\t;\r\n\t\tif (x && x.toUTCString)\r\n\t\t\tdate = x;\r\n\t\telse if (x === null || typeof x === 'number') {\r\n\t\t\tdate = new Date();\r\n\t\t\tif (x > 0)\r\n\t\t\t\tdate.setDate(date.getDate() + x);\r\n\t\t\telse {\r\n\t\t\t\tdate.setFullYear(1970);\r\n\t\t\t\tclear = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (date)\t\tparams += ';expires='+ date.toUTCString();\r\n\t\tif (o.path)\t\tparams += ';path='+ o.path;\r\n\t\tif (o.domain)\tparams += ';domain='+ o.domain;\r\n\t\tif (o.secure)\tparams += ';secure';\r\n\t\tdocument.cookie = name +'='+ (clear ? \"\" : encodeURIComponent( val )) + params; // write or clear cookie\r\n\t}\r\n\r\n,\tclear: function (name) {\r\n\t\t$.ui.cookie.write(name, '', {expires: -1});\r\n\t}\r\n\r\n};\r\n// if cookie.jquery.js is not loaded, create an alias to replicate it\r\n// this may be useful to other plugins or code dependent on that plugin\r\nif (!$.cookie) $.cookie = function (k, v, o) {\r\n\tvar C = $.ui.cookie;\r\n\tif (v === null)\r\n\t\tC.clear(k);\r\n\telse if (v === undefined)\r\n\t\treturn C.read(k);\r\n\telse\r\n\t\tC.write(k, v, o);\r\n};\r\n\r\n\r\n// tell Layout that the state plugin is available\r\n$.layout.plugins.stateManagement = true;\r\n\r\n//\tAdd State-Management options to layout.defaults\r\n$.layout.config.optionRootKeys.push(\"stateManagement\");\r\n$.layout.defaults.stateManagement = {\r\n\tenabled:\tfalse\t// true = enable state-management, even if not using cookies\r\n,\tautoSave:\ttrue\t// Save a state-cookie when page exits?\r\n,\tautoLoad:\ttrue\t// Load the state-cookie when Layout inits?\r\n\t// List state-data to save - must be pane-specific\r\n,\tstateKeys:\t\"north.size,south.size,east.size,west.size,\"+\r\n\t\t\t\t\"north.isClosed,south.isClosed,east.isClosed,west.isClosed,\"+\r\n\t\t\t\t\"north.isHidden,south.isHidden,east.isHidden,west.isHidden\"\r\n,\tcookie: {\r\n\t\tname:\t\"\"\t// If not specified, will use Layout.name, else just \"Layout\"\r\n\t,\tdomain:\t\"\"\t// blank = current domain\r\n\t,\tpath:\t\"\"\t// blank = current page, '/' = entire website\r\n\t,\texpires: \"\"\t// 'days' to keep cookie - leave blank for 'session cookie'\r\n\t,\tsecure:\tfalse\r\n\t}\r\n};\r\n// Set stateManagement as a layout-option, NOT a pane-option\r\n$.layout.optionsMap.layout.push(\"stateManagement\");\r\n\r\n/*\r\n *\tState Management methods\r\n */\r\n$.layout.state = {\r\n\r\n\t/**\r\n\t * Get the current layout state and save it to a cookie\r\n\t *\r\n\t * myLayout.saveCookie( keys, cookieOpts )\r\n\t *\r\n\t * @param {Object}\t\t\tinst\r\n\t * @param {(string|Array)=}\tkeys\r\n\t * @param {Object=}\t\t\topts\r\n\t */\r\n\tsaveCookie: function (inst, keys, cookieOpts) {\r\n\t\tvar o\t= inst.options\r\n\t\t,\toS\t= o.stateManagement\r\n\t\t,\toC\t= $.extend(true, {}, oS.cookie, cookieOpts || null)\r\n\t\t,\tdata = inst.state.stateData = inst.readState( keys || oS.stateKeys ) // read current panes-state\r\n\t\t;\r\n\t\t$.ui.cookie.write( oC.name || o.name || \"Layout\", $.layout.state.encodeJSON(data), oC );\r\n\t\treturn $.extend(true, {}, data); // return COPY of state.stateData data\r\n\t}\r\n\r\n\t/**\r\n\t * Remove the state cookie\r\n\t *\r\n\t * @param {Object}\tinst\r\n\t */\r\n,\tdeleteCookie: function (inst) {\r\n\t\tvar o = inst.options;\r\n\t\t$.ui.cookie.clear( o.stateManagement.cookie.name || o.name || \"Layout\" );\r\n\t}\r\n\r\n\t/**\r\n\t * Read & return data from the cookie - as JSON\r\n\t *\r\n\t * @param {Object}\tinst\r\n\t */\r\n,\treadCookie: function (inst) {\r\n\t\tvar o = inst.options;\r\n\t\tvar c = $.ui.cookie.read( o.stateManagement.cookie.name || o.name || \"Layout\" );\r\n\t\t// convert cookie string back to a hash and return it\r\n\t\treturn c ? $.layout.state.decodeJSON(c) : {};\r\n\t}\r\n\r\n\t/**\r\n\t * Get data from the cookie and USE IT to loadState\r\n\t *\r\n\t * @param {Object}\tinst\r\n\t */\r\n,\tloadCookie: function (inst) {\r\n\t\tvar c = $.layout.state.readCookie(inst); // READ the cookie\r\n\t\tif (c) {\r\n\t\t\tinst.state.stateData = $.extend(true, {}, c); // SET state.stateData\r\n\t\t\tinst.loadState(c); // LOAD the retrieved state\r\n\t\t}\r\n\t\treturn c;\r\n\t}\r\n\t\r\n\t/**\r\n\t * Update layout options from the cookie, if one exists\r\n\t *\r\n\t * @param {Object}\t\tinst\r\n\t * @param {Object=}\t\tstateData\r\n\t * @param {boolean=}\tanimate\r\n\t */\r\n,\tloadState: function (inst, stateData, animate) {\r\n\t\tstateData = $.layout.transformData( stateData ); // panes = default subkey\r\n\t\tif ($.isEmptyObject( stateData )) return;\r\n\t\t$.extend(true, inst.options, stateData); // update layout options\r\n\t\t// if layout has already been initialized, then UPDATE layout state\r\n\t\tif (inst.state.initialized) {\r\n\t\t\tvar pane, vis, o, s, h, c\r\n\t\t\t,\tnoAnimate = (animate===false)\r\n\t\t\t;\r\n\t\t\t$.each($.layout.config.borderPanes, function (idx, pane) {\r\n\t\t\t\tstate = inst.state[pane];\r\n\t\t\t\to = stateData[ pane ];\r\n\t\t\t\tif (typeof o != 'object') return; // no key, continue\r\n\t\t\t\ts\t= o.size;\r\n\t\t\t\tc\t= o.initClosed;\r\n\t\t\t\th\t= o.initHidden;\r\n\t\t\t\tvis\t= state.isVisible;\r\n\t\t\t\t// resize BEFORE opening\r\n\t\t\t\tif (!vis)\r\n\t\t\t\t\tinst.sizePane(pane, s, false, false);\r\n\t\t\t\tif (h === true)\t\t\tinst.hide(pane, noAnimate);\r\n\t\t\t\telse if (c === false)\tinst.open (pane, false, noAnimate);\r\n\t\t\t\telse if (c === true)\tinst.close(pane, false, noAnimate);\r\n\t\t\t\telse if (h === false)\tinst.show (pane, false, noAnimate);\r\n\t\t\t\t// resize AFTER any other actions\r\n\t\t\t\tif (vis)\r\n\t\t\t\t\tinst.sizePane(pane, s, false, noAnimate); // animate resize if option passed\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Get the *current layout state* and return it as a hash\r\n\t *\r\n\t * @param {Object=}\t\t\tinst\r\n\t * @param {(string|Array)=}\tkeys\r\n\t */\r\n,\treadState: function (inst, keys) {\r\n\t\tvar\r\n\t\t\tdata\t= {}\r\n\t\t,\talt\t\t= { isClosed: 'initClosed', isHidden: 'initHidden' }\r\n\t\t,\tstate\t= inst.state\r\n\t\t,\tpanes\t= $.layout.config.allPanes\r\n\t\t,\tpair, pane, key, val\r\n\t\t;\r\n\t\tif (!keys) keys = inst.options.stateManagement.stateKeys; // if called by user\r\n\t\tif ($.isArray(keys)) keys = keys.join(\",\");\r\n\t\t// convert keys to an array and change delimiters from '__' to '.'\r\n\t\tkeys = keys.replace(/__/g, \".\").split(',');\r\n\t\t// loop keys and create a data hash\r\n\t\tfor (var i=0, n=keys.length; i < n; i++) {\r\n\t\t\tpair = keys[i].split(\".\");\r\n\t\t\tpane = pair[0];\r\n\t\t\tkey  = pair[1];\r\n\t\t\tif ($.inArray(pane, panes) < 0) continue; // bad pane!\r\n\t\t\tval = state[ pane ][ key ];\r\n\t\t\tif (val == undefined) continue;\r\n\t\t\tif (key==\"isClosed\" && state[pane][\"isSliding\"])\r\n\t\t\t\tval = true; // if sliding, then *really* isClosed\r\n\t\t\t( data[pane] || (data[pane]={}) )[ alt[key] ? alt[key] : key ] = val;\r\n\t\t}\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t *\tStringify a JSON hash so can save in a cookie or db-field\r\n\t */\r\n,\tencodeJSON: function (JSON) {\r\n\t\treturn parse(JSON);\r\n\t\tfunction parse (h) {\r\n\t\t\tvar D=[], i=0, k, v, t; // k = key, v = value\r\n\t\t\tfor (k in h) {\r\n\t\t\t\tv = h[k];\r\n\t\t\t\tt = typeof v;\r\n\t\t\t\tif (t == 'string')\t\t// STRING - add quotes\r\n\t\t\t\t\tv = '\"'+ v +'\"';\r\n\t\t\t\telse if (t == 'object')\t// SUB-KEY - recurse into it\r\n\t\t\t\t\tv = parse(v);\r\n\t\t\t\tD[i++] = '\"'+ k +'\":'+ v;\r\n\t\t\t}\r\n\t\t\treturn '{'+ D.join(',') +'}';\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t *\tConvert stringified JSON back to a hash object\r\n\t *\t@see\t\t$.parseJSON(), adding in jQuery 1.4.1\r\n\t */\r\n,\tdecodeJSON: function (str) {\r\n\t\ttry { return $.parseJSON ? $.parseJSON(str) : window[\"eval\"](\"(\"+ str +\")\") || {}; }\r\n\t\tcatch (e) { return {}; }\r\n\t}\r\n\r\n\r\n,\t_create: function (inst) {\r\n\t\tvar _\t= $.layout.state;\r\n\t\t//\tADD State-Management plugin methods to inst\r\n\t\t $.extend( inst, {\r\n\t\t//\treadCookie - update options from cookie - returns hash of cookie data\r\n\t\t\treadCookie:\t\tfunction () { return _.readCookie(inst); }\r\n\t\t//\tdeleteCookie\r\n\t\t,\tdeleteCookie:\tfunction () { _.deleteCookie(inst); }\r\n\t\t//\tsaveCookie - optionally pass keys-list and cookie-options (hash)\r\n\t\t,\tsaveCookie:\t\tfunction (keys, cookieOpts) { return _.saveCookie(inst, keys, cookieOpts); }\r\n\t\t//\tloadCookie - readCookie and use to loadState() - returns hash of cookie data\r\n\t\t,\tloadCookie:\t\tfunction () { return _.loadCookie(inst); }\r\n\t\t//\tloadState - pass a hash of state to use to update options\r\n\t\t,\tloadState:\t\tfunction (stateData, animate) { _.loadState(inst, stateData, animate); }\r\n\t\t//\treadState - returns hash of current layout-state\r\n\t\t,\treadState:\t\tfunction (keys) { return _.readState(inst, keys); }\r\n\t\t//\tadd JSON utility methods too...\r\n\t\t,\tencodeJSON:\t\t_.encodeJSON\r\n\t\t,\tdecodeJSON:\t\t_.decodeJSON\r\n\t\t});\r\n\r\n\t\t// init state.stateData key, even if plugin is initially disabled\r\n\t\tinst.state.stateData = {};\r\n\r\n\t\t// read and load cookie-data per options\r\n\t\tvar oS = inst.options.stateManagement;\r\n\t\tif (oS.enabled) {\r\n\t\t\tif (oS.autoLoad) // update the options from the cookie\r\n\t\t\t\tinst.loadCookie();\r\n\t\t\telse // don't modify options - just store cookie data in state.stateData\r\n\t\t\t\tinst.state.stateData = inst.readCookie();\r\n\t\t}\r\n\t}\r\n\r\n,\t_unload: function (inst) {\r\n\t\tvar oS = inst.options.stateManagement;\r\n\t\tif (oS.enabled) {\r\n\t\t\tif (oS.autoSave) // save a state-cookie automatically\r\n\t\t\t\tinst.saveCookie();\r\n\t\t\telse // don't save a cookie, but do store state-data in state.stateData key\r\n\t\t\t\tinst.state.stateData = inst.readState();\r\n\t\t}\r\n\t}\r\n\r\n};\r\n\r\n// add state initialization method to Layout's onCreate array of functions\r\n$.layout.onCreate.push( $.layout.state._create );\r\n$.layout.onUnload.push( $.layout.state._unload );\r\n\r\n\r\n\r\n\r\n/**\r\n * jquery.layout.buttons 1.0\r\n * $Date: 2011-07-16 08:00:00 (Sat, 16 July 2011) $\r\n *\r\n * Copyright (c) 2010 \r\n *   Kevin Dalman (http://allpro.net)\r\n *\r\n * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)\r\n * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.\r\n *\r\n * @dependancies: UI Layout 1.3.0.rc30.1 or higher\r\n *\r\n * @support: http://groups.google.com/group/jquery-ui-layout\r\n *\r\n * Docs: [ to come ]\r\n * Tips: [ to come ]\r\n */\r\n\r\n// tell Layout that the state plugin is available\r\n$.layout.plugins.buttons = true;\r\n\r\n//\tAdd buttons options to layout.defaults\r\n$.layout.defaults.autoBindCustomButtons = false;\r\n// Specify autoBindCustomButtons as a layout-option, NOT a pane-option\r\n$.layout.optionsMap.layout.push(\"autoBindCustomButtons\");\r\n\r\nvar lang = $.layout.language;\r\n\r\n/*\r\n *\tButton methods\r\n */\r\n$.layout.buttons = {\r\n\r\n\t/**\r\n\t* Searches for .ui-layout-button-xxx elements and auto-binds them as layout-buttons\r\n\t*\r\n\t* @see  _create()\r\n\t*\r\n\t* @param  {Object}\t\tinst\tLayout Instance object\r\n\t*/\r\n\tinit: function (inst) {\r\n\t\tvar pre\t\t= \"ui-layout-button-\"\r\n\t\t,\tlayout\t= inst.options.name || \"\"\r\n\t\t,\tname;\r\n\t\t$.each(\"toggle,open,close,pin,toggle-slide,open-slide\".split(\",\"), function (i, action) {\r\n\t\t\t$.each($.layout.config.borderPanes, function (ii, pane) {\r\n\t\t\t\t$(\".\"+pre+action+\"-\"+pane).each(function(){\r\n\t\t\t\t\t// if button was previously 'bound', data.layoutName was set, but is blank if layout has no 'name'\r\n\t\t\t\t\tname = $(this).data(\"layoutName\") || $(this).attr(\"layoutName\");\r\n\t\t\t\t\tif (name == undefined || name === layout)\r\n\t\t\t\t\t\tinst.bindButton(this, action, pane);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t* Helper function to validate params received by addButton utilities\r\n\t*\r\n\t* Two classes are added to the element, based on the buttonClass...\r\n\t* The type of button is appended to create the 2nd className:\r\n\t*  - ui-layout-button-pin\t\t// action btnClass\r\n\t*  - ui-layout-button-pin-west\t// action btnClass + pane\r\n\t*  - ui-layout-button-toggle\r\n\t*  - ui-layout-button-open\r\n\t*  - ui-layout-button-close\r\n\t*\r\n\t* @param {Object}\t\t\tinst\t\tLayout Instance object\r\n\t* @param {(string|!Object)}\tselector\tjQuery selector (or element) for button, eg: \".ui-layout-north .toggle-button\"\r\n\t* @param {string}   \t\tpane \t\tName of the pane the button is for: 'north', 'south', etc.\r\n\t*\r\n\t* @return {Array.<Object>}\tIf both params valid, the element matching 'selector' in a jQuery wrapper - otherwise returns null\r\n\t*/\r\n,\tget: function (inst, selector, pane, action) {\r\n\t\tvar $E\t= $(selector)\r\n\t\t,\to\t= inst.options\r\n\t\t,\terr\t= o.showErrorMessages\r\n\t\t;\r\n\t\tif (!$E.length) { // element not found\r\n\t\t\tif (err) $.layout.msg(lang.errButton + lang.selector +\": \"+ selector, true);\r\n\t\t}\r\n\t\telse if ($.inArray(pane, $.layout.config.borderPanes) < 0) { // invalid 'pane' sepecified\r\n\t\t\tif (err) $.layout.msg(lang.errButton + lang.pane +\": \"+ pane, true);\r\n\t\t\t$E = $(\"\");  // NO BUTTON\r\n\t\t}\r\n\t\telse { // VALID\r\n\t\t\tvar btn = o[pane].buttonClass +\"-\"+ action;\r\n\t\t\t$E\t.addClass( btn +\" \"+ btn +\"-\"+ pane )\r\n\t\t\t\t.data(\"layoutName\", o.name); // add layout identifier - even if blank!\r\n\t\t}\r\n\t\treturn $E;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* NEW syntax for binding layout-buttons - will eventually replace addToggle, addOpen, etc.\r\n\t*\r\n\t* @param {Object}\t\t\tinst\t\tLayout Instance object\r\n\t* @param {(string|!Object)}\tselector\tjQuery selector (or element) for button, eg: \".ui-layout-north .toggle-button\"\r\n\t* @param {string}\t\t\taction\r\n\t* @param {string}\t\t\tpane\r\n\t*/\r\n,\tbind: function (inst, selector, action, pane) {\r\n\t\tvar _ = $.layout.buttons;\r\n\t\tswitch (action.toLowerCase()) {\r\n\t\t\tcase \"toggle\":\t\t\t_.addToggle\t(inst, selector, pane); break;\t\r\n\t\t\tcase \"open\":\t\t\t_.addOpen\t(inst, selector, pane); break;\r\n\t\t\tcase \"close\":\t\t\t_.addClose\t(inst, selector, pane); break;\r\n\t\t\tcase \"pin\":\t\t\t\t_.addPin\t(inst, selector, pane); break;\r\n\t\t\tcase \"toggle-slide\":\t_.addToggle\t(inst, selector, pane, true); break;\t\r\n\t\t\tcase \"open-slide\":\t\t_.addOpen\t(inst, selector, pane, true); break;\r\n\t\t}\r\n\t\treturn inst;\r\n\t}\r\n\r\n\t/**\r\n\t* Add a custom Toggler button for a pane\r\n\t*\r\n\t* @param {Object}\t\t\tinst\t\tLayout Instance object\r\n\t* @param {(string|!Object)}\tselector\tjQuery selector (or element) for button, eg: \".ui-layout-north .toggle-button\"\r\n\t* @param {string}  \t\t\tpane \t\tName of the pane the button is for: 'north', 'south', etc.\r\n\t* @param {boolean=}\t\t\tslide \t\ttrue = slide-open, false = pin-open\r\n\t*/\r\n,\taddToggle: function (inst, selector, pane, slide) {\r\n\t\t$.layout.buttons.get(inst, selector, pane, \"toggle\")\r\n\t\t\t.click(function(evt){\r\n\t\t\t\tinst.toggle(pane, !!slide);\r\n\t\t\t\tevt.stopPropagation();\r\n\t\t\t});\r\n\t\treturn inst;\r\n\t}\r\n\r\n\t/**\r\n\t* Add a custom Open button for a pane\r\n\t*\r\n\t* @param {Object}\t\t\tinst\t\tLayout Instance object\r\n\t* @param {(string|!Object)}\tselector\tjQuery selector (or element) for button, eg: \".ui-layout-north .toggle-button\"\r\n\t* @param {string}\t\t\tpane \t\tName of the pane the button is for: 'north', 'south', etc.\r\n\t* @param {boolean=}\t\t\tslide \t\ttrue = slide-open, false = pin-open\r\n\t*/\r\n,\taddOpen: function (inst, selector, pane, slide) {\r\n\t\t$.layout.buttons.get(inst, selector, pane, \"open\")\r\n\t\t\t.attr(\"title\", lang.Open)\r\n\t\t\t.click(function (evt) {\r\n\t\t\t\tinst.open(pane, !!slide);\r\n\t\t\t\tevt.stopPropagation();\r\n\t\t\t});\r\n\t\treturn inst;\r\n\t}\r\n\r\n\t/**\r\n\t* Add a custom Close button for a pane\r\n\t*\r\n\t* @param {Object}\t\t\tinst\t\tLayout Instance object\r\n\t* @param {(string|!Object)}\tselector\tjQuery selector (or element) for button, eg: \".ui-layout-north .toggle-button\"\r\n\t* @param {string}   \t\tpane \t\tName of the pane the button is for: 'north', 'south', etc.\r\n\t*/\r\n,\taddClose: function (inst, selector, pane) {\r\n\t\t$.layout.buttons.get(inst, selector, pane, \"close\")\r\n\t\t\t.attr(\"title\", lang.Close)\r\n\t\t\t.click(function (evt) {\r\n\t\t\t\tinst.close(pane);\r\n\t\t\t\tevt.stopPropagation();\r\n\t\t\t});\r\n\t\treturn inst;\r\n\t}\r\n\r\n\t/**\r\n\t* Add a custom Pin button for a pane\r\n\t*\r\n\t* Four classes are added to the element, based on the paneClass for the associated pane...\r\n\t* Assuming the default paneClass and the pin is 'up', these classes are added for a west-pane pin:\r\n\t*  - ui-layout-pane-pin\r\n\t*  - ui-layout-pane-west-pin\r\n\t*  - ui-layout-pane-pin-up\r\n\t*  - ui-layout-pane-west-pin-up\r\n\t*\r\n\t* @param {Object}\t\t\tinst\t\tLayout Instance object\r\n\t* @param {(string|!Object)}\tselector\tjQuery selector (or element) for button, eg: \".ui-layout-north .toggle-button\"\r\n\t* @param {string}   \t\tpane \t\tName of the pane the pin is for: 'north', 'south', etc.\r\n\t*/\r\n,\taddPin: function (inst, selector, pane) {\r\n\t\tvar\t_\t= $.layout.buttons\r\n\t\t,\t$E\t= _.get(inst, selector, pane, \"pin\");\r\n\t\tif ($E.length) {\r\n\t\t\tvar s = inst.state[pane];\r\n\t\t\t$E.click(function (evt) {\r\n\t\t\t\t_.setPinState(inst, $(this), pane, (s.isSliding || s.isClosed));\r\n\t\t\t\tif (s.isSliding || s.isClosed) inst.open( pane ); // change from sliding to open\r\n\t\t\t\telse inst.close( pane ); // slide-closed\r\n\t\t\t\tevt.stopPropagation();\r\n\t\t\t});\r\n\t\t\t// add up/down pin attributes and classes\r\n\t\t\t_.setPinState(inst, $E, pane, (!s.isClosed && !s.isSliding));\r\n\t\t\t// add this pin to the pane data so we can 'sync it' automatically\r\n\t\t\t// PANE.pins key is an array so we can store multiple pins for each pane\r\n\t\t\ts.pins.push( selector ); // just save the selector string\r\n\t\t}\r\n\t\treturn inst;\r\n\t}\r\n\r\n\t/**\r\n\t* Change the class of the pin button to make it look 'up' or 'down'\r\n\t*\r\n\t* @see  addPin(), syncPins()\r\n\t*\r\n\t* @param {Object}\t\t\tinst\tLayout Instance object\r\n\t* @param {Array.<Object>}\t$Pin\tThe pin-span element in a jQuery wrapper\r\n\t* @param {string}\t\t\tpane\tThese are the params returned to callbacks by layout()\r\n\t* @param {boolean}\t\t\tdoPin\ttrue = set the pin 'down', false = set it 'up'\r\n\t*/\r\n,\tsetPinState: function (inst, $Pin, pane, doPin) {\r\n\t\tvar updown = $Pin.attr(\"pin\");\r\n\t\tif (updown && doPin === (updown==\"down\")) return; // already in correct state\r\n\t\tvar\r\n\t\t\tpin\t\t= inst.options[pane].buttonClass +\"-pin\"\r\n\t\t,\tside\t= pin +\"-\"+ pane\r\n\t\t,\tUP\t\t= pin +\"-up \"+\tside +\"-up\"\r\n\t\t,\tDN\t\t= pin +\"-down \"+side +\"-down\"\r\n\t\t;\r\n\t\t$Pin\r\n\t\t\t.attr(\"pin\", doPin ? \"down\" : \"up\") // logic\r\n\t\t\t.attr(\"title\", doPin ? lang.Unpin : lang.Pin)\r\n\t\t\t.removeClass( doPin ? UP : DN ) \r\n\t\t\t.addClass( doPin ? DN : UP ) \r\n\t\t;\r\n\t}\r\n\r\n\t/**\r\n\t* INTERNAL function to sync 'pin buttons' when pane is opened or closed\r\n\t* Unpinned means the pane is 'sliding' - ie, over-top of the adjacent panes\r\n\t*\r\n\t* @see  open(), close()\r\n\t*\r\n\t* @param {Object}\t\t\tinst\tLayout Instance object\r\n\t* @param {string}\tpane\tThese are the params returned to callbacks by layout()\r\n\t* @param {boolean}\tdoPin\tTrue means set the pin 'down', False means 'up'\r\n\t*/\r\n,\tsyncPinBtns: function (inst, pane, doPin) {\r\n\t\t// REAL METHOD IS _INSIDE_ LAYOUT - THIS IS HERE JUST FOR REFERENCE\r\n\t\t$.each(state[pane].pins, function (i, selector) {\r\n\t\t\t$.layout.buttons.setPinState(inst, $(selector), pane, doPin);\r\n\t\t});\r\n\t}\r\n\r\n\r\n,\t_load: function (inst) {\r\n\t\tvar\t_\t= $.layout.buttons;\r\n\t\t// ADD Button methods to Layout Instance\r\n\t\t// Note: sel = jQuery Selector string\r\n\t\t$.extend( inst, {\r\n\t\t\tbindButton:\t\tfunction (sel, action, pane) { return _.bind(inst, sel, action, pane); }\r\n\t\t//\tDEPRECATED METHODS\r\n\t\t,\taddToggleBtn:\tfunction (sel, pane, slide) { return _.addToggle(inst, sel, pane, slide); }\r\n\t\t,\taddOpenBtn:\t\tfunction (sel, pane, slide) { return _.addOpen(inst, sel, pane, slide); }\r\n\t\t,\taddCloseBtn:\tfunction (sel, pane) { return _.addClose(inst, sel, pane); }\r\n\t\t,\taddPinBtn:\t\tfunction (sel, pane) { return _.addPin(inst, sel, pane); }\r\n\t\t});\r\n\r\n\t\t// init state array to hold pin-buttons\r\n\t\tfor (var i=0; i<4; i++) {\r\n\t\t\tvar pane = $.layout.config.borderPanes[i];\r\n\t\t\tinst.state[pane].pins = [];\r\n\t\t}\r\n\r\n\t\t// auto-init buttons onLoad if option is enabled\r\n\t\tif ( inst.options.autoBindCustomButtons )\r\n\t\t\t_.init(inst);\r\n\t}\r\n\r\n,\t_unload: function (inst) {\r\n\t\t// TODO: unbind all buttons???\r\n\t}\r\n\r\n};\r\n\r\n// add initialization method to Layout's onLoad array of functions\r\n$.layout.onLoad.push(  $.layout.buttons._load );\r\n//$.layout.onUnload.push( $.layout.buttons._unload );\r\n\r\n\r\n\r\n/**\r\n * jquery.layout.browserZoom 1.0\r\n * $Date: 2011-12-29 08:00:00 (Thu, 29 Dec 2011) $\r\n *\r\n * Copyright (c) 2012 \r\n *   Kevin Dalman (http://allpro.net)\r\n *\r\n * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)\r\n * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.\r\n *\r\n * @dependancies: UI Layout 1.3.0.rc30.1 or higher\r\n *\r\n * @support: http://groups.google.com/group/jquery-ui-layout\r\n *\r\n * @todo: Extend logic to handle other problematic zooming in browsers\r\n * @todo: Add hotkey/mousewheel bindings to _instantly_ respond to these zoom event\r\n */\r\n\r\n// tell Layout that the plugin is available\r\n$.layout.plugins.browserZoom = true;\r\n\r\n$.layout.defaults.browserZoomCheckInterval = 1000;\r\n$.layout.optionsMap.layout.push(\"browserZoomCheckInterval\");\r\n\r\n/*\r\n *\tbrowserZoom methods\r\n */\r\n$.layout.browserZoom = {\r\n\r\n\t_init: function (inst) {\r\n\t\t// abort if browser does not need this check\r\n\t\tif ($.layout.browserZoom.ratio() !== false)\r\n\t\t\t$.layout.browserZoom._setTimer(inst);\r\n\t}\r\n\r\n,\t_setTimer: function (inst) {\r\n\t\t// abort if layout destroyed or browser does not need this check\r\n\t\tif (inst.destroyed) return;\r\n\t\tvar o\t= inst.options\r\n\t\t,\ts\t= inst.state\r\n\t\t//\tdon't need check if inst has parentLayout, but check occassionally in case parent destroyed!\r\n\t\t//\tMINIMUM 100ms interval, for performance\r\n\t\t,\tms\t= inst.hasParentLayout ?  5000 : Math.max( o.browserZoomCheckInterval, 100 )\r\n\t\t;\r\n\t\t// set the timer\r\n\t\tsetTimeout(function(){\r\n\t\t\tif (inst.destroyed || !o.resizeWithWindow) return;\r\n\t\t\tvar d = $.layout.browserZoom.ratio();\r\n\t\t\tif (d !== s.browserZoom) {\r\n\t\t\t\ts.browserZoom = d;\r\n\t\t\t\tinst.resizeAll();\r\n\t\t\t}\r\n\t\t\t// set a NEW timeout\r\n\t\t\t$.layout.browserZoom._setTimer(inst);\r\n\t\t}\r\n\t\t,\tms );\r\n\t}\r\n\r\n,\tratio: function () {\r\n\t\tvar w\t= window\r\n\t\t,\ts\t= screen\r\n\t\t,\td\t= document\r\n\t\t,\tdE\t= d.documentElement || d.body\r\n\t\t,\tb\t= $.layout.browser\r\n\t\t,\tv\t= b.version\r\n\t\t,\tr, sW, cW\r\n\t\t;\r\n\t\t// we can ignore all browsers that fire window.resize event onZoom\r\n\t\tif ((b.msie && v > 8)\r\n\t\t||\t!b.msie\r\n\t\t) return false; // don't need to track zoom\r\n\r\n\t\tif (s.deviceXDPI)\r\n\t\t\treturn calc(s.deviceXDPI, s.systemXDPI);\r\n\t\t// everything below is just for future reference!\r\n\t\tif (b.webkit && (r = d.body.getBoundingClientRect))\r\n\t\t\treturn calc((r.left - r.right), d.body.offsetWidth);\r\n\t\tif (b.webkit && (sW = w.outerWidth))\r\n\t\t\treturn calc(sW, w.innerWidth);\r\n\t\tif ((sW = s.width) && (cW = dE.clientWidth))\r\n\t\t\treturn calc(sW, cW);\r\n\t\treturn false; // no match, so cannot - or don't need to - track zoom\r\n\r\n\t\tfunction calc (x,y) { return (parseInt(x,10) / parseInt(y,10) * 100).toFixed(); }\r\n\t}\r\n\r\n};\r\n// add initialization method to Layout's onLoad array of functions\r\n$.layout.onReady.push( $.layout.browserZoom._init );\r\n\r\n\r\n\r\n})( jQuery );"
  },
  {
    "path": "servers/www/assets/js/vendor/jquery.lazyload.js",
    "content": "/*\r\n * Lazy Load - jQuery plugin for lazy loading images\r\n *\r\n * Copyright (c) 2007-2012 Mika Tuupola\r\n *\r\n * Licensed under the MIT license:\r\n *   http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * Project home:\r\n *   http://www.appelsiini.net/projects/lazyload\r\n *\r\n * Version:  1.7.2\r\n *\r\n */\r\n(function($, window) {\r\n\r\n    $window = $(window);\r\n\r\n    $.fn.lazyload = function(options) {\r\n        var elements = this;\r\n        var settings = {\r\n            threshold       : 0,\r\n            failure_limit   : 0,\r\n            event           : \"scroll\",\r\n            effect          : \"show\",\r\n            container       : window,\r\n            data_attribute  : \"original\",\r\n            skip_invisible  : true,\r\n            appear          : null,\r\n            load            : null\r\n        };\r\n\r\n        function update() {\r\n            var counter = 0;\r\n      \r\n            elements.each(function() {\r\n                var $this = $(this);\r\n                if (settings.skip_invisible && !$this.is(\":visible\")) {\r\n                    return;\r\n                }\r\n                if ($.abovethetop(this, settings) ||\r\n                    $.leftofbegin(this, settings)) {\r\n                        /* Nothing. */\r\n                } else if (!$.belowthefold(this, settings) &&\r\n                    !$.rightoffold(this, settings)) {\r\n                        $this.trigger(\"appear\");\r\n                } else {\r\n                    if (++counter > settings.failure_limit) {\r\n                        return false;\r\n                    }\r\n                }\r\n            });\r\n\r\n        }\r\n\r\n        if(options) {\r\n            /* Maintain BC for a couple of versions. */\r\n            if (undefined !== options.failurelimit) {\r\n                options.failure_limit = options.failurelimit; \r\n                delete options.failurelimit;\r\n            }\r\n            if (undefined !== options.effectspeed) {\r\n                options.effect_speed = options.effectspeed; \r\n                delete options.effectspeed;\r\n            }\r\n\r\n            $.extend(settings, options);\r\n        }\r\n\r\n        /* Cache container as jQuery as object. */\r\n        $container = (settings.container === undefined ||\r\n                      settings.container === window) ? $window : $(settings.container);\r\n\r\n        /* Fire one scroll event per scroll. Not one scroll event per image. */\r\n        if (0 === settings.event.indexOf(\"scroll\")) {\r\n            $container.bind(settings.event, function(event) {\r\n                return update();\r\n            });\r\n        }\r\n\r\n        this.each(function() {\r\n            var self = this;\r\n            var $self = $(self);\r\n\r\n            self.loaded = false;\r\n\r\n            /* When appear is triggered load original image. */\r\n            $self.one(\"appear\", function() {\r\n                if (!this.loaded) {\r\n                    if (settings.appear) {\r\n                        var elements_left = elements.length;\r\n                        settings.appear.call(self, elements_left, settings);\r\n                    }\r\n                    $(\"<img />\")\r\n                        .bind(\"load\", function() {\r\n                            $self\r\n                                .hide()\r\n                                .attr(\"src\", $self.data(settings.data_attribute))\r\n                                [settings.effect](settings.effect_speed);\r\n                            self.loaded = true;\r\n\r\n                            /* Remove image from array so it is not looped next time. */\r\n                            var temp = $.grep(elements, function(element) {\r\n                                return !element.loaded;\r\n                            });\r\n                            elements = $(temp);\r\n\r\n                            if (settings.load) {\r\n                                var elements_left = elements.length;\r\n                                settings.load.call(self, elements_left, settings);\r\n                            }\r\n                        })\r\n                        .attr(\"src\", $self.data(settings.data_attribute));\r\n                }\r\n            });\r\n\r\n            /* When wanted event is triggered load original image */\r\n            /* by triggering appear.                              */\r\n            if (0 !== settings.event.indexOf(\"scroll\")) {\r\n                $self.bind(settings.event, function(event) {\r\n                    if (!self.loaded) {\r\n                        $self.trigger(\"appear\");\r\n                    }\r\n                });\r\n            }\r\n        });\r\n\r\n        /* Check if something appears when window is resized. */\r\n        $window.bind(\"resize\", function(event) {\r\n            update();\r\n        });\r\n\r\n        /* Force initial check if images should appear. */\r\n        update();\r\n        \r\n        return this;\r\n    };\r\n\r\n    /* Convenience methods in jQuery namespace.           */\r\n    /* Use as  $.belowthefold(element, {threshold : 100, container : window}) */\r\n\r\n    $.belowthefold = function(element, settings) {\r\n        var fold;\r\n        \r\n        if (settings.container === undefined || settings.container === window) {\r\n            fold = $window.height() + $window.scrollTop();\r\n        } else {\r\n            fold = $container.offset().top + $container.height();\r\n        }\r\n\r\n        return fold <= $(element).offset().top - settings.threshold;\r\n    };\r\n    \r\n    $.rightoffold = function(element, settings) {\r\n        var fold;\r\n\r\n        if (settings.container === undefined || settings.container === window) {\r\n            fold = $window.width() + $window.scrollLeft();\r\n        } else {\r\n            fold = $container.offset().left + $container.width();\r\n        }\r\n\r\n        return fold <= $(element).offset().left - settings.threshold;\r\n    };\r\n        \r\n    $.abovethetop = function(element, settings) {\r\n        var fold;\r\n        \r\n        if (settings.container === undefined || settings.container === window) {\r\n            fold = $window.scrollTop();\r\n        } else {\r\n            fold = $container.offset().top;\r\n        }\r\n\r\n        return fold >= $(element).offset().top + settings.threshold  + $(element).height();\r\n    };\r\n    \r\n    $.leftofbegin = function(element, settings) {\r\n        var fold;\r\n        \r\n        if (settings.container === undefined || settings.container === window) {\r\n            fold = $window.scrollLeft();\r\n        } else {\r\n            fold = $container.offset().left;\r\n        }\r\n\r\n        return fold >= $(element).offset().left + settings.threshold + $(element).width();\r\n    };\r\n\r\n    $.inviewport = function(element, settings) {\r\n         return !$.rightofscreen(element, settings) && !$.leftofscreen(element, settings) && \r\n                !$.belowthefold(element, settings) && !$.abovethetop(element, settings);\r\n     };\r\n\r\n    /* Custom selectors for your convenience.   */\r\n    /* Use as $(\"img:below-the-fold\").something() */\r\n\r\n    $.extend($.expr[':'], {\r\n        \"below-the-fold\" : function(a) { return $.belowthefold(a, {threshold : 0, container: window}); },\r\n        \"above-the-top\"  : function(a) { return !$.belowthefold(a, {threshold : 0, container: window}); },\r\n        \"right-of-screen\": function(a) { return $.rightoffold(a, {threshold : 0, container: window}); },\r\n        \"left-of-screen\" : function(a) { return !$.rightoffold(a, {threshold : 0, container: window}); },\r\n        \"in-viewport\"    : function(a) { return !$.inviewport(a, {threshold : 0, container: window}); },\r\n        /* Maintain BC for couple of versions. */\r\n        \"above-the-fold\" : function(a) { return !$.belowthefold(a, {threshold : 0, container: window}); },\r\n        \"right-of-fold\"  : function(a) { return $.rightoffold(a, {threshold : 0, container: window}); },\r\n        \"left-of-fold\"   : function(a) { return !$.rightoffold(a, {threshold : 0, container: window}); }\r\n    });\r\n\r\n})(jQuery, window);"
  },
  {
    "path": "servers/www/assets/js/vendor/jquery.timeago.js",
    "content": "/**\r\n * Timeago is a jQuery plugin that makes it easy to support automatically\r\n * updating fuzzy timestamps (e.g. \"4 minutes ago\" or \"about 1 day ago\").\r\n *\r\n * @name timeago\r\n * @version 0.11.1\r\n * @requires jQuery v1.2.3+\r\n * @author Ryan McGeary\r\n * @license MIT License - http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * For usage and examples, visit:\r\n * http://timeago.yarp.com/\r\n *\r\n * Copyright (c) 2008-2011, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org)\r\n */\r\n(function($) {\r\n  $.timeago = function(timestamp) {\r\n    if (timestamp instanceof Date) {\r\n      return inWords(timestamp);\r\n    } else if (typeof timestamp === \"string\") {\r\n      return inWords($.timeago.parse(timestamp));\r\n    } else {\r\n      return inWords($.timeago.datetime(timestamp));\r\n    }\r\n  };\r\n  var $t = $.timeago;\r\n\r\n  $.extend($.timeago, {\r\n    settings: {\r\n      refreshMillis: 60000,\r\n      allowFuture: false,\r\n      strings: {\r\n        prefixAgo: null,\r\n        prefixFromNow: null,\r\n        suffixAgo: \"ago\",\r\n        suffixFromNow: \"from now\",\r\n        seconds: \"less than a minute\",\r\n        minute: \"about a minute\",\r\n        minutes: \"%d minutes\",\r\n        hour: \"about an hour\",\r\n        hours: \"about %d hours\",\r\n        day: \"a day\",\r\n        days: \"%d days\",\r\n        month: \"about a month\",\r\n        months: \"%d months\",\r\n        year: \"about a year\",\r\n        years: \"%d years\",\r\n        wordSeparator: \" \",\r\n        numbers: []\r\n      }\r\n    },\r\n    inWords: function(distanceMillis) {\r\n      var $l = this.settings.strings;\r\n      var prefix = $l.prefixAgo;\r\n      var suffix = $l.suffixAgo;\r\n      if (this.settings.allowFuture) {\r\n        if (distanceMillis < 0) {\r\n          prefix = $l.prefixFromNow;\r\n          suffix = $l.suffixFromNow;\r\n        }\r\n      }\r\n\r\n      var seconds = Math.abs(distanceMillis) / 1000;\r\n      var minutes = seconds / 60;\r\n      var hours = minutes / 60;\r\n      var days = hours / 24;\r\n      var years = days / 365;\r\n\r\n      function substitute(stringOrFunction, number) {\r\n        var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;\r\n        var value = ($l.numbers && $l.numbers[number]) || number;\r\n        return string.replace(/%d/i, value);\r\n      }\r\n\r\n      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||\r\n        seconds < 90 && substitute($l.minute, 1) ||\r\n        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||\r\n        minutes < 90 && substitute($l.hour, 1) ||\r\n        hours < 24 && substitute($l.hours, Math.round(hours)) ||\r\n        hours < 42 && substitute($l.day, 1) ||\r\n        days < 30 && substitute($l.days, Math.round(days)) ||\r\n        days < 45 && substitute($l.month, 1) ||\r\n        days < 365 && substitute($l.months, Math.round(days / 30)) ||\r\n        years < 1.5 && substitute($l.year, 1) ||\r\n        substitute($l.years, Math.round(years));\r\n\r\n      var separator = $l.wordSeparator === undefined ?  \" \" : $l.wordSeparator;\r\n      return $.trim([prefix, words, suffix].join(separator));\r\n    },\r\n    parse: function(iso8601) {\r\n      var s = $.trim(iso8601);\r\n      s = s.replace(/\\.\\d\\d\\d+/,\"\"); // remove milliseconds\r\n      s = s.replace(/-/,\"/\").replace(/-/,\"/\");\r\n      s = s.replace(/T/,\" \").replace(/Z/,\" UTC\");\r\n      s = s.replace(/([\\+\\-]\\d\\d)\\:?(\\d\\d)/,\" $1$2\"); // -04:00 -> -0400\r\n      return new Date(s);\r\n    },\r\n    datetime: function(elem) {\r\n      // jQuery's `is()` doesn't play well with HTML5 in IE\r\n      var isTime = $(elem).get(0).tagName.toLowerCase() === \"time\"; // $(elem).is(\"time\");\r\n      var iso8601 = isTime ? $(elem).attr(\"datetime\") : $(elem).attr(\"title\");\r\n      return $t.parse(iso8601);\r\n    }\r\n  });\r\n\r\n  $.fn.timeago = function() {\r\n    var self = this;\r\n    self.each(refresh);\r\n\r\n    var $s = $t.settings;\r\n    if ($s.refreshMillis > 0) {\r\n      setInterval(function() { self.each(refresh); }, $s.refreshMillis);\r\n    }\r\n    return self;\r\n  };\r\n\r\n  function refresh() {\r\n    var data = prepareData(this);\r\n    if (!isNaN(data.datetime)) {\r\n      $(this).text(inWords(data.datetime));\r\n    }\r\n    return this;\r\n  }\r\n\r\n  function prepareData(element) {\r\n    element = $(element);\r\n    if (!element.data(\"timeago\")) {\r\n      element.data(\"timeago\", { datetime: $t.datetime(element) });\r\n      var text = $.trim(element.text());\r\n      if (text.length > 0) {\r\n        element.attr(\"title\", text);\r\n      }\r\n    }\r\n    return element.data(\"timeago\");\r\n  }\r\n\r\n  function inWords(date) {\r\n    return $t.inWords(distance(date));\r\n  }\r\n\r\n  function distance(date) {\r\n    return (new Date().getTime() - date.getTime());\r\n  }\r\n\r\n  // fix for IE6 suckage\r\n  document.createElement(\"abbr\");\r\n  document.createElement(\"time\");\r\n}(jQuery));"
  },
  {
    "path": "servers/www/assets/js/vendor/jquery.ui.custom.js",
    "content": "/*!\n * jQuery UI 1.8.21\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI\n */\n(function( $, undefined ) {\n\n// prevent duplicate loading\n// this is only a problem because we proxy existing functions\n// and we don't want to double proxy them\n$.ui = $.ui || {};\nif ( $.ui.version ) {\n\treturn;\n}\n\n$.extend( $.ui, {\n\tversion: \"1.8.21\",\n\n\tkeyCode: {\n\t\tALT: 18,\n\t\tBACKSPACE: 8,\n\t\tCAPS_LOCK: 20,\n\t\tCOMMA: 188,\n\t\tCOMMAND: 91,\n\t\tCOMMAND_LEFT: 91, // COMMAND\n\t\tCOMMAND_RIGHT: 93,\n\t\tCONTROL: 17,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tINSERT: 45,\n\t\tLEFT: 37,\n\t\tMENU: 93, // COMMAND_RIGHT\n\t\tNUMPAD_ADD: 107,\n\t\tNUMPAD_DECIMAL: 110,\n\t\tNUMPAD_DIVIDE: 111,\n\t\tNUMPAD_ENTER: 108,\n\t\tNUMPAD_MULTIPLY: 106,\n\t\tNUMPAD_SUBTRACT: 109,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSHIFT: 16,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38,\n\t\tWINDOWS: 91 // COMMAND\n\t}\n});\n\n// plugins\n$.fn.extend({\n\tpropAttr: $.fn.prop || $.fn.attr,\n\n\t_focus: $.fn.focus,\n\tfocus: function( delay, fn ) {\n\t\treturn typeof delay === \"number\" ?\n\t\t\tthis.each(function() {\n\t\t\t\tvar elem = this;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t}\n\t\t\t\t}, delay );\n\t\t\t}) :\n\t\t\tthis._focus.apply( this, arguments );\n\t},\n\n\tscrollParent: function() {\n\t\tvar scrollParent;\n\t\tif (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));\n\t\t\t}).eq(0);\n\t\t} else {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));\n\t\t\t}).eq(0);\n\t\t}\n\n\t\treturn (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t},\n\n\tdisableSelection: function() {\n\t\treturn this.bind( ( $.support.selectstart ? \"selectstart\" : \"mousedown\" ) +\n\t\t\t\".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t},\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t}\n});\n\n$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\ttype = name.toLowerCase(),\n\t\torig = {\n\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\touterWidth: $.fn.outerWidth,\n\t\t\touterHeight: $.fn.outerHeight\n\t\t};\n\n\tfunction reduce( elem, size, border, margin ) {\n\t\t$.each( side, function() {\n\t\t\tsize -= parseFloat( $.curCSS( elem, \"padding\" + this, true) ) || 0;\n\t\t\tif ( border ) {\n\t\t\t\tsize -= parseFloat( $.curCSS( elem, \"border\" + this + \"Width\", true) ) || 0;\n\t\t\t}\n\t\t\tif ( margin ) {\n\t\t\t\tsize -= parseFloat( $.curCSS( elem, \"margin\" + this, true) ) || 0;\n\t\t\t}\n\t\t});\n\t\treturn size;\n\t}\n\n\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\tif ( size === undefined ) {\n\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t});\n\t};\n\n\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\tif ( typeof size !== \"number\" ) {\n\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t});\n\t};\n});\n\n// selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar nodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tvar map = element.parentNode,\n\t\t\tmapName = map.name,\n\t\t\timg;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap=#\" + mapName + \"]\" )[0];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( /input|select|textarea|button|object/.test( nodeName )\n\t\t? !element.disabled\n\t\t: \"a\" == nodeName\n\t\t\t? element.href || isTabIndexNotNaN\n\t\t\t: isTabIndexNotNaN)\n\t\t// the element and all of its ancestors must be visible\n\t\t&& visible( element );\n}\n\nfunction visible( element ) {\n\treturn !$( element ).parents().andSelf().filter(function() {\n\t\treturn $.curCSS( this, \"visibility\" ) === \"hidden\" ||\n\t\t\t$.expr.filters.hidden( this );\n\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: function( elem, i, match ) {\n\t\treturn !!$.data( elem, match[ 3 ] );\n\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n// support\n$(function() {\n\tvar body = document.body,\n\t\tdiv = body.appendChild( div = document.createElement( \"div\" ) );\n\n\t// access offsetHeight before setting the style to prevent a layout bug\n\t// in IE 9 which causes the elemnt to continue to take up space even\n\t// after it is removed from the DOM (#8026)\n\tdiv.offsetHeight;\n\n\t$.extend( div.style, {\n\t\tminHeight: \"100px\",\n\t\theight: \"auto\",\n\t\tpadding: 0,\n\t\tborderWidth: 0\n\t});\n\n\t$.support.minHeight = div.offsetHeight === 100;\n\t$.support.selectstart = \"onselectstart\" in div;\n\n\t// set display to none to avoid a layout bug in IE\n\t// http://dev.jquery.com/ticket/4014\n\tbody.removeChild( div ).style.display = \"none\";\n});\n\n\n\n\n\n// deprecated\n$.extend( $.ui, {\n\t// $.ui.plugin is deprecated.  Use the proxy pattern instead.\n\tplugin: {\n\t\tadd: function( module, option, set ) {\n\t\t\tvar proto = $.ui[ module ].prototype;\n\t\t\tfor ( var i in set ) {\n\t\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t\t}\n\t\t},\n\t\tcall: function( instance, name, args ) {\n\t\t\tvar set = instance.plugins[ name ];\n\t\t\tif ( !set || !instance.element[ 0 ].parentNode ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tfor ( var i = 0; i < set.length; i++ ) {\n\t\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t\n\t// will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()\n\tcontains: function( a, b ) {\n\t\treturn document.compareDocumentPosition ?\n\t\t\ta.compareDocumentPosition( b ) & 16 :\n\t\t\ta !== b && a.contains( b );\n\t},\n\t\n\t// only used by resizable\n\thasScroll: function( el, a ) {\n\t\n\t\t//If overflow is hidden, the element might have extra content, but the user wants to hide it\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\n\t\t\treturn false;\n\t\t}\n\t\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\t\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t},\n\t\n\t// these are odd functions, fix the API or move into individual plugins\n\tisOverAxis: function( x, reference, size ) {\n\t\t//Determines when x coordinate is over \"b\" element axis\n\t\treturn ( x > reference ) && ( x < ( reference + size ) );\n\t},\n\tisOver: function( y, x, top, left, height, width ) {\n\t\t//Determines when x, y coordinates is over \"b\" element\n\t\treturn $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );\n\t}\n});\n\n})( jQuery );\n/*!\n * jQuery UI Widget 1.8.21\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Widget\n */\n(function( $, undefined ) {\n\n// jQuery 1.4+\nif ( $.cleanData ) {\n\tvar _cleanData = $.cleanData;\n\t$.cleanData = function( elems ) {\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\ttry {\n\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t} catch( e ) {}\n\t\t}\n\t\t_cleanData( elems );\n\t};\n} else {\n\tvar _remove = $.fn.remove;\n\t$.fn.remove = function( selector, keepData ) {\n\t\treturn this.each(function() {\n\t\t\tif ( !keepData ) {\n\t\t\t\tif ( !selector || $.filter( selector, [ this ] ).length ) {\n\t\t\t\t\t$( \"*\", this ).add( [ this ] ).each(function() {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t$( this ).triggerHandler( \"remove\" );\n\t\t\t\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t\t\t\t} catch( e ) {}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn _remove.call( $(this), selector, keepData );\n\t\t});\n\t};\n}\n\n$.widget = function( name, base, prototype ) {\n\tvar namespace = name.split( \".\" )[ 0 ],\n\t\tfullName;\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName ] = function( elem ) {\n\t\treturn !!$.data( elem, name );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\t$[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without initializing for simple inheritance\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\tvar basePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n//\t$.each( basePrototype, function( key, val ) {\n//\t\tif ( $.isPlainObject(val) ) {\n//\t\t\tbasePrototype[ key ] = $.extend( {}, val );\n//\t\t}\n//\t});\n\tbasePrototype.options = $.extend( true, {}, basePrototype.options );\n\t$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,\n\t\twidgetBaseClass: fullName\n\t}, prototype );\n\n\t$.widget.bridge( name, $[ namespace ][ name ] );\n};\n\n$.widget.bridge = function( name, object ) {\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = Array.prototype.slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.extend.apply( null, [ true, options ].concat(args) ) :\n\t\t\toptions;\n\n\t\t// prevent calls to internal methods\n\t\tif ( isMethodCall && options.charAt( 0 ) === \"_\" ) {\n\t\t\treturn returnValue;\n\t\t}\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, name ),\n\t\t\t\t\tmethodValue = instance && $.isFunction( instance[options] ) ?\n\t\t\t\t\t\tinstance[ options ].apply( instance, args ) :\n\t\t\t\t\t\tinstance;\n\t\t\t\t// TODO: add this back in 1.9 and use $.error() (see #5972)\n//\t\t\t\tif ( !instance ) {\n//\t\t\t\t\tthrow \"cannot call methods on \" + name + \" prior to initialization; \" +\n//\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\";\n//\t\t\t\t}\n//\t\t\t\tif ( !$.isFunction( instance[options] ) ) {\n//\t\t\t\t\tthrow \"no such method '\" + options + \"' for \" + name + \" widget instance\";\n//\t\t\t\t}\n//\t\t\t\tvar methodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, name );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} )._init();\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, name, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( options, element ) {\n\t// allow instantiation without initializing for simple inheritance\n\tif ( arguments.length ) {\n\t\tthis._createWidget( options, element );\n\t}\n};\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\toptions: {\n\t\tdisabled: false\n\t},\n\t_createWidget: function( options, element ) {\n\t\t// $.widget.bridge stores the plugin instance, but we do it anyway\n\t\t// so that it's stored even before the _create function runs\n\t\t$.data( element, this.widgetName, this );\n\t\tthis.element = $( element );\n\t\tthis.options = $.extend( true, {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tvar self = this;\n\t\tthis.element.bind( \"remove.\" + this.widgetName, function() {\n\t\t\tself.destroy();\n\t\t});\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\" );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: function() {\n\t\treturn $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];\n\t},\n\t_create: function() {},\n\t_init: function() {},\n\n\tdestroy: function() {\n\t\tthis.element\n\t\t\t.unbind( \".\" + this.widgetName )\n\t\t\t.removeData( this.widgetName );\n\t\tthis.widget()\n\t\t\t.unbind( \".\" + this.widgetName )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetBaseClass + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\t},\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.extend( {}, this.options );\n\t\t}\n\n\t\tif  (typeof key === \"string\" ) {\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn this.options[ key ];\n\t\t\t}\n\t\t\toptions = {};\n\t\t\toptions[ key ] = value;\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar self = this;\n\t\t$.each( options, function( key, value ) {\n\t\t\tself._setOption( key, value );\n\t\t});\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t[ value ? \"addClass\" : \"removeClass\"](\n\t\t\t\t\tthis.widgetBaseClass + \"-disabled\" + \" \" +\n\t\t\t\t\t\"ui-state-disabled\" )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOption( \"disabled\", false );\n\t},\n\tdisable: function() {\n\t\treturn this._setOption( \"disabled\", true );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\n\t\treturn !( $.isFunction(callback) &&\n\t\t\tcallback.call( this.element[0], event, data ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n})( jQuery );\n/*!\n * jQuery UI Mouse 1.8.21\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Mouse\n *\n * Depends:\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nvar mouseHandled = false;\n$( document ).mouseup( function( e ) {\n\tmouseHandled = false;\n});\n\n$.widget(\"ui.mouse\", {\n\toptions: {\n\t\tcancel: ':input,option',\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar self = this;\n\n\t\tthis.element\n\t\t\t.bind('mousedown.'+this.widgetName, function(event) {\n\t\t\t\treturn self._mouseDown(event);\n\t\t\t})\n\t\t\t.bind('click.'+this.widgetName, function(event) {\n\t\t\t\tif (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {\n\t\t\t\t    $.removeData(event.target, self.widgetName + '.preventClickEvent');\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.unbind('.'+this.widgetName);\n\t\t$(document)\n\t\t\t.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);\n\t},\n\n\t_mouseDown: function(event) {\n\t\t// don't let more than one widget handle mouseStart\n\t\tif( mouseHandled ) { return };\n\n\t\t// we may have missed mouseup (out of window)\n\t\t(this._mouseStarted && this._mouseUp(event));\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar self = this,\n\t\t\tbtnIsLeft = (event.which == 1),\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = (typeof this.options.cancel == \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif (!this.mouseDelayMet) {\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\n\t\t\t\tself.mouseDelayMet = true;\n\t\t\t}, this.options.delay);\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\n\t\t\tif (!this._mouseStarted) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {\n\t\t\t$.removeData(event.target, this.widgetName + '.preventClickEvent');\n\t\t}\n\n\t\t// these delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function(event) {\n\t\t\treturn self._mouseMove(event);\n\t\t};\n\t\tthis._mouseUpDelegate = function(event) {\n\t\t\treturn self._mouseUp(event);\n\t\t};\n\t\t$(document)\n\t\t\t.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);\n\n\t\tevent.preventDefault();\n\t\t\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function(event) {\n\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\tif ($.browser.msie && !(document.documentMode >= 9) && !event.button) {\n\t\t\treturn this._mouseUp(event);\n\t\t}\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseDrag(event);\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function(event) {\n\t\t$(document)\n\t\t\t.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif (event.target == this._mouseDownEvent.target) {\n\t\t\t    $.data(event.target, this.widgetName + '.preventClickEvent', true);\n\t\t\t}\n\n\t\t\tthis._mouseStop(event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseDistanceMet: function(event) {\n\t\treturn (Math.max(\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function(event) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function(event) {},\n\t_mouseDrag: function(event) {},\n\t_mouseStop: function(event) {},\n\t_mouseCapture: function(event) { return true; }\n});\n\n})(jQuery);\n/*!\n * jQuery UI Draggable 1.8.21\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Draggables\n *\n * Depends:\n *\tjquery.ui.core.js\n *\tjquery.ui.mouse.js\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\n$.widget(\"ui.draggable\", $.ui.mouse, {\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false\n\t},\n\t_create: function() {\n\n\t\tif (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css(\"position\")))\n\t\t\tthis.element[0].style.position = 'relative';\n\n\t\t(this.options.addClasses && this.element.addClass(\"ui-draggable\"));\n\t\t(this.options.disabled && this.element.addClass(\"ui-draggable-disabled\"));\n\n\t\tthis._mouseInit();\n\n\t},\n\n\tdestroy: function() {\n\t\tif(!this.element.data('draggable')) return;\n\t\tthis.element\n\t\t\t.removeData(\"draggable\")\n\t\t\t.unbind(\".draggable\")\n\t\t\t.removeClass(\"ui-draggable\"\n\t\t\t\t+ \" ui-draggable-dragging\"\n\t\t\t\t+ \" ui-draggable-disabled\");\n\t\tthis._mouseDestroy();\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function(event) {\n\n\t\tvar o = this.options;\n\n\t\t// among others, prevent a drag on a resizable-handle\n\t\tif (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))\n\t\t\treturn false;\n\n\t\t//Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle(event);\n\t\tif (!this.handle)\n\t\t\treturn false;\n\t\t\n\t\tif ( o.iframeFix ) {\n\t\t\t$(o.iframeFix === true ? \"iframe\" : o.iframeFix).each(function() {\n\t\t\t\t$('<div class=\"ui-draggable-iframeFix\" style=\"background: #fff;\"></div>')\n\t\t\t\t.css({\n\t\t\t\t\twidth: this.offsetWidth+\"px\", height: this.offsetHeight+\"px\",\n\t\t\t\t\tposition: \"absolute\", opacity: \"0.001\", zIndex: 1000\n\t\t\t\t})\n\t\t\t\t.css($(this).offset())\n\t\t\t\t.appendTo(\"body\");\n\t\t\t});\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function(event) {\n\n\t\tvar o = this.options;\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\tthis.helper.addClass(\"ui-draggable-dragging\");\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//If ddmanager is used for droppables, set the global draggable\n\t\tif($.ui.ddmanager)\n\t\t\t$.ui.ddmanager.current = this;\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Store the helper's css position\n\t\tthis.cssPosition = this.helper.css(\"position\");\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.positionAbs = this.element.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend(this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\n\t\t});\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition(event);\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t//Set a containment if given in the options\n\t\tif(o.containment)\n\t\t\tthis._setContainment();\n\n\t\t//Trigger event + callbacks\n\t\tif(this._trigger(\"start\", event) === false) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t//Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//Prepare the droppable offsets\n\t\tif ($.ui.ddmanager && !o.dropBehaviour)\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\n\t\t\n\t\tthis._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position\n\t\t\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)\n\t\tif ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);\n\t\t\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function(event, noPropagation) {\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition(event);\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\n\t\tif (!noPropagation) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif(this._trigger('drag', event, ui) === false) {\n\t\t\t\tthis._mouseUp({});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tif(!this.options.axis || this.options.axis != \"y\") this.helper[0].style.left = this.position.left+'px';\n\t\tif(!this.options.axis || this.options.axis != \"x\") this.helper[0].style.top = this.position.top+'px';\n\t\tif($.ui.ddmanager) $.ui.ddmanager.drag(this, event);\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function(event) {\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tvar dropped = false;\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour)\n\t\t\tdropped = $.ui.ddmanager.drop(this, event);\n\n\t\t//if a drop comes from outside (a sortable)\n\t\tif(this.dropped) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\t\t\n\t\t//if the original element is no longer in the DOM don't bother to continue (see #8269)\n\t\tvar element = this.element[0], elementInDom = false;\n\t\twhile ( element && (element = element.parentNode) ) {\n\t\t\tif (element == document ) {\n\t\t\t\telementInDom = true;\n\t\t\t}\n\t\t}\n\t\tif ( !elementInDom && this.options.helper === \"original\" )\n\t\t\treturn false;\n\n\t\tif((this.options.revert == \"invalid\" && !dropped) || (this.options.revert == \"valid\" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {\n\t\t\tvar self = this;\n\t\t\t$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {\n\t\t\t\tif(self._trigger(\"stop\", event) !== false) {\n\t\t\t\t\tself._clear();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(this._trigger(\"stop\", event) !== false) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\n\t_mouseUp: function(event) {\n\t\tif (this.options.iframeFix === true) {\n\t\t\t$(\"div.ui-draggable-iframeFix\").each(function() { \n\t\t\t\tthis.parentNode.removeChild(this); \n\t\t\t}); //Remove frame helpers\n\t\t}\n\t\t\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)\n\t\tif( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);\n\t\t\n\t\treturn $.ui.mouse.prototype._mouseUp.call(this, event);\n\t},\n\t\n\tcancel: function() {\n\t\t\n\t\tif(this.helper.is(\".ui-draggable-dragging\")) {\n\t\t\tthis._mouseUp({});\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\t\t\n\t\treturn this;\n\t\t\n\t},\n\n\t_getHandle: function(event) {\n\n\t\tvar handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;\n\t\t$(this.options.handle, this.element)\n\t\t\t.find(\"*\")\n\t\t\t.andSelf()\n\t\t\t.each(function() {\n\t\t\t\tif(this == event.target) handle = true;\n\t\t\t});\n\n\t\treturn handle;\n\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options;\n\t\tvar helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);\n\n\t\tif(!helper.parents('body').length)\n\t\t\thelper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));\n\n\t\tif(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css(\"position\")))\n\t\t\thelper.css(\"position\", \"absolute\");\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj == 'string') {\n\t\t\tobj = obj.split(' ');\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\n\t\t}\n\t\tif ('left' in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ('right' in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ('top' in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ('bottom' in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\tif((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information\n\t\t|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix\n\t\t\tpo = { top: 0, left: 0 };\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif(this.cssPosition == \"relative\") {\n\t\t\tvar p = this.element.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.element.css(\"marginLeft\"),10) || 0),\n\t\t\ttop: (parseInt(this.element.css(\"marginTop\"),10) || 0),\n\t\t\tright: (parseInt(this.element.css(\"marginRight\"),10) || 0),\n\t\t\tbottom: (parseInt(this.element.css(\"marginBottom\"),10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar o = this.options;\n\t\tif(o.containment == 'parent') o.containment = this.helper[0].parentNode;\n\t\tif(o.containment == 'document' || o.containment == 'window') this.containment = [\n\t\t\to.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\to.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,\n\t\t\t(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\n\t\t];\n\n\t\tif(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {\n\t\t        var c = $(o.containment);\n\t\t\tvar ce = c[0]; if(!ce) return;\n\t\t\tvar co = c.offset();\n\t\t\tvar over = ($(ce).css(\"overflow\") != 'hidden');\n\n\t\t\tthis.containment = [\n\t\t\t\t(parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0),\n\t\t\t\t(parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0),\n\t\t\t\t(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,\n\t\t\t\t(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom\n\t\t\t];\n\t\t\tthis.relative_container = c;\n\n\t\t} else if(o.containment.constructor == Array) {\n\t\t\tthis.containment = o.containment;\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif(!pos) pos = this.position;\n\t\tvar mod = d == \"absolute\" ? 1 : -1;\n\t\tvar o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\t+ this.offset.relative.top * mod\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\t+ this.offset.parent.top * mod\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\t+ this.offset.relative.left * mod\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\t+ this.offset.parent.left * mod\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function(event) {\n\n\t\tvar o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\t\tvar pageX = event.pageX;\n\t\tvar pageY = event.pageY;\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif(this.originalPosition) { //If we are not dragging yet, we won't check for options\n\t\t         var containment;\n\t\t         if(this.containment) {\n\t\t\t\t if (this.relative_container){\n\t\t\t\t     var co = this.relative_container.offset();\n\t\t\t\t     containment = [ this.containment[0] + co.left,\n\t\t\t\t\t\t     this.containment[1] + co.top,\n\t\t\t\t\t\t     this.containment[2] + co.left,\n\t\t\t\t\t\t     this.containment[3] + co.top ];\n\t\t\t\t }\n\t\t\t\t else {\n\t\t\t\t     containment = this.containment;\n\t\t\t\t }\n\n\t\t\t\tif(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;\n\t\t\t\tif(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;\n\t\t\t\tif(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;\n\t\t\t\tif(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;\n\t\t\t}\n\n\t\t\tif(o.grid) {\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)\n\t\t\t\tvar top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;\n\t\t\t\tpageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tvar left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;\n\t\t\t\tpageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\t- this.offset.click.top\t\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\t- this.offset.relative.top\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\t- this.offset.parent.top\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\t- this.offset.click.left\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\t- this.offset.relative.left\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\t- this.offset.parent.left\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis.helper.removeClass(\"ui-draggable-dragging\");\n\t\tif(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();\n\t\t//if($.ui.ddmanager) $.ui.ddmanager.current = null;\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t},\n\n\t// From now on bulk stuff - mainly helpers\n\n\t_trigger: function(type, event, ui) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call(this, type, [event, ui]);\n\t\tif(type == \"drag\") this.positionAbs = this._convertPositionTo(\"absolute\"); //The absolute position has to be recalculated after plugins\n\t\treturn $.Widget.prototype._trigger.call(this, type, event, ui);\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function(event) {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n});\n\n$.extend($.ui.draggable, {\n\tversion: \"1.8.21\"\n});\n\n$.ui.plugin.add(\"draggable\", \"connectToSortable\", {\n\tstart: function(event, ui) {\n\n\t\tvar inst = $(this).data(\"draggable\"), o = inst.options,\n\t\t\tuiSortable = $.extend({}, ui, { item: inst.element });\n\t\tinst.sortables = [];\n\t\t$(o.connectToSortable).each(function() {\n\t\t\tvar sortable = $.data(this, 'sortable');\n\t\t\tif (sortable && !sortable.options.disabled) {\n\t\t\t\tinst.sortables.push({\n\t\t\t\t\tinstance: sortable,\n\t\t\t\t\tshouldRevert: sortable.options.revert\n\t\t\t\t});\n\t\t\t\tsortable.refreshPositions();\t// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).\n\t\t\t\tsortable._trigger(\"activate\", event, uiSortable);\n\t\t\t}\n\t\t});\n\n\t},\n\tstop: function(event, ui) {\n\n\t\t//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper\n\t\tvar inst = $(this).data(\"draggable\"),\n\t\t\tuiSortable = $.extend({}, ui, { item: inst.element });\n\n\t\t$.each(inst.sortables, function() {\n\t\t\tif(this.instance.isOver) {\n\n\t\t\t\tthis.instance.isOver = 0;\n\n\t\t\t\tinst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance\n\t\t\t\tthis.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)\n\n\t\t\t\t//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'\n\t\t\t\tif(this.shouldRevert) this.instance.options.revert = true;\n\n\t\t\t\t//Trigger the stop of the sortable\n\t\t\t\tthis.instance._mouseStop(event);\n\n\t\t\t\tthis.instance.options.helper = this.instance.options._helper;\n\n\t\t\t\t//If the helper has been the original item, restore properties in the sortable\n\t\t\t\tif(inst.options.helper == 'original')\n\t\t\t\t\tthis.instance.currentItem.css({ top: 'auto', left: 'auto' });\n\n\t\t\t} else {\n\t\t\t\tthis.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance\n\t\t\t\tthis.instance._trigger(\"deactivate\", event, uiSortable);\n\t\t\t}\n\n\t\t});\n\n\t},\n\tdrag: function(event, ui) {\n\n\t\tvar inst = $(this).data(\"draggable\"), self = this;\n\n\t\tvar checkPos = function(o) {\n\t\t\tvar dyClick = this.offset.click.top, dxClick = this.offset.click.left;\n\t\t\tvar helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;\n\t\t\tvar itemHeight = o.height, itemWidth = o.width;\n\t\t\tvar itemTop = o.top, itemLeft = o.left;\n\n\t\t\treturn $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);\n\t\t};\n\n\t\t$.each(inst.sortables, function(i) {\n\t\t\t\n\t\t\t//Copy over some variables to allow calling the sortable's native _intersectsWith\n\t\t\tthis.instance.positionAbs = inst.positionAbs;\n\t\t\tthis.instance.helperProportions = inst.helperProportions;\n\t\t\tthis.instance.offset.click = inst.offset.click;\n\t\t\t\n\t\t\tif(this.instance._intersectsWith(this.instance.containerCache)) {\n\n\t\t\t\t//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once\n\t\t\t\tif(!this.instance.isOver) {\n\n\t\t\t\t\tthis.instance.isOver = 1;\n\t\t\t\t\t//Now we fake the start of dragging for the sortable instance,\n\t\t\t\t\t//by cloning the list group item, appending it to the sortable and using it as inst.currentItem\n\t\t\t\t\t//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)\n\t\t\t\t\tthis.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data(\"sortable-item\", true);\n\t\t\t\t\tthis.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it\n\t\t\t\t\tthis.instance.options.helper = function() { return ui.helper[0]; };\n\n\t\t\t\t\tevent.target = this.instance.currentItem[0];\n\t\t\t\t\tthis.instance._mouseCapture(event, true);\n\t\t\t\t\tthis.instance._mouseStart(event, true, true);\n\n\t\t\t\t\t//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes\n\t\t\t\t\tthis.instance.offset.click.top = inst.offset.click.top;\n\t\t\t\t\tthis.instance.offset.click.left = inst.offset.click.left;\n\t\t\t\t\tthis.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;\n\t\t\t\t\tthis.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;\n\n\t\t\t\t\tinst._trigger(\"toSortable\", event);\n\t\t\t\t\tinst.dropped = this.instance.element; //draggable revert needs that\n\t\t\t\t\t//hack so receive/update callbacks work (mostly)\n\t\t\t\t\tinst.currentItem = inst.element;\n\t\t\t\t\tthis.instance.fromOutside = inst;\n\n\t\t\t\t}\n\n\t\t\t\t//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable\n\t\t\t\tif(this.instance.currentItem) this.instance._mouseDrag(event);\n\n\t\t\t} else {\n\n\t\t\t\t//If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval\n\t\t\t\tif(this.instance.isOver) {\n\n\t\t\t\t\tthis.instance.isOver = 0;\n\t\t\t\t\tthis.instance.cancelHelperRemoval = true;\n\t\t\t\t\t\n\t\t\t\t\t//Prevent reverting on this forced stop\n\t\t\t\t\tthis.instance.options.revert = false;\n\t\t\t\t\t\n\t\t\t\t\t// The out event needs to be triggered independently\n\t\t\t\t\tthis.instance._trigger('out', event, this.instance._uiHash(this.instance));\n\t\t\t\t\t\n\t\t\t\t\tthis.instance._mouseStop(event, true);\n\t\t\t\t\tthis.instance.options.helper = this.instance.options._helper;\n\n\t\t\t\t\t//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size\n\t\t\t\t\tthis.instance.currentItem.remove();\n\t\t\t\t\tif(this.instance.placeholder) this.instance.placeholder.remove();\n\n\t\t\t\t\tinst._trigger(\"fromSortable\", event);\n\t\t\t\t\tinst.dropped = false; //draggable revert needs that\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t});\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"cursor\", {\n\tstart: function(event, ui) {\n\t\tvar t = $('body'), o = $(this).data('draggable').options;\n\t\tif (t.css(\"cursor\")) o._cursor = t.css(\"cursor\");\n\t\tt.css(\"cursor\", o.cursor);\n\t},\n\tstop: function(event, ui) {\n\t\tvar o = $(this).data('draggable').options;\n\t\tif (o._cursor) $('body').css(\"cursor\", o._cursor);\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"opacity\", {\n\tstart: function(event, ui) {\n\t\tvar t = $(ui.helper), o = $(this).data('draggable').options;\n\t\tif(t.css(\"opacity\")) o._opacity = t.css(\"opacity\");\n\t\tt.css('opacity', o.opacity);\n\t},\n\tstop: function(event, ui) {\n\t\tvar o = $(this).data('draggable').options;\n\t\tif(o._opacity) $(ui.helper).css('opacity', o._opacity);\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"scroll\", {\n\tstart: function(event, ui) {\n\t\tvar i = $(this).data(\"draggable\");\n\t\tif(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();\n\t},\n\tdrag: function(event, ui) {\n\n\t\tvar i = $(this).data(\"draggable\"), o = i.options, scrolled = false;\n\n\t\tif(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {\n\n\t\t\tif(!o.axis || o.axis != 'x') {\n\t\t\t\tif((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)\n\t\t\t\t\ti.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;\n\t\t\t\telse if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)\n\t\t\t\t\ti.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;\n\t\t\t}\n\n\t\t\tif(!o.axis || o.axis != 'y') {\n\t\t\t\tif((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)\n\t\t\t\t\ti.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;\n\t\t\t\telse if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)\n\t\t\t\t\ti.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif(!o.axis || o.axis != 'x') {\n\t\t\t\tif(event.pageY - $(document).scrollTop() < o.scrollSensitivity)\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\n\t\t\t\telse if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\n\t\t\t}\n\n\t\t\tif(!o.axis || o.axis != 'y') {\n\t\t\t\tif(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\n\t\t\t\telse if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\n\t\t\t}\n\n\t\t}\n\n\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)\n\t\t\t$.ui.ddmanager.prepareOffsets(i, event);\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"snap\", {\n\tstart: function(event, ui) {\n\n\t\tvar i = $(this).data(\"draggable\"), o = i.options;\n\t\ti.snapElements = [];\n\n\t\t$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {\n\t\t\tvar $t = $(this); var $o = $t.offset();\n\t\t\tif(this != i.element[0]) i.snapElements.push({\n\t\t\t\titem: this,\n\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t});\n\t\t});\n\n\t},\n\tdrag: function(event, ui) {\n\n\t\tvar inst = $(this).data(\"draggable\"), o = inst.options;\n\t\tvar d = o.snapTolerance;\n\n\t\tvar x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor (var i = inst.snapElements.length - 1; i >= 0; i--){\n\n\t\t\tvar l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,\n\t\t\t\tt = inst.snapElements[i].top, b = t + inst.snapElements[i].height;\n\n\t\t\t//Yes, I know, this is insane ;)\n\t\t\tif(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {\n\t\t\t\tif(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\t\tinst.snapElements[i].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(o.snapMode != 'inner') {\n\t\t\t\tvar ts = Math.abs(t - y2) <= d;\n\t\t\t\tvar bs = Math.abs(b - y1) <= d;\n\t\t\t\tvar ls = Math.abs(l - x2) <= d;\n\t\t\t\tvar rs = Math.abs(r - x1) <= d;\n\t\t\t\tif(ts) ui.position.top = inst._convertPositionTo(\"relative\", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;\n\t\t\t\tif(bs) ui.position.top = inst._convertPositionTo(\"relative\", { top: b, left: 0 }).top - inst.margins.top;\n\t\t\t\tif(ls) ui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;\n\t\t\t\tif(rs) ui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r }).left - inst.margins.left;\n\t\t\t}\n\n\t\t\tvar first = (ts || bs || ls || rs);\n\n\t\t\tif(o.snapMode != 'outer') {\n\t\t\t\tvar ts = Math.abs(t - y1) <= d;\n\t\t\t\tvar bs = Math.abs(b - y2) <= d;\n\t\t\t\tvar ls = Math.abs(l - x1) <= d;\n\t\t\t\tvar rs = Math.abs(r - x2) <= d;\n\t\t\t\tif(ts) ui.position.top = inst._convertPositionTo(\"relative\", { top: t, left: 0 }).top - inst.margins.top;\n\t\t\t\tif(bs) ui.position.top = inst._convertPositionTo(\"relative\", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;\n\t\t\t\tif(ls) ui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l }).left - inst.margins.left;\n\t\t\t\tif(rs) ui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;\n\t\t\t}\n\n\t\t\tif(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))\n\t\t\t\t(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\n\t\t\tinst.snapElements[i].snapping = (ts || bs || ls || rs || first);\n\n\t\t};\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"stack\", {\n\tstart: function(event, ui) {\n\n\t\tvar o = $(this).data(\"draggable\").options;\n\n\t\tvar group = $.makeArray($(o.stack)).sort(function(a,b) {\n\t\t\treturn (parseInt($(a).css(\"zIndex\"),10) || 0) - (parseInt($(b).css(\"zIndex\"),10) || 0);\n\t\t});\n\t\tif (!group.length) { return; }\n\t\t\n\t\tvar min = parseInt(group[0].style.zIndex) || 0;\n\t\t$(group).each(function(i) {\n\t\t\tthis.style.zIndex = min + i;\n\t\t});\n\n\t\tthis[0].style.zIndex = min + group.length;\n\n\t}\n});\n\n$.ui.plugin.add(\"draggable\", \"zIndex\", {\n\tstart: function(event, ui) {\n\t\tvar t = $(ui.helper), o = $(this).data(\"draggable\").options;\n\t\tif(t.css(\"zIndex\")) o._zIndex = t.css(\"zIndex\");\n\t\tt.css('zIndex', o.zIndex);\n\t},\n\tstop: function(event, ui) {\n\t\tvar o = $(this).data(\"draggable\").options;\n\t\tif(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);\n\t}\n});\n\n})(jQuery);\n"
  },
  {
    "path": "servers/www/assets/js/vendor/jszip.js",
    "content": "/**\n\nJSZip - A Javascript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2012 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See LICENSE.markdown.\n\nUsage:\n   zip = new JSZip();\n   zip.file(\"hello.txt\", \"Hello, World!\").add(\"tempfile\", \"nothing\");\n   zip.folder(\"images\").file(\"smile.gif\", base64Data, {base64: true});\n   zip.file(\"Xmas.txt\", \"Ho ho ho !\", {date : new Date(\"December 25, 2007 00:00:01\")});\n   zip.remove(\"tempfile\");\n\n   base64zip = zip.generate();\n\n**/\n\n/**\n * Representation a of zip file in js\n * @constructor\n * @param {String=} data the data to load, if any (optional).\n * @param {Object=} options the options for creating this objects (optional).\n */\nvar JSZip = function(data, options) {\n   // object containing the files :\n   // {\n   //   \"folder/\" : {...},\n   //   \"folder/data.txt\" : {...}\n   // }\n   this.files = {};\n\n   // Where we are in the hierarchy\n   this.root = \"\";\n\n   if(data) {\n      this.load(data, options);\n   }\n};\n\nJSZip.signature = {\n   LOCAL_FILE_HEADER : \"\\x50\\x4b\\x03\\x04\",\n   CENTRAL_FILE_HEADER : \"\\x50\\x4b\\x01\\x02\",\n   CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x05\\x06\",\n   ZIP64_CENTRAL_DIRECTORY_LOCATOR : \"\\x50\\x4b\\x06\\x07\",\n   ZIP64_CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x06\\x06\",\n   DATA_DESCRIPTOR : \"\\x50\\x4b\\x07\\x08\"\n};\n\n// Default properties for a new file\nJSZip.defaults = {\n   base64: false,\n   binary: false,\n   dir: false,\n   date: null\n};\n\n\nJSZip.prototype = (function ()\n{\n   /**\n    * A simple object representing a file in the zip file.\n    * @constructor\n    * @param {string} name the name of the file\n    * @param {string} data the data\n    * @param {Object} options the options of the file\n    */\n   var ZipObject = function (name, data, options) {\n      this.name = name;\n      this.data = data;\n      this.options = options;\n   };\n\n   ZipObject.prototype = {\n      /**\n       * Return the content as UTF8 string.\n       * @return {string} the UTF8 string.\n       */\n      asText : function ()\n      {\n         return this.options.binary ? JSZip.prototype.utf8decode(this.data) : this.data;\n      },\n      /**\n       * Returns the binary content.\n       * @return {string} the content as binary.\n       */\n      asBinary : function ()\n      {\n         return this.options.binary ? this.data : JSZip.prototype.utf8encode(this.data);\n      }\n   };\n\n   /**\n    * Transform an integer into a string in hexadecimal.\n    * @private\n    * @param {number} dec the number to convert.\n    * @param {number} bytes the number of bytes to generate.\n    * @returns {string} the result.\n    */\n   var decToHex = function(dec, bytes) {\n      var hex = \"\", i;\n      for(i = 0; i < bytes; i++)\n      {\n         hex += String.fromCharCode(dec&0xff);\n         dec=dec>>>8;\n      }\n      return hex;\n   };\n\n   /**\n    * Merge the objects passed as parameters into a new one.\n    * @private\n    * @param {...Object} var_args All objects to merge.\n    * @return {Object} a new object with the data of the others.\n    */\n   var extend = function () {\n      var result = {}, i, attr;\n      for (i = 0; i < arguments.length; i++) // arguments is not enumerable in some browsers\n      {\n         for (attr in arguments[i])\n         {\n            if(typeof result[attr] === \"undefined\")\n            {\n               result[attr] = arguments[i][attr];\n            }\n         }\n      }\n      return result;\n   };\n\n   /**\n    * Transforms the (incomplete) options from the user into the complete\n    * set of options to create a file.\n    * @private\n    * @param {Object} o the options from the user.\n    * @return {Object} the complete set of options.\n    */\n   var prepareFileAttrs = function (o) {\n      o = o || {};\n      if (o.base64 === true && o.binary == null) {\n         o.binary = true;\n      }\n      o = extend(o, JSZip.defaults);\n      o.date = o.date || new Date();\n\n      return o;\n   };\n\n  /**\n   * Add a file in the current folder.\n   * @private\n   * @param {string} name the name of the file\n   * @param {string} data the data of the file\n   * @param {Object} o the options of the file\n   * @return {Object} the new file.\n   */\n   var fileAdd = function (name, data, o) {\n      // be sure sub folders exist\n      var parent = parentFolder(name);\n      if (parent) {\n         folderAdd.call(this, parent);\n      }\n\n      o = prepareFileAttrs(o);\n\n      return this.files[name] = {name: name, data: data, options:o};\n   };\n\n\n   /**\n    * Find the parent folder of the path.\n    * @private\n    * @param {string} path the path to use\n    * @return {string} the parent folder, or \"\"\n    */\n   var parentFolder = function (path) {\n      if (path.slice(-1) == '/')\n      {\n         path = path.substring(0, path.length - 1);\n      }\n      var lastSlash = path.lastIndexOf('/');\n      return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n   };\n\n   /**\n    * Add a (sub) folder in the current folder.\n    * @private\n    * @param {string} name the folder's name\n    * @return {Object} the new folder.\n    */\n   var folderAdd = function (name) {\n      // Check the name ends with a /\n      if (name.slice(-1) != \"/\") {\n         name += \"/\"; // IE doesn't like substr(-1)\n      }\n\n      // Does this folder already exist?\n      if (!this.files[name])\n      {\n         // be sure sub folders exist\n         var parent = parentFolder(name);\n         if (parent) {\n            folderAdd.call(this, parent);\n         }\n\n         fileAdd.call(this, name, '', {dir:true});\n      }\n      return this.files[name];\n   };\n\n   /**\n    * Generate the data found in the local header of a zip file.\n    * Do not create it now, as some parts are re-used later.\n    * @private\n    * @param {Object} file the file to use.\n    * @param {string} utfEncodedFileName the file name, utf8 encoded.\n    * @param {string} compressionType the compression to use.\n    * @return {Object} an object containing header and compressedData.\n    */\n   var prepareLocalHeaderData = function(file, utfEncodedFileName, compressionType) {\n      var useUTF8 = utfEncodedFileName !== file.name,\n          data    = file.data,\n          o       = file.options,\n          dosTime,\n          dosDate;\n\n      // date\n      // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\n      // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\n      // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\n\n      dosTime = o.date.getHours();\n      dosTime = dosTime << 6;\n      dosTime = dosTime | o.date.getMinutes();\n      dosTime = dosTime << 5;\n      dosTime = dosTime | o.date.getSeconds() / 2;\n\n      dosDate = o.date.getFullYear() - 1980;\n      dosDate = dosDate << 4;\n      dosDate = dosDate | (o.date.getMonth() + 1);\n      dosDate = dosDate << 5;\n      dosDate = dosDate | o.date.getDate();\n\n      if (o.base64 === true) {\n         data = JSZipBase64.decode(data);\n      }\n      // decode UTF-8 strings if we are dealing with text data\n      if(o.binary === false) {\n         data = this.utf8encode(data);\n      }\n\n\n      var compression    = JSZip.compressions[compressionType];\n      var compressedData = compression.compress(data);\n\n      var header = \"\";\n\n      // version needed to extract\n      header += \"\\x0A\\x00\";\n      // general purpose bit flag\n      // set bit 11 if utf8\n      header += useUTF8 ? \"\\x00\\x08\" : \"\\x00\\x00\";\n      // compression method\n      header += compression.magic;\n      // last mod file time\n      header += decToHex(dosTime, 2);\n      // last mod file date\n      header += decToHex(dosDate, 2);\n      // crc-32\n      header += decToHex(this.crc32(data), 4);\n      // compressed size\n      header += decToHex(compressedData.length, 4);\n      // uncompressed size\n      header += decToHex(data.length, 4);\n      // file name length\n      header += decToHex(utfEncodedFileName.length, 2);\n      // extra field length\n      header += \"\\x00\\x00\";\n\n      return {\n         header:header,\n         compressedData:compressedData\n      };\n   };\n\n\n   // return the actual prototype of JSZip\n   return {\n      /**\n       * Read an existing zip and merge the data in the current JSZip object.\n       * The implementation is in jszip-load.js, don't forget to include it.\n       * @param {string} stream  The stream to load\n       * @param {Object} options Options for loading the stream.\n       *  options.base64 : is the stream in base64 ? default : false\n       * @return {JSZip} the current JSZip object\n       */\n      load : function (stream, options)\n      {\n         throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\");\n      },\n\n      /**\n       * Filter nested files/folders with the specified function.\n       * @param {Function} search the predicate to use :\n       * function (relativePath, file) {...}\n       * It takes 2 arguments : the relative path and the file.\n       * @return {Array} An array of matching elements.\n       */\n      filter : function (search)\n      {\n         var result = [], filename, relativePath, file, fileClone;\n         for (filename in this.files)\n         {\n            file = this.files[filename];\n            // return a new object, don't let the user mess with our internal objects :)\n            fileClone = new ZipObject(file.name, file.data, extend(file.options));\n            relativePath = filename.slice(this.root.length, filename.length);\n            if (filename.slice(0, this.root.length) === this.root && // the file is in the current root\n                search(relativePath, fileClone)) // and the file matches the function\n            {\n               result.push(fileClone);\n            }\n         }\n         return result;\n      },\n\n      /**\n       * Add a file to the zip file, or search a file.\n       * @param   {string|RegExp} name The name of the file to add (if data is defined),\n       * the name of the file to find (if no data) or a regex to match files.\n       * @param   {string} data  The file data, either raw or base64 encoded\n       * @param   {Object} o     File options\n       * @return  {JSZip|Object|Array} this JSZip object (when adding a file),\n       * a file (when searching by string) or an array of files (when searching by regex).\n       */\n      file : function(name, data, o)\n      {\n         if (arguments.length === 1)\n         {\n            if (name instanceof RegExp)\n            {\n               var regexp = name;\n               return this.filter(function(relativePath, file) {\n                  return !file.options.dir && regexp.test(relativePath);\n               });\n            }\n            else // text\n            {\n               return this.filter(function (relativePath, file) {\n                  return !file.options.dir && relativePath === name;\n               })[0]||null;\n            }\n         }\n         else // more than one argument : we have data !\n         {\n            name = this.root+name;\n            fileAdd.call(this, name, data, o);\n         }\n         return this;\n      },\n\n      /**\n       * Add a directory to the zip file, or search.\n       * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n       * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.\n       */\n      folder : function(arg)\n      {\n         if (!arg)\n         {\n            throw new Error(\"folder : wrong argument\");\n         }\n\n         if (arg instanceof RegExp)\n         {\n            return this.filter(function(relativePath, file) {\n               return file.options.dir && arg.test(relativePath);\n            });\n         }\n\n         // else, name is a new folder\n         var name = this.root + arg;\n         var newFolder = folderAdd.call(this, name);\n\n         // Allow chaining by returning a new object with this folder as the root\n         var ret = this.clone();\n         ret.root = newFolder.name;\n         return ret;\n      },\n\n      /**\n       * Delete a file, or a directory and all sub-files, from the zip\n       * @param {string} name the name of the file to delete\n       * @return {JSZip} this JSZip object\n       */\n      remove : function(name)\n      {\n         name = this.root + name;\n         var file = this.files[name];\n         if (!file)\n         {\n            // Look for any folders\n            if (name.slice(-1) != \"/\") {\n               name += \"/\";\n            }\n            file = this.files[name];\n         }\n\n         if (file)\n         {\n            if (!file.options.dir)\n            {\n               // file\n               delete this.files[name];\n            }\n            else\n            {\n               // folder\n               var kids = this.filter(function (relativePath, file) {\n                  return file.name.slice(0, name.length) === name;\n               });\n               for (var i = 0; i < kids.length; i++)\n               {\n                  delete this.files[kids[i].name];\n               }\n            }\n         }\n\n         return this;\n      },\n\n      /**\n       * Generate the complete zip file\n       * @param {Object} options the options to generate the zip file :\n       * - base64, true to generate base64.\n       * - compression, \"STORE\" by default.\n       * @return {string} the zip file\n       */\n      generate : function(options)\n      {\n         options = extend(options || {}, {\n            base64 : true,\n            compression : \"STORE\"\n         });\n         var compression = options.compression.toUpperCase();\n\n         // The central directory, and files data\n         var directory = [], files = [], fileOffset = 0;\n\n         if (!JSZip.compressions[compression]) {\n            throw compression + \" is not a valid compression method !\";\n         }\n\n         for (var name in this.files)\n         {\n            if( !this.files.hasOwnProperty(name) ) { continue; }\n\n            var file = this.files[name];\n\n            var utfEncodedFileName = this.utf8encode(file.name);\n\n            var fileRecord = \"\",\n            dirRecord = \"\",\n            data = prepareLocalHeaderData.call(this, file, utfEncodedFileName, compression);\n            fileRecord = JSZip.signature.LOCAL_FILE_HEADER + data.header + utfEncodedFileName + data.compressedData;\n\n            dirRecord = JSZip.signature.CENTRAL_FILE_HEADER +\n            // version made by (00: DOS)\n            \"\\x14\\x00\" +\n            // file header (common to file and central directory)\n            data.header +\n            // file comment length\n            \"\\x00\\x00\" +\n            // disk number start\n            \"\\x00\\x00\" +\n            // internal file attributes TODO\n            \"\\x00\\x00\" +\n            // external file attributes\n            (this.files[name].dir===true?\"\\x10\\x00\\x00\\x00\":\"\\x00\\x00\\x00\\x00\")+\n            // relative offset of local header\n            decToHex(fileOffset, 4) +\n            // file name\n            utfEncodedFileName;\n\n            fileOffset += fileRecord.length;\n\n            files.push(fileRecord);\n            directory.push(dirRecord);\n         }\n\n         var fileData = files.join(\"\");\n         var dirData = directory.join(\"\");\n\n         var dirEnd = \"\";\n\n         // end of central dir signature\n         dirEnd = JSZip.signature.CENTRAL_DIRECTORY_END +\n         // number of this disk\n         \"\\x00\\x00\" +\n         // number of the disk with the start of the central directory\n         \"\\x00\\x00\" +\n         // total number of entries in the central directory on this disk\n         decToHex(files.length, 2) +\n         // total number of entries in the central directory\n         decToHex(files.length, 2) +\n         // size of the central directory   4 bytes\n         decToHex(dirData.length, 4) +\n         // offset of start of central directory with respect to the starting disk number\n         decToHex(fileData.length, 4) +\n         // .ZIP file comment length\n         \"\\x00\\x00\";\n\n         var zip = fileData + dirData + dirEnd;\n         return (options.base64) ? JSZipBase64.encode(zip) : zip;\n      },\n\n      /**\n       *\n       *  Javascript crc32\n       *  http://www.webtoolkit.info/\n       *\n       */\n      crc32 : function(str, crc)\n      {\n\n         if (str === \"\" || typeof str === \"undefined\") {\n            return 0;\n         }\n\n         var table = \"00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D\";\n\n         if (typeof(crc) == \"undefined\") { crc = 0; }\n         var x = 0;\n         var y = 0;\n\n         crc = crc ^ (-1);\n         for( var i = 0, iTop = str.length; i < iTop; i++ ) {\n            y = ( crc ^ str.charCodeAt( i ) ) & 0xFF;\n            x = \"0x\" + table.substr( y * 9, 8 );\n            crc = ( crc >>> 8 ) ^ x;\n         }\n\n         return crc ^ (-1);\n\n      },\n\n      // Inspired by http://my.opera.com/GreyWyvern/blog/show.dml/1725165\n      clone : function()\n      {\n         var newObj = new JSZip();\n         for (var i in this)\n         {\n            if (typeof this[i] !== \"function\")\n            {\n               newObj[i] = this[i];\n            }\n         }\n         return newObj;\n      },\n\n\n      /**\n       * http://www.webtoolkit.info/javascript-utf8.html\n       */\n      utf8encode : function (string) {\n         string = string.replace(/\\r\\n/g,\"\\n\");\n         var utftext = \"\";\n\n         for (var n = 0; n < string.length; n++) {\n\n            var c = string.charCodeAt(n);\n\n            if (c < 128) {\n               utftext += String.fromCharCode(c);\n            }\n            else if((c > 127) && (c < 2048)) {\n               utftext += String.fromCharCode((c >> 6) | 192);\n               utftext += String.fromCharCode((c & 63) | 128);\n            }\n            else {\n               utftext += String.fromCharCode((c >> 12) | 224);\n               utftext += String.fromCharCode(((c >> 6) & 63) | 128);\n               utftext += String.fromCharCode((c & 63) | 128);\n            }\n\n         }\n\n         return utftext;\n      },\n\n      /**\n       * http://www.webtoolkit.info/javascript-utf8.html\n       */\n      utf8decode : function (utftext) {\n         var string = \"\";\n         var i = 0;\n         var c = 0, c1 = 0, c2 = 0, c3 = 0;\n\n         while ( i < utftext.length ) {\n\n            c = utftext.charCodeAt(i);\n\n            if (c < 128) {\n               string += String.fromCharCode(c);\n               i++;\n            }\n            else if((c > 191) && (c < 224)) {\n               c2 = utftext.charCodeAt(i+1);\n               string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n               i += 2;\n            }\n            else {\n               c2 = utftext.charCodeAt(i+1);\n               c3 = utftext.charCodeAt(i+2);\n               string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n               i += 3;\n            }\n\n         }\n\n         return string;\n      }\n   };\n}());\n\n/*\n * Compression methods\n * This object is filled in as follow :\n * name : {\n *    magic // the 2 bytes indentifying the compression method\n *    compress // function, take the uncompressed content and return it compressed.\n *    uncompress // function, take the compressed content and return it uncompressed.\n * }\n *\n * STORE is the default compression method, so it's included in this file.\n * Other methods should go to separated files : the user wants modularity.\n */\nJSZip.compressions = {\n   \"STORE\" : {\n      magic : \"\\x00\\x00\",\n      compress : function (content)\n      {\n         return content; // no compression\n      },\n      uncompress : function (content)\n      {\n         return content; // no compression\n      }\n   }\n};\n\n/**\n *\n *  Base64 encode / decode\n *  http://www.webtoolkit.info/\n *\n *  Hacked so that it doesn't utf8 en/decode everything\n **/\nvar JSZipBase64 = (function() {\n   // private property\n   var _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n   return {\n      // public method for encoding\n      encode : function(input, utf8) {\n         var output = \"\";\n         var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n         var i = 0;\n\n         while (i < input.length) {\n\n            chr1 = input.charCodeAt(i++);\n            chr2 = input.charCodeAt(i++);\n            chr3 = input.charCodeAt(i++);\n\n            enc1 = chr1 >> 2;\n            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n            enc4 = chr3 & 63;\n\n            if (isNaN(chr2)) {\n               enc3 = enc4 = 64;\n            } else if (isNaN(chr3)) {\n               enc4 = 64;\n            }\n\n            output = output +\n               _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +\n               _keyStr.charAt(enc3) + _keyStr.charAt(enc4);\n\n         }\n\n         return output;\n      },\n\n      // public method for decoding\n      decode : function(input, utf8) {\n         var output = \"\";\n         var chr1, chr2, chr3;\n         var enc1, enc2, enc3, enc4;\n         var i = 0;\n\n         input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n         while (i < input.length) {\n\n            enc1 = _keyStr.indexOf(input.charAt(i++));\n            enc2 = _keyStr.indexOf(input.charAt(i++));\n            enc3 = _keyStr.indexOf(input.charAt(i++));\n            enc4 = _keyStr.indexOf(input.charAt(i++));\n\n            chr1 = (enc1 << 2) | (enc2 >> 4);\n            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n            chr3 = ((enc3 & 3) << 6) | enc4;\n\n            output = output + String.fromCharCode(chr1);\n\n            if (enc3 != 64) {\n               output = output + String.fromCharCode(chr2);\n            }\n            if (enc4 != 64) {\n               output = output + String.fromCharCode(chr3);\n            }\n\n         }\n\n         return output;\n\n      }\n   };\n}());\n\n// enforcing Stuk's coding style\n// vim: set shiftwidth=3 softtabstop=3:"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/jquery.noty.js",
    "content": "/**\n * noty - jQuery Notification Plugin v2.0.3\n * Contributors: https://github.com/needim/noty/graphs/contributors\n *\n * Examples and Documentation - http://needim.github.com/noty/\n *\n * Licensed under the MIT licenses:\n * http://www.opensource.org/licenses/mit-license.php\n *\n **/\n\nif (typeof Object.create !== 'function') {\n    Object.create = function (o) {\n        function F() {\n        }\n\n        F.prototype = o;\n        return new F();\n    };\n}\n\n(function ($) {\n\n    var NotyObject = {\n\n        init:function (options) {\n\n            // Mix in the passed in options with the default options\n            this.options = $.extend({}, $.noty.defaults, options);\n\n            this.options.layout = (this.options.custom) ? $.noty.layouts['inline'] : $.noty.layouts[this.options.layout];\n            this.options.theme = $.noty.themes[this.options.theme];\n\n            delete options.layout;\n            delete options.theme;\n\n            this.options = $.extend({}, this.options, this.options.layout.options);\n            this.options.id = 'noty_' + (new Date().getTime() * Math.floor(Math.random() * 1000000));\n\n            this.options = $.extend({}, this.options, options);\n\n            // Build the noty dom initial structure\n            this._build();\n\n            // return this so we can chain/use the bridge with less code.\n            return this;\n        }, // end init\n\n        _build:function () {\n\n            // Generating noty bar\n            var $bar = $('<div class=\"noty_bar\"></div>').attr('id', this.options.id);\n            $bar.append(this.options.template).find('.noty_text').html(this.options.text);\n\n            this.$bar = (this.options.layout.parent.object !== null) ? $(this.options.layout.parent.object).css(this.options.layout.parent.css).append($bar) : $bar;\n\n            // Set buttons if available\n            if (this.options.buttons) {\n\n                // If we have button disable closeWith & timeout options\n                this.options.closeWith = [];\n                this.options.timeout = false;\n\n                var $buttons = $('<div/>').addClass('noty_buttons');\n\n                (this.options.layout.parent.object !== null) ? this.$bar.find('.noty_bar').append($buttons) : this.$bar.append($buttons);\n\n                var self = this;\n\n                $.each(this.options.buttons, function (i, button) {\n                    var $button = $('<button/>').addClass((button.addClass) ? button.addClass : 'gray').html(button.text)\n                        .appendTo(self.$bar.find('.noty_buttons'))\n                        .bind('click', function () {\n                            if ($.isFunction(button.onClick)) {\n                                button.onClick.call($button, self);\n                            }\n                        });\n                });\n            }\n\n            // For easy access\n            this.$message = this.$bar.find('.noty_message');\n            this.$closeButton = this.$bar.find('.noty_close');\n            this.$buttons = this.$bar.find('.noty_buttons');\n\n            $.noty.store[this.options.id] = this; // store noty for api\n\n        }, // end _build\n\n        show:function () {\n\n            var self = this;\n\n            $(self.options.layout.container.selector).append(self.$bar);\n\n            self.options.theme.style.apply(self);\n\n            ($.type(self.options.layout.css) === 'function') ? this.options.layout.css.apply(self.$bar) : self.$bar.css(this.options.layout.css || {});\n\n            self.$bar.addClass(self.options.layout.addClass);\n\n            self.options.layout.container.style.apply($(self.options.layout.container.selector));\n\n            self.options.theme.callback.onShow.apply(this);\n\n            if ($.inArray('click', self.options.closeWith) > -1)\n                self.$bar.css('cursor', 'pointer').one('click', function () {\n                    self.close();\n                });\n\n            if ($.inArray('hover', self.options.closeWith) > -1)\n                self.$bar.one('mouseenter', function () {\n                    self.close();\n                });\n\n            if ($.inArray('button', self.options.closeWith) > -1)\n                self.$closeButton.one('click', function () {\n                    self.close();\n                });\n\n            if ($.inArray('button', self.options.closeWith) == -1)\n                self.$closeButton.remove();\n\n            if (self.options.callback.onShow)\n                self.options.callback.onShow.apply(self);\n\n            self.$bar.animate(\n                self.options.animation.open,\n                self.options.animation.speed,\n                self.options.animation.easing,\n                function () {\n                    if (self.options.callback.afterShow) self.options.callback.afterShow.apply(self);\n                    self.shown = true;\n                });\n\n            // If noty is have a timeout option\n            if (self.options.timeout)\n                self.$bar.delay(self.options.timeout).promise().done(function () {\n                    self.close();\n                });\n\n            return this;\n\n        }, // end show\n\n        close:function () {\n\n            if (this.closed) return;\n\n            var self = this;\n\n            if (!this.shown) { // If we are still waiting in the queue just delete from queue\n                var queue = [];\n                $.each($.noty.queue, function (i, n) {\n                    if (n.options.id != self.options.id) {\n                        queue.push(n);\n                    }\n                });\n                $.noty.queue = queue;\n                return;\n            }\n\n            self.$bar.addClass('i-am-closing-now');\n\n            if (self.options.callback.onClose) {\n                self.options.callback.onClose.apply(self);\n            }\n\n            self.$bar.clearQueue().stop().animate(\n                self.options.animation.close,\n                self.options.animation.speed,\n                self.options.animation.easing,\n                function () {\n                    if (self.options.callback.afterClose) self.options.callback.afterClose.apply(self);\n                })\n                .promise().done(function () {\n\n                    // Modal Cleaning\n                    if (self.options.modal) {\n                        $.notyRenderer.setModalCount(-1);\n                        if ($.notyRenderer.getModalCount() == 0) $('.noty_modal').fadeOut('fast', function () {\n                            $(this).remove();\n                        });\n                    }\n\n                    // Layout Cleaning\n                    $.notyRenderer.setLayoutCountFor(self, -1);\n                    if ($.notyRenderer.getLayoutCountFor(self) == 0) $(self.options.layout.container.selector).remove();\n\n                    self.$bar.remove();\n                    self.$bar = null;\n                    self.closed = true;\n\n                    delete $.noty.store[self.options.id]; // deleting noty from store\n\n                    self.options.theme.callback.onClose.apply(self);\n\n                    if (!self.options.dismissQueue) {\n                        // Queue render\n                        $.noty.ontap = true;\n\n                        $.notyRenderer.render();\n                    }\n\n                });\n\n        }, // end close\n\n        setText:function (text) {\n            if (!this.closed) {\n                this.options.text = text;\n                this.$bar.find('.noty_text').html(text);\n            }\n            return this;\n        },\n\n        setType:function (type) {\n            if (!this.closed) {\n                this.options.type = type;\n                this.options.theme.style.apply(this);\n                this.options.theme.callback.onShow.apply(this);\n            }\n            return this;\n        },\n\n        setTimeout:function (time) {\n            if (!this.closed) {\n                var self = this;\n                this.options.timeout = time;\n                self.$bar.delay(self.options.timeout).promise().done(function () {\n                    self.close();\n                });\n            }\n            return this;\n        },\n\n        closed:false,\n        shown:false\n\n    }; // end NotyObject\n\n    $.notyRenderer = {};\n\n    $.notyRenderer.init = function (options) {\n\n        // Renderer creates a new noty\n        var notification = Object.create(NotyObject).init(options);\n\n        (notification.options.force) ? $.noty.queue.unshift(notification) : $.noty.queue.push(notification);\n\n        $.notyRenderer.render();\n\n        return ($.noty.returns == 'object') ? notification : notification.options.id;\n    };\n\n    $.notyRenderer.render = function () {\n\n        var instance = $.noty.queue[0];\n\n        if ($.type(instance) === 'object') {\n            if (instance.options.dismissQueue) {\n                $.notyRenderer.show($.noty.queue.shift());\n            } else {\n                if ($.noty.ontap) {\n                    $.notyRenderer.show($.noty.queue.shift());\n                    $.noty.ontap = false;\n                }\n            }\n        } else {\n            $.noty.ontap = true; // Queue is over\n        }\n\n    };\n\n    $.notyRenderer.show = function (notification) {\n\n        if (notification.options.modal) {\n            $.notyRenderer.createModalFor(notification);\n            $.notyRenderer.setModalCount(+1);\n        }\n\n        // Where is the container?\n        if ($(notification.options.layout.container.selector).length == 0) {\n            if (notification.options.custom) {\n                notification.options.custom.append($(notification.options.layout.container.object).addClass('i-am-new'));\n            } else {\n                $('body').append($(notification.options.layout.container.object).addClass('i-am-new'));\n            }\n        } else {\n            $(notification.options.layout.container.selector).removeClass('i-am-new');\n        }\n\n        $.notyRenderer.setLayoutCountFor(notification, +1);\n\n        notification.show();\n    };\n\n    $.notyRenderer.createModalFor = function (notification) {\n        if ($('.noty_modal').length == 0)\n            $('<div/>').addClass('noty_modal').data('noty_modal_count', 0).css(notification.options.theme.modal.css).prependTo($('body')).fadeIn('fast');\n    };\n\n    $.notyRenderer.getLayoutCountFor = function (notification) {\n        return $(notification.options.layout.container.selector).data('noty_layout_count') || 0;\n    };\n\n    $.notyRenderer.setLayoutCountFor = function (notification, arg) {\n        return $(notification.options.layout.container.selector).data('noty_layout_count', $.notyRenderer.getLayoutCountFor(notification) + arg);\n    };\n\n    $.notyRenderer.getModalCount = function () {\n        return $('.noty_modal').data('noty_modal_count') || 0;\n    };\n\n    $.notyRenderer.setModalCount = function (arg) {\n        return $('.noty_modal').data('noty_modal_count', $.notyRenderer.getModalCount() + arg);\n    };\n\n    // This is for custom container\n    $.fn.noty = function (options) {\n        options.custom = $(this);\n        return $.notyRenderer.init(options);\n    };\n\n    $.noty = {};\n    $.noty.queue = [];\n    $.noty.ontap = true;\n    $.noty.layouts = {};\n    $.noty.themes = {};\n    $.noty.returns = 'object';\n    $.noty.store = {};\n\n    $.noty.get = function (id) {\n        return $.noty.store.hasOwnProperty(id) ? $.noty.store[id] : false;\n    };\n\n    $.noty.close = function (id) {\n        return $.noty.get(id) ? $.noty.get(id).close() : false;\n    };\n\n    $.noty.setText = function (id, text) {\n        return $.noty.get(id) ? $.noty.get(id).setText(text) : false;\n    };\n\n    $.noty.setType = function (id, type) {\n        return $.noty.get(id) ? $.noty.get(id).setType(type) : false;\n    };\n\n    $.noty.clearQueue = function () {\n        $.noty.queue = [];\n    };\n\n    $.noty.closeAll = function () {\n        $.noty.clearQueue();\n        $.each($.noty.store, function (id, noty) {\n            noty.close();\n        });\n    };\n\n    var windowAlert = window.alert;\n\n    $.noty.consumeAlert = function (options) {\n        window.alert = function (text) {\n            if (options)\n                options.text = text;\n            else\n                options = {text:text};\n\n            $.notyRenderer.init(options);\n        };\n    };\n\n    $.noty.stopConsumeAlert = function () {\n        window.alert = windowAlert;\n    };\n\n    $.noty.defaults = {\n        layout:'top',\n        theme:'defaultTheme',\n        type:'alert',\n        text:'',\n        dismissQueue:true,\n        template:'<div class=\"noty_message\"><span class=\"noty_text\"></span><div class=\"noty_close\"></div></div>',\n        animation:{\n            open:{height:'toggle'},\n            close:{height:'toggle'},\n            easing:'swing',\n            speed:500\n        },\n        timeout:false,\n        force:false,\n        modal:false,\n        closeWith:['click'],\n        callback:{\n            onShow:function () {\n            },\n            afterShow:function () {\n            },\n            onClose:function () {\n            },\n            afterClose:function () {\n            }\n        },\n        buttons:false\n    };\n\n    $(window).resize(function () {\n        $.each($.noty.layouts, function (index, layout) {\n            layout.container.style.apply($(layout.container.selector));\n        });\n    });\n\n})(jQuery);\n\n// Helpers\nfunction noty(options) {\n\n    // This is for BC  -  Will be deleted on v2.2.0\n    var using_old = 0\n        , old_to_new = {\n            'animateOpen':'animation.open',\n            'animateClose':'animation.close',\n            'easing':'animation.easing',\n            'speed':'animation.speed',\n            'onShow':'callback.onShow',\n            'onShown':'callback.afterShow',\n            'onClose':'callback.onClose',\n            'onClosed':'callback.afterClose'\n        };\n\n    jQuery.each(options, function (key, value) {\n        if (old_to_new[key]) {\n            using_old++;\n            var _new = old_to_new[key].split('.');\n\n            if (!options[_new[0]]) options[_new[0]] = {};\n\n            options[_new[0]][_new[1]] = (value) ? value : function () {\n            };\n            delete options[key];\n        }\n    });\n\n    if (!options.closeWith) {\n        options.closeWith = jQuery.noty.defaults.closeWith;\n    }\n\n    if (options.hasOwnProperty('closeButton')) {\n        using_old++;\n        if (options.closeButton) options.closeWith.push('button');\n        delete options.closeButton;\n    }\n\n    if (options.hasOwnProperty('closeOnSelfClick')) {\n        using_old++;\n        if (options.closeOnSelfClick) options.closeWith.push('click');\n        delete options.closeOnSelfClick;\n    }\n\n    if (options.hasOwnProperty('closeOnSelfOver')) {\n        using_old++;\n        if (options.closeOnSelfOver) options.closeWith.push('hover');\n        delete options.closeOnSelfOver;\n    }\n\n    if (options.hasOwnProperty('custom')) {\n        using_old++;\n        if (options.custom.container != 'null') options.custom = options.custom.container;\n    }\n\n    if (options.hasOwnProperty('cssPrefix')) {\n        using_old++;\n        delete options.cssPrefix;\n    }\n\n    if (options.theme == 'noty_theme_default') {\n        using_old++;\n        options.theme = 'defaultTheme';\n    }\n\n    if (!options.hasOwnProperty('dismissQueue')) {\n        if (options.layout == 'topLeft'\n            || options.layout == 'topRight'\n            || options.layout == 'bottomLeft'\n            || options.layout == 'bottomRight') {\n            options.dismissQueue = true;\n        } else {\n            options.dismissQueue = false;\n        }\n    }\n\n    if (options.buttons) {\n        jQuery.each(options.buttons, function (i, button) {\n            if (button.click) {\n                using_old++;\n                button.onClick = button.click;\n                delete button.click;\n            }\n            if (button.type) {\n                using_old++;\n                button.addClass = button.type;\n                delete button.type;\n            }\n        });\n    }\n\n    if (using_old) {\n        if (typeof console !== \"undefined\" && console.warn) {\n            console.warn('You are using noty v2 with v1.x.x options. @deprecated until v2.2.0 - Please update your options.');\n        }\n    }\n\n    // console.log(options);\n    // End of the BC\n\n    return jQuery.notyRenderer.init(options);\n}\n"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/bottom.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.bottom = {\n\t\tname: 'bottom',\n\t\toptions: {},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_bottom_layout_container\" />',\n\t\t\tselector: 'ul#noty_bottom_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tleft: '5%',\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '90%',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 9999999\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/bottomCenter.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.bottomCenter = {\n\t\tname: 'bottomCenter',\n\t\toptions: { // overrides options\n\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_bottomCenter_layout_container\" />',\n\t\t\tselector: 'ul#noty_bottomCenter_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\tbottom: 20,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\t$(this).css({\n\t\t\t\t\tleft: ($(window).width() - $(this).outerWidth()) / 2 + 'px'\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);\n"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/bottomLeft.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.bottomLeft = {\n\t\tname: 'bottomLeft',\n\t\toptions: { // overrides options\n\t\t\t\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_bottomLeft_layout_container\" />',\n\t\t\tselector: 'ul#noty_bottomLeft_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\tbottom: 20,\n\t\t\t\t\tleft: 20,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\tif (window.innerWidth < 600) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\tleft: 5\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/bottomRight.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.bottomRight = {\n\t\tname: 'bottomRight',\n\t\toptions: { // overrides options\n\t\t\t\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_bottomRight_layout_container\" />',\n\t\t\tselector: 'ul#noty_bottomRight_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\tbottom: 20,\n\t\t\t\t\tright: 60,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\tif (window.innerWidth < 600) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\tright: 5\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/center.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.center = {\n\t\tname: 'center',\n\t\toptions: { // overrides options\n\t\t\t\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_center_layout_container\" />',\n\t\t\tselector: 'ul#noty_center_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\t// getting hidden height\n\t\t\t\tvar dupe = $(this).clone().css({visibility:\"hidden\", display:\"block\", position:\"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n\t\t\t\t$(\"body\").append(dupe);\n\t\t\t\tdupe.find('.i-am-closing-now').remove();\n\t\t\t\tdupe.find('li').css('display', 'block');\n\t\t\t\tvar actual_height = dupe.height();\n\t\t\t\tdupe.remove();\n\n\t\t\t\tif ($(this).hasClass('i-am-new')) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\tleft: ($(window).width() - $(this).outerWidth()) / 2 + 'px',\n\t\t\t\t\t\ttop: ($(window).height() - actual_height) / 2 + 'px'\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$(this).animate({\n\t\t\t\t\t\tleft: ($(window).width() - $(this).outerWidth()) / 2 + 'px',\n\t\t\t\t\t\ttop: ($(window).height() - actual_height) / 2 + 'px'\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/centerLeft.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.centerLeft = {\n\t\tname: 'centerLeft',\n\t\toptions: { // overrides options\n\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_centerLeft_layout_container\" />',\n\t\t\tselector: 'ul#noty_centerLeft_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\tleft: 20,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\t// getting hidden height\n\t\t\t\tvar dupe = $(this).clone().css({visibility:\"hidden\", display:\"block\", position:\"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n\t\t\t\t$(\"body\").append(dupe);\n\t\t\t\tdupe.find('.i-am-closing-now').remove();\n\t\t\t\tdupe.find('li').css('display', 'block');\n\t\t\t\tvar actual_height = dupe.height();\n\t\t\t\tdupe.remove();\n\n\t\t\t\tif ($(this).hasClass('i-am-new')) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\ttop: ($(window).height() - actual_height) / 2 + 'px'\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$(this).animate({\n\t\t\t\t\t\ttop: ($(window).height() - actual_height) / 2 + 'px'\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\n\t\t\t\tif (window.innerWidth < 600) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\tleft: 5\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);\n"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/centerRight.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.centerRight = {\n\t\tname: 'centerRight',\n\t\toptions: { // overrides options\n\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_centerRight_layout_container\" />',\n\t\t\tselector: 'ul#noty_centerRight_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\tright: 20,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\t// getting hidden height\n\t\t\t\tvar dupe = $(this).clone().css({visibility:\"hidden\", display:\"block\", position:\"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n\t\t\t\t$(\"body\").append(dupe);\n\t\t\t\tdupe.find('.i-am-closing-now').remove();\n\t\t\t\tdupe.find('li').css('display', 'block');\n\t\t\t\tvar actual_height = dupe.height();\n\t\t\t\tdupe.remove();\n\n\t\t\t\tif ($(this).hasClass('i-am-new')) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\ttop: ($(window).height() - actual_height) / 2 + 'px'\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t$(this).animate({\n\t\t\t\t\t\ttop: ($(window).height() - actual_height) / 2 + 'px'\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\n\t\t\t\tif (window.innerWidth < 600) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\tright: 5\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);\n"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/inline.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.inline = {\n\t\tname: 'inline',\n\t\toptions: {},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_inline_layout_container\" />',\n\t\t\tselector: 'ul#noty_inline_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 9999999\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/top.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.top = {\n\t\tname: 'top',\n\t\toptions: {},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_top_layout_container\" />',\n\t\t\tselector: 'ul#noty_top_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: '5%',\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '90%',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 9999999\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/topCenter.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.topCenter = {\n\t\tname: 'topCenter',\n\t\toptions: { // overrides options\n\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_topCenter_layout_container\" />',\n\t\t\tselector: 'ul#noty_topCenter_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\ttop: 20,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\t$(this).css({\n\t\t\t\t\tleft: ($(window).width() - $(this).outerWidth()) / 2 + 'px'\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);\n"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/topLeft.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.topLeft = {\n\t\tname: 'topLeft',\n\t\toptions: { // overrides options\n\t\t\t\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_topLeft_layout_container\" />',\n\t\t\tselector: 'ul#noty_topLeft_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\ttop: 20,\n\t\t\t\t\tleft: 20,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\tif (window.innerWidth < 600) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\tleft: 5\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/layouts/topRight.js",
    "content": ";(function($) {\n\n\t$.noty.layouts.topRight = {\n\t\tname: 'topRight',\n\t\toptions: { // overrides options\n\t\t\t\n\t\t},\n\t\tcontainer: {\n\t\t\tobject: '<ul id=\"noty_topRight_layout_container\" />',\n\t\t\tselector: 'ul#noty_topRight_layout_container',\n\t\t\tstyle: function() {\n\t\t\t\t$(this).css({\n\t\t\t\t\ttop: 20,\n\t\t\t\t\tright: 20,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\twidth: '310px',\n\t\t\t\t\theight: 'auto',\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tlistStyleType: 'none',\n\t\t\t\t\tzIndex: 10000000\n\t\t\t\t});\n\n\t\t\t\tif (window.innerWidth < 600) {\n\t\t\t\t\t$(this).css({\n\t\t\t\t\t\tright: 5\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tparent: {\n\t\t\tobject: '<li />',\n\t\t\tselector: 'li',\n\t\t\tcss: {}\n\t\t},\n\t\tcss: {\n\t\t\tdisplay: 'none',\n\t\t\twidth: '310px'\n\t\t},\n\t\taddClass: ''\n\t};\n\n})(jQuery);"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/promise.js",
    "content": "/*!\n * Noty Helpers Javascript From JQuery Javascript Library\n *\n * Ported by Maksim Pecherskiy.  Original Licensing:\n *\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Mon Nov 21 21:11:03 2011 -0500\n */\n\n\n(function(){\n\n  // String to Object flags format cache\nvar flagsCache = {};\n\n// Convert String-formatted flags into Object-formatted ones and store in cache\nfunction createFlags( flags ) {\n  var object = flagsCache[ flags ] = {},\n    i, length;\n  flags = flags.split( /\\s+/ );\n  for ( i = 0, length = flags.length; i < length; i++ ) {\n    object[ flags[i] ] = true;\n  }\n  return object;\n}\n\njQuery.extend({\n\n  _mark: function( elem, type ) {\n    if ( elem ) {\n      type = (type || \"fx\") + \"mark\";\n      jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );\n    }\n  },\n\n  _unmark: function( force, elem, type ) {\n    if ( force !== true ) {\n      type = elem;\n      elem = force;\n      force = false;\n    }\n    if ( elem ) {\n      type = type || \"fx\";\n      var key = type + \"mark\",\n        count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );\n      if ( count ) {\n        jQuery.data( elem, key, count, true );\n      } else {\n        jQuery.removeData( elem, key, true );\n        handleQueueMarkDefer( elem, type, \"mark\" );\n      }\n    }\n  },\n\n  queue: function( elem, type, data ) {\n    if ( elem ) {\n      type = (type || \"fx\") + \"queue\";\n      var q = jQuery.data( elem, type, undefined, true );\n      // Speed up dequeue by getting out quickly if this is just a lookup\n      if ( data ) {\n        if ( !q || jQuery.isArray(data) ) {\n          q = jQuery.data( elem, type, jQuery.makeArray(data), true );\n        } else {\n          q.push( data );\n        }\n      }\n      return q || [];\n    }\n  },\n\n  dequeue: function( elem, type ) {\n    type = type || \"fx\";\n\n    var queue = jQuery.queue( elem, type ),\n      fn = queue.shift(),\n      defer;\n\n    // If the fx queue is dequeued, always remove the progress sentinel\n    if ( fn === \"inprogress\" ) {\n      fn = queue.shift();\n    }\n\n    if ( fn ) {\n      // Add a progress sentinel to prevent the fx queue from being\n      // automatically dequeued\n      if ( type === \"fx\" ) {\n        queue.unshift(\"inprogress\");\n      }\n\n      fn.call(elem, function() {\n        jQuery.dequeue(elem, type);\n      });\n    }\n\n    if ( !queue.length ) {\n      jQuery.removeData( elem, type + \"queue\", true );\n      handleQueueMarkDefer( elem, type, \"queue\" );\n    }\n  }\n});\n\njQuery.fn.extend({\n  queue: function( type, data ) {\n    if ( typeof type !== \"string\" ) {\n      data = type;\n      type = \"fx\";\n    }\n\n    if ( data === undefined ) {\n      return jQuery.queue( this[0], type );\n    }\n    return this.each(function() {\n      var queue = jQuery.queue( this, type, data );\n\n      if ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n        jQuery.dequeue( this, type );\n      }\n    });\n  },\n  dequeue: function( type ) {\n    return this.each(function() {\n      jQuery.dequeue( this, type );\n    });\n  },\n  // Based off of the plugin by Clint Helfers, with permission.\n  // http://blindsignals.com/index.php/2009/07/jquery-delay/\n  delay: function( time, type ) {\n    time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;\n    type = type || \"fx\";\n\n    return this.queue( type, function() {\n      var elem = this;\n      setTimeout(function() {\n        jQuery.dequeue( elem, type );\n      }, time );\n    });\n  },\n  clearQueue: function( type ) {\n    return this.queue( type || \"fx\", [] );\n  },\n  // Get a promise resolved when queues of a certain type\n  // are emptied (fx is the type by default)\n  promise: function( type, object ) {\n    if ( typeof type !== \"string\" ) {\n      object = type;\n      type = undefined;\n    }\n    type = type || \"fx\";\n    var defer = jQuery.Deferred(),\n      elements = this,\n      i = elements.length,\n      count = 1,\n      deferDataKey = type + \"defer\",\n      queueDataKey = type + \"queue\",\n      markDataKey = type + \"mark\",\n      tmp;\n    function resolve() {\n      if ( !( --count ) ) {\n        defer.resolveWith( elements, [ elements ] );\n      }\n    }\n    while( i-- ) {\n      if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n          ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n            jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n          jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {\n        count++;\n        tmp.done( resolve );\n      }\n    }\n    resolve();\n    return defer.promise();\n  }\n});\n\nfunction handleQueueMarkDefer( elem, type, src ) {\n  var deferDataKey = type + \"defer\",\n    queueDataKey = type + \"queue\",\n    markDataKey = type + \"mark\",\n    defer = jQuery._data( elem, deferDataKey );\n  if ( defer &&\n    ( src === \"queue\" || !jQuery._data(elem, queueDataKey) ) &&\n    ( src === \"mark\" || !jQuery._data(elem, markDataKey) ) ) {\n    // Give room for hard-coded callbacks to fire first\n    // and eventually mark/queue something else on the element\n    setTimeout( function() {\n      if ( !jQuery._data( elem, queueDataKey ) &&\n        !jQuery._data( elem, markDataKey ) ) {\n        jQuery.removeData( elem, deferDataKey, true );\n        defer.fire();\n      }\n    }, 0 );\n  }\n}\n\n\n\njQuery.Callbacks = function( flags ) {\n\n  // Convert flags from String-formatted to Object-formatted\n  // (we check in cache first)\n  flags = flags ? ( /*flagsCache[ flags ] || */createFlags( flags ) ) : {};\n\n  var // Actual callback list\n    list = [],\n    // Stack of fire calls for repeatable lists\n    stack = [],\n    // Last fire value (for non-forgettable lists)\n    memory,\n    // Flag to know if list is currently firing\n    firing,\n    // First callback to fire (used internally by add and fireWith)\n    firingStart,\n    // End of the loop when firing\n    firingLength,\n    // Index of currently firing callback (modified by remove if needed)\n    firingIndex,\n    // Add one or several callbacks to the list\n    add = function( args ) {\n      var i,\n        length,\n        elem,\n        type,\n        actual;\n      for ( i = 0, length = args.length; i < length; i++ ) {\n        elem = args[ i ];\n        type = jQuery.type( elem );\n        if ( type === \"array\" ) {\n          // Inspect recursively\n          add( elem );\n        } else if ( type === \"function\" ) {\n          // Add if not in unique mode and callback is not in\n          if ( !flags.unique || !self.has( elem ) ) {\n            list.push( elem );\n          }\n        }\n      }\n    },\n    // Fire callbacks\n    fire = function( context, args ) {\n      args = args || [];\n      memory = !flags.memory || [ context, args ];\n      firing = true;\n      firingIndex = firingStart || 0;\n      firingStart = 0;\n      firingLength = list.length;\n      for ( ; list && firingIndex < firingLength; firingIndex++ ) {\n        if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {\n          memory = true; // Mark as halted\n          break;\n        }\n      }\n      firing = false;\n      if ( list ) {\n        if ( !flags.once ) {\n          if ( stack && stack.length ) {\n            memory = stack.shift();\n            self.fireWith( memory[ 0 ], memory[ 1 ] );\n          }\n        } else if ( memory === true ) {\n          self.disable();\n        } else {\n          list = [];\n        }\n      }\n    },\n    // Actual Callbacks object\n    self = {\n      // Add a callback or a collection of callbacks to the list\n      add: function() {\n        if ( list ) {\n          var length = list.length;\n          add( arguments );\n          // Do we need to add the callbacks to the\n          // current firing batch?\n          if ( firing ) {\n            firingLength = list.length;\n          // With memory, if we're not firing then\n          // we should call right away, unless previous\n          // firing was halted (stopOnFalse)\n          } else if ( memory && memory !== true ) {\n            firingStart = length;\n            fire( memory[ 0 ], memory[ 1 ] );\n          }\n        }\n        return this;\n      },\n      // Remove a callback from the list\n      remove: function() {\n        if ( list ) {\n          var args = arguments,\n            argIndex = 0,\n            argLength = args.length;\n          for ( ; argIndex < argLength ; argIndex++ ) {\n            for ( var i = 0; i < list.length; i++ ) {\n              if ( args[ argIndex ] === list[ i ] ) {\n                // Handle firingIndex and firingLength\n                if ( firing ) {\n                  if ( i <= firingLength ) {\n                    firingLength--;\n                    if ( i <= firingIndex ) {\n                      firingIndex--;\n                    }\n                  }\n                }\n                // Remove the element\n                list.splice( i--, 1 );\n                // If we have some unicity property then\n                // we only need to do this once\n                if ( flags.unique ) {\n                  break;\n                }\n              }\n            }\n          }\n        }\n        return this;\n      },\n      // Control if a given callback is in the list\n      has: function( fn ) {\n        if ( list ) {\n          var i = 0,\n            length = list.length;\n          for ( ; i < length; i++ ) {\n            if ( fn === list[ i ] ) {\n              return true;\n            }\n          }\n        }\n        return false;\n      },\n      // Remove all callbacks from the list\n      empty: function() {\n        list = [];\n        return this;\n      },\n      // Have the list do nothing anymore\n      disable: function() {\n        list = stack = memory = undefined;\n        return this;\n      },\n      // Is it disabled?\n      disabled: function() {\n        return !list;\n      },\n      // Lock the list in its current state\n      lock: function() {\n        stack = undefined;\n        if ( !memory || memory === true ) {\n          self.disable();\n        }\n        return this;\n      },\n      // Is it locked?\n      locked: function() {\n        return !stack;\n      },\n      // Call all callbacks with the given context and arguments\n      fireWith: function( context, args ) {\n        if ( stack ) {\n          if ( firing ) {\n            if ( !flags.once ) {\n              stack.push( [ context, args ] );\n            }\n          } else if ( !( flags.once && memory ) ) {\n            fire( context, args );\n          }\n        }\n        return this;\n      },\n      // Call all the callbacks with the given arguments\n      fire: function() {\n        self.fireWith( this, arguments );\n        return this;\n      },\n      // To know if the callbacks have already been called at least once\n      fired: function() {\n        return !!memory;\n      }\n    };\n\n  return self;\n};\n\n\n\njQuery.fn.extend({\n  // Get a promise resolved when queues of a certain type\n  // are emptied (fx is the type by default)\n  promise: function( type, object ) {\n    if ( typeof type !== \"string\" ) {\n      object = type;\n      type = undefined;\n    }\n    type = type || \"fx\";\n    var defer = jQuery.Deferred(),\n      elements = this,\n      i = elements.length,\n      count = 1,\n      deferDataKey = type + \"defer\",\n      queueDataKey = type + \"queue\",\n      markDataKey = type + \"mark\",\n      tmp;\n    function resolve() {\n      if ( !( --count ) ) {\n        defer.resolveWith( elements, [ elements ] );\n      }\n    }\n    while( i-- ) {\n      if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n          ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n            jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n          jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( \"once memory\" ), true ) )) {\n        count++;\n        tmp.add( resolve );\n      }\n    }\n    resolve();\n    return defer.promise();\n  }\n});\n})();"
  },
  {
    "path": "servers/www/assets/js/vendor/noty/themes/default.js",
    "content": ";(function($) {\n\n\t$.noty.themes.defaultTheme = {\n\t\tname: 'defaultTheme',\n\t\thelpers: {\n\t\t\tborderFix: function() {\n\t\t\t\tif (this.options.dismissQueue) {\n\t\t\t\t\tvar selector = this.options.layout.container.selector + ' ' + this.options.layout.parent.selector;\n\t\t\t\t\tswitch (this.options.layout.name) {\n\t\t\t\t\t\tcase 'top':\n\t\t\t\t\t\t\t$(selector).css({borderRadius: '0px 0px 0px 0px'});\n\t\t\t\t\t\t\t$(selector).last().css({borderRadius: '0px 0px 5px 5px'}); break;\n\t\t\t\t\t\tcase 'topCenter': case 'topLeft': case 'topRight':\n\t\t\t\t\t\tcase 'bottomCenter': case 'bottomLeft': case 'bottomRight':\n\t\t\t\t\t\tcase 'center': case 'centerLeft': case 'centerRight': case 'inline':\n\t\t\t\t\t\t\t$(selector).css({borderRadius: '0px 0px 0px 0px'});\n\t\t\t\t\t\t\t$(selector).first().css({'border-top-left-radius': '5px', 'border-top-right-radius': '5px'});\n\t\t\t\t\t\t\t$(selector).last().css({'border-bottom-left-radius': '5px', 'border-bottom-right-radius': '5px'}); break;\n\t\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\t\t$(selector).css({borderRadius: '0px 0px 0px 0px'});\n\t\t\t\t\t\t\t$(selector).first().css({borderRadius: '5px 5px 0px 0px'}); break;\n\t\t\t\t\t\tdefault: break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmodal: {\n\t\t\tcss: {\n\t\t\t\tposition: 'fixed',\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tbackgroundColor: '#000',\n\t\t\t\tzIndex: 10000,\n\t\t\t\topacity: 0.6,\n\t\t\t\tdisplay: 'none',\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t}\n\t\t},\n\t\tstyle: function() {\n\n\t\t\tthis.$bar.css({\n\t\t\t\toverflow: 'hidden',\n\t\t\t\tbackground: \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAoCAYAAAAPOoFWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNq81tsOgjAMANB2ov7/7ypaN7IlIwi9rGuT8QSc9EIDAsAznxvY4pXPKr05RUE5MEVB+TyWfCEl9LZApYopCmo9C4FKSMtYoI8Bwv79aQJU4l6hXXCZrQbokJEksxHo9KMOgc6w1atHXM8K9DVC7FQnJ0i8iK3QooGgbnyKgMDygBWyYFZoqx4qS27KqLZJjA1D0jK6QJcYEQEiWv9PGkTsbqxQ8oT+ZtZB6AkdsJnQDnMoHXHLGKOgDYuCWmYhEERCI5gaamW0bnHdA3k2ltlIN+2qKRyCND0bhqSYCyTB3CAOc4WusBEIpkeBuPgJMAAX8Hs1NfqHRgAAAABJRU5ErkJggg==') repeat-x scroll left top #fff\"\n\t\t\t});\n\n\t\t\tthis.$message.css({\n\t\t\t\tfontSize: '13px',\n\t\t\t\tlineHeight: '16px',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\tpadding: '8px 10px 9px',\n\t\t\t\twidth: 'auto',\n\t\t\t\tposition: 'relative'\n\t\t\t});\n\n\t\t\tthis.$closeButton.css({\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 4, right: 4,\n\t\t\t\twidth: 10, height: 10,\n\t\t\t\tbackground: \"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAATpJREFUeNoszrFqVFEUheG19zlz7sQ7ijMQBAvfYBqbpJCoZSAQbOwEE1IHGytbLQUJ8SUktW8gCCFJMSGSNxCmFBJO7j5rpXD6n5/P5vM53H3b3T9LOiB5AQDuDjM7BnA7DMPHDGBH0nuSzwHsRcRVRNRSysuU0i6AOwA/02w2+9Fae00SEbEh6SGAR5K+k3zWWptKepCm0+kpyRoRGyRBcpPkDsn1iEBr7drdP2VJZyQXERGSPpiZAViTBACXKaV9kqd5uVzCzO5KKb/d/UZSDwD/eyxqree1VqSu6zKAF2Z2RPJJaw0rAkjOJT0m+SuT/AbgDcmnkmBmfwAsJL1dXQ8lWY6IGwB1ZbrOOb8zs8thGP4COFwx/mE8Ho9Go9ErMzvJOW/1fY/JZIJSypqZfXX3L13X9fcDAKJct1sx3OiuAAAAAElFTkSuQmCC)\",\n\t\t\t\tdisplay: 'none',\n\t\t\t\tcursor: 'pointer'\n\t\t\t});\n\n\t\t\tthis.$buttons.css({\n\t\t\t\tpadding: 5,\n\t\t\t\ttextAlign: 'right',\n\t\t\t\tborderTop: '1px solid #ccc',\n\t\t\t\tbackgroundColor: '#fff'\n\t\t\t});\n\n\t\t\tthis.$buttons.find('button').css({\n\t\t\t\tmarginLeft: 5\n\t\t\t});\n\n\t\t\tthis.$buttons.find('button:first').css({\n\t\t\t\tmarginLeft: 0\n\t\t\t});\n\n\t\t\tthis.$bar.bind({\n\t\t\t\tmouseenter: function() { $(this).find('.noty_close').fadeIn(); },\n\t\t\t\tmouseleave: function() { $(this).find('.noty_close').fadeOut(); }\n\t\t\t});\n\n\t\t\tswitch (this.options.layout.name) {\n\t\t\t\tcase 'top':\n\t\t\t\t\tthis.$bar.css({\n\t\t\t\t\t\tborderRadius: '0px 0px 5px 5px',\n\t\t\t\t\t\tborderBottom: '2px solid #eee',\n\t\t\t\t\t\tborderLeft: '2px solid #eee',\n\t\t\t\t\t\tborderRight: '2px solid #eee',\n\t\t\t\t\t\tboxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n\t\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t\tcase 'topCenter': case 'center': case 'bottomCenter': case 'inline':\n\t\t\t\t\tthis.$bar.css({\n\t\t\t\t\t\tborderRadius: '5px',\n\t\t\t\t\t\tborder: '1px solid #eee',\n\t\t\t\t\t\tboxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n\t\t\t\t\t});\n\t\t\t\t\tthis.$message.css({fontSize: '13px', textAlign: 'center'});\n\t\t\t\tbreak;\n\t\t\t\tcase 'topLeft': case 'topRight':\n\t\t\t\tcase 'bottomLeft': case 'bottomRight':\n\t\t\t\tcase 'centerLeft': case 'centerRight':\n\t\t\t\t\tthis.$bar.css({\n\t\t\t\t\t\tborderRadius: '5px',\n\t\t\t\t\t\tborder: '1px solid #eee',\n\t\t\t\t\t\tboxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n\t\t\t\t\t});\n\t\t\t\t\tthis.$message.css({fontSize: '13px', textAlign: 'left'});\n\t\t\t\tbreak;\n\t\t\t\tcase 'bottom':\n\t\t\t\t\tthis.$bar.css({\n\t\t\t\t\t\tborderRadius: '5px 5px 0px 0px',\n\t\t\t\t\t\tborderTop: '2px solid #eee',\n\t\t\t\t\t\tborderLeft: '2px solid #eee',\n\t\t\t\t\t\tborderRight: '2px solid #eee',\n\t\t\t\t\t\tboxShadow: \"0 -2px 4px rgba(0, 0, 0, 0.1)\"\n\t\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.$bar.css({\n\t\t\t\t\t\tborder: '2px solid #eee',\n\t\t\t\t\t\tboxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n\t\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch (this.options.type) {\n\t\t\t\tcase 'alert': case 'notification':\n\t\t\t\t\tthis.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'}); break;\n\t\t\t\tcase 'warning':\n\t\t\t\t\tthis.$bar.css({backgroundColor: '#FFEAA8', borderColor: '#FFC237', color: '#826200'});\n\t\t\t\t\tthis.$buttons.css({borderTop: '1px solid #FFC237'}); break;\n\t\t\t\tcase 'error':\n\t\t\t\t\tthis.$bar.css({backgroundColor: 'red', borderColor: 'darkred', color: '#FFF'});\n\t\t\t\t\tthis.$message.css({fontWeight: 'bold'});\n\t\t\t\t\tthis.$buttons.css({borderTop: '1px solid darkred'}); break;\n\t\t\t\tcase 'information':\n\t\t\t\t\tthis.$bar.css({backgroundColor: '#57B7E2', borderColor: '#0B90C4', color: '#FFF'});\n\t\t\t\t\tthis.$buttons.css({borderTop: '1px solid #0B90C4'}); break;\n\t\t\t\tcase 'success':\n\t\t\t\t\tthis.$bar.css({backgroundColor: 'lightgreen', borderColor: '#50C24E', color: 'darkgreen'});\n\t\t\t\t\tthis.$buttons.css({borderTop: '1px solid #50C24E'});break;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'}); break;\n\t\t\t}\n\t\t},\n\t\tcallback: {\n\t\t\tonShow: function() { $.noty.themes.defaultTheme.helpers.borderFix.apply(this); },\n\t\t\tonClose: function() { $.noty.themes.defaultTheme.helpers.borderFix.apply(this); }\n\t\t}\n\t};\n\n})(jQuery);\n"
  },
  {
    "path": "servers/www/assets/js/vendor/overthrow.js",
    "content": "/*! Overthrow v.0.1.0. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http://filamentgroup.github.com/Overthrow/license.txt */\r\n(function( w, undefined ){\r\n  \r\n\tvar doc = w.document,\r\n\t\tdocElem = doc.documentElement,\r\n\t\tclasstext = \"overthrow-enabled\",\r\n\t\r\n\t\t// Touch events are used in the polyfill, and thus are a prerequisite\r\n\t\tcanBeFilledWithPoly = \"ontouchmove\" in doc,\r\n\t\t\r\n\t\t// The following attempts to determine whether the browser has native overflow support\r\n\t\t// so we can enable it but not polyfill\r\n\t\toverflowProbablyAlreadyWorks = \r\n\t\t\t// Features-first. iOS5 overflow scrolling property check - no UA needed here. thanks Apple :)\r\n\t\t\t\"WebkitOverflowScrolling\" in docElem.style ||\r\n\t\t\t// Touch events aren't supported and screen width is greater than X\r\n\t\t\t// ...basically, this is a loose \"desktop browser\" check. \r\n\t\t\t// It may wrongly opt-in very large tablets with no touch support.\r\n\t\t\t( !canBeFilledWithPoly && w.screen.width > 1200 ) ||\r\n\t\t\t// Hang on to your hats.\r\n\t\t\t// Whitelist some popular, overflow-supporting mobile browsers for now and the future\r\n\t\t\t// These browsers are known to get overlow support right, but give us no way of detecting it.\r\n\t\t\t(function(){\r\n\t\t\t\tvar ua = w.navigator.userAgent,\r\n\t\t\t\t\t// Webkit crosses platforms, and the browsers on our list run at least version 534\r\n\t\t\t\t\twebkit = ua.match( /AppleWebKit\\/([0-9]+)/ ),\r\n\t\t\t\t\twkversion = webkit && webkit[1],\r\n\t\t\t\t\twkLte534 = webkit && wkversion >= 534;\r\n\t\t\t\t\t\r\n\t\t\t\treturn (\r\n\t\t\t\t\t/* Android 3+ with webkit gte 534\r\n\t\t\t\t\t~: Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 */\r\n\t\t\t\t\tua.match( /Android ([0-9]+)/ ) && RegExp.$1 >= 3 && wkLte534 ||\r\n\t\t\t\t\t/* Blackberry 7+ with webkit gte 534\r\n\t\t\t\t\t~: Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0 Mobile Safari/534.11+ */\r\n\t\t\t\t\tua.match( / Version\\/([0-9]+)/ ) && RegExp.$1 >= 0 && w.blackberry && wkLte534 ||\r\n\t\t\t\t\t/* Blackberry Playbook with webkit gte 534\r\n\t\t\t\t\t~: Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+ */   \r\n\t\t\t\t\tua.indexOf( /PlayBook/ ) > -1 && RegExp.$1 >= 0 && wkLte534 ||\r\n\t\t\t\t\t/* Firefox Mobile (Fennec) 4 and up\r\n\t\t\t\t\t~: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:2.1.1) Gecko/ Firefox/4.0.2pre Fennec/4.0. */\r\n\t\t\t\t\tua.match( /Fennec\\/([0-9]+)/ ) && RegExp.$1 >= 4 ||\r\n\t\t\t\t\t/* WebOS 3 and up (TouchPad too)\r\n\t\t\t\t\t~: Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.48 Safari/534.6 TouchPad/1.0 */\r\n\t\t\t\t\tua.match( /wOSBrowser\\/([0-9]+)/ ) && RegExp.$1 >= 233 && wkLte534 ||\r\n\t\t\t\t\t/* Nokia Browser N8\r\n\t\t\t\t\t~: Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/012.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.0 Mobile Safari/533.4 3gpp-gba \r\n\t\t\t\t\t~: Note: the N9 doesn't have native overflow with one-finger touch. wtf */\r\n\t\t\t\t\tua.match( /NokiaBrowser\\/([0-9\\.]+)/ ) && parseFloat(RegExp.$1) === 7.3 && webkit && wkversion >= 533\r\n\t\t\t\t);\r\n\t\t\t})(),\r\n\t\t\t\r\n\t\t// Easing can use any of Robert Penner's equations (http://www.robertpenner.com/easing_terms_of_use.html). By default, overthrow includes ease-out-cubic\r\n\t\t// arguments: t = current iteration, b = initial value, c = end value, d = total iterations\r\n\t\t// use w.overthrow.easing to provide a custom function externally, or pass an easing function as a callback to the toss method\r\n\t\tdefaultEasing = function (t, b, c, d) {\r\n\t\t\treturn c*((t=t/d-1)*t*t + 1) + b;\r\n\t\t},\t\r\n\t\t\t\r\n\t\tenabled = false,\r\n\t\t\r\n\t\t// Keeper of intervals\r\n\t\ttimeKeeper,\r\n\t\t\t\t\r\n\t\t/* toss scrolls and element with easing\r\n\t\t\r\n\t\t// elem is the element to scroll\r\n\t\t// options hash:\r\n\t\t\t* left is the desired horizontal scroll. Default is \"+0\". For relative distances, pass a string with \"+\" or \"-\" in front.\r\n\t\t\t* top is the desired vertical scroll. Default is \"+0\". For relative distances, pass a string with \"+\" or \"-\" in front.\r\n\t\t\t* duration is the number of milliseconds the throw will take. Default is 100.\r\n\t\t\t* easing is an optional custom easing function. Default is w.overthrow.easing. Must follow the easing function signature \r\n\t\t*/\r\n\t\ttoss = function( elem, options ){\r\n\t\t\tvar i = 0,\r\n\t\t\t\tsLeft = elem.scrollLeft,\r\n\t\t\t\tsTop = elem.scrollTop,\r\n\t\t\t\t// Toss defaults\r\n\t\t\t\to = {\r\n\t\t\t\t\ttop: \"+0\",\r\n\t\t\t\t\tleft: \"+0\",\r\n\t\t\t\t\tduration: 100,\r\n\t\t\t\t\teasing: w.overthrow.easing\r\n\t\t\t\t},\r\n\t\t\t\tendLeft, endTop;\r\n\t\t\t\r\n\t\t\t// Mixin based on predefined defaults\r\n\t\t\tif( options ){\r\n\t\t\t\tfor( var j in o ){\r\n\t\t\t\t\tif( options[ j ] !== undefined ){\r\n\t\t\t\t\t\to[ j ] = options[ j ];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Convert relative values to ints\r\n\t\t\t// First the left val\r\n\t\t\tif( typeof o.left === \"string\" ){\r\n\t\t\t\to.left = parseFloat( o.left );\r\n\t\t\t\tendLeft = o.left + sLeft;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tendLeft = o.left;\r\n\t\t\t\to.left = o.left - sLeft;\r\n\t\t\t}\r\n\t\t\t// Then the top val\r\n\t\t\tif( typeof o.top === \"string\" ){\r\n\t\t\t\to.top = parseFloat( o.top );\r\n\t\t\t\tendTop = o.top + sTop;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tendTop = o.top;\r\n\t\t\t\to.top = o.top - sTop;\r\n\t\t\t}\r\n\r\n\t\t\ttimeKeeper = setInterval(function(){\t\t\t\t\t\r\n\t\t\t\tif( i++ < o.duration ){\r\n\t\t\t\t\telem.scrollLeft = o.easing( i, sLeft, o.left, o.duration );\r\n\t\t\t\t\telem.scrollTop = o.easing( i, sTop, o.top, o.duration );\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\tif( endLeft !== elem.scrollLeft ){\r\n\t\t\t\t\t\telem.scrollLeft = endLeft;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif( endTop !== elem.scrollTop ){\r\n\t\t\t\t\t\telem.scrollTop = endTop;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tintercept();\r\n\t\t\t\t}\r\n\t\t\t}, 1 );\r\n\t\t\t\r\n\t\t\t// Return the values, post-mixin, with end values specified\r\n\t\t\treturn { top: endTop, left: endLeft, duration: o.duration, easing: o.easing };\r\n\t\t},\r\n\t\t\r\n\t\t// find closest overthrow (elem or a parent)\r\n\t\tclosest = function( target, ascend ){\r\n\t\t\treturn !ascend && target.className && target.className.indexOf( \"overthrow\" ) > -1 && target || closest( target.parentNode );\r\n\t\t},\r\n\t\t\t\t\r\n\t\t// Intercept any throw in progress\r\n\t\tintercept = function(){\r\n\t\t\tclearInterval( timeKeeper );\r\n\t\t},\r\n\t\t\t\r\n\t\t// Enable and potentially polyfill overflow\r\n\t\tenable = function(){\r\n\t\t\t\t\r\n\t\t\t// If it's on, \r\n\t\t\tif( enabled ){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// It's on.\r\n\t\t\tenabled = true;\r\n\t\t\t\t\r\n\t\t\t// If overflowProbablyAlreadyWorks or at least the element canBeFilledWithPoly, add a class to cue CSS that assumes overflow scrolling will work (setting height on elements and such)\r\n\t\t\tif( overflowProbablyAlreadyWorks || canBeFilledWithPoly ){\r\n\t\t\t\tdocElem.className += \" \" + classtext;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\t// Destroy everything later. If you want to.\r\n\t\t\tw.overthrow.forget = function(){\r\n\t\t\t\t// Strip the class name from docElem\r\n\t\t\t\tdocElem.className = docElem.className.replace( classtext, \"\" );\r\n\t\t\t\t// Remove touch binding (check for method support since this part isn't qualified by touch support like the rest)\r\n\t\t\t\tif( doc.removeEventListener ){\r\n\t\t\t\t\tdoc.removeEventListener( \"touchstart\", start, false );\r\n\t\t\t\t}\r\n\t\t\t\t// reset easing to default\r\n\t\t\t\tw.overthrow.easing = defaultEasing;\r\n\t\t\t\t\r\n\t\t\t\t// Let 'em know\r\n\t\t\t\tenabled = false;\r\n\t\t\t};\r\n\t\r\n\t\t\t// If overflowProbablyAlreadyWorks or it doesn't look like the browser canBeFilledWithPoly, our job is done here. Exit viewport left.\r\n\t\t\tif( overflowProbablyAlreadyWorks || !canBeFilledWithPoly ){\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Fill 'er up!\r\n\t\t\t// From here down, all logic is associated with touch scroll handling\r\n\t\t\t\t// elem references the overthrow element in use\r\n\t\t\tvar elem,\r\n\t\t\t\t\r\n\t\t\t\t// The last several Y values are kept here\r\n\t\t\t\tlastTops = [],\r\n\t\t\r\n\t\t\t\t// The last several X values are kept here\r\n\t\t\t\tlastLefts = [],\r\n\t\t\t\t\r\n\t\t\t\t// lastDown will be true if the last scroll direction was down, false if it was up\r\n\t\t\t\tlastDown,\r\n\t\t\t\t\r\n\t\t\t\t// lastRight will be true if the last scroll direction was right, false if it was left\r\n\t\t\t\tlastRight,\r\n\t\t\t\t\r\n\t\t\t\t// For a new gesture, or change in direction, reset the values from last scroll\r\n\t\t\t\tresetVertTracking = function(){\r\n\t\t\t\t\tlastTops = [];\r\n\t\t\t\t\tlastDown = null;\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\tresetHorTracking = function(){\r\n\t\t\t\t\tlastLefts = [];\r\n\t\t\t\t\tlastRight = null;\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t// After releasing touchend, throw the overthrow element, depending on momentum\r\n\t\t\t\tfinishScroll = function(){\r\n\t\t\t\t\t// Come up with a distance and duration based on how \r\n\t\t\t\t\t// Multipliers are tweaked to a comfortable balance across platforms\r\n\t\t\t\t\tvar top = ( lastTops[ 0 ] - lastTops[ lastTops.length -1 ] ) * 8,\r\n\t\t\t\t\t\tleft = ( lastLefts[ 0 ] - lastLefts[ lastLefts.length -1 ] ) * 8,\r\n\t\t\t\t\t\tduration = Math.max( Math.abs( left ), Math.abs( top ) ) / 8;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Make top and left relative-style strings (positive vals need \"+\" prefix)\r\n\t\t\t\t\ttop = ( top > 0 ? \"+\" : \"\" ) + top;\r\n\t\t\t\t\tleft = ( left > 0 ? \"+\" : \"\" ) + left;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Make sure there's a significant amount of throw involved, otherwise, just stay still\r\n\t\t\t\t\tif( !isNaN( duration ) && duration > 0 && ( Math.abs( left ) > 80 || Math.abs( top ) > 80 ) ){\r\n\t\t\t\t\t\ttoss( elem, { left: left, top: top, duration: duration } );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\r\n\t\t\t\t// On webkit, touch events hardly trickle through textareas and inputs\r\n\t\t\t\t// Disabling CSS pointer events makes sure they do, but it also makes the controls innaccessible\r\n\t\t\t\t// Toggling pointer events at the right moments seems to do the trick\r\n\t\t\t\t// Thanks Thomas Bachem http://stackoverflow.com/a/5798681 for the following\r\n\t\t\t\tinputs,\r\n\t\t\t\tsetPointers = function( val ){\r\n\t\t\t\t\tinputs = elem.querySelectorAll( \"textarea, input\" );\r\n\t\t\t\t\tfor( var i = 0, il = inputs.length; i < il; i++ ) {\r\n\t\t\t\t\t\tinputs[ i ].style.pointerEvents = val;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t// For nested overthrows, changeScrollTarget restarts a touch event cycle on a parent or child overthrow\r\n\t\t\t\tchangeScrollTarget = function( startEvent, ascend ){\r\n\t\t\t\t\tif( doc.createEvent ){\r\n\t\t\t\t\t\tvar newTarget = ( !ascend || ascend === undefined ) && elem.parentNode || elem.touchchild || elem,\r\n\t\t\t\t\t\t\ttEnd;\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\tif( newTarget !== elem ){\r\n\t\t\t\t\t\t\ttEnd = doc.createEvent( \"HTMLEvents\" );\r\n\t\t\t\t\t\t\ttEnd.initEvent( \"touchend\", true, true );\r\n\t\t\t\t\t\t\telem.dispatchEvent( tEnd );\r\n\t\t\t\t\t\t\tnewTarget.touchchild = elem;\r\n\t\t\t\t\t\t\telem = newTarget;\r\n\t\t\t\t\t\t\tnewTarget.dispatchEvent( startEvent );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t// Touchstart handler\r\n\t\t\t\t// On touchstart, touchmove and touchend are freshly bound, and all three share a bunch of vars set by touchstart\r\n\t\t\t\t// Touchend unbinds them again, until next time\r\n\t\t\t\tstart = function( e ){\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Stop any throw in progress\r\n\t\t\t\t\tintercept();\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Reset the distance and direction tracking\r\n\t\t\t\t\tresetVertTracking();\r\n\t\t\t\t\tresetHorTracking();\r\n\t\t\t\t\t\t\r\n\t\t\t\t\telem = closest( e.target );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tif( !elem || elem === docElem || e.touches.length > 1 ){\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\t\t\t\r\n\r\n\t\t\t\t\tsetPointers( \"none\" );\r\n\t\t\t\t\tvar touchStartE = e,\r\n\t\t\t\t\t\tscrollT = elem.scrollTop,\r\n\t\t\t\t\t\tscrollL = elem.scrollLeft,\r\n\t\t\t\t\t\theight = elem.offsetHeight,\r\n\t\t\t\t\t\twidth = elem.offsetWidth,\r\n\t\t\t\t\t\tstartY = e.touches[ 0 ].pageY,\r\n\t\t\t\t\t\tstartX = e.touches[ 0 ].pageX,\r\n\t\t\t\t\t\tscrollHeight = elem.scrollHeight,\r\n\t\t\t\t\t\tscrollWidth = elem.scrollWidth,\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t// Touchmove handler\r\n\t\t\t\t\t\tmove = function( e ){\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tvar ty = scrollT + startY - e.touches[ 0 ].pageY,\r\n\t\t\t\t\t\t\t\ttx = scrollL + startX - e.touches[ 0 ].pageX,\r\n\t\t\t\t\t\t\t\tdown = ty >= ( lastTops.length ? lastTops[ 0 ] : 0 ),\r\n\t\t\t\t\t\t\t\tright = tx >= ( lastLefts.length ? lastLefts[ 0 ] : 0 );\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// If there's room to scroll the current container, prevent the default window scroll\r\n\t\t\t\t\t\t\tif( ( ty > 0 && ty < scrollHeight - height ) || ( tx > 0 && tx < scrollWidth - width ) ){\r\n\t\t\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// This bubbling is dumb. Needs a rethink.\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tchangeScrollTarget( touchStartE );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// If down and lastDown are inequal, the y scroll has changed direction. Reset tracking.\r\n\t\t\t\t\t\t\tif( lastDown && down !== lastDown ){\r\n\t\t\t\t\t\t\t\tresetVertTracking();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// If right and lastRight are inequal, the x scroll has changed direction. Reset tracking.\r\n\t\t\t\t\t\t\tif( lastRight && right !== lastRight ){\r\n\t\t\t\t\t\t\t\tresetHorTracking();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// remember the last direction in which we were headed\r\n\t\t\t\t\t\t\tlastDown = down;\r\n\t\t\t\t\t\t\tlastRight = right;\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// set the container's scroll\r\n\t\t\t\t\t\t\telem.scrollTop = ty;\r\n\t\t\t\t\t\t\telem.scrollLeft = tx;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tlastTops.unshift( ty );\r\n\t\t\t\t\t\t\tlastLefts.unshift( tx );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tif( lastTops.length > 3 ){\r\n\t\t\t\t\t\t\t\tlastTops.pop();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif( lastLefts.length > 3 ){\r\n\t\t\t\t\t\t\t\tlastLefts.pop();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t// Touchend handler\r\n\t\t\t\t\t\tend = function( e ){\r\n\t\t\t\t\t\t\t// Apply momentum based easing for a graceful finish\r\n\t\t\t\t\t\t\tfinishScroll();\t\r\n\t\t\t\t\t\t\t// Bring the pointers back\r\n\t\t\t\t\t\t\tsetPointers( \"auto\" );\r\n\t\t\t\t\t\t\tsetTimeout( function(){\r\n\t\t\t\t\t\t\t\tsetPointers( \"none\" );\r\n\t\t\t\t\t\t\t}, 450 );\r\n\t\t\t\t\t\t\telem.removeEventListener( \"touchmove\", move, false );\r\n\t\t\t\t\t\t\telem.removeEventListener( \"touchend\", end, false );\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\r\n\t\t\t\t\telem.addEventListener( \"touchmove\", move, false );\r\n\t\t\t\t\telem.addEventListener( \"touchend\", end, false );\r\n\t\t\t\t};\r\n\t\t\t\t\r\n\t\t\t// Bind to touch, handle move and end within\r\n\t\t\tdoc.addEventListener( \"touchstart\", start, false );\r\n\t\t};\r\n\t\t\r\n\t// Expose overthrow API\r\n\tw.overthrow = {\r\n\t\tset: enable,\r\n\t\tforget: function(){},\r\n\t\teasing: defaultEasing,\r\n\t\ttoss: toss,\r\n\t\tintercept: intercept,\r\n\t\tclosest: closest,\r\n\t\tsupport: overflowProbablyAlreadyWorks ? \"native\" : canBeFilledWithPoly && \"polyfilled\" || \"none\"\r\n\t};\r\n\t\r\n\t// Auto-init\r\n\tenable();\r\n\t\t\r\n})( this );"
  },
  {
    "path": "servers/www/assets/js/vendor/page.js",
    "content": "\r\n;(function(){\r\n\r\n  /**\r\n   * Perform initial dispatch.\r\n   */\r\n\r\n  var dispatch = true;\r\n\r\n  /**\r\n   * Base path.\r\n   */\r\n\r\n  var base = '';\r\n\r\n  /**\r\n   * Register `path` with callback `fn()`,\r\n   * or route `path`, or `page.start()`.\r\n   *\r\n   *   page('/user/:id', load, user);\r\n   *   page('/user/' + user.id, { some: 'thing' });\r\n   *   page('/user/' + user.id);\r\n   *   page();\r\n   *\r\n   * @param {String} path\r\n   * @param {Function} fn...\r\n   * @api public\r\n   */\r\n\r\n  function page(path, fn) {\r\n    // route <path> to <callback ...>\r\n    if ('function' == typeof fn) {\r\n      var route = new Route(path);\r\n      for (var i = 1; i < arguments.length; ++i) {\r\n        page.callbacks.push(route.middleware(arguments[i]));\r\n      }\r\n    // show <path> with [state]\r\n    } else if ('string' == typeof path) {\r\n      page.show(path, fn);\r\n    // start [options]\r\n    } else {\r\n      page.start(path);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Callback functions.\r\n   */\r\n\r\n  page.callbacks = [];\r\n\r\n  /**\r\n   * Get or set basepath to `path`.\r\n   *\r\n   * @param {String} path\r\n   * @api public\r\n   */\r\n\r\n  page.base = function(path){\r\n    if (0 == arguments.length) return base;\r\n    base = path;\r\n  };\r\n\r\n  /**\r\n   * Bind with the given `options`.\r\n   *\r\n   * Options:\r\n   *\r\n   *    - `click` bind to click events [true]\r\n   *    - `popstate` bind to popstate [true]\r\n   *    - `dispatch` perform initial dispatch [true]\r\n   *\r\n   * @param {Object} options\r\n   * @api public\r\n   */\r\n\r\n  page.start = function(options){\r\n    options = options || {};\r\n    if (false === options.dispatch) dispatch = false;\r\n    if (false !== options.popstate) History.Adapter.bind(window, \"statechange\", onpopstate, false);\r\n    if (false !== options.click) addEventListener('click', onclick, false);\r\n    if (dispatch) page.show(location.pathname, null, true, dispatch);\r\n  };\r\n\r\n  /**\r\n   * Unbind click and popstate event handlers.\r\n   *\r\n   * @api public\r\n   */\r\n\r\n  page.stop = function(){\r\n    removeEventListener('click', onclick, false);\r\n    removeEventListener('popstate', onpopstate, false);\r\n  };\r\n\r\n  /**\r\n   * Show `path` with optional `state` object.\r\n   *\r\n   * @param {String} path\r\n   * @param {Object} state\r\n   * @api public\r\n   */\r\n\r\n  page.show = function(path, state, init, dispatch){\r\n    var ctx = new Context(path, state);\r\n    ctx.init = init;\r\n    if (null == dispatch) dispatch = true;\r\n    if (dispatch) page.dispatch(ctx);\r\n    if (!init && !ctx.unhandled) History.pushState(ctx.state, ctx.title, ctx.canonicalPath);\r\n  };\r\n\r\n  /**\r\n   * Replace `path` with optional `state` object.\r\n   *\r\n   * @param {String} path\r\n   * @param {Object} state\r\n   * @api public\r\n   */\r\n\r\n  page.replace = function(path, state, init, dispatch){\r\n    var ctx = new Context(path, state);\r\n    ctx.init = init;\r\n    if (null == dispatch) dispatch = true;\r\n    if (dispatch) page.dispatch(ctx);\r\n    ctx.save()\r\n  };\r\n\r\n  /**\r\n   * Dispatch the given `ctx`.\r\n   *\r\n   * @param {Object} ctx\r\n   * @api private\r\n   */\r\n\r\n  page.dispatch = function(ctx){\r\n    var i = 0;\r\n\r\n    function next() {\r\n      var fn = page.callbacks[i++];\r\n      if (!fn) return unhandled(ctx);\r\n      fn(ctx, next);\r\n    }\r\n\r\n    next();\r\n  };\r\n\r\n  /**\r\n   * Unhandled `ctx`. When it's not the initial\r\n   * popstate then redirect. If you wish to handle\r\n   * 404s on your own use `page('*', callback)`.\r\n   *\r\n   * @param {Context} ctx\r\n   * @api private\r\n   */\r\n\r\n  function unhandled(ctx) {\r\n    if (window.location.pathname == ctx.canonicalPath) return;\r\n    page.stop();\r\n    ctx.unhandled = true;\r\n    window.location = ctx.canonicalPath;\r\n  }\r\n\r\n  /**\r\n   * Initialize a new \"request\" `Context`\r\n   * with the given `path` and optional initial `state`.\r\n   *\r\n   * @param {String} path\r\n   * @param {Object} state\r\n   * @api public\r\n   */\r\n\r\n  function Context(path, state) {\r\n    if ('/' == path[0] && 0 != path.indexOf(base)) path = base + path;\r\n    this.canonicalPath = path;\r\n    this.path = path.replace(base, '') || '/';\r\n    this.title = document.title;\r\n    this.state = state || {};\r\n    this.state.path = path;\r\n    this.params = [];\r\n  }\r\n\r\n  /**\r\n   * Save the context state.\r\n   *\r\n   * @api public\r\n   */\r\n\r\n  Context.prototype.save = function(){\r\n    History.replaceState(this.state, this.title, this.canonicalPath);\r\n  };\r\n\r\n  /**\r\n   * Initialize `Route` with the given HTTP `path`,\r\n   * and an array of `callbacks` and `options`.\r\n   *\r\n   * Options:\r\n   *\r\n   *   - `sensitive`    enable case-sensitive routes\r\n   *   - `strict`       enable strict matching for trailing slashes\r\n   *\r\n   * @param {String} path\r\n   * @param {Object} options.\r\n   * @api private\r\n   */\r\n\r\n  function Route(path, options) {\r\n    options = options || {};\r\n    this.path = path;\r\n    this.method = 'GET';\r\n    this.regexp = pathtoRegexp(path\r\n      , this.keys = []\r\n      , options.sensitive\r\n      , options.strict);\r\n  }\r\n\r\n  /**\r\n   * Return route middleware with\r\n   * the given callback `fn()`.\r\n   *\r\n   * @param {Function} fn\r\n   * @return {Function}\r\n   * @api public\r\n   */\r\n\r\n  Route.prototype.middleware = function(fn){\r\n    var self = this;\r\n    return function(ctx, next){\r\n      if (self.match(ctx.path, ctx.params)) return fn(ctx, next);\r\n      next();\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Check if this route matches `path`, if so\r\n   * populate `params`.\r\n   *\r\n   * @param {String} path\r\n   * @param {Array} params\r\n   * @return {Boolean}\r\n   * @api private\r\n   */\r\n\r\n  Route.prototype.match = function(path, params){\r\n    var keys = this.keys\r\n      , m = this.regexp.exec(path);\r\n\r\n    if (!m) return false;\r\n\r\n    for (var i = 1, len = m.length; i < len; ++i) {\r\n      var key = keys[i - 1];\r\n\r\n      var val = 'string' == typeof m[i]\r\n        ? decodeURIComponent(m[i])\r\n        : m[i];\r\n\r\n      if (key) {\r\n        params[key.name] = undefined !== params[key.name]\r\n          ? params[key.name]\r\n          : val;\r\n      } else {\r\n        params.push(val);\r\n      }\r\n    }\r\n\r\n    return true;\r\n  };\r\n\r\n  /**\r\n   * Normalize the given path string,\r\n   * returning a regular expression.\r\n   *\r\n   * An empty array should be passed,\r\n   * which will contain the placeholder\r\n   * key names. For example \"/user/:id\" will\r\n   * then contain [\"id\"].\r\n   *\r\n   * @param  {String|RegExp|Array} path\r\n   * @param  {Array} keys\r\n   * @param  {Boolean} sensitive\r\n   * @param  {Boolean} strict\r\n   * @return {RegExp}\r\n   * @api private\r\n   */\r\n\r\n  function pathtoRegexp(path, keys, sensitive, strict) {\r\n    if (path instanceof RegExp) return path;\r\n    if (path instanceof Array) path = '(' + path.join('|') + ')';\r\n    path = path\r\n      .concat(strict ? '' : '/?')\r\n      .replace(/\\/\\(/g, '(?:/')\r\n      .replace(/\\+/g, '__plus__')\r\n      .replace(/(\\/)?(\\.)?:(\\w+)(?:(\\(.*?\\)))?(\\?)?/g, function(_, slash, format, key, capture, optional){\r\n        keys.push({ name: key, optional: !! optional });\r\n        slash = slash || '';\r\n        return ''\r\n          + (optional ? '' : slash)\r\n          + '(?:'\r\n          + (optional ? slash : '')\r\n          + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')'\r\n          + (optional || '');\r\n      })\r\n      .replace(/([\\/.])/g, '\\\\$1')\r\n      .replace(/__plus__/g, '(.+)')\r\n      .replace(/\\*/g, '(.*)');\r\n    return new RegExp('^' + path + '$', sensitive ? '' : 'i');\r\n  };\r\n\r\n  /**\r\n   * Handle \"populate\" events.\r\n   */\r\n\r\n  function onpopstate(e) {\r\n    if (e.state) {\r\n      var path = e.state.path;\r\n      page.replace(path, e.state);\r\n    } else {\r\n      page.show(location.pathname, null, true, dispatch);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle \"click\" events.\r\n   */\r\n\r\n  function onclick(e) {\r\n    var el = e.target;\r\n    while (el && 'A' != el.nodeName) el = el.parentNode;\r\n    if (!el || 'A' != el.nodeName) return;\r\n    var href = el.href;\r\n    var path = el.pathname;\r\n    if (el.hash) return;\r\n    if (!sameOrigin(href)) return;\r\n    var orig = path;\r\n    path = path.replace(base, '');\r\n    if (base && orig == path) return;\r\n    e.preventDefault();\r\n    page.show(orig);\r\n  }\r\n\r\n  /**\r\n   * Check if `href` is the same origin.\r\n   */\r\n\r\n  function sameOrigin(href) {\r\n    var origin = location.protocol + \"//\" + location.hostname;\r\n    if (location.port) origin += \":\" + location.port;\r\n    return 0 == href.indexOf(origin);\r\n  }\r\n\r\n  /**\r\n   * Expose `page`.\r\n   */\r\n\r\n  if ('undefined' == typeof module) {\r\n    window.page = page;\r\n  } else {\r\n    module.exports = page;\r\n  }\r\n\r\n})();"
  },
  {
    "path": "servers/www/assets/js/vendor/postmessage.js",
    "content": "/**\r\n The MIT License\r\n\r\n Copyright (c) 2010 Daniel Park (http://metaweb.com, http://postmessage.freebaseapps.com)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in\r\n all copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n THE SOFTWARE.\r\n **/\r\nvar NO_JQUERY = {};\r\n(function(window, $, undefined) {\r\n\r\n     if (!(\"console\" in window)) {\r\n         var c = window.console = {};\r\n         c.log = c.warn = c.error = c.debug = function(){};\r\n     }\r\n\r\n     if ($ === NO_JQUERY) {\r\n         // jQuery is optional\r\n         $ = {\r\n             fn: {},\r\n             extend: function() {\r\n                 var a = arguments[0];\r\n                 for (var i=1,len=arguments.length; i<len; i++) {\r\n                     var b = arguments[i];\r\n                     for (var prop in b) {\r\n                         a[prop] = b[prop];\r\n                     }\r\n                 }\r\n                 return a;\r\n             }\r\n         };\r\n     }\r\n\r\n     $.fn.pm = function() {\r\n         console.log(\"usage: \\nto send:    $.pm(options)\\nto receive: $.pm.bind(type, fn, [origin])\");\r\n         return this;\r\n     };\r\n\r\n     // send postmessage\r\n     $.pm = window.pm = function(options) {\r\n         pm.send(options);\r\n     };\r\n\r\n     // bind postmessage handler\r\n     $.pm.bind = window.pm.bind = function(type, fn, origin, hash, async_reply) {\r\n         pm.bind(type, fn, origin, hash, async_reply === true);\r\n     };\r\n\r\n     // unbind postmessage handler\r\n     $.pm.unbind = window.pm.unbind = function(type, fn) {\r\n         pm.unbind(type, fn);\r\n     };\r\n\r\n     // default postmessage origin on bind\r\n     $.pm.origin = window.pm.origin = null;\r\n\r\n     // default postmessage polling if using location hash to pass postmessages\r\n     $.pm.poll = window.pm.poll = 200;\r\n\r\n     var pm = {\r\n\r\n         send: function(options) {\r\n             var o = $.extend({}, pm.defaults, options),\r\n             target = o.target;\r\n             if (!o.target) {\r\n                 console.warn(\"postmessage target window required\");\r\n                 return;\r\n             }\r\n             if (!o.type) {\r\n                 console.warn(\"postmessage type required\");\r\n                 return;\r\n             }\r\n             var msg = {data:o.data, type:o.type};\r\n             if (o.success) {\r\n                 msg.callback = pm._callback(o.success);\r\n             }\r\n             if (o.error) {\r\n                 msg.errback = pm._callback(o.error);\r\n             }\r\n             if ((\"postMessage\" in target) && !o.hash) {\r\n                 pm._bind();\r\n                 target.postMessage(JSON.stringify(msg), o.origin || '*');\r\n             }\r\n             else {\r\n                 pm.hash._bind();\r\n                 pm.hash.send(o, msg);\r\n             }\r\n         },\r\n\r\n         bind: function(type, fn, origin, hash, async_reply) {\r\n           pm._replyBind ( type, fn, origin, hash, async_reply );\r\n         },\r\n       \r\n         _replyBind: function(type, fn, origin, hash, isCallback) {\r\n           if ((\"postMessage\" in window) && !hash) {\r\n               pm._bind();\r\n           }\r\n           else {\r\n               pm.hash._bind();\r\n           }\r\n           var l = pm.data(\"listeners.postmessage\");\r\n           if (!l) {\r\n               l = {};\r\n               pm.data(\"listeners.postmessage\", l);\r\n           }\r\n           var fns = l[type];\r\n           if (!fns) {\r\n               fns = [];\r\n               l[type] = fns;\r\n           }\r\n           fns.push({fn:fn, callback: isCallback, origin:origin || $.pm.origin});\r\n         },\r\n\r\n         unbind: function(type, fn) {\r\n             var l = pm.data(\"listeners.postmessage\");\r\n             if (l) {\r\n                 if (type) {\r\n                     if (fn) {\r\n                         // remove specific listener\r\n                         var fns = l[type];\r\n                         if (fns) {\r\n                             var m = [];\r\n                             for (var i=0,len=fns.length; i<len; i++) {\r\n                                 var o = fns[i];\r\n                                 if (o.fn !== fn) {\r\n                                     m.push(o);\r\n                                 }\r\n                             }\r\n                             l[type] = m;\r\n                         }\r\n                     }\r\n                     else {\r\n                         // remove all listeners by type\r\n                         delete l[type];\r\n                     }\r\n                 }\r\n                 else {\r\n                     // unbind all listeners of all type\r\n                     for (var i in l) {\r\n                       delete l[i];\r\n                     }\r\n                 }\r\n             }\r\n         },\r\n\r\n         data: function(k, v) {\r\n             if (v === undefined) {\r\n                 return pm._data[k];\r\n             }\r\n             pm._data[k] = v;\r\n             return v;\r\n         },\r\n\r\n         _data: {},\r\n\r\n         _CHARS: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''),\r\n\r\n         _random: function() {\r\n             var r = [];\r\n             for (var i=0; i<32; i++) {\r\n                 r[i] = pm._CHARS[0 | Math.random() * 32];\r\n             };\r\n             return r.join(\"\");\r\n         },\r\n\r\n         _callback: function(fn) {\r\n             var cbs = pm.data(\"callbacks.postmessage\");\r\n             if (!cbs) {\r\n                 cbs = {};\r\n                 pm.data(\"callbacks.postmessage\", cbs);\r\n             }\r\n             var r = pm._random();\r\n             cbs[r] = fn;\r\n             return r;\r\n         },\r\n\r\n         _bind: function() {\r\n             // are we already listening to message events on this w?\r\n             if (!pm.data(\"listening.postmessage\")) {\r\n                 if (window.addEventListener) {\r\n                     window.addEventListener(\"message\", pm._dispatch, false);\r\n                 }\r\n                 else if (window.attachEvent) {\r\n                     window.attachEvent(\"onmessage\", pm._dispatch);\r\n                 }\r\n                 pm.data(\"listening.postmessage\", 1);\r\n             }\r\n         },\r\n\r\n         _dispatch: function(e) {\r\n             //console.log(\"$.pm.dispatch\", e, this);\r\n             try {\r\n                 var msg = JSON.parse(e.data);\r\n             }\r\n             catch (ex) {\r\n                 //console.warn(\"postmessage data invalid json: \", ex);\r\n                 return;\r\n             }\r\n             if (!msg.type) {\r\n                 //console.warn(\"postmessage message type required\");\r\n                 return;\r\n             }\r\n             var cbs = pm.data(\"callbacks.postmessage\") || {},\r\n             cb = cbs[msg.type];\r\n             if (cb) {\r\n                 cb(msg.data);\r\n             }\r\n             else {\r\n                 var l = pm.data(\"listeners.postmessage\") || {};\r\n                 var fns = l[msg.type] || [];\r\n                 for (var i=0,len=fns.length; i<len; i++) {\r\n                     var o = fns[i];\r\n                     if (o.origin && o.origin !== '*' && e.origin !== o.origin) {\r\n                         console.warn(\"postmessage message origin mismatch\", e.origin, o.origin);\r\n                         if (msg.errback) {\r\n                             // notify post message errback\r\n                             var error = {\r\n                                 message: \"postmessage origin mismatch\",\r\n                                 origin: [e.origin, o.origin]\r\n                             };\r\n                             pm.send({target:e.source, data:error, type:msg.errback});\r\n                         }\r\n                         continue;\r\n                     }\r\n\r\n                     function sendReply ( data ) {\r\n                       if (msg.callback) {\r\n                           pm.send({target:e.source, data:data, type:msg.callback});\r\n                       }\r\n                     }\r\n                     \r\n                     try {\r\n                         if ( o.callback ) {\r\n                           o.fn(msg.data, sendReply, e);\r\n                         } else {\r\n                           sendReply ( o.fn(msg.data, e) );\r\n                         }\r\n                     }\r\n                     catch (ex) {\r\n                         if (msg.errback) {\r\n                             // notify post message errback\r\n                             pm.send({target:e.source, data:ex, type:msg.errback});\r\n                         } else {\r\n                             throw ex;\r\n                         }\r\n                     }\r\n                 };\r\n             }\r\n         }\r\n     };\r\n\r\n     // location hash polling\r\n     pm.hash = {\r\n\r\n         send: function(options, msg) {\r\n             //console.log(\"hash.send\", target_window, options, msg);\r\n             var target_window = options.target,\r\n             target_url = options.url;\r\n             if (!target_url) {\r\n                 console.warn(\"postmessage target window url is required\");\r\n                 return;\r\n             }\r\n             target_url = pm.hash._url(target_url);\r\n             var source_window,\r\n             source_url = pm.hash._url(window.location.href);\r\n             if (window == target_window.parent) {\r\n                 source_window = \"parent\";\r\n             }\r\n             else {\r\n                 try {\r\n                     for (var i=0,len=parent.frames.length; i<len; i++) {\r\n                         var f = parent.frames[i];\r\n                         if (f == window) {\r\n                             source_window = i;\r\n                             break;\r\n                         }\r\n                     };\r\n                 }\r\n                 catch(ex) {\r\n                     // Opera: security error trying to access parent.frames x-origin\r\n                     // juse use window.name\r\n                     source_window = window.name;\r\n                 }\r\n             }\r\n             if (source_window == null) {\r\n                 console.warn(\"postmessage windows must be direct parent/child windows and the child must be available through the parent window.frames list\");\r\n                 return;\r\n             }\r\n             var hashmessage = {\r\n                 \"x-requested-with\": \"postmessage\",\r\n                 source: {\r\n                     name: source_window,\r\n                     url: source_url\r\n                 },\r\n                 postmessage: msg\r\n             };\r\n             var hash_id = \"#x-postmessage-id=\" + pm._random();\r\n             target_window.location = target_url + hash_id + encodeURIComponent(JSON.stringify(hashmessage));\r\n         },\r\n\r\n         _regex: /^\\#x\\-postmessage\\-id\\=(\\w{32})/,\r\n\r\n         _regex_len: \"#x-postmessage-id=\".length + 32,\r\n\r\n         _bind: function() {\r\n             // are we already listening to message events on this w?\r\n             if (!pm.data(\"polling.postmessage\")) {\r\n                 setInterval(function() {\r\n                                 var hash = \"\" + window.location.hash,\r\n                                 m = pm.hash._regex.exec(hash);\r\n                                 if (m) {\r\n                                     var id = m[1];\r\n                                     if (pm.hash._last !== id) {\r\n                                         pm.hash._last = id;\r\n                                         pm.hash._dispatch(hash.substring(pm.hash._regex_len));\r\n                                     }\r\n                                 }\r\n                             }, $.pm.poll || 200);\r\n                 pm.data(\"polling.postmessage\", 1);\r\n             }\r\n         },\r\n\r\n         _dispatch: function(hash) {\r\n             if (!hash) {\r\n                 return;\r\n             }\r\n             try {\r\n                 hash = JSON.parse(decodeURIComponent(hash));\r\n                 if (!(hash['x-requested-with'] === 'postmessage' &&\r\n                       hash.source && hash.source.name != null && hash.source.url && hash.postmessage)) {\r\n                     // ignore since hash could've come from somewhere else\r\n                     return;\r\n                 }\r\n             }\r\n             catch (ex) {\r\n                 // ignore since hash could've come from somewhere else\r\n                 return;\r\n             }\r\n             var msg = hash.postmessage,\r\n             cbs = pm.data(\"callbacks.postmessage\") || {},\r\n             cb = cbs[msg.type];\r\n             if (cb) {\r\n                 cb(msg.data);\r\n             }\r\n             else {\r\n                 var source_window;\r\n                 if (hash.source.name === \"parent\") {\r\n                     source_window = window.parent;\r\n                 }\r\n                 else {\r\n                     source_window = window.frames[hash.source.name];\r\n                 }\r\n                 var l = pm.data(\"listeners.postmessage\") || {};\r\n                 var fns = l[msg.type] || [];\r\n                 for (var i=0,len=fns.length; i<len; i++) {\r\n                     var o = fns[i];\r\n                     if (o.origin) {\r\n                         var origin = /https?\\:\\/\\/[^\\/]*/.exec(hash.source.url)[0];\r\n                         if (o.origin !== '*' && origin !== o.origin) {\r\n                             console.warn(\"postmessage message origin mismatch\", origin, o.origin);\r\n                             if (msg.errback) {\r\n                                 // notify post message errback\r\n                                 var error = {\r\n                                     message: \"postmessage origin mismatch\",\r\n                                     origin: [origin, o.origin]\r\n                                 };\r\n                                 pm.send({target:source_window, data:error, type:msg.errback, hash:true, url:hash.source.url});\r\n                             }\r\n                             continue;\r\n                         }\r\n                     }\r\n\r\n                     function sendReply ( data ) {\r\n                       if (msg.callback) {\r\n                         pm.send({target:source_window, data:data, type:msg.callback, hash:true, url:hash.source.url});\r\n                       }\r\n                     }\r\n                     \r\n                     try {\r\n                         if ( o.callback ) {\r\n                           o.fn(msg.data, sendReply);\r\n                         } else {\r\n                           sendReply ( o.fn(msg.data) );\r\n                         }\r\n                     }\r\n                     catch (ex) {\r\n                         if (msg.errback) {\r\n                             // notify post message errback\r\n                             pm.send({target:source_window, data:ex, type:msg.errback, hash:true, url:hash.source.url});\r\n                         } else {\r\n                             throw ex;\r\n                         }\r\n                     }\r\n                 };\r\n             }\r\n         },\r\n\r\n         _url: function(url) {\r\n             // url minus hash part\r\n             return (\"\"+url).replace(/#.*$/, \"\");\r\n         }\r\n\r\n     };\r\n\r\n     $.extend(pm, {\r\n                  defaults: {\r\n                      target: null,  /* target window (required) */\r\n                      url: null,     /* target window url (required if no window.postMessage or hash == true) */\r\n                      type: null,    /* message type (required) */\r\n                      data: null,    /* message data (required) */\r\n                      success: null, /* success callback (optional) */\r\n                      error: null,   /* error callback (optional) */\r\n                      origin: \"*\",   /* postmessage origin (optional) */\r\n                      hash: false    /* use location hash for message passing (optional) */\r\n                  }\r\n              });\r\n\r\n })(this, typeof jQuery === \"undefined\" ? NO_JQUERY : jQuery);\r\n\r\n/**\r\n * http://www.JSON.org/json2.js\r\n **/\r\nif (! (\"JSON\" in window && window.JSON)){JSON={}}(function(){function f(n){return n<10?\"0\"+n:n}if(typeof Date.prototype.toJSON!==\"function\"){Date.prototype.toJSON=function(key){return this.getUTCFullYear()+\"-\"+f(this.getUTCMonth()+1)+\"-\"+f(this.getUTCDate())+\"T\"+f(this.getUTCHours())+\":\"+f(this.getUTCMinutes())+\":\"+f(this.getUTCSeconds())+\"Z\"};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,escapable=/[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,gap,indent,meta={\"\\b\":\"\\\\b\",\"\\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\f\":\"\\\\f\",\"\\r\":\"\\\\r\",'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'\"'+string.replace(escapable,function(a){var c=meta[a];return typeof c===\"string\"?c:\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})+'\"':'\"'+string+'\"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value===\"object\"&&typeof value.toJSON===\"function\"){value=value.toJSON(key)}if(typeof rep===\"function\"){value=rep.call(holder,key,value)}switch(typeof value){case\"string\":return quote(value);case\"number\":return isFinite(value)?String(value):\"null\";case\"boolean\":case\"null\":return String(value);case\"object\":if(!value){return\"null\"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)===\"[object Array]\"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||\"null\"}v=partial.length===0?\"[]\":gap?\"[\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"]\":\"[\"+partial.join(\",\")+\"]\";gap=mind;return v}if(rep&&typeof rep===\"object\"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k===\"string\"){v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}v=partial.length===0?\"{}\":gap?\"{\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"}\":\"{\"+partial.join(\",\")+\"}\";gap=mind;return v}}if(typeof JSON.stringify!==\"function\"){JSON.stringify=function(value,replacer,space){var i;gap=\"\";indent=\"\";if(typeof space===\"number\"){for(i=0;i<space;i+=1){indent+=\" \"}}else{if(typeof space===\"string\"){indent=space}}rep=replacer;if(replacer&&typeof replacer!==\"function\"&&(typeof replacer!==\"object\"||typeof replacer.length!==\"number\")){throw new Error(\"JSON.stringify\")}return str(\"\",{\"\":value})}}if(typeof JSON.parse!==\"function\"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value===\"object\"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\\],:{}\\s]*$/.test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\"))){j=eval(\"(\"+text+\")\");return typeof reviver===\"function\"?walk({\"\":j},\"\"):j}throw new SyntaxError(\"JSON.parse\")}}}());"
  },
  {
    "path": "servers/www/assets/js/vendor/prettify.js",
    "content": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\r\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:\"0\"<=b&&b<=\"7\"?parseInt(a.substring(1),8):b===\"u\"||b===\"x\"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?\"\\\\x0\":\"\\\\x\")+a.toString(16);a=String.fromCharCode(a);if(a===\"\\\\\"||a===\"-\"||a===\"[\"||a===\"]\")a=\"\\\\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\S\\s]|[^\\\\]/g),a=\r\n[],b=[],o=f[0]===\"^\",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&\"-\"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=[\"[\"];o&&b.push(\"^\");b.push.apply(b,a);for(c=0;c<\r\nf.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push(\"-\"),b.push(e(i[1])));b.push(\"]\");return b.join(\"\")}function y(a){for(var f=a.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j===\"(\"?++i:\"\\\\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j===\"(\"?(++i,d[i]===void 0&&(f[c]=\"(?:\")):\"\\\\\"===j.charAt(0)&&\r\n(j=+j.substring(1))&&j<=i&&(f[c]=\"\\\\\"+d[i]);for(i=c=0;c<b;++c)\"^\"===f[c]&&\"^\"!==f[c+1]&&(f[c]=\"\");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a===\"[\"?f[c]=h(j):a!==\"\\\\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return f.join(\"\")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\\\u[\\da-f]{4}|\\\\x[\\da-f]{2}|\\\\[^UXux]/gi,\"\"))){s=!0;l=!1;break}}for(var r=\r\n{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(\"\"+g);n.push(\"(?:\"+y(g)+\")\")}return RegExp(n.join(\"|\"),l?\"gi\":\"g\")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if(\"BR\"===g||\"LI\"===g)h[s]=\"\\n\",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\\r\\n?/g,\"\\n\"):g.replace(/[\\t\\n\\r ]+/g,\" \"),h[s]=g,t[s<<1]=y,y+=g.length,\r\nt[s++<<1|1]=a)}}var e=/(?:^|\\s)nocode(?:\\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);m(a);return{a:h.join(\"\").replace(/\\n$/,\"\"),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,\"pln\"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===\r\n\"string\")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b=\"pln\")}if((c=b.length>=5&&\"lang-\"===b.substring(0,5))&&!(o&&typeof o[1]===\"string\"))c=!1,b=\"src\";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),\r\nl=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=\"\"+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\\S\\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push([\"str\",/^(?:'''(?:[^'\\\\]|\\\\[\\S\\s]|''?(?=[^']))*(?:'''|$)|\"\"\"(?:[^\"\\\\]|\\\\[\\S\\s]|\"\"?(?=[^\"]))*(?:\"\"\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$))/,q,\"'\\\"\"]):a.multiLineStrings?m.push([\"str\",/^(?:'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,\r\nq,\"'\\\"`\"]):m.push([\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*(?:'|$)|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,q,\"\\\"'\"]);a.verbatimStrings&&e.push([\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,\"#\"]):m.push([\"com\",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,q,\"#\"]),e.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,q])):m.push([\"com\",/^#[^\\n\\r]*/,\r\nq,\"#\"]));a.cStyleComments&&(e.push([\"com\",/^\\/\\/[^\\n\\r]*/,q]),e.push([\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,q]));a.regexLiterals&&e.push([\"lang-regex\",/^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)/]);(h=a.types)&&e.push([\"typ\",h]);a=(\"\"+a.keywords).replace(/^ | $/g,\r\n\"\");a.length&&e.push([\"kwd\",RegExp(\"^(?:\"+a.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),q]);m.push([\"pln\",/^\\s+/,q,\" \\r\\n\\t\\xa0\"]);e.push([\"lit\",/^@[$_a-z][\\w$@]*/i,q],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,q],[\"pln\",/^[$_a-z][\\w$@]*/i,q],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,q,\"0123456789\"],[\"pln\",/^\\\\[\\S\\s]?/,q],[\"pun\",/^.[^\\s\\w\"-$'./@\\\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if(\"BR\"===a.nodeName)h(a),\r\na.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}\r\nfor(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\\s)nocode(?:\\s|$)/,t=/\\r\\n?|\\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);for(l=s.createElement(\"LI\");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute(\"value\",\r\nm);var r=s.createElement(\"OL\");r.className=\"linenums\";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className=\"L\"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode(\"\\xa0\")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn(\"cannot override language handler %s\",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\\s*</.test(m)?\"default-markup\":\"default-code\";return A[a]}function E(a){var m=\r\na.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\\bMSIE\\b/.test(navigator.userAgent),m=/\\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,\"\\r\"));i.nodeValue=\r\nj;var u=i.ownerDocument,v=u.createElement(\"SPAN\");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){\"console\"in window&&console.log(w&&w.stack?w.stack:w)}}var v=[\"break,continue,do,else,for,if,return,while\"],w=[[v,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\r\n\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],F=[w,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],G=[w,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"],\r\nH=[G,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"],w=[w,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"],I=[v,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],\r\nJ=[v,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],v=[v,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/,N=/\\S/,O=u({keywords:[F,H,w,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\"+\r\nI,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,[\"default-code\"]);k(x([],[[\"pln\",/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],[\"lang-\",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\S\\s]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),\r\n[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);k(x([[\"pln\",/^\\s+/,q,\" \\t\\r\\n\"],[\"atv\",/^(?:\"[^\"]*\"?|'[^']*'?)/,q,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^\\s\"'>]*(?:[^\\s\"'/>]|\\/(?=\\s)))/],[\"pun\",/^[/<->]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\"([^\"]+)\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*'([^']+)'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\s\"'>]+)/i],[\"lang-css\",/^style\\s*=\\s*\"([^\"]+)\"/i],[\"lang-css\",/^style\\s*=\\s*'([^']+)'/i],[\"lang-css\",\r\n/^style\\s*=\\s*([^\\s\"'>]+)/i]]),[\"in.tag\"]);k(x([],[[\"atv\",/^[\\S\\s]+/]]),[\"uq.val\"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);k(u({keywords:\"null,true,false\"}),[\"json\"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),[\"cs\"]);k(u({keywords:G,cStyleComments:!0}),[\"java\"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),[\"bsh\",\"csh\",\"sh\"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),\r\n[\"cv\",\"py\"]);k(u({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"perl\",\"pl\",\"pm\"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),[\"js\"]);k(u({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\",\r\nhashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]);k(x([],[[\"str\",/^[\\S\\s]+/]]),[\"regex\"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement(\"PRE\");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf(\"prettyprint\")>=0){var k=k.match(g),f,b;if(b=\r\n!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&\"CODE\"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName===\"pre\"||o.tagName===\"code\"||o.tagName===\"xmp\")&&o.className&&o.className.indexOf(\"prettyprint\")>=0){b=!0;break}b||((b=(b=n.className.match(/\\blinenums\\b(?::(\\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,\r\n250):a&&a()}for(var e=[document.getElementsByTagName(\"pre\"),document.getElementsByTagName(\"code\"),document.getElementsByTagName(\"xmp\")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",\r\nPR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\"}})();"
  },
  {
    "path": "servers/www/assets/js/vendor/semver.js",
    "content": ";(function (exports) { // nothing in here is node-specific.\n\n// See http://semver.org/\n// This implementation is a *hair* less strict in that it allows\n// v1.2.3 things, and also tags that don't begin with a char.\n\nvar semver = \"\\\\s*[v=]*\\\\s*([0-9]+)\"        // major\n           + \"\\\\.([0-9]+)\"                  // minor\n           + \"\\\\.([0-9]+)\"                  // patch\n           + \"(-[0-9]+-?)?\"                 // build\n           + \"([a-zA-Z-+][a-zA-Z0-9-\\.:]*)?\" // tag\n  , exprComparator = \"^((<|>)?=?)\\s*(\"+semver+\")$|^$\"\n  , xRangePlain = \"[v=]*([0-9]+|x|X|\\\\*)\"\n                + \"(?:\\\\.([0-9]+|x|X|\\\\*)\"\n                + \"(?:\\\\.([0-9]+|x|X|\\\\*)\"\n                + \"([a-zA-Z-][a-zA-Z0-9-\\.:]*)?)?)?\"\n  , xRange = \"((?:<|>)=?)?\\\\s*\" + xRangePlain\n  , exprSpermy = \"(?:~>?)\"+xRange\n  , expressions = exports.expressions =\n    { parse : new RegExp(\"^\\\\s*\"+semver+\"\\\\s*$\")\n    , parsePackage : new RegExp(\"^\\\\s*([^\\/]+)[-@](\" +semver+\")\\\\s*$\")\n    , parseRange : new RegExp(\n        \"^\\\\s*(\" + semver + \")\\\\s+-\\\\s+(\" + semver + \")\\\\s*$\")\n    , validComparator : new RegExp(\"^\"+exprComparator+\"$\")\n    , parseXRange : new RegExp(\"^\"+xRange+\"$\")\n    , parseSpermy : new RegExp(\"^\"+exprSpermy+\"$\")\n    }\n\n\nObject.getOwnPropertyNames(expressions).forEach(function (i) {\n  exports[i] = function (str) {\n    return (\"\" + (str || \"\")).match(expressions[i])\n  }\n})\n\nexports.rangeReplace = \">=$1 <=$7\"\nexports.clean = clean\nexports.compare = compare\nexports.rcompare = rcompare\nexports.satisfies = satisfies\nexports.gt = gt\nexports.gte = gte\nexports.lt = lt\nexports.lte = lte\nexports.eq = eq\nexports.neq = neq\nexports.cmp = cmp\nexports.inc = inc\n\nexports.valid = valid\nexports.validPackage = validPackage\nexports.validRange = validRange\nexports.maxSatisfying = maxSatisfying\n\nexports.replaceStars = replaceStars\nexports.toComparators = toComparators\n\nfunction stringify (version) {\n  var v = version\n  return [v[1]||'', v[2]||'', v[3]||''].join(\".\") + (v[4]||'') + (v[5]||'')\n}\n\nfunction clean (version) {\n  version = exports.parse(version)\n  if (!version) return version\n  return stringify(version)\n}\n\nfunction valid (version) {\n  if (typeof version !== \"string\") return null\n  return exports.parse(version) && version.trim().replace(/^[v=]+/, '')\n}\n\nfunction validPackage (version) {\n  if (typeof version !== \"string\") return null\n  return version.match(expressions.parsePackage) && version.trim()\n}\n\n// range can be one of:\n// \"1.0.3 - 2.0.0\" range, inclusive, like \">=1.0.3 <=2.0.0\"\n// \">1.0.2\" like 1.0.3 - 9999.9999.9999\n// \">=1.0.2\" like 1.0.2 - 9999.9999.9999\n// \"<2.0.0\" like 0.0.0 - 1.9999.9999\n// \">1.0.2 <2.0.0\" like 1.0.3 - 1.9999.9999\nvar starExpression = /(<|>)?=?\\s*\\*/g\n  , starReplace = \"\"\n  , compTrimExpression = new RegExp(\"((<|>)?=?)\\\\s*(\"\n                                    +semver+\"|\"+xRangePlain+\")\", \"g\")\n  , compTrimReplace = \"$1$3\"\n\nfunction toComparators (range) {\n  var ret = (range || \"\").trim()\n    .replace(expressions.parseRange, exports.rangeReplace)\n    .replace(compTrimExpression, compTrimReplace)\n    .split(/\\s+/)\n    .join(\" \")\n    .split(\"||\")\n    .map(function (orchunk) {\n      return orchunk\n        .split(\" \")\n        .map(replaceXRanges)\n        .map(replaceSpermies)\n        .map(replaceStars)\n        .join(\" \").trim()\n    })\n    .map(function (orchunk) {\n      return orchunk\n        .trim()\n        .split(/\\s+/)\n        .filter(function (c) { return c.match(expressions.validComparator) })\n    })\n    .filter(function (c) { return c.length })\n  return ret\n}\n\nfunction replaceStars (stars) {\n  return stars.trim().replace(starExpression, starReplace)\n}\n\n// \"2.x\",\"2.x.x\" --> \">=2.0.0- <2.1.0-\"\n// \"2.3.x\" --> \">=2.3.0- <2.4.0-\"\nfunction replaceXRanges (ranges) {\n  return ranges.split(/\\s+/)\n               .map(replaceXRange)\n               .join(\" \")\n}\n\nfunction replaceXRange (version) {\n  return version.trim().replace(expressions.parseXRange,\n                                function (v, gtlt, M, m, p, t) {\n    var anyX = !M || M.toLowerCase() === \"x\" || M === \"*\"\n               || !m || m.toLowerCase() === \"x\" || m === \"*\"\n               || !p || p.toLowerCase() === \"x\" || p === \"*\"\n      , ret = v\n\n    if (gtlt && anyX) {\n      // just replace x'es with zeroes\n      ;(!M || M === \"*\" || M.toLowerCase() === \"x\") && (M = 0)\n      ;(!m || m === \"*\" || m.toLowerCase() === \"x\") && (m = 0)\n      ;(!p || p === \"*\" || p.toLowerCase() === \"x\") && (p = 0)\n      ret = gtlt + M+\".\"+m+\".\"+p+\"-\"\n    } else if (!M || M === \"*\" || M.toLowerCase() === \"x\") {\n      ret = \"*\" // allow any\n    } else if (!m || m === \"*\" || m.toLowerCase() === \"x\") {\n      // append \"-\" onto the version, otherwise\n      // \"1.x.x\" matches \"2.0.0beta\", since the tag\n      // *lowers* the version value\n      ret = \">=\"+M+\".0.0- <\"+(+M+1)+\".0.0-\"\n    } else if (!p || p === \"*\" || p.toLowerCase() === \"x\") {\n      ret = \">=\"+M+\".\"+m+\".0- <\"+M+\".\"+(+m+1)+\".0-\"\n    }\n    //console.error(\"parseXRange\", [].slice.call(arguments), ret)\n    return ret\n  })\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceSpermies (version) {\n  return version.trim().replace(expressions.parseSpermy,\n                                function (v, gtlt, M, m, p, t) {\n    if (gtlt) throw new Error(\n      \"Using '\"+gtlt+\"' with ~ makes no sense. Don't do it.\")\n\n    if (!M || M.toLowerCase() === \"x\") {\n      return \"\"\n    }\n    // ~1 == >=1.0.0- <2.0.0-\n    if (!m || m.toLowerCase() === \"x\") {\n      return \">=\"+M+\".0.0- <\"+(+M+1)+\".0.0-\"\n    }\n    // ~1.2 == >=1.2.0- <1.3.0-\n    if (!p || p.toLowerCase() === \"x\") {\n      return \">=\"+M+\".\"+m+\".0- <\"+M+\".\"+(+m+1)+\".0-\"\n    }\n    // ~1.2.3 == >=1.2.3- <1.3.0-\n    t = t || \"-\"\n    return \">=\"+M+\".\"+m+\".\"+p+t+\" <\"+M+\".\"+(+m+1)+\".0-\"\n  })\n}\n\nfunction validRange (range) {\n  range = replaceStars(range)\n  var c = toComparators(range)\n  return (c.length === 0)\n       ? null\n       : c.map(function (c) { return c.join(\" \") }).join(\"||\")\n}\n\n// returns the highest satisfying version in the list, or undefined\nfunction maxSatisfying (versions, range) {\n  return versions\n    .filter(function (v) { return satisfies(v, range) })\n    .sort(compare)\n    .pop()\n}\nfunction satisfies (version, range) {\n  version = valid(version)\n  if (!version) return false\n  range = toComparators(range)\n  for (var i = 0, l = range.length ; i < l ; i ++) {\n    var ok = false\n    for (var j = 0, ll = range[i].length ; j < ll ; j ++) {\n      var r = range[i][j]\n        , gtlt = r.charAt(0) === \">\" ? gt\n               : r.charAt(0) === \"<\" ? lt\n               : false\n        , eq = r.charAt(!!gtlt) === \"=\"\n        , sub = (!!eq) + (!!gtlt)\n      if (!gtlt) eq = true\n      r = r.substr(sub)\n      r = (r === \"\") ? r : valid(r)\n      ok = (r === \"\") || (eq && r === version) || (gtlt && gtlt(version, r))\n      if (!ok) break\n    }\n    if (ok) return true\n  }\n  return false\n}\n\n// return v1 > v2 ? 1 : -1\nfunction compare (v1, v2) {\n  var g = gt(v1, v2)\n  return g === null ? 0 : g ? 1 : -1\n}\n\nfunction rcompare (v1, v2) {\n  return compare(v2, v1)\n}\n\nfunction lt (v1, v2) { return gt(v2, v1) }\nfunction gte (v1, v2) { return !lt(v1, v2) }\nfunction lte (v1, v2) { return !gt(v1, v2) }\nfunction eq (v1, v2) { return gt(v1, v2) === null }\nfunction neq (v1, v2) { return gt(v1, v2) !== null }\nfunction cmp (v1, c, v2) {\n  switch (c) {\n    case \">\": return gt(v1, v2)\n    case \"<\": return lt(v1, v2)\n    case \">=\": return gte(v1, v2)\n    case \"<=\": return lte(v1, v2)\n    case \"==\": return eq(v1, v2)\n    case \"!=\": return neq(v1, v2)\n    case \"===\": return v1 === v2\n    case \"!==\": return v1 !== v2\n    default: throw new Error(\"Y U NO USE VALID COMPARATOR!? \"+c)\n  }\n}\n\n// return v1 > v2\nfunction num (v) {\n  return v === undefined ? -1 : parseInt((v||\"0\").replace(/[^0-9]+/g, ''), 10)\n}\nfunction gt (v1, v2) {\n  v1 = exports.parse(v1)\n  v2 = exports.parse(v2)\n  if (!v1 || !v2) return false\n\n  for (var i = 1; i < 5; i ++) {\n    v1[i] = num(v1[i])\n    v2[i] = num(v2[i])\n    if (v1[i] > v2[i]) return true\n    else if (v1[i] !== v2[i]) return false\n  }\n  // no tag is > than any tag, or use lexicographical order.\n  var tag1 = v1[5] || \"\"\n    , tag2 = v2[5] || \"\"\n\n  // kludge: null means they were equal.  falsey, and detectable.\n  // embarrassingly overclever, though, I know.\n  return tag1 === tag2 ? null\n         : !tag1 ? true\n         : !tag2 ? false\n         : tag1 > tag2\n}\n\nfunction inc (version, release) {\n  version = exports.parse(version)\n  if (!version) return null\n\n  var parsedIndexLookup =\n    { 'major': 1\n    , 'minor': 2\n    , 'patch': 3\n    , 'build': 4 }\n  var incIndex = parsedIndexLookup[release]\n  if (incIndex === undefined) return null\n\n  var current = num(version[incIndex])\n  version[incIndex] = current === -1 ? 1 : current + 1\n\n  for (var i = incIndex + 1; i < 5; i ++) {\n    if (num(version[i]) !== -1) version[i] = \"0\"\n  }\n\n  if (version[4]) version[4] = \"-\" + version[4]\n  version[5] = \"\"\n\n  return stringify(version)\n}\n})(typeof exports === \"object\" ? exports : semver = {})"
  },
  {
    "path": "servers/www/assets/js/vendor/showdown.js",
    "content": "//\r\n// showdown.js -- A javascript port of Markdown.\r\n//\r\n// Copyright (c) 2007 John Fraser.\r\n//\r\n// Original Markdown Copyright (c) 2004-2005 John Gruber\r\n//   <http://daringfireball.net/projects/markdown/>\r\n//\r\n// Redistributable under a BSD-style open source license.\r\n// See license.txt for more information.\r\n//\r\n// The full source distribution is at:\r\n//\r\n//  \t\t\tA A L\r\n//\t\t\t\tT C A\r\n//\t\t\t\tT K B\r\n//\r\n//   <http://www.attacklab.net/>\r\n//\r\n\r\n//\r\n// Wherever possible, Showdown is a straight, line-by-line port\r\n// of the Perl version of Markdown.\r\n//\r\n// This is not a normal parser design; it's basically just a\r\n// series of string substitutions.  It's hard to read and\r\n// maintain this way,  but keeping Showdown close to the original\r\n// design makes it easier to port new features.\r\n//\r\n// More importantly, Showdown behaves like markdown.pl in most\r\n// edge cases.  So web applications can do client-side preview\r\n// in Javascript, and then build identical HTML on the server.\r\n//\r\n// This port needs the new RegExp functionality of ECMA 262,\r\n// 3rd Edition (i.e. Javascript 1.5).  Most modern web browsers\r\n// should do fine.  Even with the new regular expression features,\r\n// We do a lot of work to emulate Perl's regex functionality.\r\n// The tricky changes in this file mostly have the \"attacklab:\"\r\n// label.  Major or self-explanatory changes don't.\r\n//\r\n// Smart diff tools like Araxis Merge will be able to match up\r\n// this file with markdown.pl in a useful way.  A little tweaking\r\n// helps: in a copy of markdown.pl, replace \"#\" with \"//\" and\r\n// replace \"$text\" with \"text\".  Be sure to ignore whitespace\r\n// and line endings.\r\n//\r\n\r\n\r\n//\r\n// Showdown usage:\r\n//\r\n//   var text = \"Markdown *rocks*.\";\r\n//\r\n//   var converter = new Showdown.converter();\r\n//   var html = converter.makeHtml(text);\r\n//\r\n//   alert(html);\r\n//\r\n// Note: move the sample code to the bottom of this\r\n// file before uncommenting it.\r\n//\r\n\r\n\r\n//\r\n// Showdown namespace\r\n//\r\nvar Showdown = {};\r\n\r\n//\r\n// converter\r\n//\r\n// Wraps all \"globals\" so that the only thing\r\n// exposed is makeHtml().\r\n//\r\nShowdown.converter = function() {\r\n\r\n//\r\n// Globals:\r\n//\r\n\r\n// Global hashes, used by various utility routines\r\nvar g_urls;\r\nvar g_titles;\r\nvar g_html_blocks;\r\n\r\n// Used to track when we're inside an ordered or unordered list\r\n// (see _ProcessListItems() for details):\r\nvar g_list_level = 0;\r\n\r\n\r\nthis.makeHtml = function(text) {\r\n//\r\n// Main function. The order in which other subs are called here is\r\n// essential. Link and image substitutions need to happen before\r\n// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>\r\n// and <img> tags get encoded.\r\n//\r\n\r\n\t// Clear the global hashes. If we don't clear these, you get conflicts\r\n\t// from other articles when generating a page which contains more than\r\n\t// one article (e.g. an index page that shows the N most recent\r\n\t// articles):\r\n\tg_urls = new Array();\r\n\tg_titles = new Array();\r\n\tg_html_blocks = new Array();\r\n\r\n\t// attacklab: Replace ~ with ~T\r\n\t// This lets us use tilde as an escape char to avoid md5 hashes\r\n\t// The choice of character is arbitray; anything that isn't\r\n    // magic in Markdown will work.\r\n\ttext = text.replace(/~/g,\"~T\");\r\n\r\n\t// attacklab: Replace $ with ~D\r\n\t// RegExp interprets $ as a special character\r\n\t// when it's in a replacement string\r\n\ttext = text.replace(/\\$/g,\"~D\");\r\n\r\n\t// Standardize line endings\r\n\ttext = text.replace(/\\r\\n/g,\"\\n\"); // DOS to Unix\r\n\ttext = text.replace(/\\r/g,\"\\n\"); // Mac to Unix\r\n\r\n\t// Make sure text begins and ends with a couple of newlines:\r\n\ttext = \"\\n\\n\" + text + \"\\n\\n\";\r\n\r\n\t// Convert all tabs to spaces.\r\n\ttext = _Detab(text);\r\n\r\n\t// Strip any lines consisting only of spaces and tabs.\r\n\t// This makes subsequent regexen easier to write, because we can\r\n\t// match consecutive blank lines with /\\n+/ instead of something\r\n\t// contorted like /[ \\t]*\\n+/ .\r\n\ttext = text.replace(/^[ \\t]+$/mg,\"\");\r\n\r\n\t// Handle github codeblocks prior to running HashHTML so that\r\n\t// HTML contained within the codeblock gets escaped propertly\r\n\ttext = _DoGithubCodeBlocks(text);\r\n\r\n\t// Turn block-level HTML blocks into hash entries\r\n\ttext = _HashHTMLBlocks(text);\r\n\r\n\t// Strip link definitions, store in hashes.\r\n\ttext = _StripLinkDefinitions(text);\r\n\r\n\ttext = _RunBlockGamut(text);\r\n\r\n\ttext = _UnescapeSpecialChars(text);\r\n\r\n\t// attacklab: Restore dollar signs\r\n\ttext = text.replace(/~D/g,\"$$\");\r\n\r\n\t// attacklab: Restore tildes\r\n\ttext = text.replace(/~T/g,\"~\");\r\n\r\n\treturn text;\r\n};\r\n\r\n\r\nvar _StripLinkDefinitions = function(text) {\r\n//\r\n// Strips link definitions from text, stores the URLs and titles in\r\n// hash references.\r\n//\r\n\r\n\t// Link defs are in the form: ^[id]: url \"optional title\"\r\n\r\n\t/*\r\n\t\tvar text = text.replace(/\r\n\t\t\t\t^[ ]{0,3}\\[(.+)\\]:  // id = $1  attacklab: g_tab_width - 1\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t  \\n?\t\t\t\t// maybe *one* newline\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t<?(\\S+?)>?\t\t\t// url = $2\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t  \\n?\t\t\t\t// maybe one newline\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t(?:\r\n\t\t\t\t  (\\n*)\t\t\t\t// any lines skipped = $3 attacklab: lookbehind removed\r\n\t\t\t\t  [\"(]\r\n\t\t\t\t  (.+?)\t\t\t\t// title = $4\r\n\t\t\t\t  [\")]\r\n\t\t\t\t  [ \\t]*\r\n\t\t\t\t)?\t\t\t\t\t// title is optional\r\n\t\t\t\t(?:\\n+|$)\r\n\t\t\t  /gm,\r\n\t\t\t  function(){...});\r\n\t*/\r\n\tvar text = text.replace(/^[ ]{0,3}\\[(.+)\\]:[ \\t]*\\n?[ \\t]*<?(\\S+?)>?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"(](.+?)[\")][ \\t]*)?(?:\\n+|\\Z)/gm,\r\n\t\tfunction (wholeMatch,m1,m2,m3,m4) {\r\n\t\t\tm1 = m1.toLowerCase();\r\n\t\t\tg_urls[m1] = _EncodeAmpsAndAngles(m2);  // Link IDs are case-insensitive\r\n\t\t\tif (m3) {\r\n\t\t\t\t// Oops, found blank lines, so it's not a title.\r\n\t\t\t\t// Put back the parenthetical statement we stole.\r\n\t\t\t\treturn m3+m4;\r\n\t\t\t} else if (m4) {\r\n\t\t\t\tg_titles[m1] = m4.replace(/\"/g,\"&quot;\");\r\n\t\t\t}\r\n\r\n\t\t\t// Completely remove the definition from the text\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t);\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _HashHTMLBlocks = function(text) {\r\n\t// attacklab: Double up blank lines to reduce lookaround\r\n\ttext = text.replace(/\\n/g,\"\\n\\n\");\r\n\r\n\t// Hashify HTML blocks:\r\n\t// We only want to do this for block-level HTML tags, such as headers,\r\n\t// lists, and tables. That's because we still want to wrap <p>s around\r\n\t// \"paragraphs\" that are wrapped in non-block-level tags, such as anchors,\r\n\t// phrase emphasis, and spans. The list of tags we're looking for is\r\n\t// hard-coded:\r\n\tvar block_tags_a = \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside\";\r\n\tvar block_tags_b = \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside\";\r\n\r\n\t// First, look for nested blocks, e.g.:\r\n\t//   <div>\r\n\t//     <div>\r\n\t//     tags for inner block must be indented.\r\n\t//     </div>\r\n\t//   </div>\r\n\t//\r\n\t// The outermost tags must start at the left margin for this to match, and\r\n\t// the inner nested divs must be indented.\r\n\t// We need to do this before the next, more liberal match, because the next\r\n\t// match will start at the first `<div>` and stop at the first `</div>`.\r\n\r\n\t// attacklab: This regex can be expensive when it fails.\r\n\t/*\r\n\t\tvar text = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t^\t\t\t\t\t// start of line  (with /m)\r\n\t\t\t<($block_tags_a)\t// start tag = $2\r\n\t\t\t\\b\t\t\t\t\t// word break\r\n\t\t\t\t\t\t\t\t// attacklab: hack around khtml/pcre bug...\r\n\t\t\t[^\\r]*?\\n\t\t\t// any number of lines, minimally matching\r\n\t\t\t</\\2>\t\t\t\t// the matching end tag\r\n\t\t\t[ \\t]*\t\t\t\t// trailing spaces/tabs\r\n\t\t\t(?=\\n+)\t\t\t\t// followed by a newline\r\n\t\t)\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\r\n\t\t/gm,function(){...}};\r\n\t*/\r\n\ttext = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\\b[^\\r]*?\\n<\\/\\2>[ \\t]*(?=\\n+))/gm,hashElement);\r\n\r\n\t//\r\n\t// Now match more liberally, simply from `\\n<tag>` to `</tag>\\n`\r\n\t//\r\n\r\n\t/*\r\n\t\tvar text = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t^\t\t\t\t\t// start of line  (with /m)\r\n\t\t\t<($block_tags_b)\t// start tag = $2\r\n\t\t\t\\b\t\t\t\t\t// word break\r\n\t\t\t\t\t\t\t\t// attacklab: hack around khtml/pcre bug...\r\n\t\t\t[^\\r]*?\t\t\t\t// any number of lines, minimally matching\r\n\t\t\t.*</\\2>\t\t\t\t// the matching end tag\r\n\t\t\t[ \\t]*\t\t\t\t// trailing spaces/tabs\r\n\t\t\t(?=\\n+)\t\t\t\t// followed by a newline\r\n\t\t)\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\r\n\t\t/gm,function(){...}};\r\n\t*/\r\n\ttext = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\\b[^\\r]*?.*<\\/\\2>[ \\t]*(?=\\n+)\\n)/gm,hashElement);\r\n\r\n\t// Special case just for <hr />. It was easier to make a special case than\r\n\t// to make the other regex more complicated.\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t\\n\\n\t\t\t\t// Starting after a blank line\r\n\t\t\t[ ]{0,3}\r\n\t\t\t(<(hr)\t\t\t\t// start tag = $2\r\n\t\t\t\\b\t\t\t\t\t// word break\r\n\t\t\t([^<>])*?\t\t\t//\r\n\t\t\t\\/?>)\t\t\t\t// the matching end tag\r\n\t\t\t[ \\t]*\r\n\t\t\t(?=\\n{2,})\t\t\t// followed by a blank line\r\n\t\t)\r\n\t\t/g,hashElement);\r\n\t*/\r\n\ttext = text.replace(/(\\n[ ]{0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,hashElement);\r\n\r\n\t// Special case for standalone HTML comments:\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t\\n\\n\t\t\t\t// Starting after a blank line\r\n\t\t\t[ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\r\n\t\t\t<!\r\n\t\t\t(--[^\\r]*?--\\s*)+\r\n\t\t\t>\r\n\t\t\t[ \\t]*\r\n\t\t\t(?=\\n{2,})\t\t\t// followed by a blank line\r\n\t\t)\r\n\t\t/g,hashElement);\r\n\t*/\r\n\ttext = text.replace(/(\\n\\n[ ]{0,3}<!(--[^\\r]*?--\\s*)+>[ \\t]*(?=\\n{2,}))/g,hashElement);\r\n\r\n\t// PHP and ASP-style processor instructions (<?...?> and <%...%>)\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(?:\r\n\t\t\t\\n\\n\t\t\t\t// Starting after a blank line\r\n\t\t)\r\n\t\t(\t\t\t\t\t\t// save in $1\r\n\t\t\t[ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\r\n\t\t\t(?:\r\n\t\t\t\t<([?%])\t\t\t// $2\r\n\t\t\t\t[^\\r]*?\r\n\t\t\t\t\\2>\r\n\t\t\t)\r\n\t\t\t[ \\t]*\r\n\t\t\t(?=\\n{2,})\t\t\t// followed by a blank line\r\n\t\t)\r\n\t\t/g,hashElement);\r\n\t*/\r\n\ttext = text.replace(/(?:\\n\\n)([ ]{0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,hashElement);\r\n\r\n\t// attacklab: Undo double lines (see comment at top of this function)\r\n\ttext = text.replace(/\\n\\n/g,\"\\n\");\r\n\treturn text;\r\n}\r\n\r\nvar hashElement = function(wholeMatch,m1) {\r\n\tvar blockText = m1;\r\n\r\n\t// Undo double lines\r\n\tblockText = blockText.replace(/\\n\\n/g,\"\\n\");\r\n\tblockText = blockText.replace(/^\\n/,\"\");\r\n\r\n\t// strip trailing blank lines\r\n\tblockText = blockText.replace(/\\n+$/g,\"\");\r\n\r\n\t// Replace the element text with a marker (\"~KxK\" where x is its key)\r\n\tblockText = \"\\n\\n~K\" + (g_html_blocks.push(blockText)-1) + \"K\\n\\n\";\r\n\r\n\treturn blockText;\r\n};\r\n\r\nvar _RunBlockGamut = function(text) {\r\n//\r\n// These are all the transformations that form block-level\r\n// tags like paragraphs, headers, and list items.\r\n//\r\n\ttext = _DoHeaders(text);\r\n\r\n\t// Do Horizontal Rules:\r\n\tvar key = hashBlock(\"<hr />\");\r\n\ttext = text.replace(/^[ ]{0,2}([ ]?\\*[ ]?){3,}[ \\t]*$/gm,key);\r\n\ttext = text.replace(/^[ ]{0,2}([ ]?\\-[ ]?){3,}[ \\t]*$/gm,key);\r\n\ttext = text.replace(/^[ ]{0,2}([ ]?\\_[ ]?){3,}[ \\t]*$/gm,key);\r\n\r\n\ttext = _DoLists(text);\r\n\ttext = _DoCodeBlocks(text);\r\n\ttext = _DoBlockQuotes(text);\r\n\r\n\t// We already ran _HashHTMLBlocks() before, in Markdown(), but that\r\n\t// was to escape raw HTML in the original Markdown source. This time,\r\n\t// we're escaping the markup we've just created, so that we don't wrap\r\n\t// <p> tags around block-level tags.\r\n\ttext = _HashHTMLBlocks(text);\r\n\ttext = _FormParagraphs(text);\r\n\r\n\treturn text;\r\n};\r\n\r\n\r\nvar _RunSpanGamut = function(text) {\r\n//\r\n// These are all the transformations that occur *within* block-level\r\n// tags like paragraphs, headers, and list items.\r\n//\r\n\r\n\ttext = _DoCodeSpans(text);\r\n\ttext = _EscapeSpecialCharsWithinTagAttributes(text);\r\n\ttext = _EncodeBackslashEscapes(text);\r\n\r\n\t// Process anchor and image tags. Images must come first,\r\n\t// because ![foo][f] looks like an anchor.\r\n\ttext = _DoImages(text);\r\n\ttext = _DoAnchors(text);\r\n\r\n\t// Make links out of things like `<http://example.com/>`\r\n\t// Must come after _DoAnchors(), because you can use < and >\r\n\t// delimiters in inline links like [this](<url>).\r\n\ttext = _DoAutoLinks(text);\r\n\ttext = _EncodeAmpsAndAngles(text);\r\n\ttext = _DoItalicsAndBold(text);\r\n\r\n\t// Do hard breaks:\r\n\ttext = text.replace(/  +\\n/g,\" <br />\\n\");\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _EscapeSpecialCharsWithinTagAttributes = function(text) {\r\n//\r\n// Within tags -- meaning between < and > -- encode [\\ ` * _] so they\r\n// don't conflict with their use in Markdown for code, italics and strong.\r\n//\r\n\r\n\t// Build a regex to find HTML tags and comments.  See Friedl's\r\n\t// \"Mastering Regular Expressions\", 2nd Ed., pp. 200-201.\r\n\tvar regex = /(<[a-z\\/!$](\"[^\"]*\"|'[^']*'|[^'\">])*>|<!(--.*?--\\s*)+>)/gi;\r\n\r\n\ttext = text.replace(regex, function(wholeMatch) {\r\n\t\tvar tag = wholeMatch.replace(/(.)<\\/?code>(?=.)/g,\"$1`\");\r\n\t\ttag = escapeCharacters(tag,\"\\\\`*_\");\r\n\t\treturn tag;\r\n\t});\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _DoAnchors = function(text) {\r\n//\r\n// Turn Markdown link shortcuts into XHTML <a> tags.\r\n//\r\n\t//\r\n\t// First, handle reference-style links: [link text] [id]\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t\\[\r\n\t\t\t(\r\n\t\t\t\t(?:\r\n\t\t\t\t\t\\[[^\\]]*\\]\t\t// allow brackets nested one level\r\n\t\t\t\t\t|\r\n\t\t\t\t\t[^\\[]\t\t\t// or anything else\r\n\t\t\t\t)*\r\n\t\t\t)\r\n\t\t\t\\]\r\n\r\n\t\t\t[ ]?\t\t\t\t\t// one optional space\r\n\t\t\t(?:\\n[ ]*)?\t\t\t\t// one optional newline followed by spaces\r\n\r\n\t\t\t\\[\r\n\t\t\t(.*?)\t\t\t\t\t// id = $3\r\n\t\t\t\\]\r\n\t\t)()()()()\t\t\t\t\t// pad remaining backreferences\r\n\t\t/g,_DoAnchors_callback);\r\n\t*/\r\n\ttext = text.replace(/(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,writeAnchorTag);\r\n\r\n\t//\r\n\t// Next, inline-style links: [link text](url \"optional title\")\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t(\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t\t\\[\r\n\t\t\t\t(\r\n\t\t\t\t\t(?:\r\n\t\t\t\t\t\t\\[[^\\]]*\\]\t// allow brackets nested one level\r\n\t\t\t\t\t|\r\n\t\t\t\t\t[^\\[\\]]\t\t\t// or anything else\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t\t\\]\r\n\t\t\t\\(\t\t\t\t\t\t// literal paren\r\n\t\t\t[ \\t]*\r\n\t\t\t()\t\t\t\t\t\t// no id, so leave $3 empty\r\n\t\t\t<?(.*?)>?\t\t\t\t// href = $4\r\n\t\t\t[ \\t]*\r\n\t\t\t(\t\t\t\t\t\t// $5\r\n\t\t\t\t(['\"])\t\t\t\t// quote char = $6\r\n\t\t\t\t(.*?)\t\t\t\t// Title = $7\r\n\t\t\t\t\\6\t\t\t\t\t// matching quote\r\n\t\t\t\t[ \\t]*\t\t\t\t// ignore any spaces/tabs between closing quote and )\r\n\t\t\t)?\t\t\t\t\t\t// title is optional\r\n\t\t\t\\)\r\n\t\t)\r\n\t\t/g,writeAnchorTag);\r\n\t*/\r\n\ttext = text.replace(/(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]\\([ \\t]*()<?(.*?)>?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,writeAnchorTag);\r\n\r\n\t//\r\n\t// Last, handle reference-style shortcuts: [link text]\r\n\t// These must come last in case you've also got [link test][1]\r\n\t// or [link test](/foo)\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t \t\t\t\t\t// wrap whole match in $1\r\n\t\t\t\\[\r\n\t\t\t([^\\[\\]]+)\t\t\t\t// link text = $2; can't contain '[' or ']'\r\n\t\t\t\\]\r\n\t\t)()()()()()\t\t\t\t\t// pad rest of backreferences\r\n\t\t/g, writeAnchorTag);\r\n\t*/\r\n\ttext = text.replace(/(\\[([^\\[\\]]+)\\])()()()()()/g, writeAnchorTag);\r\n\r\n\treturn text;\r\n}\r\n\r\nvar writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {\r\n\tif (m7 == undefined) m7 = \"\";\r\n\tvar whole_match = m1;\r\n\tvar link_text   = m2;\r\n\tvar link_id\t = m3.toLowerCase();\r\n\tvar url\t\t= m4;\r\n\tvar title\t= m7;\r\n\r\n\tif (url == \"\") {\r\n\t\tif (link_id == \"\") {\r\n\t\t\t// lower-case and turn embedded newlines into spaces\r\n\t\t\tlink_id = link_text.toLowerCase().replace(/ ?\\n/g,\" \");\r\n\t\t}\r\n\t\turl = \"#\"+link_id;\r\n\r\n\t\tif (g_urls[link_id] != undefined) {\r\n\t\t\turl = g_urls[link_id];\r\n\t\t\tif (g_titles[link_id] != undefined) {\r\n\t\t\t\ttitle = g_titles[link_id];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (whole_match.search(/\\(\\s*\\)$/m)>-1) {\r\n\t\t\t\t// Special case for explicit empty url\r\n\t\t\t\turl = \"\";\r\n\t\t\t} else {\r\n\t\t\t\treturn whole_match;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\turl = escapeCharacters(url,\"*_\");\r\n\tvar result = \"<a href=\\\"\" + url + \"\\\"\";\r\n\r\n\tif (title != \"\") {\r\n\t\ttitle = title.replace(/\"/g,\"&quot;\");\r\n\t\ttitle = escapeCharacters(title,\"*_\");\r\n\t\tresult +=  \" title=\\\"\" + title + \"\\\"\";\r\n\t}\r\n\r\n\tresult += \">\" + link_text + \"</a>\";\r\n\r\n\treturn result;\r\n}\r\n\r\n\r\nvar _DoImages = function(text) {\r\n//\r\n// Turn Markdown image shortcuts into <img> tags.\r\n//\r\n\r\n\t//\r\n\t// First, handle reference-style labeled images: ![alt text][id]\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t!\\[\r\n\t\t\t(.*?)\t\t\t\t// alt text = $2\r\n\t\t\t\\]\r\n\r\n\t\t\t[ ]?\t\t\t\t// one optional space\r\n\t\t\t(?:\\n[ ]*)?\t\t\t// one optional newline followed by spaces\r\n\r\n\t\t\t\\[\r\n\t\t\t(.*?)\t\t\t\t// id = $3\r\n\t\t\t\\]\r\n\t\t)()()()()\t\t\t\t// pad rest of backreferences\r\n\t\t/g,writeImageTag);\r\n\t*/\r\n\ttext = text.replace(/(!\\[(.*?)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,writeImageTag);\r\n\r\n\t//\r\n\t// Next, handle inline images:  ![alt text](url \"optional title\")\r\n\t// Don't forget: encode * and _\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t// wrap whole match in $1\r\n\t\t\t!\\[\r\n\t\t\t(.*?)\t\t\t\t// alt text = $2\r\n\t\t\t\\]\r\n\t\t\t\\s?\t\t\t\t\t// One optional whitespace character\r\n\t\t\t\\(\t\t\t\t\t// literal paren\r\n\t\t\t[ \\t]*\r\n\t\t\t()\t\t\t\t\t// no id, so leave $3 empty\r\n\t\t\t<?(\\S+?)>?\t\t\t// src url = $4\r\n\t\t\t[ \\t]*\r\n\t\t\t(\t\t\t\t\t// $5\r\n\t\t\t\t(['\"])\t\t\t// quote char = $6\r\n\t\t\t\t(.*?)\t\t\t// title = $7\r\n\t\t\t\t\\6\t\t\t\t// matching quote\r\n\t\t\t\t[ \\t]*\r\n\t\t\t)?\t\t\t\t\t// title is optional\r\n\t\t\\)\r\n\t\t)\r\n\t\t/g,writeImageTag);\r\n\t*/\r\n\ttext = text.replace(/(!\\[(.*?)\\]\\s?\\([ \\t]*()<?(\\S+?)>?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,writeImageTag);\r\n\r\n\treturn text;\r\n}\r\n\r\nvar writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {\r\n\tvar whole_match = m1;\r\n\tvar alt_text   = m2;\r\n\tvar link_id\t = m3.toLowerCase();\r\n\tvar url\t\t= m4;\r\n\tvar title\t= m7;\r\n\r\n\tif (!title) title = \"\";\r\n\r\n\tif (url == \"\") {\r\n\t\tif (link_id == \"\") {\r\n\t\t\t// lower-case and turn embedded newlines into spaces\r\n\t\t\tlink_id = alt_text.toLowerCase().replace(/ ?\\n/g,\" \");\r\n\t\t}\r\n\t\turl = \"#\"+link_id;\r\n\r\n\t\tif (g_urls[link_id] != undefined) {\r\n\t\t\turl = g_urls[link_id];\r\n\t\t\tif (g_titles[link_id] != undefined) {\r\n\t\t\t\ttitle = g_titles[link_id];\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn whole_match;\r\n\t\t}\r\n\t}\r\n\r\n\talt_text = alt_text.replace(/\"/g,\"&quot;\");\r\n\turl = escapeCharacters(url,\"*_\");\r\n\tvar result = \"<img src=\\\"\" + url + \"\\\" alt=\\\"\" + alt_text + \"\\\"\";\r\n\r\n\t// attacklab: Markdown.pl adds empty title attributes to images.\r\n\t// Replicate this bug.\r\n\r\n\t//if (title != \"\") {\r\n\t\ttitle = title.replace(/\"/g,\"&quot;\");\r\n\t\ttitle = escapeCharacters(title,\"*_\");\r\n\t\tresult +=  \" title=\\\"\" + title + \"\\\"\";\r\n\t//}\r\n\r\n\tresult += \" />\";\r\n\r\n\treturn result;\r\n}\r\n\r\n\r\nvar _DoHeaders = function(text) {\r\n\r\n\t// Setext-style headers:\r\n\t//\tHeader 1\r\n\t//\t========\r\n\t//\r\n\t//\tHeader 2\r\n\t//\t--------\r\n\t//\r\n\ttext = text.replace(/^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\r\n\t\tfunction(wholeMatch,m1){return hashBlock('<h1 id=\"' + headerId(m1) + '\">' + _RunSpanGamut(m1) + \"</h1>\");});\r\n\r\n\ttext = text.replace(/^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm,\r\n\t\tfunction(matchFound,m1){return hashBlock('<h2 id=\"' + headerId(m1) + '\">' + _RunSpanGamut(m1) + \"</h2>\");});\r\n\r\n\t// atx-style headers:\r\n\t//  # Header 1\r\n\t//  ## Header 2\r\n\t//  ## Header 2 with closing hashes ##\r\n\t//  ...\r\n\t//  ###### Header 6\r\n\t//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t^(\\#{1,6})\t\t\t\t// $1 = string of #'s\r\n\t\t\t[ \\t]*\r\n\t\t\t(.+?)\t\t\t\t\t// $2 = Header text\r\n\t\t\t[ \\t]*\r\n\t\t\t\\#*\t\t\t\t\t\t// optional closing #'s (not counted)\r\n\t\t\t\\n+\r\n\t\t/gm, function() {...});\r\n\t*/\r\n\r\n\ttext = text.replace(/^(\\#{1,6})[ \\t]*(.+?)[ \\t]*\\#*\\n+/gm,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar h_level = m1.length;\r\n\t\t\treturn hashBlock(\"<h\" + h_level + ' id=\"' + headerId(m2) + '\">' + _RunSpanGamut(m2) + \"</h\" + h_level + \">\");\r\n\t\t});\r\n\r\n\tfunction headerId(m) {\r\n\t\treturn m.replace(/[^\\w]/g, '').toLowerCase();\r\n\t}\r\n\treturn text;\r\n}\r\n\r\n// This declaration keeps Dojo compressor from outputting garbage:\r\nvar _ProcessListItems;\r\n\r\nvar _DoLists = function(text) {\r\n//\r\n// Form HTML ordered (numbered) and unordered (bulleted) lists.\r\n//\r\n\r\n\t// attacklab: add sentinel to hack around khtml/safari bug:\r\n\t// http://bugs.webkit.org/show_bug.cgi?id=11231\r\n\ttext += \"~0\";\r\n\r\n\t// Re-usable pattern to match any entirel ul or ol list:\r\n\r\n\t/*\r\n\t\tvar whole_list = /\r\n\t\t(\t\t\t\t\t\t\t\t\t// $1 = whole list\r\n\t\t\t(\t\t\t\t\t\t\t\t// $2\r\n\t\t\t\t[ ]{0,3}\t\t\t\t\t// attacklab: g_tab_width - 1\r\n\t\t\t\t([*+-]|\\d+[.])\t\t\t\t// $3 = first list item marker\r\n\t\t\t\t[ \\t]+\r\n\t\t\t)\r\n\t\t\t[^\\r]+?\r\n\t\t\t(\t\t\t\t\t\t\t\t// $4\r\n\t\t\t\t~0\t\t\t\t\t\t\t// sentinel for workaround; should be $\r\n\t\t\t|\r\n\t\t\t\t\\n{2,}\r\n\t\t\t\t(?=\\S)\r\n\t\t\t\t(?!\t\t\t\t\t\t\t// Negative lookahead for another list item marker\r\n\t\t\t\t\t[ \\t]*\r\n\t\t\t\t\t(?:[*+-]|\\d+[.])[ \\t]+\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t)/g\r\n\t*/\r\n\tvar whole_list = /^(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\r\n\r\n\tif (g_list_level) {\r\n\t\ttext = text.replace(whole_list,function(wholeMatch,m1,m2) {\r\n\t\t\tvar list = m1;\r\n\t\t\tvar list_type = (m2.search(/[*+-]/g)>-1) ? \"ul\" : \"ol\";\r\n\r\n\t\t\t// Turn double returns into triple returns, so that we can make a\r\n\t\t\t// paragraph for the last item in a list, if necessary:\r\n\t\t\tlist = list.replace(/\\n{2,}/g,\"\\n\\n\\n\");;\r\n\t\t\tvar result = _ProcessListItems(list);\r\n\r\n\t\t\t// Trim any trailing whitespace, to put the closing `</$list_type>`\r\n\t\t\t// up on the preceding line, to get it past the current stupid\r\n\t\t\t// HTML block parser. This is a hack to work around the terrible\r\n\t\t\t// hack that is the HTML block parser.\r\n\t\t\tresult = result.replace(/\\s+$/,\"\");\r\n\t\t\tresult = \"<\"+list_type+\">\" + result + \"</\"+list_type+\">\\n\";\r\n\t\t\treturn result;\r\n\t\t});\r\n\t} else {\r\n\t\twhole_list = /(\\n\\n|^\\n?)(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/g;\r\n\t\ttext = text.replace(whole_list,function(wholeMatch,m1,m2,m3) {\r\n\t\t\tvar runup = m1;\r\n\t\t\tvar list = m2;\r\n\r\n\t\t\tvar list_type = (m3.search(/[*+-]/g)>-1) ? \"ul\" : \"ol\";\r\n\t\t\t// Turn double returns into triple returns, so that we can make a\r\n\t\t\t// paragraph for the last item in a list, if necessary:\r\n\t\t\tvar list = list.replace(/\\n{2,}/g,\"\\n\\n\\n\");;\r\n\t\t\tvar result = _ProcessListItems(list);\r\n\t\t\tresult = runup + \"<\"+list_type+\">\\n\" + result + \"</\"+list_type+\">\\n\";\r\n\t\t\treturn result;\r\n\t\t});\r\n\t}\r\n\r\n\t// attacklab: strip sentinel\r\n\ttext = text.replace(/~0/,\"\");\r\n\r\n\treturn text;\r\n}\r\n\r\n_ProcessListItems = function(list_str) {\r\n//\r\n//  Process the contents of a single ordered or unordered list, splitting it\r\n//  into individual list items.\r\n//\r\n\t// The $g_list_level global keeps track of when we're inside a list.\r\n\t// Each time we enter a list, we increment it; when we leave a list,\r\n\t// we decrement. If it's zero, we're not in a list anymore.\r\n\t//\r\n\t// We do this because when we're not inside a list, we want to treat\r\n\t// something like this:\r\n\t//\r\n\t//    I recommend upgrading to version\r\n\t//    8. Oops, now this line is treated\r\n\t//    as a sub-list.\r\n\t//\r\n\t// As a single paragraph, despite the fact that the second line starts\r\n\t// with a digit-period-space sequence.\r\n\t//\r\n\t// Whereas when we're inside a list (or sub-list), that line will be\r\n\t// treated as the start of a sub-list. What a kludge, huh? This is\r\n\t// an aspect of Markdown's syntax that's hard to parse perfectly\r\n\t// without resorting to mind-reading. Perhaps the solution is to\r\n\t// change the syntax rules such that sub-lists must start with a\r\n\t// starting cardinal number; e.g. \"1.\" or \"a.\".\r\n\r\n\tg_list_level++;\r\n\r\n\t// trim trailing blank lines:\r\n\tlist_str = list_str.replace(/\\n{2,}$/,\"\\n\");\r\n\r\n\t// attacklab: add sentinel to emulate \\z\r\n\tlist_str += \"~0\";\r\n\r\n\t/*\r\n\t\tlist_str = list_str.replace(/\r\n\t\t\t(\\n)?\t\t\t\t\t\t\t// leading line = $1\r\n\t\t\t(^[ \\t]*)\t\t\t\t\t\t// leading whitespace = $2\r\n\t\t\t([*+-]|\\d+[.]) [ \\t]+\t\t\t// list marker = $3\r\n\t\t\t([^\\r]+?\t\t\t\t\t\t// list item text   = $4\r\n\t\t\t(\\n{1,2}))\r\n\t\t\t(?= \\n* (~0 | \\2 ([*+-]|\\d+[.]) [ \\t]+))\r\n\t\t/gm, function(){...});\r\n\t*/\r\n\tlist_str = list_str.replace(/(\\n)?(^[ \\t]*)([*+-]|\\d+[.])[ \\t]+([^\\r]+?(\\n{1,2}))(?=\\n*(~0|\\2([*+-]|\\d+[.])[ \\t]+))/gm,\r\n\t\tfunction(wholeMatch,m1,m2,m3,m4){\r\n\t\t\tvar item = m4;\r\n\t\t\tvar leading_line = m1;\r\n\t\t\tvar leading_space = m2;\r\n\r\n\t\t\tif (leading_line || (item.search(/\\n{2,}/)>-1)) {\r\n\t\t\t\titem = _RunBlockGamut(_Outdent(item));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Recursion for sub-lists:\r\n\t\t\t\titem = _DoLists(_Outdent(item));\r\n\t\t\t\titem = item.replace(/\\n$/,\"\"); // chomp(item)\r\n\t\t\t\titem = _RunSpanGamut(item);\r\n\t\t\t}\r\n\r\n\t\t\treturn  \"<li>\" + item + \"</li>\\n\";\r\n\t\t}\r\n\t);\r\n\r\n\t// attacklab: strip sentinel\r\n\tlist_str = list_str.replace(/~0/g,\"\");\r\n\r\n\tg_list_level--;\r\n\treturn list_str;\r\n}\r\n\r\n\r\nvar _DoCodeBlocks = function(text) {\r\n//\r\n//  Process Markdown `<pre><code>` blocks.\r\n//\r\n\r\n\t/*\r\n\t\ttext = text.replace(text,\r\n\t\t\t/(?:\\n\\n|^)\r\n\t\t\t(\t\t\t\t\t\t\t\t// $1 = the code block -- one or more lines, starting with a space/tab\r\n\t\t\t\t(?:\r\n\t\t\t\t\t(?:[ ]{4}|\\t)\t\t\t// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width\r\n\t\t\t\t\t.*\\n+\r\n\t\t\t\t)+\r\n\t\t\t)\r\n\t\t\t(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))\t// attacklab: g_tab_width\r\n\t\t/g,function(){...});\r\n\t*/\r\n\r\n\t// attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\r\n\ttext += \"~0\";\r\n\r\n\ttext = text.replace(/(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))/g,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar codeblock = m1;\r\n\t\t\tvar nextChar = m2;\r\n\r\n\t\t\tcodeblock = _EncodeCode( _Outdent(codeblock));\r\n\t\t\tcodeblock = _Detab(codeblock);\r\n\t\t\tcodeblock = codeblock.replace(/^\\n+/g,\"\"); // trim leading newlines\r\n\t\t\tcodeblock = codeblock.replace(/\\n+$/g,\"\"); // trim trailing whitespace\r\n\r\n\t\t\tcodeblock = \"<pre><code>\" + codeblock + \"\\n</code></pre>\";\r\n\r\n\t\t\treturn hashBlock(codeblock) + nextChar;\r\n\t\t}\r\n\t);\r\n\r\n\t// attacklab: strip sentinel\r\n\ttext = text.replace(/~0/,\"\");\r\n\r\n\treturn text;\r\n};\r\n\r\nvar _DoGithubCodeBlocks = function(text) {\r\n//\r\n//  Process Github-style code blocks\r\n//  Example:\r\n//  ```ruby\r\n//  def hello_world(x)\r\n//    puts \"Hello, #{x}\"\r\n//  end\r\n//  ```\r\n//\r\n\r\n\r\n\t// attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\r\n\ttext += \"~0\";\r\n\r\n\ttext = text.replace(/(?:^|\\n)```(.*)\\n([\\s\\S]*?)\\n```/g,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar language = m1;\r\n\t\t\tvar codeblock = m2;\r\n\r\n\t\t\tcodeblock = _EncodeCode(codeblock);\r\n\t\t\tcodeblock = _Detab(codeblock);\r\n\t\t\tcodeblock = codeblock.replace(/^\\n+/g,\"\"); // trim leading newlines\r\n\t\t\tcodeblock = codeblock.replace(/\\n+$/g,\"\"); // trim trailing whitespace\r\n\r\n\t\t\tcodeblock = \"<pre class=\\\"prettyprint\" + (language ? \" lang-\" + language : \"\") + \"\\\">\" + codeblock + \"\\n</pre>\";\r\n\r\n\t\t\treturn hashBlock(codeblock);\r\n\t\t}\r\n\t);\r\n\r\n\t// attacklab: strip sentinel\r\n\ttext = text.replace(/~0/,\"\");\r\n\r\n\treturn text;\r\n}\r\n\r\nvar hashBlock = function(text) {\r\n\ttext = text.replace(/(^\\n+|\\n+$)/g,\"\");\r\n\treturn \"\\n\\n~K\" + (g_html_blocks.push(text)-1) + \"K\\n\\n\";\r\n}\r\n\r\nvar _DoCodeSpans = function(text) {\r\n//\r\n//   *  Backtick quotes are used for <code></code> spans.\r\n//\r\n//   *  You can use multiple backticks as the delimiters if you want to\r\n//\t include literal backticks in the code span. So, this input:\r\n//\r\n//\t\t Just type ``foo `bar` baz`` at the prompt.\r\n//\r\n//\t   Will translate to:\r\n//\r\n//\t\t <p>Just type <code>foo `bar` baz</code> at the prompt.</p>\r\n//\r\n//\tThere's no arbitrary limit to the number of backticks you\r\n//\tcan use as delimters. If you need three consecutive backticks\r\n//\tin your code, use four for delimiters, etc.\r\n//\r\n//  *  You can use spaces to get literal backticks at the edges:\r\n//\r\n//\t\t ... type `` `bar` `` ...\r\n//\r\n//\t   Turns to:\r\n//\r\n//\t\t ... type <code>`bar`</code> ...\r\n//\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t(^|[^\\\\])\t\t\t\t\t// Character before opening ` can't be a backslash\r\n\t\t\t(`+)\t\t\t\t\t\t// $2 = Opening run of `\r\n\t\t\t(\t\t\t\t\t\t\t// $3 = The code block\r\n\t\t\t\t[^\\r]*?\r\n\t\t\t\t[^`]\t\t\t\t\t// attacklab: work around lack of lookbehind\r\n\t\t\t)\r\n\t\t\t\\2\t\t\t\t\t\t\t// Matching closer\r\n\t\t\t(?!`)\r\n\t\t/gm, function(){...});\r\n\t*/\r\n\r\n\ttext = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\r\n\t\tfunction(wholeMatch,m1,m2,m3,m4) {\r\n\t\t\tvar c = m3;\r\n\t\t\tc = c.replace(/^([ \\t]*)/g,\"\");\t// leading whitespace\r\n\t\t\tc = c.replace(/[ \\t]*$/g,\"\");\t// trailing whitespace\r\n\t\t\tc = _EncodeCode(c);\r\n\t\t\treturn m1+\"<code>\"+c+\"</code>\";\r\n\t\t});\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _EncodeCode = function(text) {\r\n//\r\n// Encode/escape certain characters inside Markdown code runs.\r\n// The point is that in code, these characters are literals,\r\n// and lose their special Markdown meanings.\r\n//\r\n\t// Encode all ampersands; HTML entities are not\r\n\t// entities within a Markdown code span.\r\n\ttext = text.replace(/&/g,\"&amp;\");\r\n\r\n\t// Do the angle bracket song and dance:\r\n\ttext = text.replace(/</g,\"&lt;\");\r\n\ttext = text.replace(/>/g,\"&gt;\");\r\n\r\n\t// Now, escape characters that are magic in Markdown:\r\n\ttext = escapeCharacters(text,\"\\*_{}[]\\\\\",false);\r\n\r\n// jj the line above breaks this:\r\n//---\r\n\r\n//* Item\r\n\r\n//   1. Subitem\r\n\r\n//            special char: *\r\n//---\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _DoItalicsAndBold = function(text) {\r\n\r\n\t// <strong> must go first:\r\n\ttext = text.replace(/(\\*\\*|__)(?=\\S)([^\\r]*?\\S[*_]*)\\1/g,\r\n\t\t\"<strong>$2</strong>\");\r\n\r\n\ttext = text.replace(/(\\*|_)(?=\\S)([^\\r]*?\\S)\\1/g,\r\n\t\t\"<em>$2</em>\");\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _DoBlockQuotes = function(text) {\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t(\t\t\t\t\t\t\t\t// Wrap whole match in $1\r\n\t\t\t(\r\n\t\t\t\t^[ \\t]*>[ \\t]?\t\t\t// '>' at the start of a line\r\n\t\t\t\t.+\\n\t\t\t\t\t// rest of the first line\r\n\t\t\t\t(.+\\n)*\t\t\t\t\t// subsequent consecutive lines\r\n\t\t\t\t\\n*\t\t\t\t\t\t// blanks\r\n\t\t\t)+\r\n\t\t)\r\n\t\t/gm, function(){...});\r\n\t*/\r\n\r\n\ttext = text.replace(/((^[ \\t]*>[ \\t]?.+\\n(.+\\n)*\\n*)+)/gm,\r\n\t\tfunction(wholeMatch,m1) {\r\n\t\t\tvar bq = m1;\r\n\r\n\t\t\t// attacklab: hack around Konqueror 3.5.4 bug:\r\n\t\t\t// \"----------bug\".replace(/^-/g,\"\") == \"bug\"\r\n\r\n\t\t\tbq = bq.replace(/^[ \\t]*>[ \\t]?/gm,\"~0\");\t// trim one level of quoting\r\n\r\n\t\t\t// attacklab: clean up hack\r\n\t\t\tbq = bq.replace(/~0/g,\"\");\r\n\r\n\t\t\tbq = bq.replace(/^[ \\t]+$/gm,\"\");\t\t// trim whitespace-only lines\r\n\t\t\tbq = _RunBlockGamut(bq);\t\t\t\t// recurse\r\n\r\n\t\t\tbq = bq.replace(/(^|\\n)/g,\"$1  \");\r\n\t\t\t// These leading spaces screw with <pre> content, so we need to fix that:\r\n\t\t\tbq = bq.replace(\r\n\t\t\t\t\t/(\\s*<pre>[^\\r]+?<\\/pre>)/gm,\r\n\t\t\t\tfunction(wholeMatch,m1) {\r\n\t\t\t\t\tvar pre = m1;\r\n\t\t\t\t\t// attacklab: hack around Konqueror 3.5.4 bug:\r\n\t\t\t\t\tpre = pre.replace(/^  /mg,\"~0\");\r\n\t\t\t\t\tpre = pre.replace(/~0/g,\"\");\r\n\t\t\t\t\treturn pre;\r\n\t\t\t\t});\r\n\r\n\t\t\treturn hashBlock(\"<blockquote>\\n\" + bq + \"\\n</blockquote>\");\r\n\t\t});\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _FormParagraphs = function(text) {\r\n//\r\n//  Params:\r\n//    $text - string to process with html <p> tags\r\n//\r\n\r\n\t// Strip leading and trailing lines:\r\n\ttext = text.replace(/^\\n+/g,\"\");\r\n\ttext = text.replace(/\\n+$/g,\"\");\r\n\r\n\tvar grafs = text.split(/\\n{2,}/g);\r\n\tvar grafsOut = new Array();\r\n\r\n\t//\r\n\t// Wrap <p> tags.\r\n\t//\r\n\tvar end = grafs.length;\r\n\tfor (var i=0; i<end; i++) {\r\n\t\tvar str = grafs[i];\r\n\r\n\t\t// if this is an HTML marker, copy it\r\n\t\tif (str.search(/~K(\\d+)K/g) >= 0) {\r\n\t\t\tgrafsOut.push(str);\r\n\t\t}\r\n\t\telse if (str.search(/\\S/) >= 0) {\r\n\t\t\tstr = _RunSpanGamut(str);\r\n\t\t\tstr = str.replace(/^([ \\t]*)/g,\"<p>\");\r\n\t\t\tstr += \"</p>\"\r\n\t\t\tgrafsOut.push(str);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t//\r\n\t// Unhashify HTML blocks\r\n\t//\r\n\tend = grafsOut.length;\r\n\tfor (var i=0; i<end; i++) {\r\n\t\t// if this is a marker for an html block...\r\n\t\twhile (grafsOut[i].search(/~K(\\d+)K/) >= 0) {\r\n\t\t\tvar blockText = g_html_blocks[RegExp.$1];\r\n\t\t\tblockText = blockText.replace(/\\$/g,\"$$$$\"); // Escape any dollar signs\r\n\t\t\tgrafsOut[i] = grafsOut[i].replace(/~K\\d+K/,blockText);\r\n\t\t}\r\n\t}\r\n\r\n\treturn grafsOut.join(\"\\n\\n\");\r\n}\r\n\r\n\r\nvar _EncodeAmpsAndAngles = function(text) {\r\n// Smart processing for ampersands and angle brackets that need to be encoded.\r\n\r\n\t// Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\r\n\t//   http://bumppo.net/projects/amputator/\r\n\ttext = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g,\"&amp;\");\r\n\r\n\t// Encode naked <'s\r\n\ttext = text.replace(/<(?![a-z\\/?\\$!])/gi,\"&lt;\");\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _EncodeBackslashEscapes = function(text) {\r\n//\r\n//   Parameter:  String.\r\n//   Returns:\tThe string, with after processing the following backslash\r\n//\t\t\t   escape sequences.\r\n//\r\n\r\n\t// attacklab: The polite way to do this is with the new\r\n\t// escapeCharacters() function:\r\n\t//\r\n\t// \ttext = escapeCharacters(text,\"\\\\\",true);\r\n\t// \ttext = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\r\n\t//\r\n\t// ...but we're sidestepping its use of the (slow) RegExp constructor\r\n\t// as an optimization for Firefox.  This function gets called a LOT.\r\n\r\n\ttext = text.replace(/\\\\(\\\\)/g,escapeCharacters_callback);\r\n\ttext = text.replace(/\\\\([`*_{}\\[\\]()>#+-.!])/g,escapeCharacters_callback);\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _DoAutoLinks = function(text) {\r\n\r\n\ttext = text.replace(/<((https?|ftp|dict):[^'\">\\s]+)>/gi,\"<a href=\\\"$1\\\">$1</a>\");\r\n\r\n\t// Email addresses: <address@domain.foo>\r\n\r\n\t/*\r\n\t\ttext = text.replace(/\r\n\t\t\t<\r\n\t\t\t(?:mailto:)?\r\n\t\t\t(\r\n\t\t\t\t[-.\\w]+\r\n\t\t\t\t\\@\r\n\t\t\t\t[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+\r\n\t\t\t)\r\n\t\t\t>\r\n\t\t/gi, _DoAutoLinks_callback());\r\n\t*/\r\n\ttext = text.replace(/<(?:mailto:)?([-.\\w]+\\@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\r\n\t\tfunction(wholeMatch,m1) {\r\n\t\t\treturn _EncodeEmailAddress( _UnescapeSpecialChars(m1) );\r\n\t\t}\r\n\t);\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _EncodeEmailAddress = function(addr) {\r\n//\r\n//  Input: an email address, e.g. \"foo@example.com\"\r\n//\r\n//  Output: the email address as a mailto link, with each character\r\n//\tof the address encoded as either a decimal or hex entity, in\r\n//\tthe hopes of foiling most address harvesting spam bots. E.g.:\r\n//\r\n//\t<a href=\"&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;\r\n//\t   x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;\">&#102;&#111;&#111;\r\n//\t   &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>\r\n//\r\n//  Based on a filter by Matthew Wickline, posted to the BBEdit-Talk\r\n//  mailing list: <http://tinyurl.com/yu7ue>\r\n//\r\n\r\n\t// attacklab: why can't javascript speak hex?\r\n\tfunction char2hex(ch) {\r\n\t\tvar hexDigits = '0123456789ABCDEF';\r\n\t\tvar dec = ch.charCodeAt(0);\r\n\t\treturn(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15));\r\n\t}\r\n\r\n\tvar encode = [\r\n\t\tfunction(ch){return \"&#\"+ch.charCodeAt(0)+\";\";},\r\n\t\tfunction(ch){return \"&#x\"+char2hex(ch)+\";\";},\r\n\t\tfunction(ch){return ch;}\r\n\t];\r\n\r\n\taddr = \"mailto:\" + addr;\r\n\r\n\taddr = addr.replace(/./g, function(ch) {\r\n\t\tif (ch == \"@\") {\r\n\t\t   \t// this *must* be encoded. I insist.\r\n\t\t\tch = encode[Math.floor(Math.random()*2)](ch);\r\n\t\t} else if (ch !=\":\") {\r\n\t\t\t// leave ':' alone (to spot mailto: later)\r\n\t\t\tvar r = Math.random();\r\n\t\t\t// roughly 10% raw, 45% hex, 45% dec\r\n\t\t\tch =  (\r\n\t\t\t\t\tr > .9  ?\tencode[2](ch)   :\r\n\t\t\t\t\tr > .45 ?\tencode[1](ch)   :\r\n\t\t\t\t\t\t\t\tencode[0](ch)\r\n\t\t\t\t);\r\n\t\t}\r\n\t\treturn ch;\r\n\t});\r\n\r\n\taddr = \"<a href=\\\"\" + addr + \"\\\">\" + addr + \"</a>\";\r\n\taddr = addr.replace(/\">.+:/g,\"\\\">\"); // strip the mailto: from the visible part\r\n\r\n\treturn addr;\r\n}\r\n\r\n\r\nvar _UnescapeSpecialChars = function(text) {\r\n//\r\n// Swap back in all the special characters we've hidden.\r\n//\r\n\ttext = text.replace(/~E(\\d+)E/g,\r\n\t\tfunction(wholeMatch,m1) {\r\n\t\t\tvar charCodeToReplace = parseInt(m1);\r\n\t\t\treturn String.fromCharCode(charCodeToReplace);\r\n\t\t}\r\n\t);\r\n\treturn text;\r\n}\r\n\r\n\r\nvar _Outdent = function(text) {\r\n//\r\n// Remove one level of line-leading tabs or spaces\r\n//\r\n\r\n\t// attacklab: hack around Konqueror 3.5.4 bug:\r\n\t// \"----------bug\".replace(/^-/g,\"\") == \"bug\"\r\n\r\n\ttext = text.replace(/^(\\t|[ ]{1,4})/gm,\"~0\"); // attacklab: g_tab_width\r\n\r\n\t// attacklab: clean up hack\r\n\ttext = text.replace(/~0/g,\"\")\r\n\r\n\treturn text;\r\n}\r\n\r\nvar _Detab = function(text) {\r\n// attacklab: Detab's completely rewritten for speed.\r\n// In perl we could fix it by anchoring the regexp with \\G.\r\n// In javascript we're less fortunate.\r\n\r\n\t// expand first n-1 tabs\r\n\ttext = text.replace(/\\t(?=\\t)/g,\"    \"); // attacklab: g_tab_width\r\n\r\n\t// replace the nth with two sentinels\r\n\ttext = text.replace(/\\t/g,\"~A~B\");\r\n\r\n\t// use the sentinel to anchor our regex so it doesn't explode\r\n\ttext = text.replace(/~B(.+?)~A/g,\r\n\t\tfunction(wholeMatch,m1,m2) {\r\n\t\t\tvar leadingText = m1;\r\n\t\t\tvar numSpaces = 4 - leadingText.length % 4;  // attacklab: g_tab_width\r\n\r\n\t\t\t// there *must* be a better way to do this:\r\n\t\t\tfor (var i=0; i<numSpaces; i++) leadingText+=\" \";\r\n\r\n\t\t\treturn leadingText;\r\n\t\t}\r\n\t);\r\n\r\n\t// clean up sentinels\r\n\ttext = text.replace(/~A/g,\"    \");  // attacklab: g_tab_width\r\n\ttext = text.replace(/~B/g,\"\");\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\n//\r\n//  attacklab: Utility functions\r\n//\r\n\r\n\r\nvar escapeCharacters = function(text, charsToEscape, afterBackslash) {\r\n\t// First we have to escape the escape characters so that\r\n\t// we can build a character class out of them\r\n\tvar regexString = \"([\" + charsToEscape.replace(/([\\[\\]\\\\])/g,\"\\\\$1\") + \"])\";\r\n\r\n\tif (afterBackslash) {\r\n\t\tregexString = \"\\\\\\\\\" + regexString;\r\n\t}\r\n\r\n\tvar regex = new RegExp(regexString,\"g\");\r\n\ttext = text.replace(regex,escapeCharacters_callback);\r\n\r\n\treturn text;\r\n}\r\n\r\n\r\nvar escapeCharacters_callback = function(wholeMatch,m1) {\r\n\tvar charCodeToEscape = m1.charCodeAt(0);\r\n\treturn \"~E\"+charCodeToEscape+\"E\";\r\n}\r\n\r\n} // end of Showdown.converter\r\n\r\n// export\r\nif (typeof module !== 'undefined') module.exports = Showdown;"
  },
  {
    "path": "servers/www/assets/js/vendor/underscore.js",
    "content": "//     Underscore.js 1.3.3\r\n//     (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\r\n//     Underscore is freely distributable under the MIT license.\r\n//     Portions of Underscore are inspired or borrowed from Prototype,\r\n//     Oliver Steele's Functional, and John Resig's Micro-Templating.\r\n//     For all details and documentation:\r\n//     http://documentcloud.github.com/underscore\r\n\r\n(function() {\r\n\r\n  // Baseline setup\r\n  // --------------\r\n\r\n  // Establish the root object, `window` in the browser, or `global` on the server.\r\n  var root = this;\r\n\r\n  // Save the previous value of the `_` variable.\r\n  var previousUnderscore = root._;\r\n\r\n  // Establish the object that gets returned to break out of a loop iteration.\r\n  var breaker = {};\r\n\r\n  // Save bytes in the minified (but not gzipped) version:\r\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\r\n\r\n  // Create quick reference variables for speed access to core prototypes.\r\n  var slice            = ArrayProto.slice,\r\n      unshift          = ArrayProto.unshift,\r\n      toString         = ObjProto.toString,\r\n      hasOwnProperty   = ObjProto.hasOwnProperty;\r\n\r\n  // All **ECMAScript 5** native function implementations that we hope to use\r\n  // are declared here.\r\n  var\r\n    nativeForEach      = ArrayProto.forEach,\r\n    nativeMap          = ArrayProto.map,\r\n    nativeReduce       = ArrayProto.reduce,\r\n    nativeReduceRight  = ArrayProto.reduceRight,\r\n    nativeFilter       = ArrayProto.filter,\r\n    nativeEvery        = ArrayProto.every,\r\n    nativeSome         = ArrayProto.some,\r\n    nativeIndexOf      = ArrayProto.indexOf,\r\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\r\n    nativeIsArray      = Array.isArray,\r\n    nativeKeys         = Object.keys,\r\n    nativeBind         = FuncProto.bind;\r\n\r\n  // Create a safe reference to the Underscore object for use below.\r\n  var _ = function(obj) { return new wrapper(obj); };\r\n\r\n  // Export the Underscore object for **Node.js**, with\r\n  // backwards-compatibility for the old `require()` API. If we're in\r\n  // the browser, add `_` as a global object via a string identifier,\r\n  // for Closure Compiler \"advanced\" mode.\r\n  if (typeof exports !== 'undefined') {\r\n    if (typeof module !== 'undefined' && module.exports) {\r\n      exports = module.exports = _;\r\n    }\r\n    exports._ = _;\r\n  } else {\r\n    root['_'] = _;\r\n  }\r\n\r\n  // Current version.\r\n  _.VERSION = '1.3.3';\r\n\r\n  // Collection Functions\r\n  // --------------------\r\n\r\n  // The cornerstone, an `each` implementation, aka `forEach`.\r\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\r\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\r\n  var each = _.each = _.forEach = function(obj, iterator, context) {\r\n    if (obj == null) return;\r\n    if (nativeForEach && obj.forEach === nativeForEach) {\r\n      obj.forEach(iterator, context);\r\n    } else if (obj.length === +obj.length) {\r\n      for (var i = 0, l = obj.length; i < l; i++) {\r\n        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;\r\n      }\r\n    } else {\r\n      for (var key in obj) {\r\n        if (_.has(obj, key)) {\r\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\r\n        }\r\n      }\r\n    }\r\n  };\r\n\r\n  // Return the results of applying the iterator to each element.\r\n  // Delegates to **ECMAScript 5**'s native `map` if available.\r\n  _.map = _.collect = function(obj, iterator, context) {\r\n    var results = [];\r\n    if (obj == null) return results;\r\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\r\n    each(obj, function(value, index, list) {\r\n      results[results.length] = iterator.call(context, value, index, list);\r\n    });\r\n    if (obj.length === +obj.length) results.length = obj.length;\r\n    return results;\r\n  };\r\n\r\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\r\n  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\r\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\r\n    var initial = arguments.length > 2;\r\n    if (obj == null) obj = [];\r\n    if (nativeReduce && obj.reduce === nativeReduce) {\r\n      if (context) iterator = _.bind(iterator, context);\r\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\r\n    }\r\n    each(obj, function(value, index, list) {\r\n      if (!initial) {\r\n        memo = value;\r\n        initial = true;\r\n      } else {\r\n        memo = iterator.call(context, memo, value, index, list);\r\n      }\r\n    });\r\n    if (!initial) throw new TypeError('Reduce of empty array with no initial value');\r\n    return memo;\r\n  };\r\n\r\n  // The right-associative version of reduce, also known as `foldr`.\r\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\r\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\r\n    var initial = arguments.length > 2;\r\n    if (obj == null) obj = [];\r\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\r\n      if (context) iterator = _.bind(iterator, context);\r\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\r\n    }\r\n    var reversed = _.toArray(obj).reverse();\r\n    if (context && !initial) iterator = _.bind(iterator, context);\r\n    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);\r\n  };\r\n\r\n  // Return the first value which passes a truth test. Aliased as `detect`.\r\n  _.find = _.detect = function(obj, iterator, context) {\r\n    var result;\r\n    any(obj, function(value, index, list) {\r\n      if (iterator.call(context, value, index, list)) {\r\n        result = value;\r\n        return true;\r\n      }\r\n    });\r\n    return result;\r\n  };\r\n\r\n  // Return all the elements that pass a truth test.\r\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\r\n  // Aliased as `select`.\r\n  _.filter = _.select = function(obj, iterator, context) {\r\n    var results = [];\r\n    if (obj == null) return results;\r\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\r\n    each(obj, function(value, index, list) {\r\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\r\n    });\r\n    return results;\r\n  };\r\n\r\n  // Return all the elements for which a truth test fails.\r\n  _.reject = function(obj, iterator, context) {\r\n    var results = [];\r\n    if (obj == null) return results;\r\n    each(obj, function(value, index, list) {\r\n      if (!iterator.call(context, value, index, list)) results[results.length] = value;\r\n    });\r\n    return results;\r\n  };\r\n\r\n  // Determine whether all of the elements match a truth test.\r\n  // Delegates to **ECMAScript 5**'s native `every` if available.\r\n  // Aliased as `all`.\r\n  _.every = _.all = function(obj, iterator, context) {\r\n    var result = true;\r\n    if (obj == null) return result;\r\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\r\n    each(obj, function(value, index, list) {\r\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\r\n    });\r\n    return !!result;\r\n  };\r\n\r\n  // Determine if at least one element in the object matches a truth test.\r\n  // Delegates to **ECMAScript 5**'s native `some` if available.\r\n  // Aliased as `any`.\r\n  var any = _.some = _.any = function(obj, iterator, context) {\r\n    iterator || (iterator = _.identity);\r\n    var result = false;\r\n    if (obj == null) return result;\r\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\r\n    each(obj, function(value, index, list) {\r\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\r\n    });\r\n    return !!result;\r\n  };\r\n\r\n  // Determine if a given value is included in the array or object using `===`.\r\n  // Aliased as `contains`.\r\n  _.include = _.contains = function(obj, target) {\r\n    var found = false;\r\n    if (obj == null) return found;\r\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\r\n    found = any(obj, function(value) {\r\n      return value === target;\r\n    });\r\n    return found;\r\n  };\r\n\r\n  // Invoke a method (with arguments) on every item in a collection.\r\n  _.invoke = function(obj, method) {\r\n    var args = slice.call(arguments, 2);\r\n    return _.map(obj, function(value) {\r\n      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);\r\n    });\r\n  };\r\n\r\n  // Convenience version of a common use case of `map`: fetching a property.\r\n  _.pluck = function(obj, key) {\r\n    return _.map(obj, function(value){ return value[key]; });\r\n  };\r\n\r\n  // Return the maximum element or (element-based computation).\r\n  _.max = function(obj, iterator, context) {\r\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.max.apply(Math, obj);\r\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\r\n    var result = {computed : -Infinity};\r\n    each(obj, function(value, index, list) {\r\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\r\n      computed >= result.computed && (result = {value : value, computed : computed});\r\n    });\r\n    return result.value;\r\n  };\r\n\r\n  // Return the minimum element (or element-based computation).\r\n  _.min = function(obj, iterator, context) {\r\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.min.apply(Math, obj);\r\n    if (!iterator && _.isEmpty(obj)) return Infinity;\r\n    var result = {computed : Infinity};\r\n    each(obj, function(value, index, list) {\r\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\r\n      computed < result.computed && (result = {value : value, computed : computed});\r\n    });\r\n    return result.value;\r\n  };\r\n\r\n  // Shuffle an array.\r\n  _.shuffle = function(obj) {\r\n    var shuffled = [], rand;\r\n    each(obj, function(value, index, list) {\r\n      rand = Math.floor(Math.random() * (index + 1));\r\n      shuffled[index] = shuffled[rand];\r\n      shuffled[rand] = value;\r\n    });\r\n    return shuffled;\r\n  };\r\n\r\n  // Sort the object's values by a criterion produced by an iterator.\r\n  _.sortBy = function(obj, val, context) {\r\n    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };\r\n    return _.pluck(_.map(obj, function(value, index, list) {\r\n      return {\r\n        value : value,\r\n        criteria : iterator.call(context, value, index, list)\r\n      };\r\n    }).sort(function(left, right) {\r\n      var a = left.criteria, b = right.criteria;\r\n      if (a === void 0) return 1;\r\n      if (b === void 0) return -1;\r\n      return a < b ? -1 : a > b ? 1 : 0;\r\n    }), 'value');\r\n  };\r\n\r\n  // Groups the object's values by a criterion. Pass either a string attribute\r\n  // to group by, or a function that returns the criterion.\r\n  _.groupBy = function(obj, val) {\r\n    var result = {};\r\n    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };\r\n    each(obj, function(value, index) {\r\n      var key = iterator(value, index);\r\n      (result[key] || (result[key] = [])).push(value);\r\n    });\r\n    return result;\r\n  };\r\n\r\n  // Use a comparator function to figure out at what index an object should\r\n  // be inserted so as to maintain order. Uses binary search.\r\n  _.sortedIndex = function(array, obj, iterator) {\r\n    iterator || (iterator = _.identity);\r\n    var low = 0, high = array.length;\r\n    while (low < high) {\r\n      var mid = (low + high) >> 1;\r\n      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;\r\n    }\r\n    return low;\r\n  };\r\n\r\n  // Safely convert anything iterable into a real, live array.\r\n  _.toArray = function(obj) {\r\n    if (!obj)                                     return [];\r\n    if (_.isArray(obj))                           return slice.call(obj);\r\n    if (_.isArguments(obj))                       return slice.call(obj);\r\n    if (obj.toArray && _.isFunction(obj.toArray)) return obj.toArray();\r\n    return _.values(obj);\r\n  };\r\n\r\n  // Return the number of elements in an object.\r\n  _.size = function(obj) {\r\n    return _.isArray(obj) ? obj.length : _.keys(obj).length;\r\n  };\r\n\r\n  // Array Functions\r\n  // ---------------\r\n\r\n  // Get the first element of an array. Passing **n** will return the first N\r\n  // values in the array. Aliased as `head` and `take`. The **guard** check\r\n  // allows it to work with `_.map`.\r\n  _.first = _.head = _.take = function(array, n, guard) {\r\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\r\n  };\r\n\r\n  // Returns everything but the last entry of the array. Especcialy useful on\r\n  // the arguments object. Passing **n** will return all the values in\r\n  // the array, excluding the last N. The **guard** check allows it to work with\r\n  // `_.map`.\r\n  _.initial = function(array, n, guard) {\r\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\r\n  };\r\n\r\n  // Get the last element of an array. Passing **n** will return the last N\r\n  // values in the array. The **guard** check allows it to work with `_.map`.\r\n  _.last = function(array, n, guard) {\r\n    if ((n != null) && !guard) {\r\n      return slice.call(array, Math.max(array.length - n, 0));\r\n    } else {\r\n      return array[array.length - 1];\r\n    }\r\n  };\r\n\r\n  // Returns everything but the first entry of the array. Aliased as `tail`.\r\n  // Especially useful on the arguments object. Passing an **index** will return\r\n  // the rest of the values in the array from that index onward. The **guard**\r\n  // check allows it to work with `_.map`.\r\n  _.rest = _.tail = function(array, index, guard) {\r\n    return slice.call(array, (index == null) || guard ? 1 : index);\r\n  };\r\n\r\n  // Trim out all falsy values from an array.\r\n  _.compact = function(array) {\r\n    return _.filter(array, function(value){ return !!value; });\r\n  };\r\n\r\n  // Return a completely flattened version of an array.\r\n  _.flatten = function(array, shallow) {\r\n    return _.reduce(array, function(memo, value) {\r\n      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));\r\n      memo[memo.length] = value;\r\n      return memo;\r\n    }, []);\r\n  };\r\n\r\n  // Return a version of the array that does not contain the specified value(s).\r\n  _.without = function(array) {\r\n    return _.difference(array, slice.call(arguments, 1));\r\n  };\r\n\r\n  // Produce a duplicate-free version of the array. If the array has already\r\n  // been sorted, you have the option of using a faster algorithm.\r\n  // Aliased as `unique`.\r\n  _.uniq = _.unique = function(array, isSorted, iterator) {\r\n    var initial = iterator ? _.map(array, iterator) : array;\r\n    var results = [];\r\n    // The `isSorted` flag is irrelevant if the array only contains two elements.\r\n    if (array.length < 3) isSorted = true;\r\n    _.reduce(initial, function (memo, value, index) {\r\n      if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) {\r\n        memo.push(value);\r\n        results.push(array[index]);\r\n      }\r\n      return memo;\r\n    }, []);\r\n    return results;\r\n  };\r\n\r\n  // Produce an array that contains the union: each distinct element from all of\r\n  // the passed-in arrays.\r\n  _.union = function() {\r\n    return _.uniq(_.flatten(arguments, true));\r\n  };\r\n\r\n  // Produce an array that contains every item shared between all the\r\n  // passed-in arrays. (Aliased as \"intersect\" for back-compat.)\r\n  _.intersection = _.intersect = function(array) {\r\n    var rest = slice.call(arguments, 1);\r\n    return _.filter(_.uniq(array), function(item) {\r\n      return _.every(rest, function(other) {\r\n        return _.indexOf(other, item) >= 0;\r\n      });\r\n    });\r\n  };\r\n\r\n  // Take the difference between one array and a number of other arrays.\r\n  // Only the elements present in just the first array will remain.\r\n  _.difference = function(array) {\r\n    var rest = _.flatten(slice.call(arguments, 1), true);\r\n    return _.filter(array, function(value){ return !_.include(rest, value); });\r\n  };\r\n\r\n  // Zip together multiple lists into a single array -- elements that share\r\n  // an index go together.\r\n  _.zip = function() {\r\n    var args = slice.call(arguments);\r\n    var length = _.max(_.pluck(args, 'length'));\r\n    var results = new Array(length);\r\n    for (var i = 0; i < length; i++) results[i] = _.pluck(args, \"\" + i);\r\n    return results;\r\n  };\r\n\r\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\r\n  // we need this function. Return the position of the first occurrence of an\r\n  // item in an array, or -1 if the item is not included in the array.\r\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\r\n  // If the array is large and already in sort order, pass `true`\r\n  // for **isSorted** to use binary search.\r\n  _.indexOf = function(array, item, isSorted) {\r\n    if (array == null) return -1;\r\n    var i, l;\r\n    if (isSorted) {\r\n      i = _.sortedIndex(array, item);\r\n      return array[i] === item ? i : -1;\r\n    }\r\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);\r\n    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;\r\n    return -1;\r\n  };\r\n\r\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\r\n  _.lastIndexOf = function(array, item) {\r\n    if (array == null) return -1;\r\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);\r\n    var i = array.length;\r\n    while (i--) if (i in array && array[i] === item) return i;\r\n    return -1;\r\n  };\r\n\r\n  // Generate an integer Array containing an arithmetic progression. A port of\r\n  // the native Python `range()` function. See\r\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\r\n  _.range = function(start, stop, step) {\r\n    if (arguments.length <= 1) {\r\n      stop = start || 0;\r\n      start = 0;\r\n    }\r\n    step = arguments[2] || 1;\r\n\r\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\r\n    var idx = 0;\r\n    var range = new Array(len);\r\n\r\n    while(idx < len) {\r\n      range[idx++] = start;\r\n      start += step;\r\n    }\r\n\r\n    return range;\r\n  };\r\n\r\n  // Function (ahem) Functions\r\n  // ------------------\r\n\r\n  // Reusable constructor function for prototype setting.\r\n  var ctor = function(){};\r\n\r\n  // Create a function bound to a given object (assigning `this`, and arguments,\r\n  // optionally). Binding with arguments is also known as `curry`.\r\n  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.\r\n  // We check for `func.bind` first, to fail fast when `func` is undefined.\r\n  _.bind = function bind(func, context) {\r\n    var bound, args;\r\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\r\n    if (!_.isFunction(func)) throw new TypeError;\r\n    args = slice.call(arguments, 2);\r\n    return bound = function() {\r\n      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\r\n      ctor.prototype = func.prototype;\r\n      var self = new ctor;\r\n      var result = func.apply(self, args.concat(slice.call(arguments)));\r\n      if (Object(result) === result) return result;\r\n      return self;\r\n    };\r\n  };\r\n\r\n  // Bind all of an object's methods to that object. Useful for ensuring that\r\n  // all callbacks defined on an object belong to it.\r\n  _.bindAll = function(obj) {\r\n    var funcs = slice.call(arguments, 1);\r\n    if (funcs.length == 0) funcs = _.functions(obj);\r\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\r\n    return obj;\r\n  };\r\n\r\n  // Memoize an expensive function by storing its results.\r\n  _.memoize = function(func, hasher) {\r\n    var memo = {};\r\n    hasher || (hasher = _.identity);\r\n    return function() {\r\n      var key = hasher.apply(this, arguments);\r\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\r\n    };\r\n  };\r\n\r\n  // Delays a function for the given number of milliseconds, and then calls\r\n  // it with the arguments supplied.\r\n  _.delay = function(func, wait) {\r\n    var args = slice.call(arguments, 2);\r\n    return setTimeout(function(){ return func.apply(null, args); }, wait);\r\n  };\r\n\r\n  // Defers a function, scheduling it to run after the current call stack has\r\n  // cleared.\r\n  _.defer = function(func) {\r\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\r\n  };\r\n\r\n  // Returns a function, that, when invoked, will only be triggered at most once\r\n  // during a given window of time.\r\n  _.throttle = function(func, wait) {\r\n    var context, args, timeout, throttling, more, result;\r\n    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);\r\n    return function() {\r\n      context = this; args = arguments;\r\n      var later = function() {\r\n        timeout = null;\r\n        if (more) func.apply(context, args);\r\n        whenDone();\r\n      };\r\n      if (!timeout) timeout = setTimeout(later, wait);\r\n      if (throttling) {\r\n        more = true;\r\n      } else {\r\n        result = func.apply(context, args);\r\n      }\r\n      whenDone();\r\n      throttling = true;\r\n      return result;\r\n    };\r\n  };\r\n\r\n  // Returns a function, that, as long as it continues to be invoked, will not\r\n  // be triggered. The function will be called after it stops being called for\r\n  // N milliseconds. If `immediate` is passed, trigger the function on the\r\n  // leading edge, instead of the trailing.\r\n  _.debounce = function(func, wait, immediate) {\r\n    var timeout;\r\n    return function() {\r\n      var context = this, args = arguments;\r\n      var later = function() {\r\n        timeout = null;\r\n        if (!immediate) func.apply(context, args);\r\n      };\r\n      if (immediate && !timeout) func.apply(context, args);\r\n      clearTimeout(timeout);\r\n      timeout = setTimeout(later, wait);\r\n    };\r\n  };\r\n\r\n  // Returns a function that will be executed at most one time, no matter how\r\n  // often you call it. Useful for lazy initialization.\r\n  _.once = function(func) {\r\n    var ran = false, memo;\r\n    return function() {\r\n      if (ran) return memo;\r\n      ran = true;\r\n      return memo = func.apply(this, arguments);\r\n    };\r\n  };\r\n\r\n  // Returns the first function passed as an argument to the second,\r\n  // allowing you to adjust arguments, run code before and after, and\r\n  // conditionally execute the original function.\r\n  _.wrap = function(func, wrapper) {\r\n    return function() {\r\n      var args = [func].concat(slice.call(arguments, 0));\r\n      return wrapper.apply(this, args);\r\n    };\r\n  };\r\n\r\n  // Returns a function that is the composition of a list of functions, each\r\n  // consuming the return value of the function that follows.\r\n  _.compose = function() {\r\n    var funcs = arguments;\r\n    return function() {\r\n      var args = arguments;\r\n      for (var i = funcs.length - 1; i >= 0; i--) {\r\n        args = [funcs[i].apply(this, args)];\r\n      }\r\n      return args[0];\r\n    };\r\n  };\r\n\r\n  // Returns a function that will only be executed after being called N times.\r\n  _.after = function(times, func) {\r\n    if (times <= 0) return func();\r\n    return function() {\r\n      if (--times < 1) { return func.apply(this, arguments); }\r\n    };\r\n  };\r\n\r\n  // Object Functions\r\n  // ----------------\r\n\r\n  // Retrieve the names of an object's properties.\r\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\r\n  _.keys = nativeKeys || function(obj) {\r\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\r\n    var keys = [];\r\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\r\n    return keys;\r\n  };\r\n\r\n  // Retrieve the values of an object's properties.\r\n  _.values = function(obj) {\r\n    return _.map(obj, _.identity);\r\n  };\r\n\r\n  // Return a sorted list of the function names available on the object.\r\n  // Aliased as `methods`\r\n  _.functions = _.methods = function(obj) {\r\n    var names = [];\r\n    for (var key in obj) {\r\n      if (_.isFunction(obj[key])) names.push(key);\r\n    }\r\n    return names.sort();\r\n  };\r\n\r\n  // Extend a given object with all the properties in passed-in object(s).\r\n  _.extend = function(obj) {\r\n    each(slice.call(arguments, 1), function(source) {\r\n      for (var prop in source) {\r\n        obj[prop] = source[prop];\r\n      }\r\n    });\r\n    return obj;\r\n  };\r\n\r\n  // Return a copy of the object only containing the whitelisted properties.\r\n  _.pick = function(obj) {\r\n    var result = {};\r\n    each(_.flatten(slice.call(arguments, 1)), function(key) {\r\n      if (key in obj) result[key] = obj[key];\r\n    });\r\n    return result;\r\n  };\r\n\r\n  // Fill in a given object with default properties.\r\n  _.defaults = function(obj) {\r\n    each(slice.call(arguments, 1), function(source) {\r\n      for (var prop in source) {\r\n        if (obj[prop] == null) obj[prop] = source[prop];\r\n      }\r\n    });\r\n    return obj;\r\n  };\r\n\r\n  // Create a (shallow-cloned) duplicate of an object.\r\n  _.clone = function(obj) {\r\n    if (!_.isObject(obj)) return obj;\r\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\r\n  };\r\n\r\n  // Invokes interceptor with the obj, and then returns obj.\r\n  // The primary purpose of this method is to \"tap into\" a method chain, in\r\n  // order to perform operations on intermediate results within the chain.\r\n  _.tap = function(obj, interceptor) {\r\n    interceptor(obj);\r\n    return obj;\r\n  };\r\n\r\n  // Internal recursive comparison function.\r\n  function eq(a, b, stack) {\r\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\r\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\r\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\r\n    // A strict comparison is necessary because `null == undefined`.\r\n    if (a == null || b == null) return a === b;\r\n    // Unwrap any wrapped objects.\r\n    if (a._chain) a = a._wrapped;\r\n    if (b._chain) b = b._wrapped;\r\n    // Invoke a custom `isEqual` method if one is provided.\r\n    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);\r\n    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);\r\n    // Compare `[[Class]]` names.\r\n    var className = toString.call(a);\r\n    if (className != toString.call(b)) return false;\r\n    switch (className) {\r\n      // Strings, numbers, dates, and booleans are compared by value.\r\n      case '[object String]':\r\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\r\n        // equivalent to `new String(\"5\")`.\r\n        return a == String(b);\r\n      case '[object Number]':\r\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\r\n        // other numeric values.\r\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\r\n      case '[object Date]':\r\n      case '[object Boolean]':\r\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\r\n        // millisecond representations. Note that invalid dates with millisecond representations\r\n        // of `NaN` are not equivalent.\r\n        return +a == +b;\r\n      // RegExps are compared by their source patterns and flags.\r\n      case '[object RegExp]':\r\n        return a.source == b.source &&\r\n               a.global == b.global &&\r\n               a.multiline == b.multiline &&\r\n               a.ignoreCase == b.ignoreCase;\r\n    }\r\n    if (typeof a != 'object' || typeof b != 'object') return false;\r\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\r\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\r\n    var length = stack.length;\r\n    while (length--) {\r\n      // Linear search. Performance is inversely proportional to the number of\r\n      // unique nested structures.\r\n      if (stack[length] == a) return true;\r\n    }\r\n    // Add the first object to the stack of traversed objects.\r\n    stack.push(a);\r\n    var size = 0, result = true;\r\n    // Recursively compare objects and arrays.\r\n    if (className == '[object Array]') {\r\n      // Compare array lengths to determine if a deep comparison is necessary.\r\n      size = a.length;\r\n      result = size == b.length;\r\n      if (result) {\r\n        // Deep compare the contents, ignoring non-numeric properties.\r\n        while (size--) {\r\n          // Ensure commutative equality for sparse arrays.\r\n          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;\r\n        }\r\n      }\r\n    } else {\r\n      // Objects with different constructors are not equivalent.\r\n      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;\r\n      // Deep compare objects.\r\n      for (var key in a) {\r\n        if (_.has(a, key)) {\r\n          // Count the expected number of properties.\r\n          size++;\r\n          // Deep compare each member.\r\n          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;\r\n        }\r\n      }\r\n      // Ensure that both objects contain the same number of properties.\r\n      if (result) {\r\n        for (key in b) {\r\n          if (_.has(b, key) && !(size--)) break;\r\n        }\r\n        result = !size;\r\n      }\r\n    }\r\n    // Remove the first object from the stack of traversed objects.\r\n    stack.pop();\r\n    return result;\r\n  }\r\n\r\n  // Perform a deep comparison to check if two objects are equal.\r\n  _.isEqual = function(a, b) {\r\n    return eq(a, b, []);\r\n  };\r\n\r\n  // Is a given array, string, or object empty?\r\n  // An \"empty\" object has no enumerable own-properties.\r\n  _.isEmpty = function(obj) {\r\n    if (obj == null) return true;\r\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\r\n    for (var key in obj) if (_.has(obj, key)) return false;\r\n    return true;\r\n  };\r\n\r\n  // Is a given value a DOM element?\r\n  _.isElement = function(obj) {\r\n    return !!(obj && obj.nodeType == 1);\r\n  };\r\n\r\n  // Is a given value an array?\r\n  // Delegates to ECMA5's native Array.isArray\r\n  _.isArray = nativeIsArray || function(obj) {\r\n    return toString.call(obj) == '[object Array]';\r\n  };\r\n\r\n  // Is a given variable an object?\r\n  _.isObject = function(obj) {\r\n    return obj === Object(obj);\r\n  };\r\n\r\n  // Is a given variable an arguments object?\r\n  _.isArguments = function(obj) {\r\n    return toString.call(obj) == '[object Arguments]';\r\n  };\r\n  if (!_.isArguments(arguments)) {\r\n    _.isArguments = function(obj) {\r\n      return !!(obj && _.has(obj, 'callee'));\r\n    };\r\n  }\r\n\r\n  // Is a given value a function?\r\n  _.isFunction = function(obj) {\r\n    return toString.call(obj) == '[object Function]';\r\n  };\r\n\r\n  // Is a given value a string?\r\n  _.isString = function(obj) {\r\n    return toString.call(obj) == '[object String]';\r\n  };\r\n\r\n  // Is a given value a number?\r\n  _.isNumber = function(obj) {\r\n    return toString.call(obj) == '[object Number]';\r\n  };\r\n\r\n  // Is a given object a finite number?\r\n  _.isFinite = function(obj) {\r\n    return _.isNumber(obj) && isFinite(obj);\r\n  };\r\n\r\n  // Is the given value `NaN`?\r\n  _.isNaN = function(obj) {\r\n    // `NaN` is the only value for which `===` is not reflexive.\r\n    return obj !== obj;\r\n  };\r\n\r\n  // Is a given value a boolean?\r\n  _.isBoolean = function(obj) {\r\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\r\n  };\r\n\r\n  // Is a given value a date?\r\n  _.isDate = function(obj) {\r\n    return toString.call(obj) == '[object Date]';\r\n  };\r\n\r\n  // Is the given value a regular expression?\r\n  _.isRegExp = function(obj) {\r\n    return toString.call(obj) == '[object RegExp]';\r\n  };\r\n\r\n  // Is a given value equal to null?\r\n  _.isNull = function(obj) {\r\n    return obj === null;\r\n  };\r\n\r\n  // Is a given variable undefined?\r\n  _.isUndefined = function(obj) {\r\n    return obj === void 0;\r\n  };\r\n\r\n  // Has own property?\r\n  _.has = function(obj, key) {\r\n    return hasOwnProperty.call(obj, key);\r\n  };\r\n\r\n  // Utility Functions\r\n  // -----------------\r\n\r\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\r\n  // previous owner. Returns a reference to the Underscore object.\r\n  _.noConflict = function() {\r\n    root._ = previousUnderscore;\r\n    return this;\r\n  };\r\n\r\n  // Keep the identity function around for default iterators.\r\n  _.identity = function(value) {\r\n    return value;\r\n  };\r\n\r\n  // Run a function **n** times.\r\n  _.times = function (n, iterator, context) {\r\n    for (var i = 0; i < n; i++) iterator.call(context, i);\r\n  };\r\n\r\n  // Escape a string for HTML interpolation.\r\n  _.escape = function(string) {\r\n    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\\//g,'&#x2F;');\r\n  };\r\n\r\n  // If the value of the named property is a function then invoke it;\r\n  // otherwise, return it.\r\n  _.result = function(object, property) {\r\n    if (object == null) return null;\r\n    var value = object[property];\r\n    return _.isFunction(value) ? value.call(object) : value;\r\n  };\r\n\r\n  // Add your own custom functions to the Underscore object, ensuring that\r\n  // they're correctly added to the OOP wrapper as well.\r\n  _.mixin = function(obj) {\r\n    each(_.functions(obj), function(name){\r\n      addToWrapper(name, _[name] = obj[name]);\r\n    });\r\n  };\r\n\r\n  // Generate a unique integer id (unique within the entire client session).\r\n  // Useful for temporary DOM ids.\r\n  var idCounter = 0;\r\n  _.uniqueId = function(prefix) {\r\n    var id = idCounter++;\r\n    return prefix ? prefix + id : id;\r\n  };\r\n\r\n  // By default, Underscore uses ERB-style template delimiters, change the\r\n  // following template settings to use alternative delimiters.\r\n  _.templateSettings = {\r\n    evaluate    : /<%([\\s\\S]+?)%>/g,\r\n    interpolate : /<%=([\\s\\S]+?)%>/g,\r\n    escape      : /<%-([\\s\\S]+?)%>/g\r\n  };\r\n\r\n  // When customizing `templateSettings`, if you don't want to define an\r\n  // interpolation, evaluation or escaping regex, we need one that is\r\n  // guaranteed not to match.\r\n  var noMatch = /.^/;\r\n\r\n  // Certain characters need to be escaped so that they can be put into a\r\n  // string literal.\r\n  var escapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    'r': '\\r',\r\n    'n': '\\n',\r\n    't': '\\t',\r\n    'u2028': '\\u2028',\r\n    'u2029': '\\u2029'\r\n  };\r\n\r\n  for (var p in escapes) escapes[escapes[p]] = p;\r\n  var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\r\n  var unescaper = /\\\\(\\\\|'|r|n|t|u2028|u2029)/g;\r\n\r\n  // Within an interpolation, evaluation, or escaping, remove HTML escaping\r\n  // that had been previously added.\r\n  var unescape = function(code) {\r\n    return code.replace(unescaper, function(match, escape) {\r\n      return escapes[escape];\r\n    });\r\n  };\r\n\r\n  // JavaScript micro-templating, similar to John Resig's implementation.\r\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\r\n  // and correctly escapes quotes within interpolated code.\r\n  _.template = function(text, data, settings) {\r\n    settings = _.defaults(settings || {}, _.templateSettings);\r\n\r\n    // Compile the template source, taking care to escape characters that\r\n    // cannot be included in a string literal and then unescape them in code\r\n    // blocks.\r\n    var source = \"__p+='\" + text\r\n      .replace(escaper, function(match) {\r\n        return '\\\\' + escapes[match];\r\n      })\r\n      .replace(settings.escape || noMatch, function(match, code) {\r\n        return \"'+\\n_.escape(\" + unescape(code) + \")+\\n'\";\r\n      })\r\n      .replace(settings.interpolate || noMatch, function(match, code) {\r\n        return \"'+\\n(\" + unescape(code) + \")+\\n'\";\r\n      })\r\n      .replace(settings.evaluate || noMatch, function(match, code) {\r\n        return \"';\\n\" + unescape(code) + \"\\n;__p+='\";\r\n      }) + \"';\\n\";\r\n\r\n    // If a variable is not specified, place data values in local scope.\r\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\r\n\r\n    source = \"var __p='';\" +\r\n      \"var print=function(){__p+=Array.prototype.join.call(arguments, '')};\\n\" +\r\n      source + \"return __p;\\n\";\r\n\r\n    var render = new Function(settings.variable || 'obj', '_', source);\r\n    if (data) return render(data, _);\r\n    var template = function(data) {\r\n      return render.call(this, data, _);\r\n    };\r\n\r\n    // Provide the compiled function source as a convenience for build time\r\n    // precompilation.\r\n    template.source = 'function(' + (settings.variable || 'obj') + '){\\n' +\r\n      source + '}';\r\n\r\n    return template;\r\n  };\r\n\r\n  // Add a \"chain\" function, which will delegate to the wrapper.\r\n  _.chain = function(obj) {\r\n    return _(obj).chain();\r\n  };\r\n\r\n  // The OOP Wrapper\r\n  // ---------------\r\n\r\n  // If Underscore is called as a function, it returns a wrapped object that\r\n  // can be used OO-style. This wrapper holds altered versions of all the\r\n  // underscore functions. Wrapped objects may be chained.\r\n  var wrapper = function(obj) { this._wrapped = obj; };\r\n\r\n  // Expose `wrapper.prototype` as `_.prototype`\r\n  _.prototype = wrapper.prototype;\r\n\r\n  // Helper function to continue chaining intermediate results.\r\n  var result = function(obj, chain) {\r\n    return chain ? _(obj).chain() : obj;\r\n  };\r\n\r\n  // A method to easily add functions to the OOP wrapper.\r\n  var addToWrapper = function(name, func) {\r\n    wrapper.prototype[name] = function() {\r\n      var args = slice.call(arguments);\r\n      unshift.call(args, this._wrapped);\r\n      return result(func.apply(_, args), this._chain);\r\n    };\r\n  };\r\n\r\n  // Add all of the Underscore functions to the wrapper object.\r\n  _.mixin(_);\r\n\r\n  // Add all mutator Array functions to the wrapper.\r\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\r\n    var method = ArrayProto[name];\r\n    wrapper.prototype[name] = function() {\r\n      var wrapped = this._wrapped;\r\n      method.apply(wrapped, arguments);\r\n      var length = wrapped.length;\r\n      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];\r\n      return result(wrapped, this._chain);\r\n    };\r\n  });\r\n\r\n  // Add all accessor Array functions to the wrapper.\r\n  each(['concat', 'join', 'slice'], function(name) {\r\n    var method = ArrayProto[name];\r\n    wrapper.prototype[name] = function() {\r\n      return result(method.apply(this._wrapped, arguments), this._chain);\r\n    };\r\n  });\r\n\r\n  // Start chaining a wrapped Underscore object.\r\n  wrapper.prototype.chain = function() {\r\n    this._chain = true;\r\n    return this;\r\n  };\r\n\r\n  // Extracts the result from a wrapped and chained object.\r\n  wrapper.prototype.value = function() {\r\n    return this._wrapped;\r\n  };\r\n\r\n}).call(this);"
  },
  {
    "path": "servers/www/index.coffee",
    "content": "coffee = require(\"coffee-script\")\r\nless = require(\"less\")\r\njade = require(\"jade\")\r\nexpress = require(\"express\")\r\ngzippo = require(\"gzippo\")\r\nassets = require(\"connect-assets\")\r\nnconf = require(\"nconf\")\r\nauthom = require(\"authom\")\r\nrequest = require(\"request\")\r\nsharejs = require(\"share\")\r\n\r\nmodule.exports = app = express.createServer()\r\n\r\n###\r\n# Configure oauth\r\n###\r\n\r\ngithub = authom.createServer\r\n  service: \"github\"\r\n  id: nconf.get(\"oauth:github:id\")\r\n  secret: nconf.get(\"oauth:github:secret\")\r\n  scope: [\"gist\"]\r\n\r\n###s\r\n# Configure the server\r\n###\r\n\r\napp.configure ->\r\n  app.use assets(src: \"#{__dirname}/assets\", minifyBuilds: true)\r\n  app.use gzippo.staticGzip(\"#{__dirname}/assets\")\r\n  app.use express.cookieParser()\r\n  app.use express.bodyParser()\r\n  app.use require(\"./middleware/expose\").middleware\r\n    \"url\": nconf.get(\"url\")\r\n    \"package\": require(\"./package\")\r\n    \"bootstrap\": null\r\n  app.use require(\"./middleware/session\").middleware()    \r\n  # Start the sharejs server before variable routes\r\n  sharejs.server.attach app,\r\n    forceReaping: true\r\n    reapTime: 1000 * 60 * 60 * 72\r\n    db:\r\n      type: \"none\"\r\n  app.use app.router\r\n  app.use require(\"./middleware/error\").middleware()    \r\n\r\n\r\n  app.set \"views\", \"#{__dirname}/views\"\r\n  app.set \"view engine\", \"jade\"\r\n  app.set \"view options\", layout: false\r\n\r\n\r\napp.get \"/auth/:service\", (req, res, next) ->\r\n  req.headers.host = nconf.get(\"host\")\r\n  \r\n  next()\r\n\r\napp.get \"/auth/:service\", authom.app\r\n\r\n\r\nauthom.on \"auth\", (req, res, auth) ->\r\n  res.render \"auth/success\", auth: auth\r\n\r\n\r\nauthom.on \"error\", (req, res, data) ->\r\n  res.status 403\r\n  res.render \"auth/error\", auth: data\r\n\r\n\r\napp.get \"/partials/:partial\", (req, res, next) ->\r\n  res.render \"partials/#{req.params.partial}\"\r\n\r\napp.get \"/edit/*\", (req, res, next) ->\r\n  res.render \"editor\"\r\n  \r\napp.all \"/edit/\", (req, res, next) ->\r\n  res.header(\"Access-Control-Allow-Origin\", req.headers.origin or \"*\")\r\n  res.header(\"Access-Control-Allow-Methods\", \"OPTIONS,GET,PUT,POST,DELETE\")\r\n  res.header(\"Access-Control-Allow-Headers\", \"Authorization, User-Agent, Referer, X-Requested-With, Proxy-Authorization, Proxy-Connection, Accept-Language, Accept-Encoding, Accept-Charset, Connection, Content-Length, Host, Origin, Pragma, Accept-Charset, Cache-Control, Accept, Content-Type\")\r\n  res.header(\"Access-Control-Expose-Headers\", \"Link\")\r\n  res.header(\"Access-Control-Max-Age\", \"60\")\r\n\r\n  if \"OPTIONS\" == req.method then res.send(200)\r\n  else next()\r\n\r\napp.post \"/edit/\", (req, res, next) ->    \r\n  res.header \"X-XSS-Protection\", 0\r\n\r\n  if req.body.files\r\n    for filename, file of req.body.files\r\n      if typeof file is \"string\"\r\n        req.body.files[filename] =\r\n          filename: filename\r\n          content: file\r\n      req.body.files[filename].filename ||= filename\r\n      \r\n  res.local \"bootstrap\", req.body or {}\r\n  res.render \"editor\"\r\n\r\napp.all \"/edit\", (req, res, next) -> res.redirect(\"/edit/\", 302)\r\n\r\napp.get \"/*\", (req, res) ->\r\n  res.render \"landing\"\r\n\r\n\r\n\r\napp.get \"*\", (req, res) ->\r\n  res.send \"Hello, you've reached the end of the internet. I don't know how you got here, or who told you this place exists, but its not somewhere you should be hanging out.\", 404"
  },
  {
    "path": "servers/www/middleware/error.coffee",
    "content": "module.exports.middleware = (options = {}) ->\r\n  (err, req, res, next) ->\r\n    json = if err.toJSON? then err.toJSON() else\r\n      message: err.message or \"Unknown error\"\r\n      code: err.code or 500\r\n    \r\n    res.json(json, json.code)\r\n    \r\n    throw err\r\n"
  },
  {
    "path": "servers/www/middleware/expose.coffee",
    "content": "module.exports.middleware = (options = {}) ->\n  (req, res, next) ->\n    res.local(key, value) for key, value of options\n    next()"
  },
  {
    "path": "servers/www/middleware/session.coffee",
    "content": "nconf = require(\"nconf\")\r\nrequest = require(\"request\")\r\n\r\nmodule.exports.middleware = (options = {}) ->\r\n  \r\n  apiUrl = nconf.get(\"url:api\")\r\n  \r\n  (req, res, next) ->\r\n    fetchSession = (sessid) ->\r\n      return createSession() unless sessid\r\n      \r\n      request \"#{apiUrl}/sessions/#{sessid}\", (err, response, body) ->\r\n        if err or response.statusCode >= 400 then createSession()\r\n        else finalize(parse(body))\r\n      \r\n    createSession = ->\r\n      request.post \"#{apiUrl}/sessions\", (err, response, body) ->\r\n        if err or response.statusCode >= 400 then next(\"Error creating session: #{err or response}\")\r\n        else finalize(parse(body))\r\n    \r\n    parse = (body) ->\r\n      try\r\n        session = JSON.parse(body)\r\n      catch e\r\n        return next(\"Error parsing session JSON\")\r\n      \r\n      return session\r\n      \r\n    finalize = (session) ->\r\n      res.header(\"Vary\", \"Cookie\")\r\n      res.local(\"session\", session)\r\n      next()\r\n    \r\n    if sessid = req.cookies.plnk_session then fetchSession(sessid)\r\n    else createSession()\r\n"
  },
  {
    "path": "servers/www/models/user.coffee",
    "content": "resourceful = require(\"resourceful\")\n\nmodule.exports.User = resourceful.define \"user\", ->\n  @string \"login\"\n  @string \"gravatar_id\"\n  @string \"html_url\"\n  @string \"url\"\n"
  },
  {
    "path": "servers/www/package.json",
    "content": "{\n  \"name\": \"plunker-www\",\n  \"subdomain\": \"plunker-www\",\n  \"domains\": [\n    \"plnkr.co\"\n  ],\n  \"scripts\": {\n    \"start\": \"server.js\"\n  },\n  \"engines\": {\n    \"node\": \"0.6.x\"\n  },\n  \"version\": \"0.3.18-8\",\n  \"private\": true,\n  \"dependencies\": {\n    \"coffee-script\": \"1.3.x\",\n    \"express\": \"2.5.x\",\n    \"gzippo\": \"0.1.x\",\n    \"jade\": \"0.25.x\",\n    \"less\": \"1.3.x\",\n    \"mime\": \"1.2.x\",\n    \"underscore\": \"1.3.x\",\n    \"backbone\": \"0.9.x\",\n    \"connect-assets\": \"2.2.x\",\n    \"share\": \"0.5.x\",\n    \"authom\": \"0.4.x\",\n    \"nconf\": \"0.5.x\",\n    \"request\": \"2.9.x\",\n    \"connect\": \"1.x\",\n    \"async\": \"0.1.x\"\n  }\n}"
  },
  {
    "path": "servers/www/server.js",
    "content": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\nvar nconf = require(\"nconf\").use(\"memory\")\r\n  .argv()\r\n  .env()\r\n  .file({file: \"config.json\"})\r\n  .defaults({\r\n    \"PORT\": 8080\r\n  });\r\n\r\nif (!nconf.get(\"host\")) {\r\n  console.error(\"The host option is required for Plunker to start\");\r\n} else {\r\n  \r\n  //process.env.NODE_ENV = \"production\";\r\n\r\n  var host = nconf.get(\"host\");\r\n\r\n  // Configure global paths\r\n  if (nconf.get(\"nosubdomains\")) {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://\" + host + \"/raw\");\r\n    nconf.set(\"url:run\", \"http://\" + host + \"/run\");\r\n    nconf.set(\"url:api\", \"http://\" + host + \"/api\");\r\n    nconf.set(\"url:embed\", \"http://\" + host + \"/embed\");\r\n  } else {\r\n    nconf.set(\"url:www\", \"http://\" + host);\r\n    nconf.set(\"url:raw\", \"http://raw.\" + host);\r\n    nconf.set(\"url:run\", \"http://run.\" + host);\r\n    nconf.set(\"url:api\", \"http://api.\" + host);\r\n    nconf.set(\"url:embed\", \"http://embed.\" + host);\r\n  }\r\n  \r\n  // Create and start the parent server\r\n  require(\"./index\").listen(nconf.get(\"PORT\"));\r\n  \r\n  console.log(\"Started plunker-www in\", nconf.get(\"NODE_ENV\") || \"development\", \"at\", nconf.get(\"host\"), \"on port\", nconf.get(\"PORT\"), \"using subdomains:\", !nconf.get(\"nosubdomains\"));\r\n}\r\n"
  },
  {
    "path": "servers/www/views/auth/error.jade",
    "content": "!!! 5\r\nhtml\r\n  head\r\n    meta(charset=\"utf-8\")\r\n    meta(name=\"viewport\",content=\"width=device-width, initial-scale=1.0\")\r\n    title Plunker - Authorization failed to #{auth.service}\r\n    != js(\"/js/vendor/postmessage\")\r\n  body\r\n    script\r\n      if (window.opener) {\r\n        pm({\r\n          target: window.opener,\r\n          type: \"oauth:fail\",\r\n          data: !{JSON.stringify(auth)},\r\n          success: function() { window.close(); }\r\n        });\r\n      } else {\r\n        window.location = \"/\";\r\n      }\r\n\r\n          "
  },
  {
    "path": "servers/www/views/auth/success.jade",
    "content": "!!! 5\nhtml\n  head\n    meta(charset=\"utf-8\")\n    meta(name=\"viewport\",content=\"width=device-width, initial-scale=1.0\")\n    title Plunker - Authorized to #{auth.service}\n    != js(\"/js/vendor/postmessage\")\n  body\n    script\n      if (window.opener) {\n        pm({\n          target: window.opener,\n          type: \"oauth:success\",\n          data: !{JSON.stringify(auth)},\n          success: function() { window.close(); }\n        });\n      } else {\n        window.location = \"/\";\n      }\n\n          "
  },
  {
    "path": "servers/www/views/editor.jade",
    "content": "!!! 5\r\nhtml(ng-app=\"plunker.editor\")\r\n  head\r\n    meta(charset=\"utf-8\")\r\n    meta(name=\"viewport\",content=\"width=device-width, initial-scale=1.0\")\r\n    meta(name=\"description\",content=\"I've just made a shiny new Plunk. Check it out:\")\r\n    link(rel=\"publisher\",href=\"https://plus.google.com/117182083134481297227\")\r\n    base(href=\"/edit/\")\r\n    block title\r\n      title Plunker\r\n    block styles\r\n      != css(\"pages/editor\")\r\n    // if lt IE 9\r\n      script(src=\"http://html5shim.googlecode.com/svn/trunk/html5.js\")\r\n    block scripts\r\n      script(src=\"//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js\")\r\n      // script(src=\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.0/js/bootstrap.min.js\")\r\n      script(src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js\")\r\n      script(src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular-sanitize.min.js\")\r\n      script(src=\"http://static.firebase.com/v0/firebase.js\")\r\n      script(src=\"/js/vendor/ace/ace.js\")\r\n      script(src=\"/channel/bcsocket.js\")\r\n      script(src=\"/share/share.js\")\r\n      script(src=\"/share/json.js\")\r\n      script\r\n        var _plunker = {\r\n          \"url\": !{JSON.stringify(url).replace(/<\\//g,\"<\\\\/\")},\r\n          \"session\": !{JSON.stringify(session).replace(/<\\//g,\"<\\\\/\")},\r\n          \"bootstrap\": !{JSON.stringify(bootstrap).replace(/<\\//g,\"<\\\\/\")}\r\n        };\r\n      != js(\"pages/editor\")\r\n      script\r\n        /* Analytics */\r\n        var _gaq = _gaq || [];\r\n        _gaq.push(['_setAccount', 'UA-28928507-1']);\r\n        _gaq.push(['_setDomainName', 'plnkr.co']);\r\n        _gaq.push(['_trackPageview']);\r\n      \r\n        (function() {\r\n          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\r\n          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\r\n          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\r\n        })();\r\n\r\n  body(ng-controller=\"editor\",itemscope,itemtype=\"http://schema.org/WebPage\")\r\n    nav.navbar.navbar-fixed-top\r\n      div.navbar-inner\r\n        a.brand(href=\"{{url.www}}\")\r\n          span.shrink Plunker\r\n            span.version v#{package.version}\r\n\r\n        <userpanel></userpanel>\r\n        <plunker-toolbar></plunker-toolbar>\r\n\r\n    div#editor(plunker-layout, ng-class=\"{loading:scratch.loading}\")\r\n      div.plnk-overlay\r\n      div.ui-layout-center\r\n        div.ui-layout-center\r\n          <plunker-ace class=\"editor-canvas\"></plunker-ace>\r\n\r\n\r\n        <plunker-multipanel id=\"multipanel\" class=\"ui-layout-east\" panes=\"panes\"></plunker-multipanel>\r\n\r\n      div#multipane-buttons.ui-layout-east\r\n        ul.nav.nav-list\r\n          li.pane-toggle(ng-repeat=\"panel in panels | orderBy:'order' | filter:isPaneEnabled \", ng-class=\"{active: panels.active==panel}\", title=\"{{panel.title}}\")\r\n            a(href=\"javascript:void(0)\", ng-click=\"togglePanel(panel)\")\r\n              i(ng-class=\"panel.icon\")\r\n              span.badge(ng-class=\"panel.badge.class\", ng-show=\"panel.badge\", title=\"{{panel.badge.title}}\") {{panel.badge.value}}\r\n      div.ui-layout-west\r\n        div.plnk-sidebar\r\n          details.file-list(open)\r\n            summary.header Files\r\n              a.file-add(href=\"javascript:void(0)\", ng-click=\"scratch.promptFileAdd()\")\r\n                i.icon-plus\r\n                | New...\r\n            ul.nav.nav-list\r\n              li.file(ng-class=\"{active:buffer==scratch.buffers.active()}\",ng-repeat=\"buffer in scratch.buffers.queue | orderBy:'filename'\")\r\n                a(href=\"javascript:void(0)\", ng-click=\"scratch.buffers.activate(buffer)\", ng-dblclick=\"scratch.promptFileRename(buffer.filename)\") {{buffer.filename}}\r\n                ul.file-ops\r\n                  li.delete\r\n                    button.btn.btn-mini(ng-click=\"scratch.promptFileRemove(buffer.filename)\"): i.icon-remove\r\n                \r\n          details.information(open)\r\n            summary.header Information\r\n            form\r\n              label(for=\"plnk-description\") Description:\r\n              textarea#plnk-description.description(ng-model=\"scratch.plunk.description\",itemprop=\"name\",placeholder=\"Describe your plunk\")\r\n              label(for=\"plnk-tags\") Tags:\r\n              input#plnk-tags.tags(ng-model=\"scratch.plunk.tags\", select-list, ui-select2, style=\"width:100%\")\r\n              span.help-block Comma-separated list\r\n              label(for=\"plnk-private\")\r\n                input#plnk-private.inline(type=\"checkbox\", ng-model=\"scratch.plunk.private\",ng-disabled=\"scratch.isSaved()\")\r\n                span private plunk\r\n            \r\n            div(ng-show=\"session.user && scratch.isSaved()\")\r\n              hr\r\n              div.thumb(ng-switch,on=\"scratch.plunk.thumbed\",ng-class=\"{thumbed:scratch.plunk.thumbed}\")\r\n                div(ng-switch-when=\"false\")\r\n                  button.btn.btn(ng-click=\"scratch.plunk.addThumbsUp()\",title=\"Give a thumbs-up to this plunk.\")\r\n                    i.icon-thumbs-up\r\n                    |  Thumbs-up\r\n                div(ng-switch-when=\"true\")\r\n                  i.icon-heart\r\n                  |  Thumbed-up \r\n                  button.btn.btn-danger.btn-mini(ng-click=\"scratch.plunk.removeThumbsUp()\",title=\"Remove your thumbs-up from this plunk.\")\r\n                    i.icon-thumbs-down\r\n            \r\n            div(ng-show=\"scratch.plunk.user\")\r\n              hr\r\n              div.user(ng-show=\"scratch.plunk.user\")\r\n                img.gravatar(ng-src=\"http://www.gravatar.com/avatar/{{scratch.plunk.user.gravatar_id}}?s=18&d=mm\")\r\n                span.login {{scratch.plunk.user.login}}\r\n        \r\n"
  },
  {
    "path": "servers/www/views/landing.jade",
    "content": "!!! 5\r\nhtml(ng-app=\"plunker.landing\")\r\n  head\r\n    meta(charset=\"utf-8\")\r\n    meta(name=\"viewport\",content=\"width=device-width, initial-scale=1.0\")\r\n    meta(name=\"description\", content=\"Quickly create, share and collaborate on web snippets.\")\r\n    block title\r\n      title Plunker\r\n    block styles\r\n      != css(\"pages/landing\")\r\n    // if lt IE 9\r\n      script(src=\"http://html5shim.googlecode.com/svn/trunk/html5.js\")\r\n    block scripts\r\n      script(src=\"https://static.firebase.com/v0/firebase.js\")\r\n      script\r\n        var _plunker = {\r\n          \"url\": !{JSON.stringify(url).replace(/<\\//g,\"<\\\\/\")},\r\n          \"session\": !{JSON.stringify(session).replace(/<\\//g,\"<\\\\/\")}\r\n        };\r\n      script(src=\"//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js\")\r\n      // script(src=\"//netdna.bootstrapcdn.com/twitter-bootstrap/2.1.0/js/bootstrap.min.js\")\r\n      script(src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js\")\r\n      script(src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular-resource.min.js\")\r\n      != js(\"pages/landing\")\r\n      script\r\n        var _gaq = _gaq || [];\r\n        _gaq.push(['_setAccount', 'UA-28928507-1']);\r\n        _gaq.push(['_setDomainName', 'plnkr.co']);\r\n        _gaq.push(['_trackPageview']);\r\n      \r\n        (function() {\r\n          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\r\n          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\r\n          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\r\n        })();\r\n\r\n  body\r\n    nav.navbar.navbar-fixed-top\r\n      div.navbar-inner\r\n        div.container\r\n          a.btn.btn-navbar(data-toggle=\"collapse\",data-target=\".nav-collapse\")\r\n            span.icon-bar\r\n            span.icon-bar\r\n            span.icon-bar\r\n\r\n          a.brand(href=\"/\") Plunker\r\n            span.version v#{package.version}\r\n\r\n          <userpanel></userpanel>\r\n\r\n          div.nav-collapse\r\n            ul#navbar.nav\r\n              li(ng-class=\"{active:section=='plunks'}\")\r\n                a(href=\"/plunks/trending\")\r\n                  i.icon-home\r\n                  | Plunks\r\n              li\r\n                a(href=\"/edit/\", target=\"_self\")\r\n                  i.icon-edit\r\n                  | Editor\r\n              li(ng-class=\"{active:section=='users'}\")\r\n                a(href=\"/users\")\r\n                  i.icon-th\r\n                  | Users\r\n              li(ng-class=\"{active:section=='tags'}\")\r\n                a(href=\"/tags\")\r\n                  i.icon-th\r\n                  | Tags\r\n              li(ng-class=\"{active:section=='discuss'}\")\r\n                a(href=\"/discuss\")\r\n                  i.icon-comments-alt\r\n                  | Discuss\r\n              li\r\n                a(href=\"https://github.com/filearts/plunker\")\r\n                  i.icon-github\r\n                  | Project\r\n\r\n    div#container.container\r\n      div(ng-view)\r\n      footer\r\n        hr\r\n        p Built by <a href=\"https://github.com/ggoodman\">Geoff Goodman</a> (<a href=\"http://twitter.com/g_goodman\">@g_goodman</a>)\r\n        p &copy; Filearts (2012) (<a href=\"http://twitter.com/filearts\">@filearts</a>)\r\n"
  },
  {
    "path": "servers/www/views/partials/discuss.jade",
    "content": "iframe#forum_embed(src=\"javascript:void(0)\", scrolling=\"no\", frameborder=\"0\", width=\"100%\", height=\"500\")\r\n"
  },
  {
    "path": "servers/www/views/partials/home.jade",
    "content": "section#browse(ng-controller=\"GalleryController\")\n  div.page-header\n    div.pagination.pull-right\n      ul\n        li(ng-show=\"plunks.pager.prev\")\n          a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.prev)\") «\n        li(ng-show=\"plunks.pager.next\")\n          a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.next)\") »\n    ul.nav.nav-pills\n      li(ng-repeat=\"filter in filters\", ng-class=\"{active: ranking==filter}\")\n        a(ng-href=\"{{filter.path}}\", ng-click=\"applyRanking(filter)\") {{filter.title}}\n      \n  div.row\n    div.span12\n      ul#gallery.thumbnails.cards\n        <card model=\"plunk\" ng-repeat=\"plunk in plunks\"></card>\n      ul.pager\n        li.previous(ng-show=\"plunks.pager.prev\")\n          a(ng-href=\"\", ng-click=\"pageTo(plunks.pager.prev)\") &larr; Newer\n        li.next(ng-show=\"plunks.pager.next\")\n          a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.next)\") Older  &rarr;\n"
  },
  {
    "path": "servers/www/views/partials/preview.jade",
    "content": "section#preview\n  div.row\n    div.span8.preview(ng-switch=\"state\")\n      div(ng-switch-when=\"ready\")\n        iframe.plnk-preview(ng-src=\"{{plunk.raw_url}}\", frameborder=\"0\", width=\"100%\", height=\"600\", marginheight=\"0\", marginwidth=\"0\")\n      div(ng-switch-default)\n        h3 Loading Plunk...\n    div#plunk-info.span4\n      h1(ng-bind=\"plunk.description\")\n      div.user(ng-show=\"plunk.user\")\n        p\n          img.gravatar(ng-src=\"http://www.gravatar.com/avatar/{{plunk.user.gravatar_id}}?s=18&d=mm\")\n          span.login {{plunk.user.login}}\n      p\n        a.btn.btn-large.btn-primary(ng-href=\"{{plunk.getEditUrl()}}\",target=\"_self\") Launch in Editor\n      p(ng-switch,on=\"plunk.thumbed\",ng-show=\"session.user\")\n        button.btn.btn-large.btn-success(ng-switch-when=\"false\", ng-click=\"plunk.addThumbsUp()\")\n          i.icon-thumbs-up Thumbs-up\n        div(ng-switch-when=\"true\")\n          i.icon-heart\n          |  You've given a thumbs-up to this plunk\n          button.btn.btn-danger(ng-click=\"plunk.removeThumbsUp()\", title=\"Remove yoru thumbs-up\")\n            i.icon-thumbs-down Remove\n      div.fork-of(ng-show=\"plunk.getForkOf()\")\n        h2 Fork of:\n        ul.thumbnails.cards\n          <card model=\"plunk.fork_of\"></card>\n      div.forks(ng-show=\"plunk.getForks()\")\n        h2 Forks:\n        ul.thumbnails.cards\n          <card model=\"plunk\" ng-repeat=\"plunk in plunk.getForks()\"></card>\n\n"
  },
  {
    "path": "servers/www/views/partials/tag.jade",
    "content": "section#browse\r\n  div.page-header\r\n    div.pagination.pull-right\r\n      ul\r\n        li(ng-show=\"plunks.pager.prev\")\r\n          a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.prev)\") «\r\n        li(ng-show=\"plunks.pager.next\")\r\n          a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.next)\") »\r\n\r\n    h1 Browsing tag: \r\n      small(ng-bind=\"tagname\")\r\n      \r\n  div.row\r\n    div.span12\r\n      ul#gallery.thumbnails.cards\r\n        <card model=\"plunk\" ng-repeat=\"plunk in plunks\"></card>\r\n      ul.pager\r\n        li.previous(ng-show=\"plunks.pager.prev\")\r\n          a(ng-href=\"\", ng-click=\"pageTo(plunks.pager.prev)\") &larr; Newer\r\n        li.next(ng-show=\"plunks.pager.next\")\r\n          a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.next)\") Older  &rarr;\r\n"
  },
  {
    "path": "servers/www/views/partials/tags.jade",
    "content": "section#tags\r\n  div.page-header\r\n    h1 Tags\r\n      small  Coming soon....\r\n"
  },
  {
    "path": "servers/www/views/partials/user.jade",
    "content": "section#user\r\n  div.row(ng-controller=\"UserPlunksController\")\r\n    div.span6.gallery\r\n      div.page-header\r\n        div.pagination.pull-right\r\n          ul\r\n            li(ng-show=\"plunks.pager.prev\")\r\n              a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.prev)\") «\r\n            li(ng-show=\"plunks.pager.next\")\r\n              a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.next)\") »\r\n        ul.nav.nav-pills\r\n          li(ng-repeat=\"filter in filters\", ng-class=\"{active: ranking==filter}\")\r\n            a(ng-href=\"{{filter.path}}\", ng-click=\"applyRanking(filter)\") {{filter.title}}\r\n        \r\n      ul#gallery.thumbnails.cards\r\n        <card model=\"plunk\" ng-repeat=\"plunk in plunks\"></card>\r\n      ul.pager\r\n        li.previous(ng-show=\"plunks.pager.prev\")\r\n          a(ng-href=\"\", ng-click=\"pageTo(plunks.pager.prev)\") &larr; Newer\r\n        li.next(ng-show=\"plunks.pager.next\")\r\n          a(ng-href=\"javascript:void(0)\", ng-click=\"pageTo(plunks.pager.next)\") Older  &rarr;\r\n    div.span6.user\r\n     div.page-header\r\n      h1 User: \r\n        small(ng-bind=\"username\")\r\n     \r\n     div.row\r\n        div.thumbnail.span2\r\n          img.gravatar-big(ng-src=\"http://www.gravatar.com/avatar/{{user.gravatar_id}}?s=200&d=mm\")\r\n\r\n\r\n\r\n      "
  },
  {
    "path": "servers/www/views/partials/users.jade",
    "content": "section#users\r\n  div.page-header\r\n    h1 Users\r\n      small  Coming soon....\r\n"
  }
]